34a9dc592b94b2ebce6509f5cd0a925f4294ace8
[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", "Goal minimum, vertex group weights are scaled to match this range");
226         RNA_def_property_update(prop, 0, "rna_cloth_update");
227
228         prop = RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
229         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
230         RNA_def_property_range(prop, 0.0f, 1.0f);
231         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range");
232         RNA_def_property_update(prop, 0, "rna_cloth_update");
233
234         prop = RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
235         RNA_def_property_float_sdna(prop, NULL, "defgoal");
236         RNA_def_property_range(prop, 0.0f, 1.0f);
237         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used");
238         RNA_def_property_update(prop, 0, "rna_cloth_update");
239         
240         prop = RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
241         RNA_def_property_float_sdna(prop, NULL, "goalspring");
242         RNA_def_property_range(prop, 0.0f, 0.999f);
243         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness");
244         RNA_def_property_update(prop, 0, "rna_cloth_update");
245         
246         prop = RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
247         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
248         RNA_def_property_range(prop, 0.0f, 50.0f);
249         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction");
250         RNA_def_property_update(prop, 0, "rna_cloth_update");
251
252         prop = RNA_def_property(srna, "internal_friction", PROP_FLOAT, PROP_NONE);
253         RNA_def_property_float_sdna(prop, NULL, "velocity_smooth");
254         RNA_def_property_range(prop, 0.0f, 1.0f);
255         RNA_def_property_ui_text(prop, "Internal Friction", "");
256         RNA_def_property_update(prop, 0, "rna_cloth_update");
257
258         prop = RNA_def_property(srna, "collider_friction", PROP_FLOAT, PROP_NONE);
259         RNA_def_property_float_sdna(prop, NULL, "collider_friction");
260         RNA_def_property_range(prop, 0.0f, 1.0f);
261         RNA_def_property_ui_text(prop, "Collider Friction", "");
262         RNA_def_property_update(prop, 0, "rna_cloth_update");
263
264         /* mass */
265
266         prop = RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
267         RNA_def_property_range(prop, 0.0f, 10.0f);
268         RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material");
269         RNA_def_property_update(prop, 0, "rna_cloth_update");
270
271         prop = RNA_def_property(srna, "vertex_group_mass", PROP_STRING, PROP_NONE);
272         RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length",
273                                       "rna_ClothSettings_mass_vgroup_set");
274         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
275         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
276         
277         prop = RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
278         RNA_def_property_array(prop, 3);
279         RNA_def_property_range(prop, -100.0, 100.0);
280         RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
281         RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector");
282         RNA_def_property_update(prop, 0, "rna_cloth_update");
283
284         /* various */
285
286         prop = RNA_def_property(srna, "air_damping", PROP_FLOAT, PROP_NONE);
287         RNA_def_property_float_sdna(prop, NULL, "Cvi");
288         RNA_def_property_range(prop, 0.0f, 10.0f);
289         RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
290         RNA_def_property_update(prop, 0, "rna_cloth_update");
291
292         prop = RNA_def_property(srna, "vel_damping", PROP_FLOAT, PROP_NONE);
293         RNA_def_property_float_sdna(prop, NULL, "vel_damping");
294         RNA_def_property_range(prop, 0.0f, 1.0f);
295         RNA_def_property_ui_text(prop, "Velocity Damping",
296                                  "Damp velocity to help cloth reach the resting position faster "
297                                  "(1.0 = no damping, 0.0 = fully dampened)");
298         RNA_def_property_update(prop, 0, "rna_cloth_update");
299
300         prop = RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
301         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
302         RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
303         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
304         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
305
306         prop = RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
307         RNA_def_property_float_sdna(prop, NULL, "goalspring");
308         RNA_def_property_range(prop, 0.0f, 50.0);
309         RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness");
310         RNA_def_property_update(prop, 0, "rna_cloth_update");
311
312         prop = RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
313         RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
314         RNA_def_property_range(prop, 4, 80);
315         RNA_def_property_ui_text(prop, "Quality",
316                                  "Quality of the simulation in steps per frame (higher is better quality but slower)");
317         RNA_def_property_update(prop, 0, "rna_cloth_update");
318
319         /* springs */
320
321         prop = RNA_def_property(srna, "use_stiffness_scale", PROP_BOOLEAN, PROP_NONE);
322         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
323         RNA_def_property_ui_text(prop, "Stiffness Scaling",
324                                  "If enabled, stiffness can be scaled along a weight painted vertex group");
325         RNA_def_property_update(prop, 0, "rna_cloth_update");
326         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
327         
328         prop = RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
329         RNA_def_property_float_sdna(prop, NULL, "Cdis");
330         RNA_def_property_range(prop, 0.0f, 50.0f);
331         RNA_def_property_ui_text(prop, "Spring Damping", "Damping of cloth velocity (higher = more smooth, less jiggling)");
332         RNA_def_property_update(prop, 0, "rna_cloth_update");
333         
334         prop = RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
335         RNA_def_property_float_sdna(prop, NULL, "structural");
336         RNA_def_property_range(prop, 0.0f, 10000.0f);
337         RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure");
338         RNA_def_property_update(prop, 0, "rna_cloth_update");
339
340         prop = RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
341         RNA_def_property_float_sdna(prop, NULL, "max_struct");
342         RNA_def_property_range(prop, 0.0f, 10000.0f);
343         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
344         RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value");
345         RNA_def_property_update(prop, 0, "rna_cloth_update");
346
347         prop = RNA_def_property(srna, "vertex_group_structural_stiffness", PROP_STRING, PROP_NONE);
348         RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get", "rna_ClothSettings_struct_vgroup_length",
349                                       "rna_ClothSettings_struct_vgroup_set");
350         RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group",
351                                  "Vertex group for fine control over structural stiffness");
352         RNA_def_property_update(prop, 0, "rna_cloth_update");
353
354         prop = RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
355         RNA_def_property_float_sdna(prop, NULL, "bending");
356         RNA_def_property_range(prop, 0.0f, 10000.0f);
357         RNA_def_property_ui_text(prop, "Bending Stiffness", "Wrinkle coefficient (higher = less smaller but more big wrinkles)");
358         RNA_def_property_update(prop, 0, "rna_cloth_update");
359
360         prop = RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
361         RNA_def_property_float_sdna(prop, NULL, "max_bend");
362         RNA_def_property_range(prop, 0.0f, 10000.0f);
363         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
364         RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value");
365         RNA_def_property_update(prop, 0, "rna_cloth_update");
366
367         prop = RNA_def_property(srna, "vertex_group_bending", PROP_STRING, PROP_NONE);
368         RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length",
369                                       "rna_ClothSettings_bend_vgroup_set");
370         RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group", "Vertex group for fine control over bending stiffness");
371         RNA_def_property_update(prop, 0, "rna_cloth_update");
372
373         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
374         RNA_def_property_struct_type(prop, "EffectorWeights");
375         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
376         RNA_def_property_ui_text(prop, "Effector Weights", "");
377
378         prop = RNA_def_property(srna, "pre_roll", PROP_INT, PROP_NONE);
379         RNA_def_property_int_sdna(prop, NULL, "preroll");
380         RNA_def_property_range(prop, 0, 200);
381         RNA_def_property_ui_text(prop, "Pre Roll", "Simulation starts on this frame");
382         RNA_def_property_update(prop, 0, "rna_cloth_reset");
383
384         prop = RNA_def_property(srna, "rest_shape_key", PROP_POINTER, PROP_NONE);
385         RNA_def_property_flag(prop, PROP_EDITABLE);
386         RNA_def_property_struct_type(prop, "ShapeKey");
387         RNA_def_property_pointer_funcs(prop, "rna_ClothSettings_rest_shape_key_get",
388                                        "rna_ClothSettings_rest_shape_key_set", NULL, NULL);
389         RNA_def_property_ui_text(prop, "Rest Shape Key", "Shape key to use the rest spring lengths from");
390         RNA_def_property_update(prop, 0, "rna_cloth_update");
391
392         /* unused */
393
394         /* unused still
395         prop= RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
396         RNA_def_property_float_sdna(prop, NULL, "shear");
397         RNA_def_property_range(prop, 0.0f, 1000.0f);
398         RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness"); */
399
400         /* unused still
401         prop= RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
402         RNA_def_property_float_sdna(prop, NULL, "max_shear");
403         RNA_def_property_range(prop, 0.0f, upperLimitf);
404         RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value"); */
405         
406         /* unused still
407         prop= RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
408         RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
409         RNA_def_property_range(prop, 0.0f, 100.0f);
410         RNA_def_property_ui_text(prop, "Effector Force Scale", ""); */
411
412         /* unused still
413         prop= RNA_def_property(srna, "effector_wind_scale", PROP_FLOAT, PROP_NONE);
414         RNA_def_property_float_sdna(prop, NULL, "eff_wind_scale");
415         RNA_def_property_range(prop, 0.0f, 100.0f);
416         RNA_def_property_ui_text(prop, "Effector Wind Scale", ""); */
417         
418         /* unused still
419         prop= RNA_def_property(srna, "tearing", PROP_BOOLEAN, PROP_NONE);
420         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_TEARING);
421         RNA_def_property_ui_text(prop, "Tearing", "");*/
422         
423         /* unused still
424         prop= RNA_def_property(srna, "max_spring_extensions", PROP_INT, PROP_NONE);
425         RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
426         RNA_def_property_range(prop, 1.0, 1000.0);
427         RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum extension before spring gets cut"); */
428 }
429
430 static void rna_def_cloth_collision_settings(BlenderRNA *brna)
431 {
432         StructRNA *srna;
433         PropertyRNA *prop;
434         
435         srna = RNA_def_struct(brna, "ClothCollisionSettings", NULL);
436         RNA_def_struct_ui_text(srna, "Cloth Collision Settings",
437                                "Cloth simulation settings for self collision and collision with other objects");
438         RNA_def_struct_sdna(srna, "ClothCollSettings");
439         RNA_def_struct_path_func(srna, "rna_ClothCollisionSettings_path");
440
441         /* general collision */
442
443         prop = RNA_def_property(srna, "use_collision", PROP_BOOLEAN, PROP_NONE);
444         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
445         RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
446         RNA_def_property_update(prop, 0, "rna_cloth_update");
447
448         prop = RNA_def_property(srna, "repel_force", PROP_FLOAT, PROP_NONE);
449         RNA_def_property_float_sdna(prop, NULL, "repel_force");
450         RNA_def_property_range(prop, 0.0f, 20.0f);
451         RNA_def_property_float_default(prop, 1.0f);
452         RNA_def_property_ui_text(prop, "Repulsion Force", "Repulsion force to apply on cloth when close to colliding");
453         RNA_def_property_update(prop, 0, "rna_cloth_update");
454
455         prop = RNA_def_property(srna, "distance_repel", PROP_FLOAT, PROP_NONE);
456         RNA_def_property_float_sdna(prop, NULL, "distance_repel");
457         RNA_def_property_range(prop, 0.001f, 10.0f);
458         RNA_def_property_float_default(prop, 0.005f);
459         RNA_def_property_ui_text(prop, "Repulsion Distance",
460                                  "Maximum distance to apply repulsion force, must be greater than minimum distance");
461         RNA_def_property_update(prop, 0, "rna_cloth_update");
462         
463         prop = RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
464         RNA_def_property_float_sdna(prop, NULL, "epsilon");
465         RNA_def_property_range(prop, 0.001f, 1.0f);
466         RNA_def_property_ui_text(prop, "Minimum Distance",
467                                  "Minimum distance between collision objects before collision response takes in");
468         RNA_def_property_update(prop, 0, "rna_cloth_update");
469
470         prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
471         RNA_def_property_range(prop, 0.0f, 80.0f);
472         RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened (higher = less movement)");
473         RNA_def_property_update(prop, 0, "rna_cloth_update");
474
475         prop = RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
476         RNA_def_property_int_sdna(prop, NULL, "loop_count");
477         RNA_def_property_range(prop, 1, 20);
478         RNA_def_property_ui_text(prop, "Collision Quality",
479                                  "How many collision iterations should be done. (higher is better quality but slower)");
480         RNA_def_property_update(prop, 0, "rna_cloth_update");
481
482         /* self collision */
483
484         prop = RNA_def_property(srna, "use_self_collision", PROP_BOOLEAN, PROP_NONE);
485         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
486         RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions");
487         RNA_def_property_update(prop, 0, "rna_cloth_update");
488         
489         prop = RNA_def_property(srna, "self_distance_min", PROP_FLOAT, PROP_NONE);
490         RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
491         RNA_def_property_range(prop, 0.5f, 1.0f);
492         RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
493         RNA_def_property_update(prop, 0, "rna_cloth_update");
494         
495         prop = RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
496         RNA_def_property_range(prop, 0.0f, 80.0f);
497         RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact");
498         RNA_def_property_update(prop, 0, "rna_cloth_update");
499
500         prop = RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
501         RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
502         RNA_def_property_range(prop, 1, 10);
503         RNA_def_property_ui_text(prop, "Self Collision Quality",
504                                  "How many self collision iterations should be done (higher is better quality but slower)");
505         RNA_def_property_update(prop, 0, "rna_cloth_update");
506
507         prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
508         RNA_def_property_flag(prop, PROP_EDITABLE);
509         RNA_def_property_ui_text(prop, "Collision Group", "Limit colliders to this Group");
510         RNA_def_property_update(prop, 0, "rna_cloth_update");
511 }
512
513 void RNA_def_cloth(BlenderRNA *brna)
514 {
515         rna_def_cloth_sim_settings(brna);
516         rna_def_cloth_collision_settings(brna);
517 }
518
519 #endif
520