* Rest length parameter for harmonic force springs. Implementation is a slightly...
[blender-staging.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_cloth_types.h"
33 #include "DNA_object_types.h"
34 #include "DNA_object_force.h"
35 #include "DNA_particle_types.h"
36 #include "DNA_scene_types.h"
37 #include "DNA_smoke_types.h"
38
39 #include "WM_api.h"
40 #include "WM_types.h"
41
42 EnumPropertyItem effector_shape_items[] = {
43         {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
44         {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
45         {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Surface", ""},
46         {PFIELD_SHAPE_POINTS, "POINTS", 0, "Every Point", ""},
47         {0, NULL, 0, NULL, NULL}
48 };
49
50 EnumPropertyItem curve_shape_items[] = {
51         {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
52         {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
53         {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Curve", ""},
54         {0, NULL, 0, NULL, NULL}
55 };
56
57 EnumPropertyItem empty_shape_items[] = {
58         {PFIELD_SHAPE_POINT, "POINT", 0, "Point", ""},
59         {PFIELD_SHAPE_PLANE, "PLANE", 0, "Plane", ""},
60         {0, NULL, 0, NULL, NULL}
61 };
62
63 EnumPropertyItem vortex_shape_items[] = {
64         {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""},
65         {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""},
66         {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Surface falloff (New)", ""},
67         {PFIELD_SHAPE_POINTS, "POINTS", 0, "Every Point (New)", ""},
68         {0, NULL, 0, NULL, NULL}
69 };
70
71 EnumPropertyItem curve_vortex_shape_items[] = {
72         {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""},
73         {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""},
74         {PFIELD_SHAPE_SURFACE, "SURFACE", 0, "Curve (New)", ""},
75         {0, NULL, 0, NULL, NULL}
76 };
77
78 EnumPropertyItem empty_vortex_shape_items[] = {
79         {PFIELD_SHAPE_POINT, "POINT", 0, "Old", ""},
80         {PFIELD_SHAPE_PLANE, "PLANE", 0, "New", ""},
81         {0, NULL, 0, NULL, NULL}
82 };
83
84 #ifdef RNA_RUNTIME
85
86 #include "MEM_guardedalloc.h"
87
88 #include "DNA_modifier_types.h"
89 #include "DNA_texture_types.h"
90
91 #include "BKE_context.h"
92 #include "BKE_modifier.h"
93 #include "BKE_pointcache.h"
94 #include "BKE_depsgraph.h"
95
96 #include "BLI_blenlib.h"
97
98 #include "ED_object.h"
99
100 static void rna_Cache_change(Main *bmain, Scene *scene, PointerRNA *ptr)
101 {
102         Object *ob = (Object*)ptr->id.data;
103         PointCache *cache = (PointCache*)ptr->data;
104         PTCacheID *pid = NULL;
105         ListBase pidlist;
106
107         if(!ob)
108                 return;
109
110         cache->flag |= PTCACHE_OUTDATED;
111
112         BKE_ptcache_ids_from_object(&pidlist, ob);
113
114         DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
115
116         for(pid=pidlist.first; pid; pid=pid->next) {
117                 if(pid->cache==cache)
118                         break;
119         }
120
121         if(pid)
122                 BKE_ptcache_update_info(pid);
123
124         BLI_freelistN(&pidlist);
125 }
126
127 static void rna_Cache_toggle_disk_cache(Main *bmain, Scene *scene, PointerRNA *ptr)
128 {
129         Object *ob = (Object*)ptr->id.data;
130         PointCache *cache = (PointCache*)ptr->data;
131         PTCacheID *pid = NULL;
132         ListBase pidlist;
133
134         if(!ob)
135                 return;
136
137         BKE_ptcache_ids_from_object(&pidlist, ob);
138
139         for(pid=pidlist.first; pid; pid=pid->next) {
140                 if(pid->cache==cache)
141                         break;
142         }
143
144         if(pid)
145                 BKE_ptcache_toggle_disk_cache(pid);
146
147         BLI_freelistN(&pidlist);
148 }
149
150 static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
151 {
152         Object *ob = (Object*)ptr->id.data;
153         PointCache *cache = (PointCache*)ptr->data;
154         PTCacheID *pid = NULL, *pid2= NULL;
155         ListBase pidlist;
156         int new_name = 1;
157         char name[80];
158
159         if(!ob)
160                 return;
161
162         /* TODO: check for proper characters */
163
164         BKE_ptcache_ids_from_object(&pidlist, ob);
165
166         if(cache->flag & PTCACHE_EXTERNAL) {
167                 for(pid=pidlist.first; pid; pid=pid->next) {
168                         if(pid->cache==cache)
169                                 break;
170                 }
171
172                 if(!pid)
173                         return;
174
175                 cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
176                 cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
177
178                 BKE_ptcache_load_external(pid);
179                 DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
180         }
181         else {
182                 for(pid=pidlist.first; pid; pid=pid->next) {
183                         if(pid->cache==cache)
184                                 pid2 = pid;
185                         else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) {
186                                 /*TODO: report "name exists" to user */
187                                 strcpy(cache->name, cache->prev_name);
188                                 new_name = 0;
189                         }
190                 }
191
192                 if(new_name) {
193                         if(pid2 && cache->flag & PTCACHE_DISK_CACHE) {
194                                 /* TODO: change to simple file rename */
195                                 strcpy(name, cache->name);
196                                 strcpy(cache->name, cache->prev_name);
197
198                                 cache->flag &= ~PTCACHE_DISK_CACHE;
199
200                                 BKE_ptcache_toggle_disk_cache(pid2);
201
202                                 strcpy(cache->name, name);
203
204                                 cache->flag |= PTCACHE_DISK_CACHE;
205
206                                 BKE_ptcache_toggle_disk_cache(pid2);
207                         }
208
209                         strcpy(cache->prev_name, cache->name);
210                 }
211         }
212
213         BLI_freelistN(&pidlist);
214 }
215
216 static void rna_Cache_list_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
217 {
218         Object *ob = ptr->id.data;
219         PointCache *cache= ptr->data;
220         PTCacheID *pid;
221         ListBase pidlist;
222
223         BKE_ptcache_ids_from_object(&pidlist, ob);
224
225         for(pid=pidlist.first; pid; pid=pid->next) {
226                 if(pid->cache == cache) {
227                         rna_iterator_listbase_begin(iter, pid->ptcaches, NULL);
228                         break;
229                 }
230         }
231
232         BLI_freelistN(&pidlist);
233 }
234 static void rna_Cache_active_point_cache_index_range(PointerRNA *ptr, int *min, int *max)
235 {
236         Object *ob = ptr->id.data;
237         PointCache *cache= ptr->data;
238         PTCacheID *pid;
239         ListBase pidlist;
240
241         BKE_ptcache_ids_from_object(&pidlist, ob);
242         
243         *min= 0;
244         *max= 0;
245
246         for(pid=pidlist.first; pid; pid=pid->next) {
247                 if(pid->cache == cache) {
248                         *max= BLI_countlist(pid->ptcaches)-1;
249                         *max= MAX2(0, *max);
250                         break;
251                 }
252         }
253
254         BLI_freelistN(&pidlist);
255 }
256
257 static int rna_Cache_active_point_cache_index_get(PointerRNA *ptr)
258 {
259         Object *ob = ptr->id.data;
260         PointCache *cache= ptr->data;
261         PTCacheID *pid;
262         ListBase pidlist;
263         int num = 0;
264
265         BKE_ptcache_ids_from_object(&pidlist, ob);
266         
267         for(pid=pidlist.first; pid; pid=pid->next) {
268                 if(pid->cache == cache) {
269                         num = BLI_findindex(pid->ptcaches, cache);
270                         break;
271                 }
272         }
273
274         BLI_freelistN(&pidlist);
275
276         return num;
277 }
278
279 static void rna_Cache_active_point_cache_index_set(struct PointerRNA *ptr, int value)
280 {
281         Object *ob = ptr->id.data;
282         PointCache *cache= ptr->data;
283         PTCacheID *pid;
284         ListBase pidlist;
285
286         BKE_ptcache_ids_from_object(&pidlist, ob);
287         
288         for(pid=pidlist.first; pid; pid=pid->next) {
289                 if(pid->cache == cache) {
290                         *(pid->cache_ptr) = BLI_findlink(pid->ptcaches, value);
291                         break;
292                 }
293         }
294
295         BLI_freelistN(&pidlist);
296 }
297
298 static char *rna_CollisionSettings_path(PointerRNA *ptr)
299 {
300         Object *ob= (Object*)ptr->id.data;
301         ModifierData *md = (ModifierData *)modifiers_findByType(ob, eModifierType_Collision);
302         
303         return BLI_sprintfN("modifiers[\"%s\"].settings", md->name);
304 }
305
306 static int rna_SoftBodySettings_use_edges_get(PointerRNA *ptr)
307 {
308         Object *data= (Object*)(ptr->id.data);
309         return (((data->softflag) & OB_SB_EDGES) != 0);
310 }
311
312 static void rna_SoftBodySettings_use_edges_set(PointerRNA *ptr, int value)
313 {
314         Object *data= (Object*)(ptr->id.data);
315         if(value) data->softflag |= OB_SB_EDGES;
316         else data->softflag &= ~OB_SB_EDGES;
317 }
318
319 static int rna_SoftBodySettings_use_goal_get(PointerRNA *ptr)
320 {
321         Object *data= (Object*)(ptr->id.data);
322         return (((data->softflag) & OB_SB_GOAL) != 0);
323 }
324
325 static void rna_SoftBodySettings_use_goal_set(PointerRNA *ptr, int value)
326 {
327         Object *data= (Object*)(ptr->id.data);
328         if(value) data->softflag |= OB_SB_GOAL;
329         else data->softflag &= ~OB_SB_GOAL;
330 }
331
332 static int rna_SoftBodySettings_stiff_quads_get(PointerRNA *ptr)
333 {
334         Object *data= (Object*)(ptr->id.data);
335         return (((data->softflag) & OB_SB_QUADS) != 0);
336 }
337
338 static void rna_SoftBodySettings_stiff_quads_set(PointerRNA *ptr, int value)
339 {
340         Object *data= (Object*)(ptr->id.data);
341         if(value) data->softflag |= OB_SB_QUADS;
342         else data->softflag &= ~OB_SB_QUADS;
343 }
344
345 static int rna_SoftBodySettings_self_collision_get(PointerRNA *ptr)
346 {
347         Object *data= (Object*)(ptr->id.data);
348         return (((data->softflag) & OB_SB_SELF) != 0);
349 }
350
351 static void rna_SoftBodySettings_self_collision_set(PointerRNA *ptr, int value)
352 {
353         Object *data= (Object*)(ptr->id.data);
354         if(value) data->softflag |= OB_SB_SELF;
355         else data->softflag &= ~OB_SB_SELF;
356 }
357
358 static int rna_SoftBodySettings_new_aero_get(PointerRNA *ptr)
359 {
360         Object *data= (Object*)(ptr->id.data);
361         return (((data->softflag) & OB_SB_AERO_ANGLE) != 0);
362 }
363
364 static void rna_SoftBodySettings_new_aero_set(PointerRNA *ptr, int value)
365 {
366         Object *data= (Object*)(ptr->id.data);
367         if(value) data->softflag |= OB_SB_AERO_ANGLE;
368         else data->softflag &= ~OB_SB_AERO_ANGLE;
369 }
370
371 static int rna_SoftBodySettings_face_collision_get(PointerRNA *ptr)
372 {
373         Object *data= (Object*)(ptr->id.data);
374         return (((data->softflag) & OB_SB_FACECOLL) != 0);
375 }
376
377 static void rna_SoftBodySettings_face_collision_set(PointerRNA *ptr, int value)
378 {
379         Object *data= (Object*)(ptr->id.data);
380         if(value) data->softflag |= OB_SB_FACECOLL;
381         else data->softflag &= ~OB_SB_FACECOLL;
382 }
383
384 static int rna_SoftBodySettings_edge_collision_get(PointerRNA *ptr)
385 {
386         Object *data= (Object*)(ptr->id.data);
387         return (((data->softflag) & OB_SB_EDGECOLL) != 0);
388 }
389
390 static void rna_SoftBodySettings_edge_collision_set(PointerRNA *ptr, int value)
391 {
392         Object *data= (Object*)(ptr->id.data);
393         if(value) data->softflag |= OB_SB_EDGECOLL;
394         else data->softflag &= ~OB_SB_EDGECOLL;
395 }
396
397 static void rna_SoftBodySettings_goal_vgroup_get(PointerRNA *ptr, char *value)
398 {
399         SoftBody *sb= (SoftBody*)ptr->data;
400         rna_object_vgroup_name_index_get(ptr, value, sb->vertgroup);
401 }
402
403 static int rna_SoftBodySettings_goal_vgroup_length(PointerRNA *ptr)
404 {
405         SoftBody *sb= (SoftBody*)ptr->data;
406         return rna_object_vgroup_name_index_length(ptr, sb->vertgroup);
407 }
408
409 static void rna_SoftBodySettings_goal_vgroup_set(PointerRNA *ptr, const char *value)
410 {
411         SoftBody *sb= (SoftBody*)ptr->data;
412         rna_object_vgroup_name_index_set(ptr, value, &sb->vertgroup);
413 }
414
415 static void rna_SoftBodySettings_mass_vgroup_set(PointerRNA *ptr, const char *value)
416 {
417         SoftBody *sb= (SoftBody*)ptr->data;
418         rna_object_vgroup_name_set(ptr, value, sb->namedVG_Mass, sizeof(sb->namedVG_Mass));
419 }
420
421 static void rna_SoftBodySettings_spring_vgroup_set(PointerRNA *ptr, const char *value)
422 {
423         SoftBody *sb= (SoftBody*)ptr->data;
424         rna_object_vgroup_name_set(ptr, value, sb->namedVG_Spring_K, sizeof(sb->namedVG_Spring_K));
425 }
426
427
428 static char *rna_SoftBodySettings_path(PointerRNA *ptr)
429 {
430         Object *ob= (Object*)ptr->id.data;
431         ModifierData *md = (ModifierData *)modifiers_findByType(ob, eModifierType_Softbody);
432         
433         return BLI_sprintfN("modifiers[\"%s\"].settings", md->name);
434 }
435
436 static int particle_id_check(PointerRNA *ptr)
437 {
438         ID *id= ptr->id.data;
439
440         return (GS(id->name) == ID_PA);
441 }
442
443 static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
444 {
445         if(particle_id_check(ptr)) {
446                 ParticleSettings *part = (ParticleSettings*)ptr->id.data;
447
448                 if(part->pd->forcefield != PFIELD_TEXTURE && part->pd->tex) {
449                         part->pd->tex->id.us--;
450                         part->pd->tex= 0;
451                 }
452
453                 if(part->pd2->forcefield != PFIELD_TEXTURE && part->pd2->tex) {
454                         part->pd2->tex->id.us--;
455                         part->pd2->tex= 0;
456                 }
457
458                 DAG_id_flush_update(&part->id, OB_RECALC|PSYS_RECALC_RESET);
459                 WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
460
461         }
462         else {
463                 Object *ob = (Object*)ptr->id.data;
464
465                 if(ob->pd->forcefield != PFIELD_TEXTURE && ob->pd->tex) {
466                         ob->pd->tex->id.us--;
467                         ob->pd->tex= 0;
468                 }
469
470                 DAG_id_flush_update(&ob->id, OB_RECALC_OB);
471                 WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
472         }
473 }
474
475 static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
476 {
477         if(!particle_id_check(ptr)) {
478                 Object *ob= (Object*)ptr->id.data;
479                 PartDeflect *pd= ob->pd;
480                 ModifierData *md= modifiers_findByType(ob, eModifierType_Surface);
481
482                 /* add/remove modifier as needed */
483                 if(!md) {
484                         if(pd && (pd->shape == PFIELD_SHAPE_SURFACE) && ELEM(pd->forcefield,PFIELD_GUIDE,PFIELD_TEXTURE)==0)
485                                 if(ELEM4(ob->type, OB_MESH, OB_SURF, OB_FONT, OB_CURVE))
486                                         ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Surface);
487                 }
488                 else {
489                         if(!pd || pd->shape != PFIELD_SHAPE_SURFACE)
490                                 ED_object_modifier_remove(NULL, scene, ob, md);
491                 }
492
493                 WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
494         }
495 }
496
497 static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
498 {
499         if(particle_id_check(ptr)) {
500                 DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC|PSYS_RECALC_RESET);
501         }
502         else {
503                 Object *ob= (Object*)ptr->id.data;
504
505                 /* do this before scene sort, that one checks for CU_PATH */
506                 /* XXX if(ob->type==OB_CURVE && ob->pd->forcefield==PFIELD_GUIDE) {
507                         Curve *cu= ob->data;
508                         cu->flag |= (CU_PATH|CU_3D);
509                         do_curvebuts(B_CU3D);  // all curves too
510                 }*/
511
512                 rna_FieldSettings_shape_update(bmain, scene, ptr);
513
514                 DAG_scene_sort(scene);
515
516                 if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE)
517                         DAG_id_flush_update(&ob->id, OB_RECALC);
518                 else
519                         DAG_id_flush_update(&ob->id, OB_RECALC_OB);
520
521                 WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
522         }
523 }
524
525 static char *rna_FieldSettings_path(PointerRNA *ptr)
526 {
527         PartDeflect *pd = (PartDeflect *)ptr->data;
528         
529         /* Check through all possible places the settings can be to find the right one */
530         
531         if(particle_id_check(ptr)) {
532                 /* particle system force field */
533                 ParticleSettings *part = (ParticleSettings*)ptr->id.data;
534                 
535                 if (part->pd == pd)
536                         return BLI_sprintfN("force_field_1");
537                 else if (part->pd2 == pd)
538                         return BLI_sprintfN("force_field_2");
539         } else {
540                 /* object force field */
541                 Object *ob= (Object*)ptr->id.data;
542                 
543                 if (ob->pd == pd)
544                         return BLI_sprintfN("field");
545         }
546         return NULL;
547 }
548
549 static void rna_EffectorWeight_update(Main *bmain, Scene *scene, PointerRNA *ptr)
550 {
551         DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
552
553         WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
554 }
555
556 static void rna_EffectorWeight_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
557 {
558         DAG_scene_sort(scene);
559
560         DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
561
562         WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
563 }
564
565 static char *rna_EffectorWeight_path(PointerRNA *ptr)
566 {
567         EffectorWeights *ew = (EffectorWeights *)ptr->data;
568         /* Check through all possible places the settings can be to find the right one */
569         
570         if(particle_id_check(ptr)) {
571                 /* particle effector weights */
572                 ParticleSettings *part = (ParticleSettings*)ptr->id.data;
573                 
574                 if (part->effector_weights == ew)
575                         return BLI_sprintfN("effector_weights");
576         } else {
577                 Object *ob= (Object*)ptr->id.data;
578                 ModifierData *md;
579                 
580                 /* check softbody modifier */
581                 md = (ModifierData *)modifiers_findByType(ob, eModifierType_Softbody);
582                 if (md) {
583                         /* no pointer from modifier data to actual softbody storage, would be good to add */
584                         if (ob->soft->effector_weights == ew)
585                                 return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", md->name);
586                 }
587                 
588                 /* check cloth modifier */
589                 md = (ModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
590                 if (md) {
591                         ClothModifierData *cmd = (ClothModifierData *)md;
592                         
593                         if (cmd->sim_parms->effector_weights == ew)
594                                 return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", md->name);
595                 }
596                 
597                 /* check smoke modifier */
598                 md = (ModifierData *)modifiers_findByType(ob, eModifierType_Smoke);
599                 if (md) {
600                         SmokeModifierData *smd = (SmokeModifierData *)md;
601                         
602                         if (smd->domain->effector_weights == ew)
603                                 return BLI_sprintfN("modifiers[\"%s\"].settings.effector_weights", md->name);
604                 }
605         }
606         return NULL;
607 }
608
609 static void rna_CollisionSettings_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
610 {
611         Object *ob= (Object*)ptr->id.data;
612         ModifierData *md= modifiers_findByType(ob, eModifierType_Collision);
613
614         /* add/remove modifier as needed */
615         if(ob->pd->deflect && !md)
616                 ED_object_modifier_add(NULL, scene, ob, NULL, eModifierType_Collision);
617         else if(!ob->pd->deflect && md)
618                 ED_object_modifier_remove(NULL, scene, ob, md);
619
620         WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
621 }
622
623 static void rna_CollisionSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
624 {
625         Object *ob= (Object*)ptr->id.data;
626
627         DAG_id_flush_update(&ob->id, OB_RECALC);
628         WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
629 }
630
631 static void rna_softbody_update(Main *bmain, Scene *scene, PointerRNA *ptr)
632 {
633         Object *ob= (Object*)ptr->id.data;
634
635         DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
636         WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
637 }
638
639
640 static EnumPropertyItem *rna_Effector_shape_itemf(bContext *C, PointerRNA *ptr, int *free)
641 {
642         Object *ob= NULL;
643
644         if(particle_id_check(ptr))
645                 return empty_shape_items;
646         
647         ob= (Object*)ptr->id.data;
648         
649         if(ob->type == OB_CURVE) {
650                 if(ob->pd->forcefield == PFIELD_VORTEX)
651                         return curve_vortex_shape_items;
652
653                 return curve_shape_items;
654         }
655         else if(ELEM3(ob->type, OB_MESH, OB_SURF, OB_FONT)) {
656                 if(ob->pd->forcefield == PFIELD_VORTEX)
657                         return vortex_shape_items;
658
659                 return effector_shape_items;
660         }
661         else {
662                 if(ob->pd->forcefield == PFIELD_VORTEX)
663                         return empty_vortex_shape_items;
664
665                 return empty_shape_items;
666         }
667 }
668
669
670 #else
671
672 static void rna_def_pointcache(BlenderRNA *brna)
673 {
674         StructRNA *srna;
675         PropertyRNA *prop;
676
677         srna= RNA_def_struct(brna, "PointCache", NULL);
678         RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations.");
679         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
680         
681         prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_TIME);
682         RNA_def_property_int_sdna(prop, NULL, "startframe");
683         RNA_def_property_range(prop, 1, 300000);
684         RNA_def_property_ui_text(prop, "Start", "Frame on which the simulation starts.");
685         
686         prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_TIME);
687         RNA_def_property_int_sdna(prop, NULL, "endframe");
688         RNA_def_property_range(prop, 1, 300000);
689         RNA_def_property_ui_text(prop, "End", "Frame on which the simulation stops.");
690
691         prop= RNA_def_property(srna, "step", PROP_INT, PROP_NONE);
692         RNA_def_property_range(prop, 1, 20);
693         RNA_def_property_ui_text(prop, "Cache Step", "Number of frames between cached frames.");
694         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
695
696         prop= RNA_def_property(srna, "index", PROP_INT, PROP_NONE);
697         RNA_def_property_int_sdna(prop, NULL, "index");
698         RNA_def_property_range(prop, -1, 100);
699         RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files.");
700         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
701
702         /* flags */
703         prop= RNA_def_property(srna, "baked", PROP_BOOLEAN, PROP_NONE);
704         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
705         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
706
707         prop= RNA_def_property(srna, "baking", PROP_BOOLEAN, PROP_NONE);
708         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKING);
709         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
710
711         prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE);
712         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_DISK_CACHE);
713         RNA_def_property_ui_text(prop, "Disk Cache", "Save cache files to disk");
714         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_disk_cache");
715
716         prop= RNA_def_property(srna, "outdated", PROP_BOOLEAN, PROP_NONE);
717         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_OUTDATED);
718         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
719         RNA_def_property_ui_text(prop, "Cache is outdated", "");
720
721         prop= RNA_def_property(srna, "frames_skipped", PROP_BOOLEAN, PROP_NONE);
722         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_FRAMES_SKIPPED);
723         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
724
725         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
726         RNA_def_property_string_sdna(prop, NULL, "name");
727         RNA_def_property_ui_text(prop, "Name", "Cache name");
728         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
729         RNA_def_struct_name_property(srna, prop);
730
731         prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
732         RNA_def_property_string_sdna(prop, NULL, "path");
733         RNA_def_property_ui_text(prop, "File Path", "Cache file path.");
734         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
735
736         prop= RNA_def_property(srna, "quick_cache", PROP_BOOLEAN, PROP_NONE);
737         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_QUICK_CACHE);
738         RNA_def_property_ui_text(prop, "Quick Cache", "Update simulation with cache steps");
739         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
740
741         prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE);
742         RNA_def_property_string_sdna(prop, NULL, "info");
743         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
744         RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status.");
745
746         prop= RNA_def_property(srna, "external", PROP_BOOLEAN, PROP_NONE);
747         RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_EXTERNAL);
748         RNA_def_property_ui_text(prop, "External", "Read cache from an external location");
749         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
750
751         prop= RNA_def_property(srna, "point_cache_list", PROP_COLLECTION, PROP_NONE);
752         RNA_def_property_collection_funcs(prop, "rna_Cache_list_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
753         RNA_def_property_struct_type(prop, "PointCache");
754         RNA_def_property_ui_text(prop, "Point Cache List", "Point cache list");
755
756         prop= RNA_def_property(srna, "active_point_cache_index", PROP_INT, PROP_UNSIGNED);
757         RNA_def_property_int_funcs(prop, "rna_Cache_active_point_cache_index_get", "rna_Cache_active_point_cache_index_set", "rna_Cache_active_point_cache_index_range");
758         RNA_def_property_ui_text(prop, "Active Point Cache Index", "");
759         RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_change");
760 }
761
762 static void rna_def_collision(BlenderRNA *brna)
763 {
764         StructRNA *srna;
765         PropertyRNA *prop;
766
767         srna= RNA_def_struct(brna, "CollisionSettings", NULL);
768         RNA_def_struct_sdna(srna, "PartDeflect");
769         RNA_def_struct_path_func(srna, "rna_CollisionSettings_path");
770         RNA_def_struct_ui_text(srna, "Collision Settings", "Collision settings for object in physics simulation.");
771         
772         prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
773         RNA_def_property_boolean_sdna(prop, NULL, "deflect", 1);
774         RNA_def_property_ui_text(prop, "Enabled", "Enable this objects as a collider for physics systems");
775         RNA_def_property_update(prop, 0, "rna_CollisionSettings_dependency_update");
776         
777         /* Particle Interaction */
778         
779         prop= RNA_def_property(srna, "damping_factor", PROP_FLOAT, PROP_NONE);
780         RNA_def_property_float_sdna(prop, NULL, "pdef_damp");
781         RNA_def_property_range(prop, 0.0f, 1.0f);
782         RNA_def_property_ui_text(prop, "Damping Factor", "Amount of damping during particle collision");
783         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
784         
785         prop= RNA_def_property(srna, "random_damping", PROP_FLOAT, PROP_NONE);
786         RNA_def_property_float_sdna(prop, NULL, "pdef_rdamp");
787         RNA_def_property_range(prop, 0.0f, 1.0f);
788         RNA_def_property_ui_text(prop, "Random Damping", "Random variation of damping");
789         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
790         
791         prop= RNA_def_property(srna, "friction_factor", PROP_FLOAT, PROP_NONE);
792         RNA_def_property_float_sdna(prop, NULL, "pdef_frict");
793         RNA_def_property_range(prop, 0.0f, 1.0f);
794         RNA_def_property_ui_text(prop, "Friction Factor", "Amount of friction during particle collision");
795         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
796         
797         prop= RNA_def_property(srna, "random_friction", PROP_FLOAT, PROP_NONE);
798         RNA_def_property_float_sdna(prop, NULL, "pdef_rfrict");
799         RNA_def_property_range(prop, 0.0f, 1.0f);
800         RNA_def_property_ui_text(prop, "Random Friction", "Random variation of friction");
801         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
802                 
803         prop= RNA_def_property(srna, "permeability", PROP_FLOAT, PROP_NONE);
804         RNA_def_property_float_sdna(prop, NULL, "pdef_perm");
805         RNA_def_property_range(prop, 0.0f, 1.0f);
806         RNA_def_property_ui_text(prop, "Permeability", "Chance that the particle will pass through the mesh");
807         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
808         
809         prop= RNA_def_property(srna, "kill_particles", PROP_BOOLEAN, PROP_NONE);
810         RNA_def_property_boolean_sdna(prop, NULL, "flag", PDEFLE_KILL_PART);
811         RNA_def_property_ui_text(prop, "Kill Particles", "Kill collided particles");
812         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
813         
814         /* Soft Body and Cloth Interaction */
815         
816         prop= RNA_def_property(srna, "inner_thickness", PROP_FLOAT, PROP_NONE);
817         RNA_def_property_float_sdna(prop, NULL, "pdef_sbift");
818         RNA_def_property_range(prop, 0.001f, 1.0f);
819         RNA_def_property_ui_text(prop, "Inner Thickness", "Inner face thickness");
820         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
821         
822         prop= RNA_def_property(srna, "outer_thickness", PROP_FLOAT, PROP_NONE);
823         RNA_def_property_float_sdna(prop, NULL, "pdef_sboft");
824         RNA_def_property_range(prop, 0.001f, 1.0f);
825         RNA_def_property_ui_text(prop, "Outer Thickness", "Outer face thickness");
826         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
827         
828         prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
829         RNA_def_property_float_sdna(prop, NULL, "pdef_sbdamp");
830         RNA_def_property_range(prop, 0.0f, 1.0f);
831         RNA_def_property_ui_text(prop, "Damping", "Amount of damping during collision");
832         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
833         
834         /* Does this belong here?
835         prop= RNA_def_property(srna, "collision_stack", PROP_BOOLEAN, PROP_NONE);
836         RNA_def_property_boolean_sdna(prop, NULL, "softflag", OB_SB_COLLFINAL);
837         RNA_def_property_ui_text(prop, "Collision from Stack", "Pick collision object from modifier stack (softbody only)");
838         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
839         */
840
841         prop= RNA_def_property(srna, "absorption", PROP_FLOAT, PROP_FACTOR);
842         RNA_def_property_range(prop, 0.0f, 1.0f);
843         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 2);
844         RNA_def_property_ui_text(prop, "Absorption", "How much of effector force gets lost during collision with this object (in percent).");
845         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
846 }
847
848 static void rna_def_effector_weight(BlenderRNA *brna)
849 {
850         StructRNA *srna;
851         PropertyRNA *prop;
852
853         srna= RNA_def_struct(brna, "EffectorWeights", NULL);
854         RNA_def_struct_sdna(srna, "EffectorWeights");
855         RNA_def_struct_path_func(srna, "rna_EffectorWeight_path");
856         RNA_def_struct_ui_text(srna, "Effector Weights", "Effector weights for physics simulation.");
857         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
858
859         /* Flags */
860         prop= RNA_def_property(srna, "do_growing_hair", PROP_BOOLEAN, PROP_NONE);
861         RNA_def_property_boolean_sdna(prop, NULL, "flag", EFF_WEIGHT_DO_HAIR);
862         RNA_def_property_ui_text(prop, "Use For Growing Hair", "Use force fields when growing hair.");
863         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
864         
865         /* General */
866         prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
867         RNA_def_property_pointer_sdna(prop, NULL, "group");
868         RNA_def_property_struct_type(prop, "Group");
869         RNA_def_property_flag(prop, PROP_EDITABLE);
870         RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group.");
871         RNA_def_property_update(prop, 0, "rna_EffectorWeight_dependency_update");
872
873         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_NONE);
874         RNA_def_property_float_sdna(prop, NULL, "global_gravity");
875         RNA_def_property_range(prop, -200.0f, 200.0f);
876         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
877         RNA_def_property_ui_text(prop, "Gravity", "Global gravity weight.");
878         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
879
880         /* Effector weights */
881         prop= RNA_def_property(srna, "all", PROP_FLOAT, PROP_NONE);
882         RNA_def_property_float_sdna(prop, NULL, "weight[0]");
883         RNA_def_property_range(prop, -200.0f, 200.0f);
884         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
885         RNA_def_property_ui_text(prop, "All", "All effector's weight.");
886         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
887
888         prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE);
889         RNA_def_property_float_sdna(prop, NULL, "weight[1]");
890         RNA_def_property_range(prop, -200.0f, 200.0f);
891         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
892         RNA_def_property_ui_text(prop, "Force", "Force effector weight.");
893         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
894
895         prop= RNA_def_property(srna, "vortex", PROP_FLOAT, PROP_NONE);
896         RNA_def_property_float_sdna(prop, NULL, "weight[2]");
897         RNA_def_property_range(prop, -200.0f, 200.0f);
898         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
899         RNA_def_property_ui_text(prop, "Vortex", "Vortex effector weight.");
900         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
901
902         prop= RNA_def_property(srna, "magnetic", PROP_FLOAT, PROP_NONE);
903         RNA_def_property_float_sdna(prop, NULL, "weight[3]");
904         RNA_def_property_range(prop, -200.0f, 200.0f);
905         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
906         RNA_def_property_ui_text(prop, "Magnetic", "Magnetic effector weight.");
907         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
908
909         prop= RNA_def_property(srna, "wind", PROP_FLOAT, PROP_NONE);
910         RNA_def_property_float_sdna(prop, NULL, "weight[4]");
911         RNA_def_property_range(prop, -200.0f, 200.0f);
912         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
913         RNA_def_property_ui_text(prop, "Wind", "Wind effector weight.");
914         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
915
916         prop= RNA_def_property(srna, "curveguide", PROP_FLOAT, PROP_NONE);
917         RNA_def_property_float_sdna(prop, NULL, "weight[5]");
918         RNA_def_property_range(prop, -200.0f, 200.0f);
919         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
920         RNA_def_property_ui_text(prop, "Curve Guide", "Curve guide effector weight.");
921         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
922
923         prop= RNA_def_property(srna, "texture", PROP_FLOAT, PROP_NONE);
924         RNA_def_property_float_sdna(prop, NULL, "weight[6]");
925         RNA_def_property_range(prop, -200.0f, 200.0f);
926         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
927         RNA_def_property_ui_text(prop, "Texture", "Texture effector weight.");
928         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
929
930         prop= RNA_def_property(srna, "harmonic", PROP_FLOAT, PROP_NONE);
931         RNA_def_property_float_sdna(prop, NULL, "weight[7]");
932         RNA_def_property_range(prop, -200.0f, 200.0f);
933         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
934         RNA_def_property_ui_text(prop, "Harmonic", "Harmonic effector weight.");
935         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
936
937         prop= RNA_def_property(srna, "charge", PROP_FLOAT, PROP_NONE);
938         RNA_def_property_float_sdna(prop, NULL, "weight[8]");
939         RNA_def_property_range(prop, -200.0f, 200.0f);
940         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
941         RNA_def_property_ui_text(prop, "Charge", "Charge effector weight.");
942         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
943
944         prop= RNA_def_property(srna, "lennardjones", PROP_FLOAT, PROP_NONE);
945         RNA_def_property_float_sdna(prop, NULL, "weight[9]");
946         RNA_def_property_range(prop, -200.0f, 200.0f);
947         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
948         RNA_def_property_ui_text(prop, "Lennard-Jones", "Lennard-Jones effector weight.");
949         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
950
951         prop= RNA_def_property(srna, "boid", PROP_FLOAT, PROP_NONE);
952         RNA_def_property_float_sdna(prop, NULL, "weight[10]");
953         RNA_def_property_range(prop, -200.0f, 200.0f);
954         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
955         RNA_def_property_ui_text(prop, "Boid", "Boid effector weight.");
956         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
957
958         prop= RNA_def_property(srna, "turbulence", PROP_FLOAT, PROP_NONE);
959         RNA_def_property_float_sdna(prop, NULL, "weight[11]");
960         RNA_def_property_range(prop, -200.0f, 200.0f);
961         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
962         RNA_def_property_ui_text(prop, "Turbulence", "Turbulence effector weight.");
963         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
964
965         prop= RNA_def_property(srna, "drag", PROP_FLOAT, PROP_NONE);
966         RNA_def_property_float_sdna(prop, NULL, "weight[12]");
967         RNA_def_property_range(prop, -200.0f, 200.0f);
968         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
969         RNA_def_property_ui_text(prop, "Drag", "Drag effector weight.");
970         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
971 }
972
973 static void rna_def_field(BlenderRNA *brna)
974 {
975         StructRNA *srna;
976         PropertyRNA *prop;
977         
978         static EnumPropertyItem field_type_items[] = {
979                 {0, "NONE", 0, "None", ""},
980                 {PFIELD_FORCE, "FORCE", ICON_FORCE_FORCE, "Force", ""},
981                 {PFIELD_WIND, "WIND", ICON_FORCE_WIND, "Wind", ""},
982                 {PFIELD_VORTEX, "VORTEX", ICON_FORCE_VORTEX, "Vortex", ""},
983                 {PFIELD_MAGNET, "MAGNET", ICON_FORCE_MAGNETIC, "Magnetic", ""},
984                 {PFIELD_HARMONIC, "HARMONIC", ICON_FORCE_HARMONIC, "Harmonic", ""},
985                 {PFIELD_CHARGE, "CHARGE", ICON_FORCE_CHARGE, "Charge", ""},
986                 {PFIELD_LENNARDJ, "LENNARDJ", ICON_FORCE_LENNARDJONES, "Lennard-Jones", ""},
987                 {PFIELD_TEXTURE, "TEXTURE", ICON_FORCE_TEXTURE, "Texture", ""},
988                 {PFIELD_GUIDE, "GUIDE", ICON_FORCE_CURVE, "Curve Guide", ""},
989                 {PFIELD_BOID, "BOID", ICON_FORCE_BOID, "Boid", ""},
990                 {PFIELD_TURBULENCE, "TURBULENCE", ICON_FORCE_TURBULENCE, "Turbulence", ""},
991                 {PFIELD_DRAG, "DRAG", ICON_FORCE_DRAG, "Drag", ""},
992                 {0, NULL, 0, NULL, NULL}};
993
994         static EnumPropertyItem falloff_items[] = {
995                 {PFIELD_FALL_SPHERE, "SPHERE", 0, "Sphere", ""},
996                 {PFIELD_FALL_TUBE, "TUBE", 0, "Tube", ""},
997                 {PFIELD_FALL_CONE, "CONE", 0, "Cone", ""},
998                 {0, NULL, 0, NULL, NULL}};
999                 
1000         static EnumPropertyItem texture_items[] = {
1001                 {PFIELD_TEX_RGB, "RGB", 0, "RGB", ""},
1002                 {PFIELD_TEX_GRAD, "GRADIENT", 0, "Gradient", ""},
1003                 {PFIELD_TEX_CURL, "CURL", 0, "Curl", ""},
1004                 {0, NULL, 0, NULL, NULL}};
1005
1006         static EnumPropertyItem zdirection_items[] = {
1007                 {PFIELD_Z_BOTH, "BOTH", 0, "Both Z", ""},
1008                 {PFIELD_Z_POS, "POSITIVE", 0, "+Z", ""},
1009                 {PFIELD_Z_NEG, "NEGATIVE", 0, "-Z", ""},
1010                 {0, NULL, 0, NULL, NULL}};
1011                 
1012         static EnumPropertyItem guide_kink_items[] = {
1013                 {0, "NONE", 0, "Nothing", ""},
1014                 {1, "CURL", 0, "Curl", ""},
1015                 {2, "RADIAL", 0, "Radial", ""},
1016                 {3, "WAVE", 0, "Wave", ""},
1017                 {4, "BRAID", 0, "Braid", ""},
1018                 {5, "ROTATION", 0, "Rotation", ""},
1019                 {6, "ROLL", 0, "Roll", ""},
1020                 {0, NULL, 0, NULL, NULL}};
1021                 
1022         static EnumPropertyItem guide_kink_axis_items[] = {
1023                 {0, "X", 0, "X", ""},
1024                 {1, "Y", 0, "Y", ""},
1025                 {2, "Z", 0, "Z", ""},
1026                 {0, NULL, 0, NULL, NULL}};
1027
1028         srna= RNA_def_struct(brna, "FieldSettings", NULL);
1029         RNA_def_struct_sdna(srna, "PartDeflect");
1030         RNA_def_struct_path_func(srna, "rna_FieldSettings_path");
1031         RNA_def_struct_ui_text(srna, "Field Settings", "Field settings for an object in physics simulation.");
1032         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
1033         
1034         /* Enums */
1035         
1036         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
1037         RNA_def_property_enum_sdna(prop, NULL, "forcefield");
1038         RNA_def_property_enum_items(prop, field_type_items);
1039         RNA_def_property_ui_text(prop, "Type", "Type of field.");
1040         RNA_def_property_update(prop, 0, "rna_FieldSettings_dependency_update");
1041
1042         prop= RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
1043         RNA_def_property_enum_items(prop, effector_shape_items);
1044         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Effector_shape_itemf");
1045         RNA_def_property_ui_text(prop, "Shape", "Which direction is used to calculate the effector force.");
1046         RNA_def_property_update(prop, 0, "rna_FieldSettings_shape_update");
1047         
1048         prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
1049         RNA_def_property_enum_sdna(prop, NULL, "falloff");
1050         RNA_def_property_enum_items(prop, falloff_items);
1051         RNA_def_property_ui_text(prop, "Fall-Off", "Fall-off shape.");
1052         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1053         
1054         prop= RNA_def_property(srna, "texture_mode", PROP_ENUM, PROP_NONE);
1055         RNA_def_property_enum_sdna(prop, NULL, "tex_mode");
1056         RNA_def_property_enum_items(prop, texture_items);
1057         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)");
1058         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1059
1060         prop= RNA_def_property(srna, "z_direction", PROP_ENUM, PROP_NONE);
1061         RNA_def_property_enum_sdna(prop, NULL, "zdir");
1062         RNA_def_property_enum_items(prop, zdirection_items);
1063         RNA_def_property_ui_text(prop, "Z Direction", "Effect in full or only positive/negative Z direction.");
1064         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1065         
1066         /* Float */
1067         
1068         prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
1069         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1070         RNA_def_property_range(prop, -1000.0f, 1000.0f);
1071         RNA_def_property_ui_text(prop, "Strength", "Strength of force field");
1072         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1073
1074         /* different ui range to above */
1075         prop= RNA_def_property(srna, "linear_drag", PROP_FLOAT, PROP_NONE);
1076         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1077         RNA_def_property_range(prop, -2.0f, 2.0f);
1078         RNA_def_property_ui_text(prop, "Linear Drag", "Drag component proportional to velocity.");
1079         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1080
1081         prop= RNA_def_property(srna, "harmonic_damping", PROP_FLOAT, PROP_NONE);
1082         RNA_def_property_float_sdna(prop, NULL, "f_damp");
1083         RNA_def_property_range(prop, 0.0f, 10.0f);
1084         RNA_def_property_ui_text(prop, "Harmonic Damping", "Damping of the harmonic force");
1085         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1086
1087         /* different ui range to above */
1088         prop= RNA_def_property(srna, "quadratic_drag", PROP_FLOAT, PROP_NONE);
1089         RNA_def_property_float_sdna(prop, NULL, "f_damp");
1090         RNA_def_property_range(prop, -2.0f, 2.0f);
1091         RNA_def_property_ui_text(prop, "Quadratic Drag", "Drag component proportional to the square of velocity.");
1092         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1093
1094         prop= RNA_def_property(srna, "flow", PROP_FLOAT, PROP_NONE);
1095         RNA_def_property_float_sdna(prop, NULL, "f_flow");
1096         RNA_def_property_range(prop, 0.0f, 10.0f);
1097         RNA_def_property_ui_text(prop, "Flow", "Convert effector force into air flow velocity");
1098         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1099
1100         /* different ui range to above */
1101         prop= RNA_def_property(srna, "inflow", PROP_FLOAT, PROP_NONE);
1102         RNA_def_property_float_sdna(prop, NULL, "f_flow");
1103         RNA_def_property_range(prop, -10.0f, 10.0f);
1104         RNA_def_property_ui_text(prop, "Inflow", "Inwards component of the vortex force");
1105         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1106
1107         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
1108         RNA_def_property_float_sdna(prop, NULL, "f_size");
1109         RNA_def_property_range(prop, 0.0f, 10.0f);
1110         RNA_def_property_ui_text(prop, "Size", "Size of the noise");
1111         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1112
1113         prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
1114         RNA_def_property_float_sdna(prop, NULL, "f_size");
1115         RNA_def_property_range(prop, 0.0f, 1000.0f);
1116         RNA_def_property_ui_text(prop, "Rest Length", "Rest length of the harmonic force");
1117         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1118         
1119         prop= RNA_def_property(srna, "falloff_power", PROP_FLOAT, PROP_NONE);
1120         RNA_def_property_float_sdna(prop, NULL, "f_power");
1121         RNA_def_property_range(prop, 0.0f, 10.0f);
1122         RNA_def_property_ui_text(prop, "Falloff Power", "Falloff power (real gravitational falloff = 2)");
1123         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1124         
1125         prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
1126         RNA_def_property_float_sdna(prop, NULL, "mindist");
1127         RNA_def_property_range(prop, 0.0f, 1000.0f);
1128         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance for the field's fall-off");
1129         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1130         
1131         prop= RNA_def_property(srna, "maximum_distance", PROP_FLOAT, PROP_NONE);
1132         RNA_def_property_float_sdna(prop, NULL, "maxdist");
1133         RNA_def_property_range(prop, 0.0f, 1000.0f);
1134         RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance for the field to work");
1135         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1136         
1137         prop= RNA_def_property(srna, "radial_minimum", PROP_FLOAT, PROP_NONE);
1138         RNA_def_property_float_sdna(prop, NULL, "minrad");
1139         RNA_def_property_range(prop, 0.0f, 1000.0f);
1140         RNA_def_property_ui_text(prop, "Minimum Radial Distance", "Minimum radial distance for the field's fall-off");
1141         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1142         
1143         prop= RNA_def_property(srna, "radial_maximum", PROP_FLOAT, PROP_NONE);
1144         RNA_def_property_float_sdna(prop, NULL, "maxrad");
1145         RNA_def_property_range(prop, 0.0f, 1000.0f);
1146         RNA_def_property_ui_text(prop, "Maximum Radial Distance", "Maximum radial distance for the field to work");
1147         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1148         
1149         prop= RNA_def_property(srna, "radial_falloff", PROP_FLOAT, PROP_NONE);
1150         RNA_def_property_float_sdna(prop, NULL, "f_power_r");
1151         RNA_def_property_range(prop, 0.0f, 10.0f);
1152         RNA_def_property_ui_text(prop, "Radial Falloff Power", "Radial falloff power (real gravitational falloff = 2)");
1153         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1154
1155         prop= RNA_def_property(srna, "texture_nabla", PROP_FLOAT, PROP_NONE);
1156         RNA_def_property_float_sdna(prop, NULL, "tex_nabla");
1157         RNA_def_property_range(prop, 0.0001f, 1.0f);
1158         RNA_def_property_ui_text(prop, "Nabla", "Defines size of derivative offset used for calculating gradient and curl");
1159         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1160         
1161         prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE);
1162         RNA_def_property_float_sdna(prop, NULL, "f_noise");
1163         RNA_def_property_range(prop, 0.0f, 10.0f);
1164         RNA_def_property_ui_text(prop, "Noise", "Noise of the force");
1165         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1166
1167         prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
1168         RNA_def_property_range(prop, 1, 128);
1169         RNA_def_property_ui_text(prop, "Seed", "Seed of the noise");
1170         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1171
1172         /* Boolean */
1173         
1174         prop= RNA_def_property(srna, "use_min_distance", PROP_BOOLEAN, PROP_NONE);
1175         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMIN);
1176         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum distance for the field's fall-off");
1177         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1178         
1179         prop= RNA_def_property(srna, "use_max_distance", PROP_BOOLEAN, PROP_NONE);
1180         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAX);
1181         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum distance for the field to work");
1182         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1183         
1184         prop= RNA_def_property(srna, "use_radial_min", PROP_BOOLEAN, PROP_NONE);
1185         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMINR);
1186         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum radial distance for the field's fall-off");
1187         // "Use a minimum angle for the field's fall-off"
1188         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1189         
1190         prop= RNA_def_property(srna, "use_radial_max", PROP_BOOLEAN, PROP_NONE);
1191         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAXR);
1192         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum radial distance for the field to work");
1193         // "Use a maximum angle for the field to work"
1194         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1195
1196         prop= RNA_def_property(srna, "use_coordinates", PROP_BOOLEAN, PROP_NONE);
1197         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_OBJECT);
1198         RNA_def_property_ui_text(prop, "Use Coordinates", "Use object/global coordinates for texture");
1199         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1200
1201         prop= RNA_def_property(srna, "global_coordinates", PROP_BOOLEAN, PROP_NONE);
1202         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GLOBAL_CO);
1203         RNA_def_property_ui_text(prop, "Use Global Coordinates", "Use effector/global coordinates for turbulence");
1204         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1205         
1206         prop= RNA_def_property(srna, "force_2d", PROP_BOOLEAN, PROP_NONE);
1207         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_2D);
1208         RNA_def_property_ui_text(prop, "2D", "Apply force only in 2d");
1209         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1210         
1211         prop= RNA_def_property(srna, "root_coordinates", PROP_BOOLEAN, PROP_NONE);
1212         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_ROOTCO);
1213         RNA_def_property_ui_text(prop, "Root Texture Coordinates", "Texture coordinates from root particle locations");
1214         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1215
1216         prop= RNA_def_property(srna, "do_location", PROP_BOOLEAN, PROP_NONE);
1217         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_LOCATION);
1218         RNA_def_property_ui_text(prop, "Location", "Effect particles' location");
1219         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1220
1221         prop= RNA_def_property(srna, "do_rotation", PROP_BOOLEAN, PROP_NONE);
1222         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_ROTATION);
1223         RNA_def_property_ui_text(prop, "Rotation", "Effect particles' dynamic rotation");
1224         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1225
1226         prop= RNA_def_property(srna, "do_absorption", PROP_BOOLEAN, PROP_NONE);
1227         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_VISIBILITY);
1228         RNA_def_property_ui_text(prop, "Absorption", "Force gets absorbed by collision objects");
1229         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1230
1231         prop= RNA_def_property(srna, "multiple_springs", PROP_BOOLEAN, PROP_NONE);
1232         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_MULTIPLE_SPRINGS);
1233         RNA_def_property_ui_text(prop, "Multiple Springs", "Every point is effected by multiple springs");
1234         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1235         
1236         /* Pointer */
1237         
1238         prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
1239         RNA_def_property_pointer_sdna(prop, NULL, "tex");
1240         RNA_def_property_flag(prop, PROP_EDITABLE);
1241         RNA_def_property_ui_text(prop, "Texture", "Texture to use as force");
1242         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1243         
1244         /********** Curve Guide Field Settings **********/
1245         
1246         prop= RNA_def_property(srna, "guide_minimum", PROP_FLOAT, PROP_NONE);
1247         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1248         RNA_def_property_range(prop, 0.0f, 1000.0f);
1249         RNA_def_property_ui_text(prop, "Minimum Distance", "The distance from which particles are affected fully.");
1250         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1251
1252         prop= RNA_def_property(srna, "guide_free", PROP_FLOAT, PROP_NONE);
1253         RNA_def_property_float_sdna(prop, NULL, "free_end");
1254         RNA_def_property_range(prop, 0.0f, 0.99f);
1255         RNA_def_property_ui_text(prop, "Free", "Guide-free time from particle life's end");
1256         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1257
1258         prop= RNA_def_property(srna, "guide_path_add", PROP_BOOLEAN, PROP_NONE);
1259         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_ADD);
1260         RNA_def_property_ui_text(prop, "Additive", "Based on distance/falloff it adds a portion of the entire path");
1261         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1262         
1263         /* Clump Settings */
1264         
1265         prop= RNA_def_property(srna, "guide_clump_amount", PROP_FLOAT, PROP_NONE);
1266         RNA_def_property_float_sdna(prop, NULL, "clump_fac");
1267         RNA_def_property_range(prop, -1.0f, 1.0f);
1268         RNA_def_property_ui_text(prop, "Amount", "Amount of clumpimg");
1269         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1270         
1271         prop= RNA_def_property(srna, "guide_clump_shape", PROP_FLOAT, PROP_NONE);
1272         RNA_def_property_float_sdna(prop, NULL, "clump_pow");
1273         RNA_def_property_range(prop, -0.999f, 0.999f);
1274         RNA_def_property_ui_text(prop, "Shape", "Shape of clumpimg");
1275         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1276         
1277         /* Kink Settings */
1278         
1279         prop= RNA_def_property(srna, "guide_kink_type", PROP_ENUM, PROP_NONE);
1280         RNA_def_property_enum_sdna(prop, NULL, "kink");
1281         RNA_def_property_enum_items(prop, guide_kink_items);
1282         RNA_def_property_ui_text(prop, "Kink", "Type of periodic offset on the curve");
1283         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1284         
1285         prop= RNA_def_property(srna, "guide_kink_axis", PROP_ENUM, PROP_NONE);
1286         RNA_def_property_enum_sdna(prop, NULL, "kink_axis");
1287         RNA_def_property_enum_items(prop, guide_kink_axis_items);
1288         RNA_def_property_ui_text(prop, "Axis", "Which axis to use for offset");
1289         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1290
1291         prop= RNA_def_property(srna, "guide_kink_frequency", PROP_FLOAT, PROP_NONE);
1292         RNA_def_property_float_sdna(prop, NULL, "kink_freq");
1293         RNA_def_property_range(prop, 0.0f, 10.0f);
1294         RNA_def_property_ui_text(prop, "Frequency", "The frequency of the offset (1/total length)");
1295         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1296         
1297         prop= RNA_def_property(srna, "guide_kink_shape", PROP_FLOAT, PROP_NONE);
1298         RNA_def_property_float_sdna(prop, NULL, "kink_shape");
1299         RNA_def_property_range(prop, -0.999f, 0.999f);
1300         RNA_def_property_ui_text(prop, "Shape", "djust the offset to the beginning/end");
1301         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1302         
1303         prop= RNA_def_property(srna, "guide_kink_amplitude", PROP_FLOAT, PROP_NONE);
1304         RNA_def_property_float_sdna(prop, NULL, "kink_amp");
1305         RNA_def_property_range(prop, 0.0f, 10.0f);
1306         RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset");
1307         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1308
1309         /* Variables used for Curve Guide, allready wrapped, used for other fields too */
1310         // falloff_power, use_max_distance, maximum_distance
1311 }
1312
1313 static void rna_def_game_softbody(BlenderRNA *brna)
1314 {
1315         StructRNA *srna;
1316         PropertyRNA *prop;
1317
1318         srna= RNA_def_struct(brna, "GameSoftBodySettings", NULL);
1319         RNA_def_struct_sdna(srna, "BulletSoftBody");
1320         RNA_def_struct_ui_text(srna, "Game Soft Body Settings", "Soft body simulation settings for an object in the game engine.");
1321         
1322         /* Floats */
1323         
1324         prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE);
1325         RNA_def_property_float_sdna(prop, NULL, "linStiff");
1326         RNA_def_property_range(prop, 0.0f, 1.0f);
1327         RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links");
1328         
1329         prop= RNA_def_property(srna, "dynamic_friction", PROP_FLOAT, PROP_NONE);
1330         RNA_def_property_float_sdna(prop, NULL, "kDF");
1331         RNA_def_property_range(prop, 0.0f, 1.0f);
1332         RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction");
1333         
1334         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
1335         RNA_def_property_float_sdna(prop, NULL, "kMT");
1336         RNA_def_property_range(prop, 0.0f, 1.0f);
1337         RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold");
1338         
1339         prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE);
1340         RNA_def_property_float_sdna(prop, NULL, "margin");
1341         RNA_def_property_range(prop, 0.01f, 1.0f);
1342         RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable");
1343         
1344         prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE);
1345         RNA_def_property_float_sdna(prop, NULL, "welding");
1346         RNA_def_property_range(prop, 0.0f, 0.01f);
1347         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)");
1348
1349         /* Integers */
1350         
1351         prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE);
1352         RNA_def_property_int_sdna(prop, NULL, "piterations");
1353         RNA_def_property_range(prop, 0, 10);
1354         RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations");
1355         
1356         prop= RNA_def_property(srna, "cluster_iterations", PROP_INT, PROP_NONE);
1357         RNA_def_property_int_sdna(prop, NULL, "numclusteriterations");
1358         RNA_def_property_range(prop, 1, 128);
1359         RNA_def_property_ui_text(prop, "Cluster Iterations", "Specify the number of cluster iterations");
1360         
1361         /* Booleans */
1362         
1363         prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE);
1364         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING);
1365         RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal");
1366         
1367         prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE);
1368         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS);
1369         RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints");
1370         
1371         prop= RNA_def_property(srna, "cluster_rigid_to_softbody", PROP_BOOLEAN, PROP_NONE);
1372         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS);
1373         RNA_def_property_ui_text(prop, "Rigid to Soft Body", "Enable cluster collision between soft and rigid body");
1374         
1375         prop= RNA_def_property(srna, "cluster_soft_to_softbody", PROP_BOOLEAN, PROP_NONE);
1376         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS);
1377         RNA_def_property_ui_text(prop, "Soft to Soft Body", "Enable cluster collision between soft and soft body");
1378 }
1379
1380 static void rna_def_softbody(BlenderRNA *brna)
1381 {
1382         StructRNA *srna;
1383         PropertyRNA *prop;
1384         
1385         static EnumPropertyItem collision_type_items[] = {
1386                 {SBC_MODE_MANUAL, "MANUAL", 0, "Manual", "Manual adjust"},
1387                 {SBC_MODE_AVG, "AVERAGE", 0, "Average", "Average Spring length * Ball Size"},
1388                 {SBC_MODE_MIN, "MINIMAL", 0, "Minimal", "Minimal Spring length * Ball Size"},
1389                 {SBC_MODE_MAX, "MAXIMAL", 0, "Maximal", "Maximal Spring length * Ball Size"},
1390                 {SBC_MODE_AVGMINMAX, "MINMAX", 0, "AvMinMax", "(Min+Max)/2 * Ball Size"},
1391                 {0, NULL, 0, NULL, NULL}};
1392
1393         srna= RNA_def_struct(brna, "SoftBodySettings", NULL);
1394         RNA_def_struct_sdna(srna, "SoftBody");
1395         RNA_def_struct_path_func(srna, "rna_SoftBodySettings_path");
1396         RNA_def_struct_ui_text(srna, "Soft Body Settings", "Soft body simulation settings for an object.");
1397         
1398         /* General Settings */
1399         
1400         prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
1401         RNA_def_property_float_sdna(prop, NULL, "mediafrict");
1402         RNA_def_property_range(prop, 0.0f, 50.0f);
1403         RNA_def_property_ui_text(prop, "Friction", "General media friction for point movements");
1404         RNA_def_property_update(prop, 0, "rna_softbody_update");
1405         
1406         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
1407         RNA_def_property_float_sdna(prop, NULL, "nodemass");
1408         RNA_def_property_range(prop, 0.0f, 50000.0f);
1409         RNA_def_property_ui_text(prop, "Mass", "");
1410         RNA_def_property_update(prop, 0, "rna_softbody_update");
1411         
1412         prop= RNA_def_property(srna, "mass_vertex_group", PROP_STRING, PROP_NONE);
1413         RNA_def_property_string_sdna(prop, NULL, "namedVG_Mass");
1414         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Control point mass values.");
1415         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_mass_vgroup_set");
1416         RNA_def_property_update(prop, 0, "rna_softbody_update");
1417         
1418         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
1419         RNA_def_property_float_sdna(prop, NULL, "grav");
1420         RNA_def_property_range(prop, -10.0f, 10.0f);
1421         RNA_def_property_ui_text(prop, "Gravitation", "Apply gravitation to point movement");
1422         RNA_def_property_update(prop, 0, "rna_softbody_update");
1423         
1424         prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
1425         RNA_def_property_float_sdna(prop, NULL, "physics_speed");
1426         RNA_def_property_range(prop, 0.01f, 100.0f);
1427         RNA_def_property_ui_text(prop, "Speed", "Tweak timing for physics to control frequency and speed");
1428         RNA_def_property_update(prop, 0, "rna_softbody_update");
1429         
1430         /* Goal */
1431         
1432         prop= RNA_def_property(srna, "goal_vertex_group", PROP_STRING, PROP_NONE);
1433         RNA_def_property_string_sdna(prop, NULL, "vertgroup");
1434         RNA_def_property_string_funcs(prop, "rna_SoftBodySettings_goal_vgroup_get", "rna_SoftBodySettings_goal_vgroup_length", "rna_SoftBodySettings_goal_vgroup_set");
1435         RNA_def_property_ui_text(prop, "Goal Vertex Group", "Control point weight values.");
1436         
1437         prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
1438         RNA_def_property_float_sdna(prop, NULL, "mingoal");
1439         RNA_def_property_range(prop, 0.0f, 1.0f);
1440         RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
1441         RNA_def_property_update(prop, 0, "rna_softbody_update");
1442
1443         prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
1444         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
1445         RNA_def_property_range(prop, 0.0f, 1.0f);
1446         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
1447         RNA_def_property_update(prop, 0, "rna_softbody_update");
1448
1449         prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
1450         RNA_def_property_float_sdna(prop, NULL, "defgoal");
1451         RNA_def_property_range(prop, 0.0f, 1.0f);
1452         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
1453         RNA_def_property_update(prop, 0, "rna_softbody_update");
1454         
1455         prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
1456         RNA_def_property_float_sdna(prop, NULL, "goalspring");
1457         RNA_def_property_range(prop, 0.0f, 0.999f);
1458         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
1459         RNA_def_property_update(prop, 0, "rna_softbody_update");
1460         
1461         prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
1462         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
1463         RNA_def_property_range(prop, 0.0f, 50.0f);
1464         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
1465         RNA_def_property_update(prop, 0, "rna_softbody_update");
1466         
1467         /* Edge Spring Settings */
1468         
1469         prop= RNA_def_property(srna, "pull", PROP_FLOAT, PROP_NONE);
1470         RNA_def_property_float_sdna(prop, NULL, "inspring");
1471         RNA_def_property_range(prop, 0.0f, 0.999f);
1472         RNA_def_property_ui_text(prop, "Pull", "Edge spring stiffness when longer than rest length");
1473         RNA_def_property_update(prop, 0, "rna_softbody_update");
1474         
1475         prop= RNA_def_property(srna, "push", PROP_FLOAT, PROP_NONE);
1476         RNA_def_property_float_sdna(prop, NULL, "inpush");
1477         RNA_def_property_range(prop, 0.0f, 0.999f);
1478         RNA_def_property_ui_text(prop, "Push", "Edge spring stiffness when shorter than rest length");
1479         RNA_def_property_update(prop, 0, "rna_softbody_update");
1480         
1481         prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
1482         RNA_def_property_float_sdna(prop, NULL, "infrict");
1483         RNA_def_property_range(prop, 0.0f, 50.0f);
1484         RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
1485         RNA_def_property_update(prop, 0, "rna_softbody_update");
1486         
1487         prop= RNA_def_property(srna, "spring_length", PROP_FLOAT, PROP_NONE);
1488         RNA_def_property_float_sdna(prop, NULL, "springpreload");
1489         RNA_def_property_range(prop, 0.0f, 200.0f);
1490         RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
1491         RNA_def_property_update(prop, 0, "rna_softbody_update");
1492         
1493         prop= RNA_def_property(srna, "aero", PROP_FLOAT, PROP_NONE);
1494         RNA_def_property_float_sdna(prop, NULL, "aeroedge");
1495         RNA_def_property_range(prop, 0.0f, 30000.0f);
1496         RNA_def_property_ui_text(prop, "Aero", "Make edges 'sail'");
1497         RNA_def_property_update(prop, 0, "rna_softbody_update");
1498         
1499         prop= RNA_def_property(srna, "plastic", PROP_FLOAT, PROP_NONE);
1500         RNA_def_property_float_sdna(prop, NULL, "plastic");
1501         RNA_def_property_range(prop, 0.0f, 100.0f);
1502         RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
1503         RNA_def_property_update(prop, 0, "rna_softbody_update");
1504         
1505         prop= RNA_def_property(srna, "bending", PROP_FLOAT, PROP_NONE);
1506         RNA_def_property_float_sdna(prop, NULL, "secondspring");
1507         RNA_def_property_range(prop, 0.0f, 10.0f);
1508         RNA_def_property_ui_text(prop, "Bending", "Bending Stiffness");
1509         RNA_def_property_update(prop, 0, "rna_softbody_update");
1510         
1511         prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
1512         RNA_def_property_float_sdna(prop, NULL, "shearstiff");
1513         RNA_def_property_range(prop, 0.0f, 1.0f);
1514         RNA_def_property_ui_text(prop, "Shear", "Shear Stiffness");
1515         
1516         prop= RNA_def_property(srna, "spring_vertex_group", PROP_STRING, PROP_NONE);
1517         RNA_def_property_string_sdna(prop, NULL, "namedVG_Spring_K");
1518         RNA_def_property_ui_text(prop, "Spring Vertex Group", "Control point spring strength values.");
1519         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_spring_vgroup_set");
1520         RNA_def_property_update(prop, 0, "rna_softbody_update");
1521         
1522         /* Collision */
1523         
1524         prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
1525         RNA_def_property_enum_sdna(prop, NULL, "sbc_mode");
1526         RNA_def_property_enum_items(prop, collision_type_items);
1527         RNA_def_property_ui_text(prop, "Collision Type", "Choose Collision Type");
1528         RNA_def_property_update(prop, 0, "rna_softbody_update");
1529         
1530         prop= RNA_def_property(srna, "ball_size", PROP_FLOAT, PROP_NONE);
1531         RNA_def_property_float_sdna(prop, NULL, "colball");
1532         RNA_def_property_range(prop, -10.0f, 10.0f);
1533         RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted");
1534         RNA_def_property_update(prop, 0, "rna_softbody_update");
1535         
1536         prop= RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE);
1537         RNA_def_property_float_sdna(prop, NULL, "ballstiff");
1538         RNA_def_property_range(prop, 0.001f, 100.0f);
1539         RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating presure");
1540         RNA_def_property_update(prop, 0, "rna_softbody_update");
1541         
1542         prop= RNA_def_property(srna, "ball_damp", PROP_FLOAT, PROP_NONE);
1543         RNA_def_property_float_sdna(prop, NULL, "balldamp");
1544         RNA_def_property_range(prop, 0.001f, 1.0f);
1545         RNA_def_property_ui_text(prop, "Ball Size", "Blending to inelastic collision");
1546         RNA_def_property_update(prop, 0, "rna_softbody_update");
1547         
1548         /* Solver */
1549         
1550         prop= RNA_def_property(srna, "error_limit", PROP_FLOAT, PROP_NONE);
1551         RNA_def_property_float_sdna(prop, NULL, "rklimit");
1552         RNA_def_property_range(prop, 0.001f, 10.0f);
1553         RNA_def_property_ui_text(prop, "Error Limit", "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
1554         RNA_def_property_update(prop, 0, "rna_softbody_update");
1555         
1556         prop= RNA_def_property(srna, "minstep", PROP_INT, PROP_NONE);
1557         RNA_def_property_int_sdna(prop, NULL, "minloops");
1558         RNA_def_property_range(prop, 0, 30000);
1559         RNA_def_property_ui_text(prop, "Min Step", "Minimal # solver steps/frame");
1560         RNA_def_property_update(prop, 0, "rna_softbody_update");
1561         
1562         prop= RNA_def_property(srna, "maxstep", PROP_INT, PROP_NONE);
1563         RNA_def_property_int_sdna(prop, NULL, "maxloops");
1564         RNA_def_property_range(prop, 0, 30000);
1565         RNA_def_property_ui_text(prop, "Max Step", "Maximal # solver steps/frame");
1566         RNA_def_property_update(prop, 0, "rna_softbody_update");
1567         
1568         prop= RNA_def_property(srna, "choke", PROP_INT, PROP_NONE);
1569         RNA_def_property_int_sdna(prop, NULL, "choke");
1570         RNA_def_property_range(prop, 0, 100);
1571         RNA_def_property_ui_text(prop, "Choke", "'Viscosity' inside collision target");
1572         RNA_def_property_update(prop, 0, "rna_softbody_update");
1573         
1574         prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE);
1575         RNA_def_property_int_sdna(prop, NULL, "fuzzyness");
1576         RNA_def_property_range(prop, 1, 100);
1577         RNA_def_property_ui_text(prop, "Fuzzy", "Fuzzyness while on collision, high values make collsion handling faster but less stable");
1578         RNA_def_property_update(prop, 0, "rna_softbody_update");
1579         
1580         prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
1581         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_OLDERR);
1582         RNA_def_property_ui_text(prop, "V", "Use velocities for automagic step sizes");
1583         RNA_def_property_update(prop, 0, "rna_softbody_update");
1584         
1585         prop= RNA_def_property(srna, "diagnose", PROP_BOOLEAN, PROP_NONE);
1586         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_MONITOR);
1587         RNA_def_property_ui_text(prop, "Print Performance to Console", "Turn on SB diagnose console prints");
1588         
1589         /* Flags */
1590         
1591         prop= RNA_def_property(srna, "use_goal", PROP_BOOLEAN, PROP_NONE);
1592         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_goal_get", "rna_SoftBodySettings_use_goal_set");
1593         RNA_def_property_ui_text(prop, "Use Goal", "Define forces for vertices to stick to animated position.");
1594         RNA_def_property_update(prop, 0, "rna_softbody_update");
1595         
1596         prop= RNA_def_property(srna, "use_edges", PROP_BOOLEAN, PROP_NONE);
1597         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_edges_get", "rna_SoftBodySettings_use_edges_set");
1598         RNA_def_property_ui_text(prop, "Use Edges", "Use Edges as springs");
1599         RNA_def_property_update(prop, 0, "rna_softbody_update");
1600         
1601         prop= RNA_def_property(srna, "stiff_quads", PROP_BOOLEAN, PROP_NONE);
1602         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_stiff_quads_get", "rna_SoftBodySettings_stiff_quads_set");
1603         RNA_def_property_ui_text(prop, "Stiff Quads", "Adds diagonal springs on 4-gons.");
1604         RNA_def_property_update(prop, 0, "rna_softbody_update");
1605         
1606         prop= RNA_def_property(srna, "edge_collision", PROP_BOOLEAN, PROP_NONE);
1607         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_edge_collision_get", "rna_SoftBodySettings_edge_collision_set");
1608         RNA_def_property_ui_text(prop, "Edge Collision", "Edges collide too.");
1609         RNA_def_property_update(prop, 0, "rna_softbody_update");
1610         
1611         prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE);
1612         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_face_collision_get", "rna_SoftBodySettings_face_collision_set");
1613         RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, SLOOOOOW warning.");
1614         RNA_def_property_update(prop, 0, "rna_softbody_update");
1615         
1616         prop= RNA_def_property(srna, "new_aero", PROP_BOOLEAN, PROP_NONE);
1617         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set");
1618         RNA_def_property_ui_text(prop, "N", "New aero(uses angle and length).");
1619         RNA_def_property_update(prop, 0, "rna_softbody_update");
1620         
1621         prop= RNA_def_property(srna, "self_collision", PROP_BOOLEAN, PROP_NONE);
1622         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_self_collision_get", "rna_SoftBodySettings_self_collision_set");
1623         RNA_def_property_ui_text(prop, "Self Collision", "Enable naive vertex ball self collision.");
1624         RNA_def_property_update(prop, 0, "rna_softbody_update");
1625
1626         prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
1627         RNA_def_property_pointer_sdna(prop, NULL, "effector_weights");
1628         RNA_def_property_struct_type(prop, "EffectorWeights");
1629         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1630         RNA_def_property_ui_text(prop, "Effector Weights", "");
1631 }
1632
1633 void RNA_def_object_force(BlenderRNA *brna)
1634 {
1635         rna_def_pointcache(brna);
1636         rna_def_collision(brna);
1637         rna_def_effector_weight(brna);
1638         rna_def_field(brna);
1639         rna_def_game_softbody(brna);
1640         rna_def_softbody(brna);
1641 }
1642
1643 #endif