Fix depsgraph to compute more accurate links for collision & force.
[blender.git] / source / blender / makesrna / intern / rna_cloth.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008)
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_cloth.c
24  *  \ingroup RNA
25  */
26
27 #include <stdlib.h>
28 #include <limits.h>
29
30 #include "DNA_cloth_types.h"
31 #include "DNA_object_types.h"
32 #include "DNA_scene_types.h"
33
34 #include "RNA_define.h"
35
36 #include "rna_internal.h"
37
38 #include "BKE_cloth.h"
39 #include "BKE_modifier.h"
40
41 #include "BPH_mass_spring.h"
42
43 #include "WM_api.h"
44 #include "WM_types.h"
45
46 #ifdef RNA_RUNTIME
47
48 #include "BKE_context.h"
49 #include "BKE_depsgraph.h"
50
51 static void rna_cloth_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
52 {
53         Object *ob = (Object *)ptr->id.data;
54
55         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
56         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob);
57 }
58
59 static void rna_cloth_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
60 {
61         DAG_relations_tag_update(bmain);
62         rna_cloth_update(bmain, scene, ptr);
63 }
64
65 static void rna_cloth_pinning_changed(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
66 {
67         Object *ob = (Object *)ptr->id.data;
68 /*      ClothSimSettings *settings = (ClothSimSettings *)ptr->data; */
69         ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
70
71         cloth_free_modifier(clmd);
72
73         DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
74         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, ob);
75 }
76
77 static void rna_ClothSettings_bending_set(struct PointerRNA *ptr, float value)
78 {
79         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
80
81         settings->bending = value;
82
83         /* check for max clipping */
84         if (value > settings->max_bend)
85                 settings->max_bend = value;
86 }
87
88 static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
89 {
90         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
91         
92         /* check for clipping */
93         if (value < settings->bending)
94                 value = settings->bending;
95         
96         settings->max_bend = value;
97 }
98
99 static void rna_ClothSettings_structural_set(struct PointerRNA *ptr, float value)
100 {
101         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
102
103         settings->structural = value;
104
105         /* check for max clipping */
106         if (value > settings->max_struct)
107                 settings->max_struct = value;
108 }
109
110 static void rna_ClothSettings_max_struct_set(struct PointerRNA *ptr, float value)
111 {
112         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
113         
114         /* check for clipping */
115         if (value < settings->structural)
116                 value = settings->structural;
117         
118         settings->max_struct = value;
119 }
120
121 static void rna_ClothSettings_max_sewing_set(struct PointerRNA *ptr, float value)
122 {
123         ClothSimSettings *settings = (ClothSimSettings *)ptr->data;
124
125         /* check for clipping */
126         if (value < 0.0f)
127                 value = 0.0f;
128
129         settings->max_sewing = value;
130 }
131
132 static void rna_ClothSettings_mass_vgroup_get(PointerRNA *ptr, char *value)
133 {
134         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
135         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_mass);
136 }
137
138 static int rna_ClothSettings_mass_vgroup_length(PointerRNA *ptr)
139 {
140         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
141         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_mass);
142 }
143
144 static void rna_ClothSettings_mass_vgroup_set(PointerRNA *ptr, const char *value)
145 {
146         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
147         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_mass);
148 }
149
150 static void rna_ClothSettings_shrink_vgroup_get(PointerRNA *ptr, char *value)
151 {
152         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
153         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_shrink);
154 }
155
156 static int rna_ClothSettings_shrink_vgroup_length(PointerRNA *ptr)
157 {
158         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
159         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_shrink);
160 }
161
162 static void rna_ClothSettings_shrink_vgroup_set(PointerRNA *ptr, const char *value)
163 {
164         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
165         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_shrink);
166 }
167
168 static void rna_ClothSettings_struct_vgroup_get(PointerRNA *ptr, char *value)
169 {
170         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
171         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_struct);
172 }
173
174 static int rna_ClothSettings_struct_vgroup_length(PointerRNA *ptr)
175 {
176         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
177         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_struct);
178 }
179
180 static void rna_ClothSettings_struct_vgroup_set(PointerRNA *ptr, const char *value)
181 {
182         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
183         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_struct);
184 }
185
186 static void rna_ClothSettings_bend_vgroup_get(PointerRNA *ptr, char *value)
187 {
188         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
189         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_bend);
190 }
191
192 static int rna_ClothSettings_bend_vgroup_length(PointerRNA *ptr)
193 {
194         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
195         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_bend);
196 }
197
198 static void rna_ClothSettings_bend_vgroup_set(PointerRNA *ptr, const char *value)
199 {
200         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
201         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_bend);
202 }
203
204
205 static void rna_CollSettings_selfcol_vgroup_get(PointerRNA *ptr, char *value)
206 {
207         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
208         rna_object_vgroup_name_index_get(ptr, value, coll->vgroup_selfcol);
209 }
210
211 static int rna_CollSettings_selfcol_vgroup_length(PointerRNA *ptr)
212 {
213         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
214         return rna_object_vgroup_name_index_length(ptr, coll->vgroup_selfcol);
215 }
216
217 static void rna_CollSettings_selfcol_vgroup_set(PointerRNA *ptr, const char *value)
218 {
219         ClothCollSettings *coll = (ClothCollSettings *)ptr->data;
220         rna_object_vgroup_name_index_set(ptr, value, &coll->vgroup_selfcol);
221 }
222
223 static PointerRNA rna_ClothSettings_rest_shape_key_get(PointerRNA *ptr)
224 {
225         Object *ob = (Object *)ptr->id.data;
226         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
227
228         return rna_object_shapekey_index_get(ob->data, sim->shapekey_rest);
229 }
230
231 static void rna_ClothSettings_rest_shape_key_set(PointerRNA *ptr, PointerRNA value)
232 {
233         Object *ob = (Object *)ptr->id.data;
234         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
235
236         sim->shapekey_rest = rna_object_shapekey_index_set(ob->data, value, sim->shapekey_rest);
237 }
238
239 static void rna_ClothSettings_gravity_get(PointerRNA *ptr, float *values)
240 {
241         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
242
243         values[0] = sim->gravity[0];
244         values[1] = sim->gravity[1];
245         values[2] = sim->gravity[2];
246 }
247
248 static void rna_ClothSettings_gravity_set(PointerRNA *ptr, const float *values)
249 {
250         ClothSimSettings *sim = (ClothSimSettings *)ptr->data;
251
252         sim->gravity[0] = values[0];
253         sim->gravity[1] = values[1];
254         sim->gravity[2] = values[2];
255 }
256
257 static char *rna_ClothSettings_path(PointerRNA *ptr)
258 {
259         Object *ob = (Object *)ptr->id.data;
260         ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
261
262         if (md) {
263                 char name_esc[sizeof(md->name) * 2];
264                 BLI_strescape(name_esc, md->name, sizeof(name_esc));
265                 return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
266         }
267         else {
268                 return NULL;
269         }
270 }
271
272 static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
273 {
274         Object *ob = (Object *)ptr->id.data;
275         ModifierData *md = modifiers_findByType(ob, eModifierType_Cloth);
276
277         if (md) {
278                 char name_esc[sizeof(md->name) * 2];
279                 BLI_strescape(name_esc, md->name, sizeof(name_esc));
280                 return BLI_sprintfN("modifiers[\"%s\"].collision_settings", name_esc);
281         }
282         else {
283                 return NULL;
284         }
285 }
286
287 #else
288
289 static void rna_def_cloth_solver_result(BlenderRNA *brna)
290 {
291         StructRNA *srna;
292         PropertyRNA *prop;
293         
294         static EnumPropertyItem status_items[] = {
295             {BPH_SOLVER_SUCCESS, "SUCCESS", 0, "Success", "Computation was successful"},
296             {BPH_SOLVER_NUMERICAL_ISSUE, "NUMERICAL_ISSUE", 0, "Numerical Issue", "The provided data did not satisfy the prerequisites"},
297             {BPH_SOLVER_NO_CONVERGENCE, "NO_CONVERGENCE", 0, "No Convergence", "Iterative procedure did not converge"},
298             {BPH_SOLVER_INVALID_INPUT, "INVALID_INPUT", 0, "Invalid Input", "The inputs are invalid, or the algorithm has been improperly called"},
299             {0, NULL, 0, NULL, NULL}
300         };
301         
302         srna = RNA_def_struct(brna, "ClothSolverResult", NULL);
303         RNA_def_struct_ui_text(srna, "Solver Result", "Result of cloth solver iteration");
304         
305         RNA_define_verify_sdna(0);
306         
307         prop = RNA_def_property(srna, "status", PROP_ENUM, PROP_NONE);
308         RNA_def_property_enum_items(prop, status_items);
309         RNA_def_property_enum_sdna(prop, NULL, "status");
310         RNA_def_property_flag(prop, PROP_ENUM_FLAG);
311         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
312         RNA_def_property_ui_text(prop, "Status", "Status of the solver iteration");
313         
314         prop = RNA_def_property(srna, "max_error", PROP_FLOAT, PROP_NONE);
315         RNA_def_property_float_sdna(prop, NULL, "max_error");
316         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
317         RNA_def_property_ui_text(prop, "Maximum Error", "Maximum error during substeps");
318         
319         prop = RNA_def_property(srna, "min_error", PROP_FLOAT, PROP_NONE);
320         RNA_def_property_float_sdna(prop, NULL, "min_error");
321         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
322         RNA_def_property_ui_text(prop, "Minimum Error", "Minimum error during substeps");
323         
324         prop = RNA_def_property(srna, "avg_error", PROP_FLOAT, PROP_NONE);
325         RNA_def_property_float_sdna(prop, NULL, "avg_error");
326         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
327         RNA_def_property_ui_text(prop, "Average Error", "Average error during substeps");
328         
329         prop = RNA_def_property(srna, "max_iterations", PROP_INT, PROP_NONE);
330         RNA_def_property_int_sdna(prop, NULL, "max_iterations");
331         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
332         RNA_def_property_ui_text(prop, "Maximum Iterations", "Maximum iterations during substeps");
333         
334         prop = RNA_def_property(srna, "min_iterations", PROP_INT, PROP_NONE);
335         RNA_def_property_int_sdna(prop, NULL, "min_iterations");
336         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
337         RNA_def_property_ui_text(prop, "Minimum Iterations", "Minimum iterations during substeps");
338         
339         prop = RNA_def_property(srna, "avg_iterations", PROP_FLOAT, PROP_NONE);
340         RNA_def_property_float_sdna(prop, NULL, "avg_iterations");
341         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
342         RNA_def_property_ui_text(prop, "Average Iterations", "Average iterations during substeps");
343         
344         RNA_define_verify_sdna(1);
345 }
346
347 static void rna_def_cloth_sim_settings(BlenderRNA *brna)
348 {
349         StructRNA *srna;
350         PropertyRNA *prop;
351         
352         srna = RNA_def_struct(brna, "ClothSettings", NULL);
353         RNA_def_struct_ui_text(srna, "Cloth Settings", "Cloth simulation settings for an object");
354         RNA_def_struct_sdna(srna, "ClothSimSettings");
355         RNA_def_struct_path_func(srna, "rna_ClothSettings_path");
356         
357         /* goal */
358         
359         prop = RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
360         RNA_def_property_float_sdna(prop, NULL, "mingoal");
361         RNA_def_property_range(prop, 0.0f, 1.0f);
362         RNA_def_property_ui_text(prop, "Goal Minimum",
363                                  "Goal minimum, vertex group weights are scaled to match this range");
364         RNA_def_property_update(prop, 0, "rna_cloth_update");
365
366         prop = RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
367         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
368         RNA_def_property_range(prop, 0.0f, 1.0f);
369         RNA_def_property_ui_text(prop, "Goal Maximum",
370                                  "Goal maximum, vertex group weights are scaled to match this range");
371         RNA_def_property_update(prop, 0, "rna_cloth_update");
372
373         prop = RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
374         RNA_def_property_float_sdna(prop, NULL, "defgoal");
375         RNA_def_property_range(prop, 0.0f, 1.0f);
376         RNA_def_property_ui_text(prop, "Goal Default",
377                                  "Default Goal (vertex target position) value, when no Vertex Group used");
378         RNA_def_property_update(prop, 0, "rna_cloth_update");
379         
380         prop = RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
381         RNA_def_property_float_sdna(prop, NULL, "goalspring");
382         RNA_def_property_range(prop, 0.0f, 0.999f);
383         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness");
384         RNA_def_property_update(prop, 0, "rna_cloth_update");
385         
386         prop = RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
387         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
388         RNA_def_property_range(prop, 0.0f, 50.0f);
389         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction");
390         RNA_def_property_update(prop, 0, "rna_cloth_update");
391
392         prop = RNA_def_property(srna, "internal_friction", PROP_FLOAT, PROP_NONE);
393         RNA_def_property_float_sdna(prop, NULL, "velocity_smooth");
394         RNA_def_property_range(prop, 0.0f, 1.0f);
395         RNA_def_property_ui_text(prop, "Internal Friction", "");
396         RNA_def_property_update(prop, 0, "rna_cloth_update");
397
398         prop = RNA_def_property(srna, "collider_friction", PROP_FLOAT, PROP_NONE);
399         RNA_def_property_float_sdna(prop, NULL, "collider_friction");
400         RNA_def_property_range(prop, 0.0f, 1.0f);
401         RNA_def_property_ui_text(prop, "Collider Friction", "");
402         RNA_def_property_update(prop, 0, "rna_cloth_update");
403
404         prop = RNA_def_property(srna, "density_target", PROP_FLOAT, PROP_NONE);
405         RNA_def_property_float_sdna(prop, NULL, "density_target");
406         RNA_def_property_range(prop, 0.0f, 10000.0f);
407         RNA_def_property_ui_text(prop, "Target Density", "Maximum density of hair");
408         RNA_def_property_update(prop, 0, "rna_cloth_update");
409
410         prop = RNA_def_property(srna, "density_strength", PROP_FLOAT, PROP_NONE);
411         RNA_def_property_float_sdna(prop, NULL, "density_strength");
412         RNA_def_property_range(prop, 0.0f, 1.0f);
413         RNA_def_property_ui_text(prop, "Target Density Strength", "Influence of target density on the simulation");
414         RNA_def_property_update(prop, 0, "rna_cloth_update");
415
416         /* mass */
417
418         prop = RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
419         RNA_def_property_range(prop, 0.0f, 10.0f);
420         RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material");
421         RNA_def_property_update(prop, 0, "rna_cloth_update");
422
423         prop = RNA_def_property(srna, "vertex_group_mass", PROP_STRING, PROP_NONE);
424         RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length",
425                                       "rna_ClothSettings_mass_vgroup_set");
426         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
427         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
428         
429         prop = RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
430         RNA_def_property_array(prop, 3);
431         RNA_def_property_range(prop, -100.0, 100.0);
432         RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
433         RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector");
434         RNA_def_property_update(prop, 0, "rna_cloth_update");
435
436         /* various */
437
438         prop = RNA_def_property(srna, "air_damping", PROP_FLOAT, PROP_NONE);
439         RNA_def_property_float_sdna(prop, NULL, "Cvi");
440         RNA_def_property_range(prop, 0.0f, 10.0f);
441         RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
442         RNA_def_property_update(prop, 0, "rna_cloth_update");
443
444         prop = RNA_def_property(srna, "vel_damping", PROP_FLOAT, PROP_NONE);
445         RNA_def_property_float_sdna(prop, NULL, "vel_damping");
446         RNA_def_property_range(prop, 0.0f, 1.0f);
447         RNA_def_property_ui_text(prop, "Velocity Damping",
448                                  "Damp velocity to help cloth reach the resting position faster "
449                                  "(1.0 = no damping, 0.0 = fully dampened)");
450         RNA_def_property_update(prop, 0, "rna_cloth_update");
451
452         prop = RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
453         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
454         RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
455         RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
456         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
457
458         prop = RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
459         RNA_def_property_float_sdna(prop, NULL, "goalspring");
460         RNA_def_property_range(prop, 0.0f, 50.0);
461         RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness");
462         RNA_def_property_update(prop, 0, "rna_cloth_update");
463
464         prop = RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
465         RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
466         RNA_def_property_range(prop, 1, INT_MAX);
467         RNA_def_property_ui_range(prop, 1, 80, 1, -1);
468         RNA_def_property_ui_text(prop, "Quality",
469                                  "Quality of the simulation in steps per frame (higher is better quality but slower)");
470         RNA_def_property_update(prop, 0, "rna_cloth_update");
471
472         prop = RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
473         RNA_def_property_float_sdna(prop, NULL, "time_scale");
474         RNA_def_property_range(prop, 0.0f, FLT_MAX);
475         RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 3);
476         RNA_def_property_ui_text(prop, "Speed", "Cloth speed is multiplied by this value");
477         RNA_def_property_update(prop, 0, "rna_cloth_update");
478
479         prop = RNA_def_property(srna, "vertex_group_shrink", PROP_STRING, PROP_NONE);
480         RNA_def_property_string_funcs(prop, "rna_ClothSettings_shrink_vgroup_get", "rna_ClothSettings_shrink_vgroup_length",
481                                       "rna_ClothSettings_shrink_vgroup_set");
482         RNA_def_property_ui_text(prop, "Shrink Vertex Group", "Vertex Group for shrinking cloth");
483         RNA_def_property_update(prop, 0, "rna_cloth_update");
484
485         prop = RNA_def_property(srna, "shrink_min", PROP_FLOAT, PROP_NONE);
486         RNA_def_property_float_sdna(prop, NULL, "shrink_min");
487         RNA_def_property_range(prop, 0.0f, 1.0f);
488         RNA_def_property_ui_text(prop, "Shrink Factor Min", "Min amount to shrink cloth by");
489         RNA_def_property_update(prop, 0, "rna_cloth_update");
490
491         prop = RNA_def_property(srna, "shrink_max", PROP_FLOAT, PROP_NONE);
492         RNA_def_property_float_sdna(prop, NULL, "shrink_max");
493         RNA_def_property_range(prop, 0.0f, 1.0f);
494         RNA_def_property_ui_text(prop, "Shrink Factor Max", "Max amount to shrink cloth by");
495         RNA_def_property_update(prop, 0, "rna_cloth_update");
496
497         prop = RNA_def_property(srna, "voxel_cell_size", PROP_FLOAT, PROP_UNSIGNED);
498         RNA_def_property_float_sdna(prop, NULL, "voxel_cell_size");
499         RNA_def_property_range(prop, 0.0001f, 10000.0f);
500         RNA_def_property_float_default(prop, 0.1f);
501         RNA_def_property_ui_text(prop, "Voxel Grid Cell Size", "Size of the voxel grid cells for interaction effects");
502         RNA_def_property_update(prop, 0, "rna_cloth_update");
503
504         /* springs */
505
506         prop = RNA_def_property(srna, "use_stiffness_scale", PROP_BOOLEAN, PROP_NONE);
507         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
508         RNA_def_property_ui_text(prop, "Stiffness Scaling",
509                                  "If enabled, stiffness can be scaled along a weight painted vertex group");
510         RNA_def_property_update(prop, 0, "rna_cloth_update");
511         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
512         
513         prop = RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
514         RNA_def_property_float_sdna(prop, NULL, "Cdis");
515         RNA_def_property_range(prop, 0.0f, 50.0f);
516         RNA_def_property_ui_text(prop, "Spring Damping",
517                                  "Damping of cloth velocity (higher = more smooth, less jiggling)");
518         RNA_def_property_update(prop, 0, "rna_cloth_update");
519         
520         prop = RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
521         RNA_def_property_float_sdna(prop, NULL, "structural");
522         RNA_def_property_range(prop, 0.0f, 10000.0f);
523         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_structural_set", NULL);
524         RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure");
525         RNA_def_property_update(prop, 0, "rna_cloth_update");
526
527         prop = RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
528         RNA_def_property_float_sdna(prop, NULL, "max_struct");
529         RNA_def_property_range(prop, 0.0f, 10000.0f);
530         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
531         RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value");
532         RNA_def_property_update(prop, 0, "rna_cloth_update");
533
534         prop = RNA_def_property(srna, "sewing_force_max", PROP_FLOAT, PROP_NONE);
535         RNA_def_property_float_sdna(prop, NULL, "max_sewing");
536         RNA_def_property_range(prop, 0.0f, 10000.0f);
537         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_sewing_set", NULL);
538         RNA_def_property_ui_text(prop, "Sewing Force Max", "Maximum sewing force");
539         RNA_def_property_update(prop, 0, "rna_cloth_update");
540
541         prop = RNA_def_property(srna, "vertex_group_structural_stiffness", PROP_STRING, PROP_NONE);
542         RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get",
543                                       "rna_ClothSettings_struct_vgroup_length",
544                                       "rna_ClothSettings_struct_vgroup_set");
545         RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group",
546                                  "Vertex group for fine control over structural stiffness");
547         RNA_def_property_update(prop, 0, "rna_cloth_update");
548
549         prop = RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
550         RNA_def_property_float_sdna(prop, NULL, "bending");
551         RNA_def_property_range(prop, 0.0f, 10000.0f);
552         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_bending_set", NULL);
553         RNA_def_property_ui_text(prop, "Bending Stiffness",
554                                  "Wrinkle coefficient (higher = less smaller but more big wrinkles)");
555         RNA_def_property_update(prop, 0, "rna_cloth_update");
556
557         prop = RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
558         RNA_def_property_float_sdna(prop, NULL, "max_bend");
559         RNA_def_property_range(prop, 0.0f, 10000.0f);
560         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
561         RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value");
562         RNA_def_property_update(prop, 0, "rna_cloth_update");
563
564         prop = RNA_def_property(srna, "bending_damping", PROP_FLOAT, PROP_NONE);
565         RNA_def_property_float_sdna(prop, NULL, "bending_damping");
566         RNA_def_property_range(prop, 0.0f, 1000.0f);
567         RNA_def_property_ui_text(prop, "Bending Spring Damping",
568                                  "Damping of bending motion");
569         RNA_def_property_update(prop, 0, "rna_cloth_update");
570
571         prop = RNA_def_property(srna, "use_sewing_springs", PROP_BOOLEAN, PROP_NONE);
572         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SEW);
573         RNA_def_property_ui_text(prop, "Sew Cloth", "Pulls loose edges together");
574         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
575         RNA_def_property_update(prop, 0, "rna_cloth_update");
576
577         prop = RNA_def_property(srna, "vertex_group_bending", PROP_STRING, PROP_NONE);
578         RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length",
579                                       "rna_ClothSettings_bend_vgroup_set");
580         RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group",
581                                  "Vertex group for fine control over bending stiffness");
582         RNA_def_property_update(prop, 0, "rna_cloth_update");
583
584         prop = RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
585         RNA_def_property_struct_type(prop, "EffectorWeights");
586         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
587         RNA_def_property_ui_text(prop, "Effector Weights", "");
588
589         prop = RNA_def_property(srna, "rest_shape_key", PROP_POINTER, PROP_NONE);
590         RNA_def_property_flag(prop, PROP_EDITABLE);
591         RNA_def_property_struct_type(prop, "ShapeKey");
592         RNA_def_property_pointer_funcs(prop, "rna_ClothSettings_rest_shape_key_get",
593                                        "rna_ClothSettings_rest_shape_key_set", NULL, NULL);
594         RNA_def_property_ui_text(prop, "Rest Shape Key", "Shape key to use the rest spring lengths from");
595         RNA_def_property_update(prop, 0, "rna_cloth_update");
596
597         prop = RNA_def_property(srna, "use_dynamic_mesh", PROP_BOOLEAN, PROP_NONE);
598         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH);
599         RNA_def_property_ui_text(prop, "Dynamic Base Mesh", "Make simulation respect deformations in the base mesh");
600         RNA_def_property_update(prop, 0, "rna_cloth_update");
601         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
602
603         /* unused */
604
605         /* unused still */
606 #if 0
607         prop = RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
608         RNA_def_property_float_sdna(prop, NULL, "shear");
609         RNA_def_property_range(prop, 0.0f, 1000.0f);
610         RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness");
611 #endif
612         /* unused still */
613 #if 0
614         prop = RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
615         RNA_def_property_float_sdna(prop, NULL, "max_shear");
616         RNA_def_property_range(prop, 0.0f, upperLimitf);
617         RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value");
618 #endif
619         /* unused still */
620 #if 0
621         prop = RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
622         RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
623         RNA_def_property_range(prop, 0.0f, 100.0f);
624         RNA_def_property_ui_text(prop, "Effector Force Scale", "");
625 #endif
626         /* unused still */
627 #if 0
628         prop = RNA_def_property(srna, "effector_wind_scale", PROP_FLOAT, PROP_NONE);
629         RNA_def_property_float_sdna(prop, NULL, "eff_wind_scale");
630         RNA_def_property_range(prop, 0.0f, 100.0f);
631         RNA_def_property_ui_text(prop, "Effector Wind Scale", "");
632 #endif
633         /* unused still */
634 #if 0
635         prop = RNA_def_property(srna, "tearing", PROP_BOOLEAN, PROP_NONE);
636         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_TEARING);
637         RNA_def_property_ui_text(prop, "Tearing", "");
638 #endif
639         /* unused still */
640 #if 0
641         prop = RNA_def_property(srna, "max_spring_extensions", PROP_INT, PROP_NONE);
642         RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
643         RNA_def_property_range(prop, 1.0, 1000.0);
644         RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum extension before spring gets cut");
645 #endif
646 }
647
648 static void rna_def_cloth_collision_settings(BlenderRNA *brna)
649 {
650         StructRNA *srna;
651         PropertyRNA *prop;
652         
653         srna = RNA_def_struct(brna, "ClothCollisionSettings", NULL);
654         RNA_def_struct_ui_text(srna, "Cloth Collision Settings",
655                                "Cloth simulation settings for self collision and collision with other objects");
656         RNA_def_struct_sdna(srna, "ClothCollSettings");
657         RNA_def_struct_path_func(srna, "rna_ClothCollisionSettings_path");
658
659         /* general collision */
660
661         prop = RNA_def_property(srna, "use_collision", PROP_BOOLEAN, PROP_NONE);
662         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
663         RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
664         RNA_def_property_update(prop, 0, "rna_cloth_update");
665
666         prop = RNA_def_property(srna, "repel_force", PROP_FLOAT, PROP_NONE);
667         RNA_def_property_float_sdna(prop, NULL, "repel_force");
668         RNA_def_property_range(prop, 0.0f, 20.0f);
669         RNA_def_property_float_default(prop, 1.0f);
670         RNA_def_property_ui_text(prop, "Repulsion Force", "Repulsion force to apply on cloth when close to colliding");
671         RNA_def_property_update(prop, 0, "rna_cloth_update");
672
673         prop = RNA_def_property(srna, "distance_repel", PROP_FLOAT, PROP_NONE);
674         RNA_def_property_float_sdna(prop, NULL, "distance_repel");
675         RNA_def_property_range(prop, 0.001f, 10.0f);
676         RNA_def_property_float_default(prop, 0.005f);
677         RNA_def_property_ui_text(prop, "Repulsion Distance",
678                                  "Maximum distance to apply repulsion force, must be greater than minimum distance");
679         RNA_def_property_update(prop, 0, "rna_cloth_update");
680         
681         prop = RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_NONE);
682         RNA_def_property_float_sdna(prop, NULL, "epsilon");
683         RNA_def_property_range(prop, 0.001f, 1.0f);
684         RNA_def_property_ui_text(prop, "Minimum Distance",
685                                  "Minimum distance between collision objects before collision response takes in");
686         RNA_def_property_update(prop, 0, "rna_cloth_update");
687
688         prop = RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
689         RNA_def_property_range(prop, 0.0f, 80.0f);
690         RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened (higher = less movement)");
691         RNA_def_property_update(prop, 0, "rna_cloth_update");
692
693         prop = RNA_def_property(srna, "damping", PROP_FLOAT, PROP_FACTOR);
694         RNA_def_property_float_sdna(prop, NULL, "damping");
695         RNA_def_property_range(prop, 0.0f, 1.0f);
696         RNA_def_property_float_default(prop, 1.0f);
697         RNA_def_property_ui_text(prop, "Restitution", "Amount of velocity lost on collision");
698         RNA_def_property_update(prop, 0, "rna_cloth_update");
699
700         prop = RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
701         RNA_def_property_int_sdna(prop, NULL, "loop_count");
702         RNA_def_property_range(prop, 1, SHRT_MAX);
703         RNA_def_property_ui_range(prop, 1, 20, 1, -1);
704         RNA_def_property_ui_text(prop, "Collision Quality",
705                                  "How many collision iterations should be done. (higher is better quality but slower)");
706         RNA_def_property_update(prop, 0, "rna_cloth_update");
707
708         /* self collision */
709
710         prop = RNA_def_property(srna, "use_self_collision", PROP_BOOLEAN, PROP_NONE);
711         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
712         RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions");
713         RNA_def_property_update(prop, 0, "rna_cloth_update");
714         
715         prop = RNA_def_property(srna, "self_distance_min", PROP_FLOAT, PROP_NONE);
716         RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
717         RNA_def_property_range(prop, 0.5f, 1.0f);
718         RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
719         RNA_def_property_update(prop, 0, "rna_cloth_update");
720         
721         prop = RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
722         RNA_def_property_range(prop, 0.0f, 80.0f);
723         RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact");
724         RNA_def_property_update(prop, 0, "rna_cloth_update");
725
726         prop = RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
727         RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
728         RNA_def_property_range(prop, 1, SHRT_MAX);
729         RNA_def_property_ui_range(prop, 1, 10, 1, -1);
730         RNA_def_property_ui_text(prop, "Self Collision Quality",
731                                  "How many self collision iterations should be done "
732                                  "(higher is better quality but slower)");
733         RNA_def_property_update(prop, 0, "rna_cloth_update");
734
735         prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
736         RNA_def_property_flag(prop, PROP_EDITABLE);
737         RNA_def_property_ui_text(prop, "Collision Group", "Limit colliders to this Group");
738         RNA_def_property_update(prop, 0, "rna_cloth_dependency_update");
739
740         prop = RNA_def_property(srna, "vertex_group_self_collisions", PROP_STRING, PROP_NONE);
741         RNA_def_property_string_funcs(prop, "rna_CollSettings_selfcol_vgroup_get", "rna_CollSettings_selfcol_vgroup_length",
742                                       "rna_CollSettings_selfcol_vgroup_set");
743         RNA_def_property_ui_text(prop, "Selfcollision Vertex Group",
744                                  "Vertex group to define vertices which are not used during self collisions");
745         RNA_def_property_update(prop, 0, "rna_cloth_update");
746 }
747
748 void RNA_def_cloth(BlenderRNA *brna)
749 {
750         rna_def_cloth_solver_result(brna);
751         rna_def_cloth_sim_settings(brna);
752         rna_def_cloth_collision_settings(brna);
753 }
754
755 #endif