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