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