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