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