use bool for rna funcs.
[blender.git] / source / blender / makesrna / intern / rna_cloth.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008)
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_cloth.c
24  *  \ingroup RNA
25  */
26
27 #include <stdlib.h>
28 #include <limits.h>
29
30 #include "BKE_cloth.h"
31 #include "BKE_modifier.h"
32
33 #include "DNA_cloth_types.h"
34 #include "DNA_object_types.h"
35 #include "DNA_scene_types.h"
36
37 #include "RNA_define.h"
38
39 #include "rna_internal.h"
40
41 #include "WM_api.h"
42 #include "WM_types.h"
43
44 #ifdef RNA_RUNTIME
45
46 #include "BKE_context.h"
47 #include "BKE_depsgraph.h"
48
49 static void rna_cloth_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
50 {
51         Object *ob = (Object *)ptr->id.data;
52
53         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
54         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob);
55 }
56
57 static void rna_cloth_pinning_changed(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
58 {
59         Object *ob = (Object *)ptr->id.data;
60 /*      ClothSimSettings *settings = (ClothSimSettings *)ptr->data; */
61         ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
62
63         cloth_free_modifier(clmd);
64
65         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
66         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob);
67 }
68
69 static void rna_cloth_reset(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
70 {
71         Object *ob = (Object *)ptr->id.data;
72         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
73
74         settings->reset = 1;
75
76         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
77         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob);
78 }
79
80
81 static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
82 {
83         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
84         
85         /* check for clipping */
86         if (value < settings->bending)
87                 value = settings->bending;
88         
89         settings->max_bend = value;
90 }
91
92 static void rna_ClothSettings_max_struct_set(struct PointerRNA *ptr, float value)
93 {
94         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
95         
96         /* check for clipping */
97         if (value < settings->structural)
98                 value = settings->structural;
99         
100         settings->max_struct = value;
101 }
102
103 static void rna_ClothSettings_mass_vgroup_get(PointerRNA *ptr, char *value)
104 {
105         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
106         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_mass);
107 }
108
109 static int rna_ClothSettings_mass_vgroup_length(PointerRNA *ptr)
110 {
111         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
112         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_mass);
113 }
114
115 static void rna_ClothSettings_mass_vgroup_set(PointerRNA *ptr, const char *value)
116 {
117         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
118         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_mass);
119 }
120
121 static void rna_ClothSettings_struct_vgroup_get(PointerRNA *ptr, char *value)
122 {
123         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
124         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_struct);
125 }
126
127 static int rna_ClothSettings_struct_vgroup_length(PointerRNA *ptr)
128 {
129         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
130         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_struct);
131 }
132
133 static void rna_ClothSettings_struct_vgroup_set(PointerRNA *ptr, const char *value)
134 {
135         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
136         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_struct);
137 }
138
139 static void rna_ClothSettings_bend_vgroup_get(PointerRNA *ptr, char *value)
140 {
141         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
142         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_bend);
143 }
144
145 static int rna_ClothSettings_bend_vgroup_length(PointerRNA *ptr)
146 {
147         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
148         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_bend);
149 }
150
151 static void rna_ClothSettings_bend_vgroup_set(PointerRNA *ptr, const char *value)
152 {
153         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
154         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_bend);
155 }
156
157
158 static void rna_CollSettings_selfcol_vgroup_get(PointerRNA *ptr, char *value)
159 {
160         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
161         rna_object_vgroup_name_index_get(ptr, value, coll->vgroup_selfcol);
162 }
163
164 static int rna_CollSettings_selfcol_vgroup_length(PointerRNA *ptr)
165 {
166         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
167         return rna_object_vgroup_name_index_length(ptr, coll->vgroup_selfcol);
168 }
169
170 static void rna_CollSettings_selfcol_vgroup_set(PointerRNA *ptr, const char *value)
171 {
172         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
173         rna_object_vgroup_name_index_set(ptr, value, &coll->vgroup_selfcol);
174 }
175
176 static PointerRNA rna_ClothSettings_rest_shape_key_get(PointerRNA *ptr)
177 {
178         Object *ob = (Object *)ptr->id.data;
179         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
180
181         return rna_object_shapekey_index_get(ob->data, sim->shapekey_rest);
182 }
183
184 static void rna_ClothSettings_rest_shape_key_set(PointerRNA *ptr, PointerRNA value)
185 {
186         Object *ob = (Object *)ptr->id.data;
187         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
188
189         sim->shapekey_rest = rna_object_shapekey_index_set(ob->data, value, sim->shapekey_rest);
190 }
191
192 static void rna_ClothSettings_gravity_get(PointerRNA *ptr, float *values)
193 {
194         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
195
196         values[0] = sim->gravity[0];
197         values[1] = sim->gravity[1];
198         values[2] = sim->gravity[2];
199 }
200
201 static void rna_ClothSettings_gravity_set(PointerRNA *ptr, const float *values)
202 {
203         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
204
205         sim->gravity[0] = values[0];
206         sim->gravity[1] = values[1];
207         sim->gravity[2] = values[2];
208 }
209
210 static char *rna_ClothSettings_path(PointerRNA *ptr)
211 {
212         Object *ob = (Object *)ptr->id.data;
213         ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
214
215         return md ? BLI_sprintfN("modifiers[\"%s\"].settings", md->name) : NULL;
216 }
217
218 static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
219 {
220         Object *ob = (Object *)ptr->id.data;
221         ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
222
223         return md ? BLI_sprintfN("modifiers[\"%s\"].collision_settings", md->name) : NULL;
224 }
225
226 #else
227
228 static void rna_def_cloth_sim_settings(BlenderRNA *brna)
229 {
230         StructRNA *srna;
231         PropertyRNA *prop;
232         
233         srna = RNA_def_struct(brna, "ClothSettings", NULL);
234         RNA_def_struct_ui_text(srna, "Cloth Settings", "Cloth simulation settings for an object");
235         RNA_def_struct_sdna(srna, "ClothSimSettings");
236         RNA_def_struct_path_func(srna, "rna_ClothSettings_path");
237         
238         /* goal */
239         
240         prop = RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
241         RNA_def_property_float_sdna(prop, NULL, "mingoal");
242         RNA_def_property_range(prop, 0.0f, 1.0f);
243         RNA_def_property_ui_text(prop, "Goal Minimum",
244                                  "Goal minimum, vertex group weights are scaled to match this range");
245         RNA_def_property_update(prop, 0, "rna_cloth_update");
246
247         prop = RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
248         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
249         RNA_def_property_range(prop, 0.0f, 1.0f);
250         RNA_def_property_ui_text(prop, "Goal Maximum",
251                                  "Goal maximum, vertex group weights are scaled to match this range");
252         RNA_def_property_update(prop, 0, "rna_cloth_update");
253
254         prop = RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
255         RNA_def_property_float_sdna(prop, NULL, "defgoal");
256         RNA_def_property_range(prop, 0.0f, 1.0f);
257         RNA_def_property_ui_text(prop, "Goal Default",
258                                  "Default Goal (vertex target position) value, when no Vertex Group used");
259         RNA_def_property_update(prop, 0, "rna_cloth_update");
260         
261         prop = RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
262         RNA_def_property_float_sdna(prop, NULL, "goalspring");
263         RNA_def_property_range(prop, 0.0f, 0.999f);
264         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness");
265         RNA_def_property_update(prop, 0, "rna_cloth_update");
266         
267         prop = RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
268         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
269         RNA_def_property_range(prop, 0.0f, 50.0f);
270         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction");
271         RNA_def_property_update(prop, 0, "rna_cloth_update");
272
273         prop = RNA_def_property(srna, "internal_friction", PROP_FLOAT, PROP_NONE);
274         RNA_def_property_float_sdna(prop, NULL, "velocity_smooth");
275         RNA_def_property_range(prop, 0.0f, 1.0f);
276         RNA_def_property_ui_text(prop, "Internal Friction", "");
277         RNA_def_property_update(prop, 0, "rna_cloth_update");
278
279         prop = RNA_def_property(srna, "collider_friction", PROP_FLOAT, PROP_NONE);
280         RNA_def_property_float_sdna(prop, NULL, "collider_friction");
281         RNA_def_property_range(prop, 0.0f, 1.0f);
282         RNA_def_property_ui_text(prop, "Collider Friction", "");
283         RNA_def_property_update(prop, 0, "rna_cloth_update");
284
285         /* mass */
286
287         prop = RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
288         RNA_def_property_range(prop, 0.0f, 10.0f);
289         RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material");
290         RNA_def_property_update(prop, 0, "rna_cloth_update");
291
292         prop = RNA_def_property(srna, "vertex_group_mass", PROP_STRING, PROP_NONE);
293         RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length",
294                                       "rna_ClothSettings_mass_vgroup_set");
295         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
296         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
297         
298         prop = RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
299         RNA_def_property_array(prop, 3);
300         RNA_def_property_range(prop, -100.0, 100.0);
301         RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
302         RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector");
303         RNA_def_property_update(prop, 0, "rna_cloth_update");
304
305         /* various */
306
307         prop = RNA_def_property(srna, "air_damping", PROP_FLOAT, PROP_NONE);
308         RNA_def_property_float_sdna(prop, NULL, "Cvi");
309         RNA_def_property_range(prop, 0.0f, 10.0f);
310         RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
311         RNA_def_property_update(prop, 0, "rna_cloth_update");
312
313         prop = RNA_def_property(srna, "vel_damping", PROP_FLOAT, PROP_NONE);
314         RNA_def_property_float_sdna(prop, NULL, "vel_damping");
315         RNA_def_property_range(prop, 0.0f, 1.0f);
316         RNA_def_property_ui_text(prop, "Velocity Damping",
317                                  "Damp velocity to help cloth reach the resting position faster "
318                                  "(1.0 = no damping, 0.0 = fully dampened)");
319         RNA_def_property_update(prop, 0, "rna_cloth_update");
320
321         prop = RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
322         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
323         RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
324         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
325         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
326
327         prop = RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
328         RNA_def_property_float_sdna(prop, NULL, "goalspring");
329         RNA_def_property_range(prop, 0.0f, 50.0);
330         RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness");
331         RNA_def_property_update(prop, 0, "rna_cloth_update");
332
333         prop = RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
334         RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
335         RNA_def_property_range(prop, 4, 80);
336         RNA_def_property_ui_text(prop, "Quality",
337                                  "Quality of the simulation in steps per frame (higher is better quality but slower)");
338         RNA_def_property_update(prop, 0, "rna_cloth_update");
339
340         /* springs */
341
342         prop = RNA_def_property(srna, "use_stiffness_scale", PROP_BOOLEAN, PROP_NONE);
343         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
344         RNA_def_property_ui_text(prop, "Stiffness Scaling",
345                                  "If enabled, stiffness can be scaled along a weight painted vertex group");
346         RNA_def_property_update(prop, 0, "rna_cloth_update");
347         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
348         
349         prop = RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
350         RNA_def_property_float_sdna(prop, NULL, "Cdis");
351         RNA_def_property_range(prop, 0.0f, 50.0f);
352         RNA_def_property_ui_text(prop, "Spring Damping",
353                                  "Damping of cloth velocity (higher = more smooth, less jiggling)");
354         RNA_def_property_update(prop, 0, "rna_cloth_update");
355         
356         prop = RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
357         RNA_def_property_float_sdna(prop, NULL, "structural");
358         RNA_def_property_range(prop, 0.0f, 10000.0f);
359         RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure");
360         RNA_def_property_update(prop, 0, "rna_cloth_update");
361
362         prop = RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
363         RNA_def_property_float_sdna(prop, NULL, "max_struct");
364         RNA_def_property_range(prop, 0.0f, 10000.0f);
365         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
366         RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value");
367         RNA_def_property_update(prop, 0, "rna_cloth_update");
368
369         prop = RNA_def_property(srna, "vertex_group_structural_stiffness", PROP_STRING, PROP_NONE);
370         RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get",
371                                       "rna_ClothSettings_struct_vgroup_length",
372                                       "rna_ClothSettings_struct_vgroup_set");
373         RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group",
374                                  "Vertex group for fine control over structural stiffness");
375         RNA_def_property_update(prop, 0, "rna_cloth_update");
376
377         prop = RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
378         RNA_def_property_float_sdna(prop, NULL, "bending");
379         RNA_def_property_range(prop, 0.0f, 10000.0f);
380         RNA_def_property_ui_text(prop, "Bending Stiffness",
381                                  "Wrinkle coefficient (higher = less smaller but more big wrinkles)");
382         RNA_def_property_update(prop, 0, "rna_cloth_update");
383
384         prop = RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
385         RNA_def_property_float_sdna(prop, NULL, "max_bend");
386         RNA_def_property_range(prop, 0.0f, 10000.0f);
387         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
388         RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value");
389         RNA_def_property_update(prop, 0, "rna_cloth_update");
390
391         prop = RNA_def_property(srna, "vertex_group_bending", PROP_STRING, PROP_NONE);
392         RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length",
393                                       "rna_ClothSettings_bend_vgroup_set");
394         RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group",
395                                  "Vertex group for fine control over bending stiffness");
396         RNA_def_property_update(prop, 0, "rna_cloth_update");
397
398         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
399         RNA_def_property_struct_type(prop, "EffectorWeights");
400         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
401         RNA_def_property_ui_text(prop, "Effector Weights", "");
402
403         prop = RNA_def_property(srna, "pre_roll", PROP_INT, PROP_NONE);
404         RNA_def_property_int_sdna(prop, NULL, "preroll");
405         RNA_def_property_range(prop, 0, MAXFRAME);
406         RNA_def_property_ui_text(prop, "Pre Roll", "Start simulation a number of frames earlier to let the cloth settle in");
407         RNA_def_property_update(prop, 0, "rna_cloth_reset");
408
409         prop = RNA_def_property(srna, "rest_shape_key", PROP_POINTER, PROP_NONE);
410         RNA_def_property_flag(prop, PROP_EDITABLE);
411         RNA_def_property_struct_type(prop, "ShapeKey");
412         RNA_def_property_pointer_funcs(prop, "rna_ClothSettings_rest_shape_key_get",
413                                        "rna_ClothSettings_rest_shape_key_set", NULL, NULL);
414         RNA_def_property_ui_text(prop, "Rest Shape Key", "Shape key to use the rest spring lengths from");
415         RNA_def_property_update(prop, 0, "rna_cloth_update");
416
417         /* unused */
418
419         /* unused still */
420 #if 0
421         prop = RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
422         RNA_def_property_float_sdna(prop, NULL, "shear");
423         RNA_def_property_range(prop, 0.0f, 1000.0f);
424         RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness");
425 #endif
426         /* unused still */
427 #if 0
428         prop = RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
429         RNA_def_property_float_sdna(prop, NULL, "max_shear");
430         RNA_def_property_range(prop, 0.0f, upperLimitf);
431         RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value");
432 #endif
433         /* unused still */
434 #if 0
435         prop = RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
436         RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
437         RNA_def_property_range(prop, 0.0f, 100.0f);
438         RNA_def_property_ui_text(prop, "Effector Force Scale", "");
439 #endif
440         /* unused still */
441 #if 0
442         prop = RNA_def_property(srna, "effector_wind_scale", PROP_FLOAT, PROP_NONE);
443         RNA_def_property_float_sdna(prop, NULL, "eff_wind_scale");
444         RNA_def_property_range(prop, 0.0f, 100.0f);
445         RNA_def_property_ui_text(prop, "Effector Wind Scale", "");
446 #endif
447         /* unused still */
448 #if 0
449         prop = RNA_def_property(srna, "tearing", PROP_BOOLEAN, PROP_NONE);
450         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_TEARING);
451         RNA_def_property_ui_text(prop, "Tearing", "");
452 #endif
453         /* unused still */
454 #if 0
455         prop = RNA_def_property(srna, "max_spring_extensions", PROP_INT, PROP_NONE);
456         RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
457         RNA_def_property_range(prop, 1.0, 1000.0);
458         RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum extension before spring gets cut");
459 #endif
460 }
461
462 static void rna_def_cloth_collision_settings(BlenderRNA *brna)
463 {
464         StructRNA *srna;
465         PropertyRNA *prop;
466         
467         srna = RNA_def_struct(brna, "ClothCollisionSettings", NULL);
468         RNA_def_struct_ui_text(srna, "Cloth Collision Settings",
469                                "Cloth simulation settings for self collision and collision with other objects");
470         RNA_def_struct_sdna(srna, "ClothCollSettings");
471         RNA_def_struct_path_func(srna, "rna_ClothCollisionSettings_path");
472
473         /* general collision */
474
475         prop = RNA_def_property(srna, "use_collision", PROP_BOOLEAN, PROP_NONE);
476         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
477         RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
478         RNA_def_property_update(prop, 0, "rna_cloth_update");
479
480         prop = RNA_def_property(srna, "repel_force", PROP_FLOAT, PROP_NONE);
481         RNA_def_property_float_sdna(prop, NULL, "repel_force");
482         RNA_def_property_range(prop, 0.0f, 20.0f);
483         RNA_def_property_float_default(prop, 1.0f);
484         RNA_def_property_ui_text(prop, "Repulsion Force", "Repulsion force to apply on cloth when close to colliding");
485         RNA_def_property_update(prop, 0, "rna_cloth_update");
486
487         prop = RNA_def_property(srna, "distance_repel", PROP_FLOAT, PROP_NONE);
488         RNA_def_property_float_sdna(prop, NULL, "distance_repel");
489         RNA_def_property_range(prop, 0.001f, 10.0f);
490         RNA_def_property_float_default(prop, 0.005f);
491         RNA_def_property_ui_text(prop, "Repulsion Distance",
492                                  "Maximum distance to apply repulsion force, must be greater than minimum distance");
493         RNA_def_property_update(prop, 0, "rna_cloth_update");
494         
495         prop = RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
496         RNA_def_property_float_sdna(prop, NULL, "epsilon");
497         RNA_def_property_range(prop, 0.001f, 1.0f);
498         RNA_def_property_ui_text(prop, "Minimum Distance",
499                                  "Minimum distance between collision objects before collision response takes in");
500         RNA_def_property_update(prop, 0, "rna_cloth_update");
501
502         prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
503         RNA_def_property_range(prop, 0.0f, 80.0f);
504         RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened (higher = less movement)");
505         RNA_def_property_update(prop, 0, "rna_cloth_update");
506
507         prop = RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
508         RNA_def_property_int_sdna(prop, NULL, "loop_count");
509         RNA_def_property_range(prop, 1, 20);
510         RNA_def_property_ui_text(prop, "Collision Quality",
511                                  "How many collision iterations should be done. (higher is better quality but slower)");
512         RNA_def_property_update(prop, 0, "rna_cloth_update");
513
514         /* self collision */
515
516         prop = RNA_def_property(srna, "use_self_collision", PROP_BOOLEAN, PROP_NONE);
517         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
518         RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions");
519         RNA_def_property_update(prop, 0, "rna_cloth_update");
520         
521         prop = RNA_def_property(srna, "self_distance_min", PROP_FLOAT, PROP_NONE);
522         RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
523         RNA_def_property_range(prop, 0.5f, 1.0f);
524         RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
525         RNA_def_property_update(prop, 0, "rna_cloth_update");
526         
527         prop = RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
528         RNA_def_property_range(prop, 0.0f, 80.0f);
529         RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact");
530         RNA_def_property_update(prop, 0, "rna_cloth_update");
531
532         prop = RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
533         RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
534         RNA_def_property_range(prop, 1, 10);
535         RNA_def_property_ui_text(prop, "Self Collision Quality",
536                                  "How many self collision iterations should be done "
537                                  "(higher is better quality but slower)");
538         RNA_def_property_update(prop, 0, "rna_cloth_update");
539
540         prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
541         RNA_def_property_flag(prop, PROP_EDITABLE);
542         RNA_def_property_ui_text(prop, "Collision Group", "Limit colliders to this Group");
543         RNA_def_property_update(prop, 0, "rna_cloth_update");
544
545         prop = RNA_def_property(srna, "vertex_group_self_collisions", PROP_STRING, PROP_NONE);
546         RNA_def_property_string_funcs(prop, "rna_CollSettings_selfcol_vgroup_get", "rna_CollSettings_selfcol_vgroup_length",
547                                       "rna_CollSettings_selfcol_vgroup_set");
548         RNA_def_property_ui_text(prop, "Selfcollision Vertex Group",
549                                  "Vertex group to define vertices which are not used during self collisions");
550         RNA_def_property_update(prop, 0, "rna_cloth_update");
551 }
552
553 void RNA_def_cloth(BlenderRNA *brna)
554 {
555         rna_def_cloth_sim_settings(brna);
556         rna_def_cloth_collision_settings(brna);
557 }
558
559 #endif