f04001d8a642d425181b6bea65845e9c1c2a4669
[blender.git] / source / blender / makesrna / intern / rna_object_force.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), Thomas Dinges
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26
27 #include "RNA_define.h"
28 #include "RNA_types.h"
29
30 #include "rna_internal.h"
31
32 #include "DNA_object_types.h"
33 #include "DNA_object_force.h"
34 #include "DNA_scene_types.h"
35
36 #include "WM_api.h"
37 #include "WM_types.h"
38
39 #ifdef RNA_RUNTIME
40
41 #include "MEM_guardedalloc.h"
42
43 #include "DNA_modifier_types.h"
44 #include "DNA_texture_types.h"
45
46 #include "BKE_context.h"
47 #include "BKE_modifier.h"
48 #include "BKE_pointcache.h"
49 #include "BKE_depsgraph.h"
50
51 #include "BLI_blenlib.h"
52
53 #include "ED_object.h"
54
55 static void rna_Cache_change(bContext *C, PointerRNA *ptr)
56 {
57         Scene *scene = CTX_data_scene(C);
58         Object *ob = CTX_data_active_object(C);
59         PointCache *cache = (PointCache*)ptr->data;
60         PTCacheID *pid = NULL;
61         ListBase pidlist;
62
63         if(!ob)
64                 return;
65
66         cache->flag |= PTCACHE_OUTDATED;
67
68         BKE_ptcache_ids_from_object(&pidlist, ob);
69
70         DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
71
72         for(pid=pidlist.first; pid; pid=pid->next) {
73                 if(pid->cache==cache)
74                         break;
75         }
76
77         if(pid)
78                 BKE_ptcache_update_info(pid);
79
80         BLI_freelistN(&pidlist);
81 }
82
83 static void rna_Cache_toggle_disk_cache(bContext *C, PointerRNA *ptr)
84 {
85         Object *ob = CTX_data_active_object(C);
86         PointCache *cache = (PointCache*)ptr->data;
87         PTCacheID *pid = NULL;
88         ListBase pidlist;
89
90         if(!ob)
91                 return;
92
93         BKE_ptcache_ids_from_object(&pidlist, ob);
94
95         for(pid=pidlist.first; pid; pid=pid->next) {
96                 if(pid->cache==cache)
97                         break;
98         }
99
100         if(pid)
101                 BKE_ptcache_toggle_disk_cache(pid);
102
103         BLI_freelistN(&pidlist);
104 }
105
106 static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr)
107 {
108         Scene *scene = CTX_data_scene(C);
109         Object *ob = CTX_data_active_object(C);
110         PointCache *cache = (PointCache*)ptr->data;
111         PTCacheID *pid = NULL, *pid2= NULL;
112         ListBase pidlist;
113         int new_name = 1;
114         char name[80];
115
116         if(!ob)
117                 return;
118
119         /* TODO: check for proper characters */
120
121         BKE_ptcache_ids_from_object(&pidlist, ob);
122
123         if(cache->flag & PTCACHE_EXTERNAL) {
124                 for(pid=pidlist.first; pid; pid=pid->next) {
125                         if(pid->cache==cache)
126                                 break;
127                 }
128
129                 if(!pid)
130                         return;
131
132                 cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
133                 cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
134
135                 BKE_ptcache_load_external(pid);
136                 DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
137         }
138         else {
139                 for(pid=pidlist.first; pid; pid=pid->next) {
140                         if(pid->cache==cache)
141                                 pid2 = pid;
142                         else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) {
143                                 /*TODO: report "name exists" to user */
144                                 strcpy(cache->name, cache->prev_name);
145                                 new_name = 0;
146                         }
147                 }
148
149                 if(new_name) {
150                         if(pid2 && cache->flag & PTCACHE_DISK_CACHE) {
151                                 strcpy(name, cache->name);
152                                 strcpy(cache->name, cache->prev_name);
153
154                                 cache->flag &= ~PTCACHE_DISK_CACHE;
155
156                                 BKE_ptcache_toggle_disk_cache(pid2);
157
158                                 strcpy(cache->name, name);
159
160                                 cache->flag |= PTCACHE_DISK_CACHE;
161
162                                 BKE_ptcache_toggle_disk_cache(pid2);
163                         }
164
165                         strcpy(cache->prev_name, cache->name);
166                 }
167         }
168
169         BLI_freelistN(&pidlist);
170 }
171
172 static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr)
173 {
174         Object *data= (Object*)(ptr->id.data);
175         return (((data->softflag) & OB_SB_EDGES) != 0);
176 }
177
178 static void rna_SoftBodySettings_use_edges_set(PointerRNA *ptr, int value)
179 {
180         Object *data= (Object*)(ptr->id.data);
181         if(value) data->softflag |= OB_SB_EDGES;
182         else data->softflag &= ~OB_SB_EDGES;
183 }
184
185 static int rna_SoftBodySettings_use_goal_get(PointerRNA *ptr)
186 {
187         Object *data= (Object*)(ptr->id.data);
188         return (((data->softflag) & OB_SB_GOAL) != 0);
189 }
190
191 static void rna_SoftBodySettings_use_goal_set(PointerRNA *ptr, int value)
192 {
193         Object *data= (Object*)(ptr->id.data);
194         if(value) data->softflag |= OB_SB_GOAL;
195         else data->softflag &= ~OB_SB_GOAL;
196 }
197
198 static int rna_SoftBodySettings_stiff_quads_get(PointerRNA *ptr)
199 {
200         Object *data= (Object*)(ptr->id.data);
201         return (((data->softflag) & OB_SB_QUADS) != 0);
202 }
203
204 static void rna_SoftBodySettings_stiff_quads_set(PointerRNA *ptr, int value)
205 {
206         Object *data= (Object*)(ptr->id.data);
207         if(value) data->softflag |= OB_SB_QUADS;
208         else data->softflag &= ~OB_SB_QUADS;
209 }
210
211 static int rna_SoftBodySettings_self_collision_get(PointerRNA *ptr)
212 {
213         Object *data= (Object*)(ptr->id.data);
214         return (((data->softflag) & OB_SB_SELF) != 0);
215 }
216
217 static void rna_SoftBodySettings_self_collision_set(PointerRNA *ptr, int value)
218 {
219         Object *data= (Object*)(ptr->id.data);
220         if(value) data->softflag |= OB_SB_SELF;
221         else data->softflag &= ~OB_SB_SELF;
222 }
223
224 static int rna_SoftBodySettings_new_aero_get(PointerRNA *ptr)
225 {
226         Object *data= (Object*)(ptr->id.data);
227         return (((data->softflag) & OB_SB_AERO_ANGLE) != 0);
228 }
229
230 static void rna_SoftBodySettings_new_aero_set(PointerRNA *ptr, int value)
231 {
232         Object *data= (Object*)(ptr->id.data);
233         if(value) data->softflag |= OB_SB_AERO_ANGLE;
234         else data->softflag &= ~OB_SB_AERO_ANGLE;
235 }
236
237 static int rna_SoftBodySettings_face_collision_get(PointerRNA *ptr)
238 {
239         Object *data= (Object*)(ptr->id.data);
240         return (((data->softflag) & OB_SB_FACECOLL) != 0);
241 }
242
243 static void rna_SoftBodySettings_face_collision_set(PointerRNA *ptr, int value)
244 {
245         Object *data= (Object*)(ptr->id.data);
246         if(value) data->softflag |= OB_SB_FACECOLL;
247         else data->softflag &= ~OB_SB_FACECOLL;
248 }
249
250 static int rna_SoftBodySettings_edge_collision_get(PointerRNA *ptr)
251 {
252         Object *data= (Object*)(ptr->id.data);
253         return (((data->softflag) & OB_SB_EDGECOLL) != 0);
254 }
255
256 static void rna_SoftBodySettings_edge_collision_set(PointerRNA *ptr, int value)
257 {
258         Object *data= (Object*)(ptr->id.data);
259         if(value) data->softflag |= OB_SB_EDGECOLL;
260         else data->softflag &= ~OB_SB_EDGECOLL;
261 }
262
263 static void rna_SoftBodySettings_goal_vgroup_get(PointerRNA *ptr, char *value)
264 {
265         SoftBody *sb= (SoftBody*)ptr->data;
266         rna_object_vgroup_name_index_get(ptr, value, sb->vertgroup);
267 }
268
269 static int rna_SoftBodySettings_goal_vgroup_length(PointerRNA *ptr)
270 {
271         SoftBody *sb= (SoftBody*)ptr->data;
272         return rna_object_vgroup_name_index_length(ptr, sb->vertgroup);
273 }
274
275 static void rna_SoftBodySettings_goal_vgroup_set(PointerRNA *ptr, const char *value)
276 {
277         SoftBody *sb= (SoftBody*)ptr->data;
278         rna_object_vgroup_name_index_set(ptr, value, &sb->vertgroup);
279 }
280
281 static void rna_FieldSettings_update(bContext *C, PointerRNA *ptr)
282 {
283         Scene *scene= CTX_data_scene(C);
284         Object *ob= (Object*)ptr->id.data;
285
286         if(ob->pd->forcefield != PFIELD_TEXTURE && ob->pd->tex) {
287                 ob->pd->tex->id.us--;
288                 ob->pd->tex= 0;
289         }
290
291         DAG_object_flush_update(scene, ob, OB_RECALC_OB);
292         WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
293 }
294
295 static void rna_FieldSettings_surface_update(bContext *C, PointerRNA *ptr)
296 {
297         Scene *scene= CTX_data_scene(C);
298         Object *ob= (Object*)ptr->id.data;
299         PartDeflect *pd= ob->pd;
300         ModifierData *md= modifiers_findByType(ob, eModifierType_Surface);
301
302         /* add/remove modifier as needed */
303         if(!md) {
304                 if(pd && (pd->flag & PFIELD_SURFACE))
305                         if(ELEM6(pd->forcefield,PFIELD_HARMONIC,PFIELD_FORCE,PFIELD_HARMONIC,PFIELD_CHARGE,PFIELD_LENNARDJ,PFIELD_BOID))
306                                 if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE))
307                                         ED_object_modifier_add(NULL, scene, ob, eModifierType_Surface);
308         }
309         else {
310                 if(!pd || !(pd->flag & PFIELD_SURFACE))
311                         ED_object_modifier_remove(NULL, scene, ob, md);
312         }
313
314         WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
315 }
316
317 static void rna_FieldSettings_dependency_update(bContext *C, PointerRNA *ptr)
318 {
319         Scene *scene= CTX_data_scene(C);
320         Object *ob= (Object*)ptr->id.data;
321
322         /* do this before scene sort, that one checks for CU_PATH */
323         /* XXX if(ob->type==OB_CURVE && ob->pd->forcefield==PFIELD_GUIDE) {
324                 Curve *cu= ob->data;
325                 cu->flag |= (CU_PATH|CU_3D);
326                 do_curvebuts(B_CU3D);  // all curves too
327         }*/
328
329         rna_FieldSettings_surface_update(C, ptr);
330
331         DAG_scene_sort(scene);
332
333         if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE)
334                 DAG_object_flush_update(scene, ob, OB_RECALC);
335         else
336                 DAG_object_flush_update(scene, ob, OB_RECALC_OB);
337
338         WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
339 }
340
341 static void rna_CollisionSettings_dependency_update(bContext *C, PointerRNA *ptr)
342 {
343         Scene *scene= CTX_data_scene(C);
344         Object *ob= (Object*)ptr->id.data;
345         ModifierData *md= modifiers_findByType(ob, eModifierType_Collision);
346
347         /* add/remove modifier as needed */
348         if(ob->pd->deflect && !md)
349                 ED_object_modifier_add(NULL, scene, ob, eModifierType_Collision);
350         else if(!ob->pd->deflect && md)
351                 ED_object_modifier_remove(NULL, scene, ob, md);
352
353         WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
354 }
355
356 static void rna_CollisionSettings_update(bContext *C, PointerRNA *ptr)
357 {
358         Scene *scene= CTX_data_scene(C);
359         Object *ob= (Object*)ptr->id.data;
360
361         DAG_object_flush_update(scene, ob, OB_RECALC);
362         WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
363 }
364
365 #else
366
367 static void rna_def_pointcache(BlenderRNA *brna)
368 {
369         StructRNA *srna;
370         PropertyRNA *prop;
371
372         srna= RNA_def_struct(brna, "PointCache", NULL);
373         RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations.");
374         
375         prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
376         RNA_def_property_int_sdna(prop, NULL, "startframe");
377         RNA_def_property_range(prop, 1, 300000);
378         RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts.");
379         
380         prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME);
381         RNA_def_property_int_sdna(prop, NULL, "endframe");
382         RNA_def_property_range(prop, 1, 300000);
383         RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops.");
384
385         prop= RNA_def_property(srna, "step", PROP_INT, PROP_NONE);
386         RNA_def_property_range(prop, 1, 20);
387         RNA_def_property_ui_text(prop, "Cache Step", "Number of frames between cached frames.");
388         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
389
390         prop= RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
391         RNA_def_property_int_sdna(prop, NULL, "index");
392         RNA_def_property_range(prop, -1, 100);
393         RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files.");
394         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
395
396         /* flags */
397         prop= RNA_def_property(srna, "baked", PROP_BOOLEAN, PROP_NONE);
398         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
399         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
400
401         prop= RNA_def_property(srna, "baking", PROP_BOOLEAN, PROP_NONE);
402         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKING);
403         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
404
405         prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE);
406         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_DISK_CACHE);
407         RNA_def_property_ui_text(prop, "Disk Cache", "Save cache files to disk");
408         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_disk_cache");
409
410         prop= RNA_def_property(srna, "outdated", PROP_BOOLEAN, PROP_NONE);
411         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_OUTDATED);
412         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
413         RNA_def_property_ui_text(prop, "Cache is outdated", "");
414
415         prop= RNA_def_property(srna, "frames_skipped", PROP_BOOLEAN, PROP_NONE);
416         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_FRAMES_SKIPPED);
417         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
418
419         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
420         RNA_def_property_string_sdna(prop, NULL, "name");
421         RNA_def_property_ui_text(prop, "Name", "Cache name");
422         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
423
424         prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
425         RNA_def_property_string_sdna(prop, NULL, "path");
426         RNA_def_property_ui_text(prop, "File Path", "Cache file path.");
427         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
428
429         prop= RNA_def_property(srna, "quick_cache", PROP_BOOLEAN, PROP_NONE);
430         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_QUICK_CACHE);
431         RNA_def_property_ui_text(prop, "Quick Cache", "Update simulation with cache steps");
432         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
433
434         prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE);
435         RNA_def_property_string_sdna(prop, NULL, "info");
436         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
437         RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status.");
438
439         prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE);
440         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL);
441         RNA_def_property_ui_text(prop, "External", "Read cache from an external location");
442         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
443 }
444
445 static void rna_def_collision(BlenderRNA *brna)
446 {
447         StructRNA *srna;
448         PropertyRNA *prop;
449
450         srna= RNA_def_struct(brna, "CollisionSettings", NULL);
451         RNA_def_struct_sdna(srna, "PartDeflect");
452         RNA_def_struct_ui_text(srna, "Collision Settings", "Collision settings for object in physics simulation.");
453         
454         prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
455         RNA_def_property_boolean_sdna(prop, NULL, "deflect", 1);
456         RNA_def_property_ui_text(prop, "Enabled", "Enable this objects as a collider for physics systems");
457         RNA_def_property_update(prop, 0, "rna_CollisionSettings_dependency_update");
458         
459         /* Particle Interaction */
460         
461         prop= RNA_def_property(srna, "damping_factor", PROP_FLOAT, PROP_NONE);
462         RNA_def_property_float_sdna(prop, NULL, "pdef_damp");
463         RNA_def_property_range(prop, 0.0f, 1.0f);
464         RNA_def_property_ui_text(prop, "Damping Factor", "Amount of damping during particle collision");
465         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
466         
467         prop= RNA_def_property(srna, "random_damping", PROP_FLOAT, PROP_NONE);
468         RNA_def_property_float_sdna(prop, NULL, "pdef_rdamp");
469         RNA_def_property_range(prop, 0.0f, 1.0f);
470         RNA_def_property_ui_text(prop, "Random Damping", "Random variation of damping");
471         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
472         
473         prop= RNA_def_property(srna, "friction_factor", PROP_FLOAT, PROP_NONE);
474         RNA_def_property_float_sdna(prop, NULL, "pdef_frict");
475         RNA_def_property_range(prop, 0.0f, 1.0f);
476         RNA_def_property_ui_text(prop, "Friction Factor", "Amount of friction during particle collision");
477         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
478         
479         prop= RNA_def_property(srna, "random_friction", PROP_FLOAT, PROP_NONE);
480         RNA_def_property_float_sdna(prop, NULL, "pdef_rfrict");
481         RNA_def_property_range(prop, 0.0f, 1.0f);
482         RNA_def_property_ui_text(prop, "Random Friction", "Random variation of friction");
483         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
484                 
485         prop= RNA_def_property(srna, "permeability", PROP_FLOAT, PROP_NONE);
486         RNA_def_property_float_sdna(prop, NULL, "pdef_perm");
487         RNA_def_property_range(prop, 0.0f, 1.0f);
488         RNA_def_property_ui_text(prop, "Permeability", "Chance that the particle will pass through the mesh");
489         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
490         
491         prop= RNA_def_property(srna, "kill_particles", PROP_BOOLEAN, PROP_NONE);
492         RNA_def_property_boolean_sdna(prop, NULL, "flag", PDEFLE_KILL_PART);
493         RNA_def_property_ui_text(prop, "Kill Particles", "Kill collided particles");
494         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
495         
496         /* Soft Body and Cloth Interaction */
497         
498         prop= RNA_def_property(srna, "inner_thickness", PROP_FLOAT, PROP_NONE);
499         RNA_def_property_float_sdna(prop, NULL, "pdef_sbift");
500         RNA_def_property_range(prop, 0.001f, 1.0f);
501         RNA_def_property_ui_text(prop, "Inner Thickness", "Inner face thickness");
502         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
503         
504         prop= RNA_def_property(srna, "outer_thickness", PROP_FLOAT, PROP_NONE);
505         RNA_def_property_float_sdna(prop, NULL, "pdef_sboft");
506         RNA_def_property_range(prop, 0.001f, 1.0f);
507         RNA_def_property_ui_text(prop, "Outer Thickness", "Outer face thickness");
508         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
509         
510         prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
511         RNA_def_property_float_sdna(prop, NULL, "pdef_sbdamp");
512         RNA_def_property_range(prop, 0.0f, 1.0f);
513         RNA_def_property_ui_text(prop, "Damping", "Amount of damping during collision");
514         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
515         
516         /* Does this belong here?
517         prop= RNA_def_property(srna, "collision_stack", PROP_BOOLEAN, PROP_NONE);
518         RNA_def_property_boolean_sdna(prop, NULL, "softflag", OB_SB_COLLFINAL);
519         RNA_def_property_ui_text(prop, "Collision from Stack", "Pick collision object from modifier stack (softbody only)");
520         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
521         */
522 }
523
524 static void rna_def_field(BlenderRNA *brna)
525 {
526         StructRNA *srna;
527         PropertyRNA *prop;
528         
529         static EnumPropertyItem field_type_items[] = {
530                 {0, "NONE", 0, "None", ""},
531                 {PFIELD_FORCE, "SPHERICAL", 0, "Spherical", ""},
532                 {PFIELD_VORTEX, "VORTEX", 0, "Vortex", ""},
533                 {PFIELD_MAGNET, "MAGNET", 0, "Magnetic", ""},
534                 {PFIELD_WIND, "WIND", 0, "Wind", ""},
535                 {PFIELD_GUIDE, "GUIDE", 0, "Curve Guide", ""},
536                 {PFIELD_TEXTURE, "TEXTURE", 0, "Texture", ""},
537                 {PFIELD_HARMONIC, "HARMONIC", 0, "Harmonic", ""},
538                 {PFIELD_CHARGE, "CHARGE", 0, "Charge", ""},
539                 {PFIELD_LENNARDJ, "LENNARDJ", 0, "Lennard-Jones", ""},
540                 {PFIELD_BOID, "BOID", 0, "Boid", ""},
541                 {0, NULL, 0, NULL, NULL}};
542                 
543         static EnumPropertyItem falloff_items[] = {
544                 {PFIELD_FALL_SPHERE, "SPHERE", 0, "Sphere", ""},
545                 {PFIELD_FALL_TUBE, "TUBE", 0, "Tube", ""},
546                 {PFIELD_FALL_CONE, "CONE", 0, "Cone", ""},
547                 {0, NULL, 0, NULL, NULL}};
548                 
549         static EnumPropertyItem texture_items[] = {
550                 {PFIELD_TEX_RGB, "RGB", 0, "RGB", ""},
551                 {PFIELD_TEX_GRAD, "GRADIENT", 0, "Gradient", ""},
552                 {PFIELD_TEX_CURL, "CURL", 0, "Curl", ""},
553                 {0, NULL, 0, NULL, NULL}};
554
555         srna= RNA_def_struct(brna, "FieldSettings", NULL);
556         RNA_def_struct_sdna(srna, "PartDeflect");
557         RNA_def_struct_ui_text(srna, "Field Settings", "Field settings for an object in physics simulation.");
558         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
559         
560         /* Enums */
561         
562         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
563         RNA_def_property_enum_sdna(prop, NULL, "forcefield");
564         RNA_def_property_enum_items(prop, field_type_items);
565         RNA_def_property_ui_text(prop, "Type", "Type of field.");
566         RNA_def_property_update(prop, 0, "rna_FieldSettings_dependency_update");
567         
568         prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
569         RNA_def_property_enum_sdna(prop, NULL, "falloff");
570         RNA_def_property_enum_items(prop, falloff_items);
571         RNA_def_property_ui_text(prop, "Fall-Off", "Fall-off shape.");
572         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
573         
574         prop= RNA_def_property(srna, "texture_mode", PROP_ENUM, PROP_NONE);
575         RNA_def_property_enum_sdna(prop, NULL, "tex_mode");
576         RNA_def_property_enum_items(prop, texture_items);
577         RNA_def_property_ui_text(prop, "Texture Mode", "How the texture effect is calculated (RGB & Curl need a RGB texture else Gradient will be used instead)");
578         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
579         
580         /* Float */
581         
582         prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
583         RNA_def_property_float_sdna(prop, NULL, "f_strength");
584         RNA_def_property_range(prop, -1000.0f, 1000.0f);
585         RNA_def_property_ui_text(prop, "Strength", "Strength of force field");
586         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
587         
588         prop= RNA_def_property(srna, "falloff_power", PROP_FLOAT, PROP_NONE);
589         RNA_def_property_float_sdna(prop, NULL, "f_power");
590         RNA_def_property_range(prop, 0.0f, 10.0f);
591         RNA_def_property_ui_text(prop, "Falloff Power", "Falloff power (real gravitational falloff = 2)");
592         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
593         
594         prop= RNA_def_property(srna, "harmonic_damping", PROP_FLOAT, PROP_NONE);
595         RNA_def_property_float_sdna(prop, NULL, "f_damp");
596         RNA_def_property_range(prop, 0.0f, 10.0f);
597         RNA_def_property_ui_text(prop, "Harmonic Damping", "Damping of the harmonic force");
598         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
599         
600         prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
601         RNA_def_property_float_sdna(prop, NULL, "mindist");
602         RNA_def_property_range(prop, 0.0f, 1000.0f);
603         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance for the field's fall-off");
604         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
605         
606         prop= RNA_def_property(srna, "maximum_distance", PROP_FLOAT, PROP_NONE);
607         RNA_def_property_float_sdna(prop, NULL, "maxdist");
608         RNA_def_property_range(prop, 0.0f, 1000.0f);
609         RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance for the field to work");
610         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
611         
612         prop= RNA_def_property(srna, "radial_minimum", PROP_FLOAT, PROP_NONE);
613         RNA_def_property_float_sdna(prop, NULL, "minrad");
614         RNA_def_property_range(prop, 0.0f, 1000.0f);
615         RNA_def_property_ui_text(prop, "Minimum Radial Distance", "Minimum radial distance for the field's fall-off");
616         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
617         
618         prop= RNA_def_property(srna, "radial_maximum", PROP_FLOAT, PROP_NONE);
619         RNA_def_property_float_sdna(prop, NULL, "maxrad");
620         RNA_def_property_range(prop, 0.0f, 1000.0f);
621         RNA_def_property_ui_text(prop, "Maximum Radial Distance", "Maximum radial distance for the field to work");
622         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
623         
624         prop= RNA_def_property(srna, "radial_falloff", PROP_FLOAT, PROP_NONE);
625         RNA_def_property_float_sdna(prop, NULL, "f_power_r");
626         RNA_def_property_range(prop, 0.0f, 10.0f);
627         RNA_def_property_ui_text(prop, "Radial Falloff Power", "Radial falloff power (real gravitational falloff = 2)");
628         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
629
630         prop= RNA_def_property(srna, "texture_nabla", PROP_FLOAT, PROP_NONE);
631         RNA_def_property_float_sdna(prop, NULL, "tex_nabla");
632         RNA_def_property_range(prop, 0.0001f, 1.0f);
633         RNA_def_property_ui_text(prop, "Nabla", "Defines size of derivative offset used for calculating gradient and curl");
634         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
635         
636         prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE);
637         RNA_def_property_float_sdna(prop, NULL, "f_noise");
638         RNA_def_property_range(prop, 0.0f, 10.0f);
639         RNA_def_property_ui_text(prop, "Noise", "Noise of the wind force");
640         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
641
642         prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
643         RNA_def_property_range(prop, 1, 128);
644         RNA_def_property_ui_text(prop, "Seed", "Seed of the wind noise");
645         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
646
647         /* Boolean */
648         
649         prop= RNA_def_property(srna, "use_min_distance", PROP_BOOLEAN, PROP_NONE);
650         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMIN);
651         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum distance for the field's fall-off");
652         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
653         
654         prop= RNA_def_property(srna, "use_max_distance", PROP_BOOLEAN, PROP_NONE);
655         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAX);
656         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum distance for the field to work");
657         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
658         
659         prop= RNA_def_property(srna, "use_radial_min", PROP_BOOLEAN, PROP_NONE);
660         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMINR);
661         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum radial distance for the field's fall-off");
662         // "Use a minimum angle for the field's fall-off"
663         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
664         
665         prop= RNA_def_property(srna, "use_radial_max", PROP_BOOLEAN, PROP_NONE);
666         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAXR);
667         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum radial distance for the field to work");
668         // "Use a maximum angle for the field to work"
669         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
670         
671         prop= RNA_def_property(srna, "guide_path_add", PROP_BOOLEAN, PROP_NONE);
672         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_ADD);
673         RNA_def_property_ui_text(prop, "Additive", "Based on distance/falloff it adds a portion of the entire path");
674         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
675         
676         prop= RNA_def_property(srna, "planar", PROP_BOOLEAN, PROP_NONE);
677         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_PLANAR);
678         RNA_def_property_ui_text(prop, "Planar", "Create planar field");
679         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
680         
681         prop= RNA_def_property(srna, "surface", PROP_BOOLEAN, PROP_NONE);
682         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_SURFACE);
683         RNA_def_property_ui_text(prop, "Surface", "Use closest point on surface");
684         RNA_def_property_update(prop, 0, "rna_FieldSettings_surface_update");
685         
686         prop= RNA_def_property(srna, "positive_z", PROP_BOOLEAN, PROP_NONE);
687         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_POSZ);
688         RNA_def_property_ui_text(prop, "Positive", "Effect only in direction of positive Z axis");
689         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
690         
691         prop= RNA_def_property(srna, "use_coordinates", PROP_BOOLEAN, PROP_NONE);
692         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_OBJECT);
693         RNA_def_property_ui_text(prop, "Use Coordinates", "Use object/global coordinates for texture");
694         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
695         
696         prop= RNA_def_property(srna, "force_2d", PROP_BOOLEAN, PROP_NONE);
697         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_2D);
698         RNA_def_property_ui_text(prop, "2D", "Apply force only in 2d");
699         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
700         
701         prop= RNA_def_property(srna, "root_coordinates", PROP_BOOLEAN, PROP_NONE);
702         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_ROOTCO);
703         RNA_def_property_ui_text(prop, "Root Texture Coordinates", "Texture coordinates from root particle locations");
704         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
705         
706         /* Pointer */
707         
708         prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
709         RNA_def_property_pointer_sdna(prop, NULL, "tex");
710         RNA_def_property_flag(prop, PROP_EDITABLE);
711         RNA_def_property_ui_text(prop, "Texture", "Texture to use as force");
712         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
713 }
714
715 static void rna_def_game_softbody(BlenderRNA *brna)
716 {
717         StructRNA *srna;
718         PropertyRNA *prop;
719
720         srna= RNA_def_struct(brna, "GameSoftBodySettings", NULL);
721         RNA_def_struct_sdna(srna, "BulletSoftBody");
722         RNA_def_struct_ui_text(srna, "Game Soft Body Settings", "Soft body simulation settings for an object in the game engine.");
723         
724         /* Floats */
725         
726         prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE);
727         RNA_def_property_float_sdna(prop, NULL, "linStiff");
728         RNA_def_property_range(prop, 0.0f, 1.0f);
729         RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links");
730         
731         prop= RNA_def_property(srna, "dynamic_friction", PROP_FLOAT, PROP_NONE);
732         RNA_def_property_float_sdna(prop, NULL, "kDF");
733         RNA_def_property_range(prop, 0.0f, 1.0f);
734         RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction");
735         
736         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
737         RNA_def_property_float_sdna(prop, NULL, "kMT");
738         RNA_def_property_range(prop, 0.0f, 1.0f);
739         RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold");
740         
741         prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE);
742         RNA_def_property_float_sdna(prop, NULL, "margin");
743         RNA_def_property_range(prop, 0.01f, 1.0f);
744         RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable");
745         
746         prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE);
747         RNA_def_property_float_sdna(prop, NULL, "welding");
748         RNA_def_property_range(prop, 0.0f, 0.01f);
749         RNA_def_property_ui_text(prop, "Welding", "Welding threshold: distance between nearby vertices to be considered equal => set to 0.0 to disable welding test and speed up scene loading (ok if the mesh has no duplicates)");
750
751         /* Integers */
752         
753         prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE);
754         RNA_def_property_int_sdna(prop, NULL, "piterations");
755         RNA_def_property_range(prop, 0, 10);
756         RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations");
757         
758         prop= RNA_def_property(srna, "cluster_iterations", PROP_INT, PROP_NONE);
759         RNA_def_property_int_sdna(prop, NULL, "numclusteriterations");
760         RNA_def_property_range(prop, 1, 128);
761         RNA_def_property_ui_text(prop, "Cluster Iterations", "Specify the number of cluster iterations");
762         
763         /* Booleans */
764         
765         prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE);
766         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING);
767         RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal");
768         
769         prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE);
770         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS);
771         RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints");
772         
773         prop= RNA_def_property(srna, "enable_rs_collision", PROP_BOOLEAN, PROP_NONE);
774         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS);
775         RNA_def_property_ui_text(prop, "Cluster Collision RS", "Enable cluster collision between soft and rigid body");
776         
777         prop= RNA_def_property(srna, "enable_ss_collision", PROP_BOOLEAN, PROP_NONE);
778         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS);
779         RNA_def_property_ui_text(prop, "Cluster Collision SS", "Enable cluster collision between soft and soft body");
780 }
781
782 static void rna_def_softbody(BlenderRNA *brna)
783 {
784         StructRNA *srna;
785         PropertyRNA *prop;
786         
787         static EnumPropertyItem collision_type_items[] = {
788                 {SBC_MODE_MANUAL, "MANUAL", 0, "Manual", "Manual adjust"},
789                 {SBC_MODE_AVG, "AVERAGE", 0, "Average", "Average Spring length * Ball Size"},
790                 {SBC_MODE_MIN, "MINIMAL", 0, "Minimal", "Minimal Spring length * Ball Size"},
791                 {SBC_MODE_MAX, "MAXIMAL", 0, "Maximal", "Maximal Spring length * Ball Size"},
792                 {SBC_MODE_AVGMINMAX, "MINMAX", 0, "AvMinMax", "(Min+Max)/2 * Ball Size"},
793                 {0, NULL, 0, NULL, NULL}};
794
795         srna= RNA_def_struct(brna, "SoftBodySettings", NULL);
796         RNA_def_struct_sdna(srna, "SoftBody");
797         RNA_def_struct_ui_text(srna, "Soft Body Settings", "Soft body simulation settings for an object.");
798         
799         /* General Settings */
800         
801         prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
802         RNA_def_property_float_sdna(prop, NULL, "mediafrict");
803         RNA_def_property_range(prop, 0.0f, 50.0f);
804         RNA_def_property_ui_text(prop, "Friction", "General media friction for point movements");
805         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
806         
807         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
808         RNA_def_property_float_sdna(prop, NULL, "nodemass");
809         RNA_def_property_range(prop, 0.0f, 50000.0f);
810         RNA_def_property_ui_text(prop, "Mass", "");
811         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
812         
813         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
814         RNA_def_property_float_sdna(prop, NULL, "grav");
815         RNA_def_property_range(prop, -10.0f, 10.0f);
816         RNA_def_property_ui_text(prop, "Gravitation", "Apply gravitation to point movement");
817         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
818         
819         prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
820         RNA_def_property_float_sdna(prop, NULL, "physics_speed");
821         RNA_def_property_range(prop, 0.01f, 100.0f);
822         RNA_def_property_ui_text(prop, "Speed", "Tweak timing for physics to control frequency and speed");
823         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
824         
825         /* Goal */
826         
827         prop= RNA_def_property(srna, "goal_vertex_group", PROP_STRING, PROP_NONE);
828         RNA_def_property_string_sdna(prop, NULL, "vertgroup");
829         RNA_def_property_string_funcs(prop, "rna_SoftBodySettings_goal_vgroup_get", "rna_SoftBodySettings_goal_vgroup_length", "rna_SoftBodySettings_goal_vgroup_set");
830         RNA_def_property_ui_text(prop, "Goal Vertex Group", "Control point weight values.");
831         
832         prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
833         RNA_def_property_float_sdna(prop, NULL, "mingoal");
834         RNA_def_property_range(prop, 0.0f, 1.0f);
835         RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
836         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
837
838         prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
839         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
840         RNA_def_property_range(prop, 0.0f, 1.0f);
841         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
842         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
843
844         prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
845         RNA_def_property_float_sdna(prop, NULL, "defgoal");
846         RNA_def_property_range(prop, 0.0f, 1.0f);
847         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
848         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
849         
850         prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
851         RNA_def_property_float_sdna(prop, NULL, "goalspring");
852         RNA_def_property_range(prop, 0.0f, 0.999f);
853         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
854         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
855         
856         prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
857         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
858         RNA_def_property_range(prop, 0.0f, 50.0f);
859         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
860         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
861         
862         /* Edge Spring Settings */
863         
864         prop= RNA_def_property(srna, "pull", PROP_FLOAT, PROP_NONE);
865         RNA_def_property_float_sdna(prop, NULL, "inspring");
866         RNA_def_property_range(prop, 0.0f, 0.999f);
867         RNA_def_property_ui_text(prop, "Pull", "Edge spring stiffness when longer than rest length");
868         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
869         
870         prop= RNA_def_property(srna, "push", PROP_FLOAT, PROP_NONE);
871         RNA_def_property_float_sdna(prop, NULL, "inpush");
872         RNA_def_property_range(prop, 0.0f, 0.999f);
873         RNA_def_property_ui_text(prop, "Push", "Edge spring stiffness when shorter than rest length");
874         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
875         
876         prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
877         RNA_def_property_float_sdna(prop, NULL, "infrict");
878         RNA_def_property_range(prop, 0.0f, 50.0f);
879         RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
880         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
881         
882         prop= RNA_def_property(srna, "spring_length", PROP_FLOAT, PROP_NONE);
883         RNA_def_property_float_sdna(prop, NULL, "springpreload");
884         RNA_def_property_range(prop, 0.0f, 200.0f);
885         RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
886         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
887         
888         prop= RNA_def_property(srna, "aero", PROP_FLOAT, PROP_NONE);
889         RNA_def_property_float_sdna(prop, NULL, "aeroedge");
890         RNA_def_property_range(prop, 0.0f, 30000.0f);
891         RNA_def_property_ui_text(prop, "Aero", "Make edges 'sail'");
892         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
893         
894         prop= RNA_def_property(srna, "plastic", PROP_FLOAT, PROP_NONE);
895         RNA_def_property_float_sdna(prop, NULL, "plastic");
896         RNA_def_property_range(prop, 0.0f, 100.0f);
897         RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
898         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
899         
900         prop= RNA_def_property(srna, "bending", PROP_FLOAT, PROP_NONE);
901         RNA_def_property_float_sdna(prop, NULL, "secondspring");
902         RNA_def_property_range(prop, 0.0f, 10.0f);
903         RNA_def_property_ui_text(prop, "Bending", "Bending Stiffness");
904         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
905         
906         prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
907         RNA_def_property_float_sdna(prop, NULL, "shearstiff");
908         RNA_def_property_range(prop, 0.0f, 1.0f);
909         RNA_def_property_ui_text(prop, "Shear", "Shear Stiffness");
910         
911         /* Collision */
912         
913         prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
914         RNA_def_property_enum_sdna(prop, NULL, "sbc_mode");
915         RNA_def_property_enum_items(prop, collision_type_items);
916         RNA_def_property_ui_text(prop, "Collision Type", "Choose Collision Type");
917         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
918         
919         prop= RNA_def_property(srna, "ball_size", PROP_FLOAT, PROP_NONE);
920         RNA_def_property_float_sdna(prop, NULL, "colball");
921         RNA_def_property_range(prop, -10.0f, 10.0f);
922         RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted");
923         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
924         
925         prop= RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE);
926         RNA_def_property_float_sdna(prop, NULL, "ballstiff");
927         RNA_def_property_range(prop, 0.001f, 100.0f);
928         RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating presure");
929         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
930         
931         prop= RNA_def_property(srna, "ball_damp", PROP_FLOAT, PROP_NONE);
932         RNA_def_property_float_sdna(prop, NULL, "balldamp");
933         RNA_def_property_range(prop, 0.001f, 1.0f);
934         RNA_def_property_ui_text(prop, "Ball Size", "Blending to inelastic collision");
935         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
936         
937         /* Solver */
938         
939         prop= RNA_def_property(srna, "error_limit", PROP_FLOAT, PROP_NONE);
940         RNA_def_property_float_sdna(prop, NULL, "rklimit");
941         RNA_def_property_range(prop, 0.001f, 10.0f);
942         RNA_def_property_ui_text(prop, "Error Limit", "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
943         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
944         
945         prop= RNA_def_property(srna, "minstep", PROP_INT, PROP_NONE);
946         RNA_def_property_int_sdna(prop, NULL, "minloops");
947         RNA_def_property_range(prop, 0, 30000);
948         RNA_def_property_ui_text(prop, "Min Step", "Minimal # solver steps/frame");
949         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
950         
951         prop= RNA_def_property(srna, "maxstep", PROP_INT, PROP_NONE);
952         RNA_def_property_int_sdna(prop, NULL, "maxloops");
953         RNA_def_property_range(prop, 0, 30000);
954         RNA_def_property_ui_text(prop, "Max Step", "Maximal # solver steps/frame");
955         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
956         
957         prop= RNA_def_property(srna, "choke", PROP_INT, PROP_NONE);
958         RNA_def_property_int_sdna(prop, NULL, "choke");
959         RNA_def_property_range(prop, 0, 100);
960         RNA_def_property_ui_text(prop, "Choke", "'Viscosity' inside collision target");
961         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
962         
963         prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE);
964         RNA_def_property_int_sdna(prop, NULL, "fuzzyness");
965         RNA_def_property_range(prop, 1, 100);
966         RNA_def_property_ui_text(prop, "Fuzzy", "Fuzzyness while on collision, high values make collsion handling faster but less stable");
967         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
968         
969         prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
970         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_OLDERR);
971         RNA_def_property_ui_text(prop, "V", "Use velocities for automagic step sizes");
972         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
973         
974         prop= RNA_def_property(srna, "diagnose", PROP_BOOLEAN, PROP_NONE);
975         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_MONITOR);
976         RNA_def_property_ui_text(prop, "Print Performance to Console", "Turn on SB diagnose console prints");
977         
978         /* Flags */
979         
980         prop= RNA_def_property(srna, "use_goal", PROP_BOOLEAN, PROP_NONE);
981         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_goal_get", "rna_SoftBodySettings_use_goal_set");
982         RNA_def_property_ui_text(prop, "Use Goal", "Define forces for vertices to stick to animated position.");
983         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
984         
985         prop= RNA_def_property(srna, "use_edges", PROP_BOOLEAN, PROP_NONE);
986         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_edges_get", "rna_SoftBodySettings_use_edges_set");
987         RNA_def_property_ui_text(prop, "Use Edges", "Use Edges as springs");
988         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
989         
990         prop= RNA_def_property(srna, "stiff_quads", PROP_BOOLEAN, PROP_NONE);
991         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_stiff_quads_get", "rna_SoftBodySettings_stiff_quads_set");
992         RNA_def_property_ui_text(prop, "Stiff Quads", "Adds diagonal springs on 4-gons.");
993         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
994         
995         prop= RNA_def_property(srna, "edge_collision", PROP_BOOLEAN, PROP_NONE);
996         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_edge_collision_get", "rna_SoftBodySettings_edge_collision_set");
997         RNA_def_property_ui_text(prop, "Edge Collision", "Edges collide too.");
998         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
999         
1000         prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE);
1001         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_face_collision_get", "rna_SoftBodySettings_face_collision_set");
1002         RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, SLOOOOOW warning.");
1003         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
1004         
1005         prop= RNA_def_property(srna, "new_aero", PROP_BOOLEAN, PROP_NONE);
1006         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set");
1007         RNA_def_property_ui_text(prop, "N", "New aero(uses angle and length).");
1008         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
1009         
1010         prop= RNA_def_property(srna, "self_collision", PROP_BOOLEAN, PROP_NONE);
1011         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_self_collision_get", "rna_SoftBodySettings_self_collision_set");
1012         RNA_def_property_ui_text(prop, "Self Collision", "Enable naive vertex ball self collision.");
1013         RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
1014 }
1015
1016 void RNA_def_object_force(BlenderRNA *brna)
1017 {
1018         rna_def_pointcache(brna);
1019         rna_def_collision(brna);
1020         rna_def_field(brna);
1021         rna_def_game_softbody(brna);
1022         rna_def_softbody(brna);
1023 }
1024
1025 #endif