spelling errors, no real changes to code.
[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_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         prop= RNA_def_property(srna, "stickness", PROP_FLOAT, PROP_NONE);
815         RNA_def_property_float_sdna(prop, NULL, "pdef_stickness");
816         RNA_def_property_range(prop, 0.0f, 10.0f);
817         RNA_def_property_ui_text(prop, "Stickness", "Amount of stickness to surface collision");
818         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
819         
820         /* Soft Body and Cloth Interaction */
821         
822         prop= RNA_def_property(srna, "inner_thickness", PROP_FLOAT, PROP_NONE);
823         RNA_def_property_float_sdna(prop, NULL, "pdef_sbift");
824         RNA_def_property_range(prop, 0.001f, 1.0f);
825         RNA_def_property_ui_text(prop, "Inner Thickness", "Inner face thickness");
826         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
827         
828         prop= RNA_def_property(srna, "outer_thickness", PROP_FLOAT, PROP_NONE);
829         RNA_def_property_float_sdna(prop, NULL, "pdef_sboft");
830         RNA_def_property_range(prop, 0.001f, 1.0f);
831         RNA_def_property_ui_text(prop, "Outer Thickness", "Outer face thickness");
832         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
833         
834         prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
835         RNA_def_property_float_sdna(prop, NULL, "pdef_sbdamp");
836         RNA_def_property_range(prop, 0.0f, 1.0f);
837         RNA_def_property_ui_text(prop, "Damping", "Amount of damping during collision");
838         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
839         
840         /* Does this belong here?
841         prop= RNA_def_property(srna, "collision_stack", PROP_BOOLEAN, PROP_NONE);
842         RNA_def_property_boolean_sdna(prop, NULL, "softflag", OB_SB_COLLFINAL);
843         RNA_def_property_ui_text(prop, "Collision from Stack", "Pick collision object from modifier stack (softbody only)");
844         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
845         */
846
847         prop= RNA_def_property(srna, "absorption", PROP_FLOAT, PROP_FACTOR);
848         RNA_def_property_range(prop, 0.0f, 1.0f);
849         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 2);
850         RNA_def_property_ui_text(prop, "Absorption", "How much of effector force gets lost during collision with this object (in percent).");
851         RNA_def_property_update(prop, 0, "rna_CollisionSettings_update");
852 }
853
854 static void rna_def_effector_weight(BlenderRNA *brna)
855 {
856         StructRNA *srna;
857         PropertyRNA *prop;
858
859         srna= RNA_def_struct(brna, "EffectorWeights", NULL);
860         RNA_def_struct_sdna(srna, "EffectorWeights");
861         RNA_def_struct_path_func(srna, "rna_EffectorWeight_path");
862         RNA_def_struct_ui_text(srna, "Effector Weights", "Effector weights for physics simulation.");
863         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
864
865         /* Flags */
866         prop= RNA_def_property(srna, "do_growing_hair", PROP_BOOLEAN, PROP_NONE);
867         RNA_def_property_boolean_sdna(prop, NULL, "flag", EFF_WEIGHT_DO_HAIR);
868         RNA_def_property_ui_text(prop, "Use For Growing Hair", "Use force fields when growing hair.");
869         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
870         
871         /* General */
872         prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
873         RNA_def_property_pointer_sdna(prop, NULL, "group");
874         RNA_def_property_struct_type(prop, "Group");
875         RNA_def_property_flag(prop, PROP_EDITABLE);
876         RNA_def_property_ui_text(prop, "Effector Group", "Limit effectors to this Group.");
877         RNA_def_property_update(prop, 0, "rna_EffectorWeight_dependency_update");
878
879         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_NONE);
880         RNA_def_property_float_sdna(prop, NULL, "global_gravity");
881         RNA_def_property_range(prop, -200.0f, 200.0f);
882         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
883         RNA_def_property_ui_text(prop, "Gravity", "Global gravity weight.");
884         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
885
886         /* Effector weights */
887         prop= RNA_def_property(srna, "all", PROP_FLOAT, PROP_NONE);
888         RNA_def_property_float_sdna(prop, NULL, "weight[0]");
889         RNA_def_property_range(prop, -200.0f, 200.0f);
890         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
891         RNA_def_property_ui_text(prop, "All", "All effector's weight.");
892         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
893
894         prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE);
895         RNA_def_property_float_sdna(prop, NULL, "weight[1]");
896         RNA_def_property_range(prop, -200.0f, 200.0f);
897         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
898         RNA_def_property_ui_text(prop, "Force", "Force effector weight.");
899         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
900
901         prop= RNA_def_property(srna, "vortex", PROP_FLOAT, PROP_NONE);
902         RNA_def_property_float_sdna(prop, NULL, "weight[2]");
903         RNA_def_property_range(prop, -200.0f, 200.0f);
904         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
905         RNA_def_property_ui_text(prop, "Vortex", "Vortex effector weight.");
906         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
907
908         prop= RNA_def_property(srna, "magnetic", PROP_FLOAT, PROP_NONE);
909         RNA_def_property_float_sdna(prop, NULL, "weight[3]");
910         RNA_def_property_range(prop, -200.0f, 200.0f);
911         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
912         RNA_def_property_ui_text(prop, "Magnetic", "Magnetic effector weight.");
913         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
914
915         prop= RNA_def_property(srna, "wind", PROP_FLOAT, PROP_NONE);
916         RNA_def_property_float_sdna(prop, NULL, "weight[4]");
917         RNA_def_property_range(prop, -200.0f, 200.0f);
918         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
919         RNA_def_property_ui_text(prop, "Wind", "Wind effector weight.");
920         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
921
922         prop= RNA_def_property(srna, "curveguide", PROP_FLOAT, PROP_NONE);
923         RNA_def_property_float_sdna(prop, NULL, "weight[5]");
924         RNA_def_property_range(prop, -200.0f, 200.0f);
925         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
926         RNA_def_property_ui_text(prop, "Curve Guide", "Curve guide effector weight.");
927         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
928
929         prop= RNA_def_property(srna, "texture", PROP_FLOAT, PROP_NONE);
930         RNA_def_property_float_sdna(prop, NULL, "weight[6]");
931         RNA_def_property_range(prop, -200.0f, 200.0f);
932         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
933         RNA_def_property_ui_text(prop, "Texture", "Texture effector weight.");
934         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
935
936         prop= RNA_def_property(srna, "harmonic", PROP_FLOAT, PROP_NONE);
937         RNA_def_property_float_sdna(prop, NULL, "weight[7]");
938         RNA_def_property_range(prop, -200.0f, 200.0f);
939         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
940         RNA_def_property_ui_text(prop, "Harmonic", "Harmonic effector weight.");
941         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
942
943         prop= RNA_def_property(srna, "charge", PROP_FLOAT, PROP_NONE);
944         RNA_def_property_float_sdna(prop, NULL, "weight[8]");
945         RNA_def_property_range(prop, -200.0f, 200.0f);
946         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
947         RNA_def_property_ui_text(prop, "Charge", "Charge effector weight.");
948         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
949
950         prop= RNA_def_property(srna, "lennardjones", PROP_FLOAT, PROP_NONE);
951         RNA_def_property_float_sdna(prop, NULL, "weight[9]");
952         RNA_def_property_range(prop, -200.0f, 200.0f);
953         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
954         RNA_def_property_ui_text(prop, "Lennard-Jones", "Lennard-Jones effector weight.");
955         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
956
957         prop= RNA_def_property(srna, "boid", PROP_FLOAT, PROP_NONE);
958         RNA_def_property_float_sdna(prop, NULL, "weight[10]");
959         RNA_def_property_range(prop, -200.0f, 200.0f);
960         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
961         RNA_def_property_ui_text(prop, "Boid", "Boid effector weight.");
962         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
963
964         prop= RNA_def_property(srna, "turbulence", PROP_FLOAT, PROP_NONE);
965         RNA_def_property_float_sdna(prop, NULL, "weight[11]");
966         RNA_def_property_range(prop, -200.0f, 200.0f);
967         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
968         RNA_def_property_ui_text(prop, "Turbulence", "Turbulence effector weight.");
969         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
970
971         prop= RNA_def_property(srna, "drag", PROP_FLOAT, PROP_NONE);
972         RNA_def_property_float_sdna(prop, NULL, "weight[12]");
973         RNA_def_property_range(prop, -200.0f, 200.0f);
974         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
975         RNA_def_property_ui_text(prop, "Drag", "Drag effector weight.");
976         RNA_def_property_update(prop, 0, "rna_EffectorWeight_update");
977 }
978
979 static void rna_def_field(BlenderRNA *brna)
980 {
981         StructRNA *srna;
982         PropertyRNA *prop;
983         
984         static EnumPropertyItem field_type_items[] = {
985                 {0, "NONE", 0, "None", ""},
986                 {PFIELD_FORCE, "FORCE", ICON_FORCE_FORCE, "Force", ""},
987                 {PFIELD_WIND, "WIND", ICON_FORCE_WIND, "Wind", ""},
988                 {PFIELD_VORTEX, "VORTEX", ICON_FORCE_VORTEX, "Vortex", ""},
989                 {PFIELD_MAGNET, "MAGNET", ICON_FORCE_MAGNETIC, "Magnetic", ""},
990                 {PFIELD_HARMONIC, "HARMONIC", ICON_FORCE_HARMONIC, "Harmonic", ""},
991                 {PFIELD_CHARGE, "CHARGE", ICON_FORCE_CHARGE, "Charge", ""},
992                 {PFIELD_LENNARDJ, "LENNARDJ", ICON_FORCE_LENNARDJONES, "Lennard-Jones", ""},
993                 {PFIELD_TEXTURE, "TEXTURE", ICON_FORCE_TEXTURE, "Texture", ""},
994                 {PFIELD_GUIDE, "GUIDE", ICON_FORCE_CURVE, "Curve Guide", ""},
995                 {PFIELD_BOID, "BOID", ICON_FORCE_BOID, "Boid", ""},
996                 {PFIELD_TURBULENCE, "TURBULENCE", ICON_FORCE_TURBULENCE, "Turbulence", ""},
997                 {PFIELD_DRAG, "DRAG", ICON_FORCE_DRAG, "Drag", ""},
998                 {0, NULL, 0, NULL, NULL}};
999
1000         static EnumPropertyItem falloff_items[] = {
1001                 {PFIELD_FALL_SPHERE, "SPHERE", 0, "Sphere", ""},
1002                 {PFIELD_FALL_TUBE, "TUBE", 0, "Tube", ""},
1003                 {PFIELD_FALL_CONE, "CONE", 0, "Cone", ""},
1004                 {0, NULL, 0, NULL, NULL}};
1005                 
1006         static EnumPropertyItem texture_items[] = {
1007                 {PFIELD_TEX_RGB, "RGB", 0, "RGB", ""},
1008                 {PFIELD_TEX_GRAD, "GRADIENT", 0, "Gradient", ""},
1009                 {PFIELD_TEX_CURL, "CURL", 0, "Curl", ""},
1010                 {0, NULL, 0, NULL, NULL}};
1011
1012         static EnumPropertyItem zdirection_items[] = {
1013                 {PFIELD_Z_BOTH, "BOTH", 0, "Both Z", ""},
1014                 {PFIELD_Z_POS, "POSITIVE", 0, "+Z", ""},
1015                 {PFIELD_Z_NEG, "NEGATIVE", 0, "-Z", ""},
1016                 {0, NULL, 0, NULL, NULL}};
1017                 
1018         static EnumPropertyItem guide_kink_items[] = {
1019                 {0, "NONE", 0, "Nothing", ""},
1020                 {1, "CURL", 0, "Curl", ""},
1021                 {2, "RADIAL", 0, "Radial", ""},
1022                 {3, "WAVE", 0, "Wave", ""},
1023                 {4, "BRAID", 0, "Braid", ""},
1024                 {5, "ROTATION", 0, "Rotation", ""},
1025                 {6, "ROLL", 0, "Roll", ""},
1026                 {0, NULL, 0, NULL, NULL}};
1027                 
1028         static EnumPropertyItem guide_kink_axis_items[] = {
1029                 {0, "X", 0, "X", ""},
1030                 {1, "Y", 0, "Y", ""},
1031                 {2, "Z", 0, "Z", ""},
1032                 {0, NULL, 0, NULL, NULL}};
1033
1034         srna= RNA_def_struct(brna, "FieldSettings", NULL);
1035         RNA_def_struct_sdna(srna, "PartDeflect");
1036         RNA_def_struct_path_func(srna, "rna_FieldSettings_path");
1037         RNA_def_struct_ui_text(srna, "Field Settings", "Field settings for an object in physics simulation.");
1038         RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
1039         
1040         /* Enums */
1041         
1042         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
1043         RNA_def_property_enum_sdna(prop, NULL, "forcefield");
1044         RNA_def_property_enum_items(prop, field_type_items);
1045         RNA_def_property_ui_text(prop, "Type", "Type of field.");
1046         RNA_def_property_update(prop, 0, "rna_FieldSettings_dependency_update");
1047
1048         prop= RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
1049         RNA_def_property_enum_items(prop, effector_shape_items);
1050         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Effector_shape_itemf");
1051         RNA_def_property_ui_text(prop, "Shape", "Which direction is used to calculate the effector force.");
1052         RNA_def_property_update(prop, 0, "rna_FieldSettings_shape_update");
1053         
1054         prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
1055         RNA_def_property_enum_sdna(prop, NULL, "falloff");
1056         RNA_def_property_enum_items(prop, falloff_items);
1057         RNA_def_property_ui_text(prop, "Fall-Off", "Fall-off shape.");
1058         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1059         
1060         prop= RNA_def_property(srna, "texture_mode", PROP_ENUM, PROP_NONE);
1061         RNA_def_property_enum_sdna(prop, NULL, "tex_mode");
1062         RNA_def_property_enum_items(prop, texture_items);
1063         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)");
1064         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1065
1066         prop= RNA_def_property(srna, "z_direction", PROP_ENUM, PROP_NONE);
1067         RNA_def_property_enum_sdna(prop, NULL, "zdir");
1068         RNA_def_property_enum_items(prop, zdirection_items);
1069         RNA_def_property_ui_text(prop, "Z Direction", "Effect in full or only positive/negative Z direction.");
1070         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1071         
1072         /* Float */
1073         
1074         prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
1075         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1076         RNA_def_property_range(prop, -1000.0f, 1000.0f);
1077         RNA_def_property_ui_text(prop, "Strength", "Strength of force field");
1078         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1079
1080         /* different ui range to above */
1081         prop= RNA_def_property(srna, "linear_drag", PROP_FLOAT, PROP_NONE);
1082         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1083         RNA_def_property_range(prop, -2.0f, 2.0f);
1084         RNA_def_property_ui_text(prop, "Linear Drag", "Drag component proportional to velocity.");
1085         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1086
1087         prop= RNA_def_property(srna, "harmonic_damping", PROP_FLOAT, PROP_NONE);
1088         RNA_def_property_float_sdna(prop, NULL, "f_damp");
1089         RNA_def_property_range(prop, 0.0f, 10.0f);
1090         RNA_def_property_ui_text(prop, "Harmonic Damping", "Damping of the harmonic force");
1091         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1092
1093         /* different ui range to above */
1094         prop= RNA_def_property(srna, "quadratic_drag", PROP_FLOAT, PROP_NONE);
1095         RNA_def_property_float_sdna(prop, NULL, "f_damp");
1096         RNA_def_property_range(prop, -2.0f, 2.0f);
1097         RNA_def_property_ui_text(prop, "Quadratic Drag", "Drag component proportional to the square of velocity.");
1098         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1099
1100         prop= RNA_def_property(srna, "flow", PROP_FLOAT, PROP_NONE);
1101         RNA_def_property_float_sdna(prop, NULL, "f_flow");
1102         RNA_def_property_range(prop, 0.0f, 10.0f);
1103         RNA_def_property_ui_text(prop, "Flow", "Convert effector force into air flow velocity");
1104         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1105
1106         /* different ui range to above */
1107         prop= RNA_def_property(srna, "inflow", PROP_FLOAT, PROP_NONE);
1108         RNA_def_property_float_sdna(prop, NULL, "f_flow");
1109         RNA_def_property_range(prop, -10.0f, 10.0f);
1110         RNA_def_property_ui_text(prop, "Inflow", "Inwards component of the vortex force");
1111         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1112
1113         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
1114         RNA_def_property_float_sdna(prop, NULL, "f_size");
1115         RNA_def_property_range(prop, 0.0f, 10.0f);
1116         RNA_def_property_ui_text(prop, "Size", "Size of the noise");
1117         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1118
1119         prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
1120         RNA_def_property_float_sdna(prop, NULL, "f_size");
1121         RNA_def_property_range(prop, 0.0f, 1000.0f);
1122         RNA_def_property_ui_text(prop, "Rest Length", "Rest length of the harmonic force");
1123         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1124         
1125         prop= RNA_def_property(srna, "falloff_power", PROP_FLOAT, PROP_NONE);
1126         RNA_def_property_float_sdna(prop, NULL, "f_power");
1127         RNA_def_property_range(prop, 0.0f, 10.0f);
1128         RNA_def_property_ui_text(prop, "Falloff Power", "Falloff power (real gravitational falloff = 2)");
1129         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1130         
1131         prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
1132         RNA_def_property_float_sdna(prop, NULL, "mindist");
1133         RNA_def_property_range(prop, 0.0f, 1000.0f);
1134         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance for the field's fall-off");
1135         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1136         
1137         prop= RNA_def_property(srna, "maximum_distance", PROP_FLOAT, PROP_NONE);
1138         RNA_def_property_float_sdna(prop, NULL, "maxdist");
1139         RNA_def_property_range(prop, 0.0f, 1000.0f);
1140         RNA_def_property_ui_text(prop, "Maximum Distance", "Maximum distance for the field to work");
1141         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1142         
1143         prop= RNA_def_property(srna, "radial_minimum", PROP_FLOAT, PROP_NONE);
1144         RNA_def_property_float_sdna(prop, NULL, "minrad");
1145         RNA_def_property_range(prop, 0.0f, 1000.0f);
1146         RNA_def_property_ui_text(prop, "Minimum Radial Distance", "Minimum radial distance for the field's fall-off");
1147         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1148         
1149         prop= RNA_def_property(srna, "radial_maximum", PROP_FLOAT, PROP_NONE);
1150         RNA_def_property_float_sdna(prop, NULL, "maxrad");
1151         RNA_def_property_range(prop, 0.0f, 1000.0f);
1152         RNA_def_property_ui_text(prop, "Maximum Radial Distance", "Maximum radial distance for the field to work");
1153         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1154         
1155         prop= RNA_def_property(srna, "radial_falloff", PROP_FLOAT, PROP_NONE);
1156         RNA_def_property_float_sdna(prop, NULL, "f_power_r");
1157         RNA_def_property_range(prop, 0.0f, 10.0f);
1158         RNA_def_property_ui_text(prop, "Radial Falloff Power", "Radial falloff power (real gravitational falloff = 2)");
1159         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1160
1161         prop= RNA_def_property(srna, "texture_nabla", PROP_FLOAT, PROP_NONE);
1162         RNA_def_property_float_sdna(prop, NULL, "tex_nabla");
1163         RNA_def_property_range(prop, 0.0001f, 1.0f);
1164         RNA_def_property_ui_text(prop, "Nabla", "Defines size of derivative offset used for calculating gradient and curl");
1165         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1166         
1167         prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE);
1168         RNA_def_property_float_sdna(prop, NULL, "f_noise");
1169         RNA_def_property_range(prop, 0.0f, 10.0f);
1170         RNA_def_property_ui_text(prop, "Noise", "Noise of the force");
1171         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1172
1173         prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
1174         RNA_def_property_range(prop, 1, 128);
1175         RNA_def_property_ui_text(prop, "Seed", "Seed of the noise");
1176         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1177
1178         /* Boolean */
1179         
1180         prop= RNA_def_property(srna, "use_min_distance", PROP_BOOLEAN, PROP_NONE);
1181         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMIN);
1182         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum distance for the field's fall-off");
1183         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1184         
1185         prop= RNA_def_property(srna, "use_max_distance", PROP_BOOLEAN, PROP_NONE);
1186         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAX);
1187         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum distance for the field to work");
1188         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1189         
1190         prop= RNA_def_property(srna, "use_radial_min", PROP_BOOLEAN, PROP_NONE);
1191         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMINR);
1192         RNA_def_property_ui_text(prop, "Use Min", "Use a minimum radial distance for the field's fall-off");
1193         // "Use a minimum angle for the field's fall-off"
1194         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1195         
1196         prop= RNA_def_property(srna, "use_radial_max", PROP_BOOLEAN, PROP_NONE);
1197         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_USEMAXR);
1198         RNA_def_property_ui_text(prop, "Use Max", "Use a maximum radial distance for the field to work");
1199         // "Use a maximum angle for the field to work"
1200         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1201
1202         prop= RNA_def_property(srna, "use_coordinates", PROP_BOOLEAN, PROP_NONE);
1203         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_OBJECT);
1204         RNA_def_property_ui_text(prop, "Use Coordinates", "Use object/global coordinates for texture");
1205         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1206
1207         prop= RNA_def_property(srna, "global_coordinates", PROP_BOOLEAN, PROP_NONE);
1208         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GLOBAL_CO);
1209         RNA_def_property_ui_text(prop, "Use Global Coordinates", "Use effector/global coordinates for turbulence");
1210         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1211         
1212         prop= RNA_def_property(srna, "force_2d", PROP_BOOLEAN, PROP_NONE);
1213         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_2D);
1214         RNA_def_property_ui_text(prop, "2D", "Apply force only in 2d");
1215         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1216         
1217         prop= RNA_def_property(srna, "root_coordinates", PROP_BOOLEAN, PROP_NONE);
1218         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_TEX_ROOTCO);
1219         RNA_def_property_ui_text(prop, "Root Texture Coordinates", "Texture coordinates from root particle locations");
1220         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1221
1222         prop= RNA_def_property(srna, "do_location", PROP_BOOLEAN, PROP_NONE);
1223         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_LOCATION);
1224         RNA_def_property_ui_text(prop, "Location", "Effect particles' location");
1225         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1226
1227         prop= RNA_def_property(srna, "do_rotation", PROP_BOOLEAN, PROP_NONE);
1228         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_DO_ROTATION);
1229         RNA_def_property_ui_text(prop, "Rotation", "Effect particles' dynamic rotation");
1230         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1231
1232         prop= RNA_def_property(srna, "do_absorption", PROP_BOOLEAN, PROP_NONE);
1233         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_VISIBILITY);
1234         RNA_def_property_ui_text(prop, "Absorption", "Force gets absorbed by collision objects");
1235         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1236
1237         prop= RNA_def_property(srna, "multiple_springs", PROP_BOOLEAN, PROP_NONE);
1238         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_MULTIPLE_SPRINGS);
1239         RNA_def_property_ui_text(prop, "Multiple Springs", "Every point is effected by multiple springs");
1240         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1241         
1242         /* Pointer */
1243         
1244         prop= RNA_def_property(srna, "texture", PROP_POINTER, PROP_NONE);
1245         RNA_def_property_pointer_sdna(prop, NULL, "tex");
1246         RNA_def_property_flag(prop, PROP_EDITABLE);
1247         RNA_def_property_ui_text(prop, "Texture", "Texture to use as force");
1248         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1249         
1250         /********** Curve Guide Field Settings **********/
1251         
1252         prop= RNA_def_property(srna, "guide_minimum", PROP_FLOAT, PROP_NONE);
1253         RNA_def_property_float_sdna(prop, NULL, "f_strength");
1254         RNA_def_property_range(prop, 0.0f, 1000.0f);
1255         RNA_def_property_ui_text(prop, "Minimum Distance", "The distance from which particles are affected fully.");
1256         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1257
1258         prop= RNA_def_property(srna, "guide_free", PROP_FLOAT, PROP_NONE);
1259         RNA_def_property_float_sdna(prop, NULL, "free_end");
1260         RNA_def_property_range(prop, 0.0f, 0.99f);
1261         RNA_def_property_ui_text(prop, "Free", "Guide-free time from particle life's end");
1262         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1263
1264         prop= RNA_def_property(srna, "guide_path_add", PROP_BOOLEAN, PROP_NONE);
1265         RNA_def_property_boolean_sdna(prop, NULL, "flag", PFIELD_GUIDE_PATH_ADD);
1266         RNA_def_property_ui_text(prop, "Additive", "Based on distance/falloff it adds a portion of the entire path");
1267         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1268         
1269         /* Clump Settings */
1270         
1271         prop= RNA_def_property(srna, "guide_clump_amount", PROP_FLOAT, PROP_NONE);
1272         RNA_def_property_float_sdna(prop, NULL, "clump_fac");
1273         RNA_def_property_range(prop, -1.0f, 1.0f);
1274         RNA_def_property_ui_text(prop, "Amount", "Amount of clumpimg");
1275         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1276         
1277         prop= RNA_def_property(srna, "guide_clump_shape", PROP_FLOAT, PROP_NONE);
1278         RNA_def_property_float_sdna(prop, NULL, "clump_pow");
1279         RNA_def_property_range(prop, -0.999f, 0.999f);
1280         RNA_def_property_ui_text(prop, "Shape", "Shape of clumpimg");
1281         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1282         
1283         /* Kink Settings */
1284         
1285         prop= RNA_def_property(srna, "guide_kink_type", PROP_ENUM, PROP_NONE);
1286         RNA_def_property_enum_sdna(prop, NULL, "kink");
1287         RNA_def_property_enum_items(prop, guide_kink_items);
1288         RNA_def_property_ui_text(prop, "Kink", "Type of periodic offset on the curve");
1289         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1290         
1291         prop= RNA_def_property(srna, "guide_kink_axis", PROP_ENUM, PROP_NONE);
1292         RNA_def_property_enum_sdna(prop, NULL, "kink_axis");
1293         RNA_def_property_enum_items(prop, guide_kink_axis_items);
1294         RNA_def_property_ui_text(prop, "Axis", "Which axis to use for offset");
1295         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1296
1297         prop= RNA_def_property(srna, "guide_kink_frequency", PROP_FLOAT, PROP_NONE);
1298         RNA_def_property_float_sdna(prop, NULL, "kink_freq");
1299         RNA_def_property_range(prop, 0.0f, 10.0f);
1300         RNA_def_property_ui_text(prop, "Frequency", "The frequency of the offset (1/total length)");
1301         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1302         
1303         prop= RNA_def_property(srna, "guide_kink_shape", PROP_FLOAT, PROP_NONE);
1304         RNA_def_property_float_sdna(prop, NULL, "kink_shape");
1305         RNA_def_property_range(prop, -0.999f, 0.999f);
1306         RNA_def_property_ui_text(prop, "Shape", "djust the offset to the beginning/end");
1307         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1308         
1309         prop= RNA_def_property(srna, "guide_kink_amplitude", PROP_FLOAT, PROP_NONE);
1310         RNA_def_property_float_sdna(prop, NULL, "kink_amp");
1311         RNA_def_property_range(prop, 0.0f, 10.0f);
1312         RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset");
1313         RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
1314
1315         /* Variables used for Curve Guide, already wrapped, used for other fields too */
1316         // falloff_power, use_max_distance, maximum_distance
1317 }
1318
1319 static void rna_def_game_softbody(BlenderRNA *brna)
1320 {
1321         StructRNA *srna;
1322         PropertyRNA *prop;
1323
1324         srna= RNA_def_struct(brna, "GameSoftBodySettings", NULL);
1325         RNA_def_struct_sdna(srna, "BulletSoftBody");
1326         RNA_def_struct_ui_text(srna, "Game Soft Body Settings", "Soft body simulation settings for an object in the game engine.");
1327         
1328         /* Floats */
1329         
1330         prop= RNA_def_property(srna, "linstiff", PROP_FLOAT, PROP_NONE);
1331         RNA_def_property_float_sdna(prop, NULL, "linStiff");
1332         RNA_def_property_range(prop, 0.0f, 1.0f);
1333         RNA_def_property_ui_text(prop, "Linear Stiffness", "Linear stiffness of the soft body links");
1334         
1335         prop= RNA_def_property(srna, "dynamic_friction", PROP_FLOAT, PROP_NONE);
1336         RNA_def_property_float_sdna(prop, NULL, "kDF");
1337         RNA_def_property_range(prop, 0.0f, 1.0f);
1338         RNA_def_property_ui_text(prop, "Friction", "Dynamic Friction");
1339         
1340         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
1341         RNA_def_property_float_sdna(prop, NULL, "kMT");
1342         RNA_def_property_range(prop, 0.0f, 1.0f);
1343         RNA_def_property_ui_text(prop, "Threshold", "Shape matching threshold");
1344         
1345         prop= RNA_def_property(srna, "margin", PROP_FLOAT, PROP_NONE);
1346         RNA_def_property_float_sdna(prop, NULL, "margin");
1347         RNA_def_property_range(prop, 0.01f, 1.0f);
1348         RNA_def_property_ui_text(prop, "Margin", "Collision margin for soft body. Small value makes the algorithm unstable");
1349         
1350         prop= RNA_def_property(srna, "welding", PROP_FLOAT, PROP_NONE);
1351         RNA_def_property_float_sdna(prop, NULL, "welding");
1352         RNA_def_property_range(prop, 0.0f, 0.01f);
1353         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)");
1354
1355         /* Integers */
1356         
1357         prop= RNA_def_property(srna, "position_iterations", PROP_INT, PROP_NONE);
1358         RNA_def_property_int_sdna(prop, NULL, "piterations");
1359         RNA_def_property_range(prop, 0, 10);
1360         RNA_def_property_ui_text(prop, "Position Iterations", "Position solver iterations");
1361         
1362         prop= RNA_def_property(srna, "cluster_iterations", PROP_INT, PROP_NONE);
1363         RNA_def_property_int_sdna(prop, NULL, "numclusteriterations");
1364         RNA_def_property_range(prop, 1, 128);
1365         RNA_def_property_ui_text(prop, "Cluster Iterations", "Specify the number of cluster iterations");
1366         
1367         /* Booleans */
1368         
1369         prop= RNA_def_property(srna, "shape_match", PROP_BOOLEAN, PROP_NONE);
1370         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_SHAPE_MATCHING);
1371         RNA_def_property_ui_text(prop, "Shape Match", "Enable soft body shape matching goal");
1372         
1373         prop= RNA_def_property(srna, "bending_const", PROP_BOOLEAN, PROP_NONE);
1374         RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_BSB_BENDING_CONSTRAINTS);
1375         RNA_def_property_ui_text(prop, "Bending Const", "Enable bending constraints");
1376         
1377         prop= RNA_def_property(srna, "cluster_rigid_to_softbody", PROP_BOOLEAN, PROP_NONE);
1378         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_RS);
1379         RNA_def_property_ui_text(prop, "Rigid to Soft Body", "Enable cluster collision between soft and rigid body");
1380         
1381         prop= RNA_def_property(srna, "cluster_soft_to_softbody", PROP_BOOLEAN, PROP_NONE);
1382         RNA_def_property_boolean_sdna(prop, NULL, "collisionflags", OB_BSB_COL_CL_SS);
1383         RNA_def_property_ui_text(prop, "Soft to Soft Body", "Enable cluster collision between soft and soft body");
1384 }
1385
1386 static void rna_def_softbody(BlenderRNA *brna)
1387 {
1388         StructRNA *srna;
1389         PropertyRNA *prop;
1390         int matrix_dimsize[]= {3, 3};
1391
1392         
1393         static EnumPropertyItem collision_type_items[] = {
1394                 {SBC_MODE_MANUAL, "MANUAL", 0, "Manual", "Manual adjust"},
1395                 {SBC_MODE_AVG, "AVERAGE", 0, "Average", "Average Spring length * Ball Size"},
1396                 {SBC_MODE_MIN, "MINIMAL", 0, "Minimal", "Minimal Spring length * Ball Size"},
1397                 {SBC_MODE_MAX, "MAXIMAL", 0, "Maximal", "Maximal Spring length * Ball Size"},
1398                 {SBC_MODE_AVGMINMAX, "MINMAX", 0, "AvMinMax", "(Min+Max)/2 * Ball Size"},
1399                 {0, NULL, 0, NULL, NULL}};
1400
1401         srna= RNA_def_struct(brna, "SoftBodySettings", NULL);
1402         RNA_def_struct_sdna(srna, "SoftBody");
1403         RNA_def_struct_path_func(srna, "rna_SoftBodySettings_path");
1404         RNA_def_struct_ui_text(srna, "Soft Body Settings", "Soft body simulation settings for an object.");
1405         
1406         /* General Settings */
1407         
1408         prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
1409         RNA_def_property_float_sdna(prop, NULL, "mediafrict");
1410         RNA_def_property_range(prop, 0.0f, 50.0f);
1411         RNA_def_property_ui_text(prop, "Friction", "General media friction for point movements");
1412         RNA_def_property_update(prop, 0, "rna_softbody_update");
1413         
1414         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
1415         RNA_def_property_float_sdna(prop, NULL, "nodemass");
1416         RNA_def_property_range(prop, 0.0f, 50000.0f);
1417         RNA_def_property_ui_text(prop, "Mass", "");
1418         RNA_def_property_update(prop, 0, "rna_softbody_update");
1419         
1420         prop= RNA_def_property(srna, "mass_vertex_group", PROP_STRING, PROP_NONE);
1421         RNA_def_property_string_sdna(prop, NULL, "namedVG_Mass");
1422         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Control point mass values.");
1423         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_mass_vgroup_set");
1424         RNA_def_property_update(prop, 0, "rna_softbody_update");
1425         
1426         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
1427         RNA_def_property_float_sdna(prop, NULL, "grav");
1428         RNA_def_property_range(prop, -10.0f, 10.0f);
1429         RNA_def_property_ui_text(prop, "Gravitation", "Apply gravitation to point movement");
1430         RNA_def_property_update(prop, 0, "rna_softbody_update");
1431         
1432         prop= RNA_def_property(srna, "speed", PROP_FLOAT, PROP_NONE);
1433         RNA_def_property_float_sdna(prop, NULL, "physics_speed");
1434         RNA_def_property_range(prop, 0.01f, 100.0f);
1435         RNA_def_property_ui_text(prop, "Speed", "Tweak timing for physics to control frequency and speed");
1436         RNA_def_property_update(prop, 0, "rna_softbody_update");
1437         
1438         /* Goal */
1439         
1440         prop= RNA_def_property(srna, "goal_vertex_group", PROP_STRING, PROP_NONE);
1441         RNA_def_property_string_sdna(prop, NULL, "vertgroup");
1442         RNA_def_property_string_funcs(prop, "rna_SoftBodySettings_goal_vgroup_get", "rna_SoftBodySettings_goal_vgroup_length", "rna_SoftBodySettings_goal_vgroup_set");
1443         RNA_def_property_ui_text(prop, "Goal Vertex Group", "Control point weight values.");
1444         
1445         prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
1446         RNA_def_property_float_sdna(prop, NULL, "mingoal");
1447         RNA_def_property_range(prop, 0.0f, 1.0f);
1448         RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
1449         RNA_def_property_update(prop, 0, "rna_softbody_update");
1450
1451         prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
1452         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
1453         RNA_def_property_range(prop, 0.0f, 1.0f);
1454         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
1455         RNA_def_property_update(prop, 0, "rna_softbody_update");
1456
1457         prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
1458         RNA_def_property_float_sdna(prop, NULL, "defgoal");
1459         RNA_def_property_range(prop, 0.0f, 1.0f);
1460         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
1461         RNA_def_property_update(prop, 0, "rna_softbody_update");
1462         
1463         prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
1464         RNA_def_property_float_sdna(prop, NULL, "goalspring");
1465         RNA_def_property_range(prop, 0.0f, 0.999f);
1466         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
1467         RNA_def_property_update(prop, 0, "rna_softbody_update");
1468         
1469         prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
1470         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
1471         RNA_def_property_range(prop, 0.0f, 50.0f);
1472         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
1473         RNA_def_property_update(prop, 0, "rna_softbody_update");
1474         
1475         /* Edge Spring Settings */
1476         
1477         prop= RNA_def_property(srna, "pull", PROP_FLOAT, PROP_NONE);
1478         RNA_def_property_float_sdna(prop, NULL, "inspring");
1479         RNA_def_property_range(prop, 0.0f, 0.999f);
1480         RNA_def_property_ui_text(prop, "Pull", "Edge spring stiffness when longer than rest length");
1481         RNA_def_property_update(prop, 0, "rna_softbody_update");
1482         
1483         prop= RNA_def_property(srna, "push", PROP_FLOAT, PROP_NONE);
1484         RNA_def_property_float_sdna(prop, NULL, "inpush");
1485         RNA_def_property_range(prop, 0.0f, 0.999f);
1486         RNA_def_property_ui_text(prop, "Push", "Edge spring stiffness when shorter than rest length");
1487         RNA_def_property_update(prop, 0, "rna_softbody_update");
1488         
1489         prop= RNA_def_property(srna, "damp", PROP_FLOAT, PROP_NONE);
1490         RNA_def_property_float_sdna(prop, NULL, "infrict");
1491         RNA_def_property_range(prop, 0.0f, 50.0f);
1492         RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
1493         RNA_def_property_update(prop, 0, "rna_softbody_update");
1494         
1495         prop= RNA_def_property(srna, "spring_length", PROP_FLOAT, PROP_NONE);
1496         RNA_def_property_float_sdna(prop, NULL, "springpreload");
1497         RNA_def_property_range(prop, 0.0f, 200.0f);
1498         RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
1499         RNA_def_property_update(prop, 0, "rna_softbody_update");
1500         
1501         prop= RNA_def_property(srna, "aero", PROP_FLOAT, PROP_NONE);
1502         RNA_def_property_float_sdna(prop, NULL, "aeroedge");
1503         RNA_def_property_range(prop, 0.0f, 30000.0f);
1504         RNA_def_property_ui_text(prop, "Aero", "Make edges 'sail'");
1505         RNA_def_property_update(prop, 0, "rna_softbody_update");
1506         
1507         prop= RNA_def_property(srna, "plastic", PROP_FLOAT, PROP_NONE);
1508         RNA_def_property_float_sdna(prop, NULL, "plastic");
1509         RNA_def_property_range(prop, 0.0f, 100.0f);
1510         RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
1511         RNA_def_property_update(prop, 0, "rna_softbody_update");
1512         
1513         prop= RNA_def_property(srna, "bending", PROP_FLOAT, PROP_NONE);
1514         RNA_def_property_float_sdna(prop, NULL, "secondspring");
1515         RNA_def_property_range(prop, 0.0f, 10.0f);
1516         RNA_def_property_ui_text(prop, "Bending", "Bending Stiffness");
1517         RNA_def_property_update(prop, 0, "rna_softbody_update");
1518         
1519         prop= RNA_def_property(srna, "shear", PROP_FLOAT, PROP_NONE);
1520         RNA_def_property_float_sdna(prop, NULL, "shearstiff");
1521         RNA_def_property_range(prop, 0.0f, 1.0f);
1522         RNA_def_property_ui_text(prop, "Shear", "Shear Stiffness");
1523         
1524         prop= RNA_def_property(srna, "spring_vertex_group", PROP_STRING, PROP_NONE);
1525         RNA_def_property_string_sdna(prop, NULL, "namedVG_Spring_K");
1526         RNA_def_property_ui_text(prop, "Spring Vertex Group", "Control point spring strength values.");
1527         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SoftBodySettings_spring_vgroup_set");
1528         RNA_def_property_update(prop, 0, "rna_softbody_update");
1529         
1530         /* Collision */
1531         
1532         prop= RNA_def_property(srna, "collision_type", PROP_ENUM, PROP_NONE);
1533         RNA_def_property_enum_sdna(prop, NULL, "sbc_mode");
1534         RNA_def_property_enum_items(prop, collision_type_items);
1535         RNA_def_property_ui_text(prop, "Collision Type", "Choose Collision Type");
1536         RNA_def_property_update(prop, 0, "rna_softbody_update");
1537         
1538         prop= RNA_def_property(srna, "ball_size", PROP_FLOAT, PROP_NONE);
1539         RNA_def_property_float_sdna(prop, NULL, "colball");
1540         RNA_def_property_range(prop, -10.0f, 10.0f);
1541         RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted");
1542         RNA_def_property_update(prop, 0, "rna_softbody_update");
1543         
1544         prop= RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE);
1545         RNA_def_property_float_sdna(prop, NULL, "ballstiff");
1546         RNA_def_property_range(prop, 0.001f, 100.0f);
1547         RNA_def_property_ui_text(prop, "Ball Size", "Ball inflating presure");
1548         RNA_def_property_update(prop, 0, "rna_softbody_update");
1549         
1550         prop= RNA_def_property(srna, "ball_damp", PROP_FLOAT, PROP_NONE);
1551         RNA_def_property_float_sdna(prop, NULL, "balldamp");
1552         RNA_def_property_range(prop, 0.001f, 1.0f);
1553         RNA_def_property_ui_text(prop, "Ball Size", "Blending to inelastic collision");
1554         RNA_def_property_update(prop, 0, "rna_softbody_update");
1555         
1556         /* Solver */
1557         
1558         prop= RNA_def_property(srna, "error_limit", PROP_FLOAT, PROP_NONE);
1559         RNA_def_property_float_sdna(prop, NULL, "rklimit");
1560         RNA_def_property_range(prop, 0.001f, 10.0f);
1561         RNA_def_property_ui_text(prop, "Error Limit", "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed");
1562         RNA_def_property_update(prop, 0, "rna_softbody_update");
1563         
1564         prop= RNA_def_property(srna, "minstep", PROP_INT, PROP_NONE);
1565         RNA_def_property_int_sdna(prop, NULL, "minloops");
1566         RNA_def_property_range(prop, 0, 30000);
1567         RNA_def_property_ui_text(prop, "Min Step", "Minimal # solver steps/frame");
1568         RNA_def_property_update(prop, 0, "rna_softbody_update");
1569         
1570         prop= RNA_def_property(srna, "maxstep", PROP_INT, PROP_NONE);
1571         RNA_def_property_int_sdna(prop, NULL, "maxloops");
1572         RNA_def_property_range(prop, 0, 30000);
1573         RNA_def_property_ui_text(prop, "Max Step", "Maximal # solver steps/frame");
1574         RNA_def_property_update(prop, 0, "rna_softbody_update");
1575         
1576         prop= RNA_def_property(srna, "choke", PROP_INT, PROP_NONE);
1577         RNA_def_property_int_sdna(prop, NULL, "choke");
1578         RNA_def_property_range(prop, 0, 100);
1579         RNA_def_property_ui_text(prop, "Choke", "'Viscosity' inside collision target");
1580         RNA_def_property_update(prop, 0, "rna_softbody_update");
1581         
1582         prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE);
1583         RNA_def_property_int_sdna(prop, NULL, "fuzzyness");
1584         RNA_def_property_range(prop, 1, 100);
1585         RNA_def_property_ui_text(prop, "Fuzzy", "Fuzzyness while on collision, high values make collsion handling faster but less stable");
1586         RNA_def_property_update(prop, 0, "rna_softbody_update");
1587         
1588         prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
1589         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_OLDERR);
1590         RNA_def_property_ui_text(prop, "V", "Use velocities for automagic step sizes");
1591         RNA_def_property_update(prop, 0, "rna_softbody_update");
1592         
1593         prop= RNA_def_property(srna, "diagnose", PROP_BOOLEAN, PROP_NONE);
1594         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_MONITOR);
1595         RNA_def_property_ui_text(prop, "Print Performance to Console", "Turn on SB diagnose console prints");
1596         
1597         prop= RNA_def_property(srna, "estimate_matrix", PROP_BOOLEAN, PROP_NONE);
1598         RNA_def_property_boolean_sdna(prop, NULL, "solverflags", SBSO_ESTIMATEIPO);
1599         RNA_def_property_ui_text(prop, "Estimate matrix", "esimate matrix .. split to COM , ROT ,SCALE ");
1600
1601
1602         /***********************************************************************************/
1603         /* these are not exactly settings, but reading calculated results*/
1604         /* but i did not want to start a new property struct */
1605         /* so rather rename this from SoftBodySettings to SoftBody */
1606         /* translation */
1607         prop= RNA_def_property(srna, "lcom", PROP_FLOAT, PROP_TRANSLATION);
1608         RNA_def_property_float_sdna(prop, NULL, "lcom");
1609         RNA_def_property_ui_text(prop, "Center of mass", "Location of Center of mass.");
1610
1611         /* matrix */
1612         prop= RNA_def_property(srna, "lrot", PROP_FLOAT, PROP_MATRIX);
1613         RNA_def_property_float_sdna(prop, NULL, "lrot");
1614         RNA_def_property_multi_array(prop, 2, matrix_dimsize);
1615         RNA_def_property_ui_text(prop, "Rot Matrix", "Estimated rotation matrix.");
1616
1617         prop= RNA_def_property(srna, "lscale", PROP_FLOAT, PROP_MATRIX);
1618         RNA_def_property_float_sdna(prop, NULL, "lscale");
1619         RNA_def_property_multi_array(prop, 2, matrix_dimsize);
1620         RNA_def_property_ui_text(prop, "Scale Matrix", "Estimated scale matrix.");
1621         /***********************************************************************************/
1622
1623
1624         /* Flags */
1625         
1626         prop= RNA_def_property(srna, "use_goal", PROP_BOOLEAN, PROP_NONE);
1627         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_goal_get", "rna_SoftBodySettings_use_goal_set");
1628         RNA_def_property_ui_text(prop, "Use Goal", "Define forces for vertices to stick to animated position.");
1629         RNA_def_property_update(prop, 0, "rna_softbody_update");
1630         
1631         prop= RNA_def_property(srna, "use_edges", PROP_BOOLEAN, PROP_NONE);
1632         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_use_edges_get", "rna_SoftBodySettings_use_edges_set");
1633         RNA_def_property_ui_text(prop, "Use Edges", "Use Edges as springs");
1634         RNA_def_property_update(prop, 0, "rna_softbody_update");
1635         
1636         prop= RNA_def_property(srna, "stiff_quads", PROP_BOOLEAN, PROP_NONE);
1637         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_stiff_quads_get", "rna_SoftBodySettings_stiff_quads_set");
1638         RNA_def_property_ui_text(prop, "Stiff Quads", "Adds diagonal springs on 4-gons.");
1639         RNA_def_property_update(prop, 0, "rna_softbody_update");
1640         
1641         prop= RNA_def_property(srna, "edge_collision", PROP_BOOLEAN, PROP_NONE);
1642         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_edge_collision_get", "rna_SoftBodySettings_edge_collision_set");
1643         RNA_def_property_ui_text(prop, "Edge Collision", "Edges collide too.");
1644         RNA_def_property_update(prop, 0, "rna_softbody_update");
1645         
1646         prop= RNA_def_property(srna, "face_collision", PROP_BOOLEAN, PROP_NONE);
1647         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_face_collision_get", "rna_SoftBodySettings_face_collision_set");
1648         RNA_def_property_ui_text(prop, "Face Collision", "Faces collide too, SLOOOOOW warning.");
1649         RNA_def_property_update(prop, 0, "rna_softbody_update");
1650         
1651         prop= RNA_def_property(srna, "new_aero", PROP_BOOLEAN, PROP_NONE);
1652         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_new_aero_get", "rna_SoftBodySettings_new_aero_set");
1653         RNA_def_property_ui_text(prop, "N", "New aero(uses angle and length).");
1654         RNA_def_property_update(prop, 0, "rna_softbody_update");
1655         
1656         prop= RNA_def_property(srna, "self_collision", PROP_BOOLEAN, PROP_NONE);
1657         RNA_def_property_boolean_funcs(prop, "rna_SoftBodySettings_self_collision_get", "rna_SoftBodySettings_self_collision_set");
1658         RNA_def_property_ui_text(prop, "Self Collision", "Enable naive vertex ball self collision.");
1659         RNA_def_property_update(prop, 0, "rna_softbody_update");
1660
1661         prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
1662         RNA_def_property_pointer_sdna(prop, NULL, "effector_weights");
1663         RNA_def_property_struct_type(prop, "EffectorWeights");
1664         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1665         RNA_def_property_ui_text(prop, "Effector Weights", "");
1666 }
1667
1668 void RNA_def_object_force(BlenderRNA *brna)
1669 {
1670         rna_def_pointcache(brna);
1671         rna_def_collision(brna);
1672         rna_def_effector_weight(brna);
1673         rna_def_field(brna);
1674         rna_def_game_softbody(brna);
1675         rna_def_softbody(brna);
1676 }
1677
1678 #endif