RNA
[blender.git] / source / blender / makesrna / intern / rna_object.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributor(s): Blender Foundation (2008).
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26
27 #include "RNA_access.h"
28 #include "RNA_define.h"
29 #include "RNA_types.h"
30
31 #include "rna_internal.h"
32
33 #include "DNA_object_types.h"
34 #include "DNA_property_types.h"
35
36 #include "WM_types.h"
37
38 #ifdef RNA_RUNTIME
39
40 #include "BKE_context.h"
41 #include "BKE_depsgraph.h"
42
43 static void rna_Object_update(bContext *C, PointerRNA *ptr)
44 {
45         DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_OB);
46 }
47
48 static int rna_VertexGroup_index_get(PointerRNA *ptr)
49 {
50         Object *ob= ptr->id.data;
51
52         return BLI_findindex(&ob->defbase, ptr->data);
53 }
54
55 static void *rna_Object_active_vertex_group_get(PointerRNA *ptr)
56 {
57         Object *ob= ptr->id.data;
58         return BLI_findlink(&ob->defbase, ob->actdef);
59 }
60
61 static void *rna_Object_game_settings_get(PointerRNA *ptr)
62 {
63         return ptr->id.data;
64 }
65
66 static void rna_Object_layer_set(PointerRNA *ptr, int index, int value)
67 {
68         Object *ob= (Object*)ptr->data;
69
70         if(value) ob->lay |= (1<<index);
71         else {
72                 ob->lay &= ~(1<<index);
73                 if(ob->lay == 0)
74                         ob->lay |= (1<<index);
75         }
76 }
77
78 static void rna_ObjectGameSettings_state_set(PointerRNA *ptr, int index, int value)
79 {
80         Object *ob= (Object*)ptr->data;
81
82         if(value) ob->state |= (1<<index);
83         else {
84                 ob->state &= ~(1<<index);
85                 if(ob->state == 0)
86                         ob->state |= (1<<index);
87         }
88 }
89
90 #else
91
92 static void rna_def_vertex_group(BlenderRNA *brna)
93 {
94         StructRNA *srna;
95         PropertyRNA *prop;
96
97         srna= RNA_def_struct(brna, "VertexGroup", NULL);
98         RNA_def_struct_sdna(srna, "bDeformGroup");
99         RNA_def_struct_ui_text(srna, "Vertex Group", "Group of vertices, used for armature deform and other purposes.");
100
101         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
102         RNA_def_property_ui_text(prop, "Name", "Vertex group name.");
103         RNA_def_struct_name_property(srna, prop);
104
105         prop= RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
106         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
107         RNA_def_property_int_funcs(prop, "rna_VertexGroup_index_get", NULL, NULL);
108         RNA_def_property_ui_text(prop, "Index", "Index number of the vertex group.");
109 }
110
111 static void rna_def_object_game_settings(BlenderRNA *brna)
112 {
113         StructRNA *srna;
114         PropertyRNA *prop;
115
116         static EnumPropertyItem body_type_items[] = {
117                 {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", "No Collision", ""},
118                 {OB_BODY_TYPE_STATIC, "STATIC", "Static", ""},
119                 {OB_BODY_TYPE_DYNAMIC, "DYNAMIC", "Dynamic", ""},
120                 {OB_BODY_TYPE_RIGID, "RIGID_BODY", "Rigid Body", ""},
121                 {OB_BODY_TYPE_SOFT, "SOFT_BODY", "Soft Body", ""},
122                 {0, NULL, NULL, NULL}};
123
124         static EnumPropertyItem collision_bounds_items[] = {
125                 {OB_BOUND_BOX, "BOX", "Box", ""},
126                 {OB_BOUND_SPHERE, "SPHERE", "Sphere", ""},
127                 {OB_BOUND_CYLINDER, "CYLINDER", "Cylinder", ""},
128                 {OB_BOUND_CONE, "CONE", "Cone", ""},
129                 {OB_BOUND_POLYH, "CONVEX_HULL", "Convex Hull", ""},
130                 {OB_BOUND_POLYT, "TRIANGLE_MESH", "Triangle Mesh", ""},
131                 //{OB_DYN_MESH, "DYNAMIC_MESH", "Dynamic Mesh", ""},
132                 {0, NULL, NULL, NULL}};
133
134         srna= RNA_def_struct(brna, "ObjectGameSettings", NULL);
135         RNA_def_struct_sdna(srna, "Object");
136         RNA_def_struct_ui_text(srna, "Object Game Settings", "Game engine related settings for the object.");
137
138         prop= RNA_def_property(srna, "sensors", PROP_COLLECTION, PROP_NONE);
139         RNA_def_property_struct_type(prop, "Sensor");
140         RNA_def_property_ui_text(prop, "Sensors", "DOC_BROKEN");
141
142         prop= RNA_def_property(srna, "controllers", PROP_COLLECTION, PROP_NONE);
143         RNA_def_property_struct_type(prop, "Controller");
144         RNA_def_property_ui_text(prop, "Controllers", "DOC_BROKEN");
145
146         prop= RNA_def_property(srna, "actuators", PROP_COLLECTION, PROP_NONE);
147         RNA_def_property_struct_type(prop, "Actuator");
148         RNA_def_property_ui_text(prop, "Actuators", "DOC_BROKEN");
149
150         prop= RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE);
151         RNA_def_property_collection_sdna(prop, NULL, "prop", NULL);
152         RNA_def_property_struct_type(prop, "GameProperty");
153         RNA_def_property_ui_text(prop, "Properties", "Game engine properties.");
154
155         prop= RNA_def_property(srna, "physics_type", PROP_ENUM, PROP_NONE);
156         RNA_def_property_enum_sdna(prop, NULL, "body_type");
157         RNA_def_property_enum_items(prop, body_type_items);
158         RNA_def_property_flag(prop, PROP_NOT_EDITABLE); // this controls various gameflags
159         RNA_def_property_ui_text(prop, "Physics Type",  "Selects the type of physical representation.");
160
161         prop= RNA_def_property(srna, "actor", PROP_BOOLEAN, PROP_NONE);
162         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ACTOR);
163         RNA_def_property_ui_text(prop, "Actor", "Object is detected by the Near and Radar sensor.");
164
165         prop= RNA_def_property(srna, "ghost", PROP_BOOLEAN, PROP_NONE);
166         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_GHOST);
167         RNA_def_property_ui_text(prop, "Ghost", "Object does not restitute collisions, like a ghost.");
168
169         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
170         RNA_def_property_range(prop, 0.01, 10000.0);
171         RNA_def_property_ui_text(prop, "Mass", "Mass of the object.");
172
173         prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
174         RNA_def_property_float_sdna(prop, NULL, "inertia");
175         RNA_def_property_range(prop, 0.01, 10.0);
176         RNA_def_property_ui_text(prop, "Radius", "Radius for Bounding sphere and Fh/Fh Rot.");
177
178         prop= RNA_def_property(srna, "no_sleeping", PROP_BOOLEAN, PROP_NONE);
179         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_COLLISION_RESPONSE);
180         RNA_def_property_ui_text(prop, "No Sleeping", "Disable auto (de)activation in physics simulation.");
181
182         prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
183         RNA_def_property_float_sdna(prop, NULL, "damping");
184         RNA_def_property_range(prop, 0.0, 1.0);
185         RNA_def_property_ui_text(prop, "Damping", "General movement damping.");
186
187         prop= RNA_def_property(srna, "rotation_damping", PROP_FLOAT, PROP_NONE);
188         RNA_def_property_float_sdna(prop, NULL, "rdamping");
189         RNA_def_property_range(prop, 0.0, 1.0);
190         RNA_def_property_ui_text(prop, "Rotation Damping", "General rotation damping.");
191
192         prop= RNA_def_property(srna, "do_fh", PROP_BOOLEAN, PROP_NONE);
193         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_DO_FH);
194         RNA_def_property_ui_text(prop, "Do Fh", "Use Fh settings in materials.");
195
196         prop= RNA_def_property(srna, "rotation_fh", PROP_BOOLEAN, PROP_NONE);
197         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ROT_FH);
198         RNA_def_property_ui_text(prop, "Rotation Fh", "Use face normal to rotate Object");
199
200         prop= RNA_def_property(srna, "form_factor", PROP_FLOAT, PROP_NONE);
201         RNA_def_property_float_sdna(prop, NULL, "formfactor");
202         RNA_def_property_range(prop, 0.0, 1.0);
203         RNA_def_property_ui_text(prop, "Form Factor", "Form factor scales the inertia tensor.");
204
205         prop= RNA_def_property(srna, "anisotropic_friction", PROP_BOOLEAN, PROP_NONE);
206         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ANISOTROPIC_FRICTION);
207         RNA_def_property_ui_text(prop, "Anisotropic Friction", "Enable anisotropic friction.");
208
209         prop= RNA_def_property(srna, "friction_coefficients", PROP_FLOAT, PROP_VECTOR);
210         RNA_def_property_float_sdna(prop, NULL, "anisotropicFriction");
211         RNA_def_property_range(prop, 0.0, 1.0);
212         RNA_def_property_ui_text(prop, "Friction Coefficients", "Relative friction coefficient in the in the X, Y and Z directions, when anisotropic friction is enabled.");
213
214         prop= RNA_def_property(srna, "use_collision_bounds", PROP_BOOLEAN, PROP_NONE);
215         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_BOUNDS);
216         RNA_def_property_ui_text(prop, "Use Collision Bounds", "Specify a collision bounds type other than the default.");
217
218         prop= RNA_def_property(srna, "collision_bounds", PROP_ENUM, PROP_NONE);
219         RNA_def_property_enum_sdna(prop, NULL, "boundtype");
220         RNA_def_property_enum_items(prop, collision_bounds_items);
221         RNA_def_property_ui_text(prop, "Collision Bounds",  "Selects the collision type.");
222
223         prop= RNA_def_property(srna, "collision_compound", PROP_BOOLEAN, PROP_NONE);
224         RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_CHILD);
225         RNA_def_property_ui_text(prop, "Collison Compound", "Add children to form a compound collision object.");
226
227         prop= RNA_def_property(srna, "collision_margin", PROP_FLOAT, PROP_NONE);
228         RNA_def_property_float_sdna(prop, NULL, "margin");
229         RNA_def_property_range(prop, 0.0, 1.0);
230         RNA_def_property_ui_text(prop, "Collision Margin", "Extra margin around object for collision detection, small amount required for stability.");
231
232         prop= RNA_def_property(srna, "state", PROP_BOOLEAN, PROP_NONE);
233         RNA_def_property_boolean_sdna(prop, NULL, "state", 1);
234         RNA_def_property_array(prop, 30);
235         RNA_def_property_ui_text(prop, "State", "State determining which controllers are displayed.");
236         RNA_def_property_boolean_funcs(prop, NULL, "rna_ObjectGameSettings_state_set");
237
238         prop= RNA_def_property(srna, "initial_state", PROP_BOOLEAN, PROP_NONE);
239         RNA_def_property_boolean_sdna(prop, NULL, "init_state", 1);
240         RNA_def_property_array(prop, 30);
241         RNA_def_property_ui_text(prop, "Initial State", "Initial state when the game starts.");
242 }
243
244 static void rna_def_object(BlenderRNA *brna)
245 {
246         StructRNA *srna;
247         PropertyRNA *prop;
248         
249         srna= RNA_def_struct(brna, "Object", "ID");
250         RNA_def_struct_ui_text(srna, "Object", "DOC_BROKEN");
251
252         prop= RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
253         RNA_def_property_struct_type(prop, "ID");
254         RNA_def_property_ui_text(prop, "Data", "Object data.");
255
256         prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_NONE);
257         RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
258         RNA_def_property_array(prop, 20);
259         RNA_def_property_ui_text(prop, "Layers", "Layers the object is on.");
260         RNA_def_property_boolean_funcs(prop, NULL, "rna_Object_layer_set");
261
262         /* parent and track */
263
264         prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
265         RNA_def_property_ui_text(prop, "Parent", "Parent Object");
266
267         prop= RNA_def_property(srna, "track", PROP_POINTER, PROP_NONE);
268         RNA_def_property_ui_text(prop, "Track", "Object being tracked to define the rotation (Old Track).");
269
270         /* transform */
271
272         prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_VECTOR);
273         RNA_def_property_float_sdna(prop, NULL, "loc");
274         RNA_def_property_ui_text(prop, "Location", "Location of the object.");
275         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
276
277         prop= RNA_def_property(srna, "delta_location", PROP_FLOAT, PROP_VECTOR);
278         RNA_def_property_float_sdna(prop, NULL, "dloc");
279         RNA_def_property_ui_text(prop, "Delta Location", "Extra added translation to object location.");
280         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
281         
282         prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ROTATION);
283         RNA_def_property_float_sdna(prop, NULL, "rot");
284         RNA_def_property_ui_text(prop, "Rotation", "Rotation of the object.");
285         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
286
287         prop= RNA_def_property(srna, "delta_rotation", PROP_FLOAT, PROP_ROTATION);
288         RNA_def_property_float_sdna(prop, NULL, "drot");
289         RNA_def_property_ui_text(prop, "Delta Rotation", "Extra added rotation to the rotation of the object.");
290         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
291         
292         prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_VECTOR);
293         RNA_def_property_float_sdna(prop, NULL, "size");
294         RNA_def_property_ui_text(prop, "Scale", "Scaling of the object.");
295         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
296
297         prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_VECTOR);
298         RNA_def_property_float_sdna(prop, NULL, "dsize");
299         RNA_def_property_ui_text(prop, "Delta Scale", "Extra added scaling to the scale of the object.");
300         RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_update");
301
302         /* collections */
303
304         prop= RNA_def_property(srna, "ipo", PROP_POINTER, PROP_NONE);
305         RNA_def_property_struct_type(prop, "Ipo");
306         RNA_def_property_ui_text(prop, "Ipo", "DOC_BROKEN");
307
308         prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
309         RNA_def_property_struct_type(prop, "Constraint");
310         RNA_def_property_ui_text(prop, "Constraints", "DOC_BROKEN");
311         
312         prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE);
313         RNA_def_property_struct_type(prop, "Modifier");
314         RNA_def_property_ui_text(prop, "Modifiers", "DOC_BROKEN");
315
316         /* game engine */
317
318         prop= RNA_def_property(srna, "game_settings", PROP_POINTER, PROP_NONE);
319         RNA_def_property_struct_type(prop, "ObjectGameSettings");
320         RNA_def_property_pointer_funcs(prop, "rna_Object_game_settings_get", NULL, NULL);
321         RNA_def_property_ui_text(prop, "Game Settings", "Game engine related settings for the object.");
322
323         /* vertex groups */
324
325         prop= RNA_def_property(srna, "vertex_groups", PROP_COLLECTION, PROP_NONE);
326         RNA_def_property_collection_sdna(prop, NULL, "defbase", NULL);
327         RNA_def_property_struct_type(prop, "VertexGroup");
328         RNA_def_property_ui_text(prop, "Vertex Groups", "Vertex groups of the object.");
329
330         prop= RNA_def_property(srna, "active_vertex_group", PROP_POINTER, PROP_NONE);
331         RNA_def_property_struct_type(prop, "VertexGroup");
332         RNA_def_property_pointer_funcs(prop, "rna_Object_active_vertex_group_get", NULL, NULL);
333         RNA_def_property_ui_text(prop, "Active Vertex Group", "Vertex groups of the object.");
334
335         /* various */
336
337         prop= RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
338         RNA_def_property_int_sdna(prop, NULL, "index");
339         RNA_def_property_ui_text(prop, "Pass Index", "Index # for the IndexOB render pass.");
340
341         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
342         RNA_def_property_float_sdna(prop, NULL, "col");
343         RNA_def_property_ui_text(prop, "Color", "Object color and alpha, used when faces have the ObColor mode enabled.");
344 }
345
346 void RNA_def_object(BlenderRNA *brna)
347 {
348         rna_def_vertex_group(brna);
349         rna_def_object_game_settings(brna);
350         rna_def_object(brna);
351 }
352
353 #endif
354