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