batch remove .'s used with RNA_def_struct_ui_text
[blender.git] / source / blender / makesrna / intern / rna_cloth.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributor(s): Blender Foundation (2008)
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26 #include <limits.h>
27
28 #include "RNA_define.h"
29 #include "RNA_types.h"
30
31 #include "rna_internal.h"
32
33 #include "BKE_cloth.h"
34 #include "BKE_modifier.h"
35
36 #include "DNA_cloth_types.h"
37 #include "DNA_object_types.h"
38 #include "DNA_scene_types.h"
39
40 #include "WM_api.h"
41 #include "WM_types.h"
42
43 #ifdef RNA_RUNTIME
44
45 #include "BKE_context.h"
46 #include "BKE_depsgraph.h"
47
48 static void rna_cloth_update(Main *bmain, Scene *scene, PointerRNA *ptr)
49 {
50         Object *ob= (Object*)ptr->id.data;
51
52         DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
53         WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
54 }
55
56 static void rna_cloth_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
57 {
58         Object *ob= (Object*)ptr->id.data;
59         ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
60
61         settings->reset = 1;
62
63         DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
64         WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
65 }
66
67
68 static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
69 {
70         ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
71         
72         /* check for clipping */
73         if(value < settings->bending)
74                 value = settings->bending;
75         
76         settings->max_bend = value;
77 }
78
79 static void rna_ClothSettings_max_struct_set(struct PointerRNA *ptr, float value)
80 {
81         ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
82         
83         /* check for clipping */
84         if(value < settings->structural)
85                 value = settings->structural;
86         
87         settings->max_struct = value;
88 }
89
90 static void rna_ClothSettings_mass_vgroup_get(PointerRNA *ptr, char *value)
91 {
92         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
93         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_mass);
94 }
95
96 static int rna_ClothSettings_mass_vgroup_length(PointerRNA *ptr)
97 {
98         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
99         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_mass);
100 }
101
102 static void rna_ClothSettings_mass_vgroup_set(PointerRNA *ptr, const char *value)
103 {
104         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
105         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_mass);
106 }
107
108 static void rna_ClothSettings_struct_vgroup_get(PointerRNA *ptr, char *value)
109 {
110         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
111         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_struct);
112 }
113
114 static int rna_ClothSettings_struct_vgroup_length(PointerRNA *ptr)
115 {
116         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
117         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_struct);
118 }
119
120 static void rna_ClothSettings_struct_vgroup_set(PointerRNA *ptr, const char *value)
121 {
122         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
123         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_struct);
124 }
125
126 static void rna_ClothSettings_bend_vgroup_get(PointerRNA *ptr, char *value)
127 {
128         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
129         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_bend);
130 }
131
132 static int rna_ClothSettings_bend_vgroup_length(PointerRNA *ptr)
133 {
134         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
135         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_bend);
136 }
137
138 static void rna_ClothSettings_bend_vgroup_set(PointerRNA *ptr, const char *value)
139 {
140         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
141         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_bend);
142 }
143
144 static void rna_ClothSettings_gravity_get(PointerRNA *ptr, float *values)
145 {
146         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
147
148         values[0]= sim->gravity[0];
149         values[1]= sim->gravity[1];
150         values[2]= sim->gravity[2];
151 }
152
153 static void rna_ClothSettings_gravity_set(PointerRNA *ptr, const float *values)
154 {
155         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
156
157         sim->gravity[0]= values[0];
158         sim->gravity[1]= values[1];
159         sim->gravity[2]= values[2];
160 }
161
162 static char *rna_ClothSettings_path(PointerRNA *ptr)
163 {
164         Object *ob= (Object*)ptr->id.data;
165         ModifierData *md= modifiers_findByType(ob, eModifierType_Cloth);
166
167         return md ? BLI_sprintfN("modifiers[\"%s\"].settings", md->name) : NULL;
168 }
169
170 static char *rna_ClothCollisionSettings_path(PointerRNA *ptr)
171 {
172         Object *ob= (Object*)ptr->id.data;
173         ModifierData *md= modifiers_findByType(ob, eModifierType_Cloth);
174
175         return md ? BLI_sprintfN("modifiers[\"%s\"].collision_settings", md->name) : NULL;
176 }
177
178 #else
179
180 static void rna_def_cloth_sim_settings(BlenderRNA *brna)
181 {
182         StructRNA *srna;
183         PropertyRNA *prop;
184         
185         srna = RNA_def_struct(brna, "ClothSettings", NULL);
186         RNA_def_struct_ui_text(srna, "Cloth Settings", "Cloth simulation settings for an object");
187         RNA_def_struct_sdna(srna, "ClothSimSettings");
188         RNA_def_struct_path_func(srna, "rna_ClothSettings_path");
189         
190         /* goal */
191         
192         prop= RNA_def_property(srna, "goal_min", PROP_FLOAT, PROP_NONE);
193         RNA_def_property_float_sdna(prop, NULL, "mingoal");
194         RNA_def_property_range(prop, 0.0f, 1.0f);
195         RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range");
196         RNA_def_property_update(prop, 0, "rna_cloth_update");
197
198         prop= RNA_def_property(srna, "goal_max", PROP_FLOAT, PROP_NONE);
199         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
200         RNA_def_property_range(prop, 0.0f, 1.0f);
201         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range");
202         RNA_def_property_update(prop, 0, "rna_cloth_update");
203
204         prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
205         RNA_def_property_float_sdna(prop, NULL, "defgoal");
206         RNA_def_property_range(prop, 0.0f, 1.0f);
207         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used");
208         RNA_def_property_update(prop, 0, "rna_cloth_update");
209         
210         prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
211         RNA_def_property_float_sdna(prop, NULL, "goalspring");
212         RNA_def_property_range(prop, 0.0f, 0.999f);
213         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness");
214         RNA_def_property_update(prop, 0, "rna_cloth_update");
215         
216         prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
217         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
218         RNA_def_property_range(prop, 0.0f, 50.0f);
219         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction");
220         RNA_def_property_update(prop, 0, "rna_cloth_update");
221
222         prop= RNA_def_property(srna, "internal_friction", PROP_FLOAT, PROP_NONE);
223         RNA_def_property_float_sdna(prop, NULL, "velocity_smooth");
224         RNA_def_property_range(prop, 0.0f, 1.0f);
225         RNA_def_property_ui_text(prop, "Internal Friction", "");
226         RNA_def_property_update(prop, 0, "rna_cloth_update");
227
228         /* mass */
229
230         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
231         RNA_def_property_range(prop, 0.0f, 10.0f);
232         RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material");
233         RNA_def_property_update(prop, 0, "rna_cloth_update");
234
235         prop= RNA_def_property(srna, "mass_vertex_group", PROP_STRING, PROP_NONE);
236         RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length", "rna_ClothSettings_mass_vgroup_set");
237         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
238         RNA_def_property_update(prop, 0, "rna_cloth_update");
239         
240         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
241         RNA_def_property_array(prop, 3);
242         RNA_def_property_range(prop, -100.0, 100.0);
243         RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
244         RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector");
245         RNA_def_property_update(prop, 0, "rna_cloth_update");
246
247         /* various */
248
249         prop= RNA_def_property(srna, "air_damping", PROP_FLOAT, PROP_NONE);
250         RNA_def_property_float_sdna(prop, NULL, "Cvi");
251         RNA_def_property_range(prop, 0.0f, 10.0f);
252         RNA_def_property_ui_text(prop, "Air Damping", "Air has normally some thickness which slows falling things down");
253         RNA_def_property_update(prop, 0, "rna_cloth_update");
254
255         prop= RNA_def_property(srna, "pin_cloth", PROP_BOOLEAN, PROP_NONE);
256         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
257         RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
258         RNA_def_property_update(prop, 0, "rna_cloth_update");
259
260         prop= RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
261         RNA_def_property_float_sdna(prop, NULL, "goalspring");
262         RNA_def_property_range(prop, 0.0f, 50.0);
263         RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness");
264         RNA_def_property_update(prop, 0, "rna_cloth_update");
265
266         prop= RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
267         RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
268         RNA_def_property_range(prop, 4, 80);
269         RNA_def_property_ui_text(prop, "Quality", "Quality of the simulation in steps per frame. (higher is better quality but slower)");
270         RNA_def_property_update(prop, 0, "rna_cloth_update");
271
272         /* springs */
273
274         prop= RNA_def_property(srna, "stiffness_scaling", PROP_BOOLEAN, PROP_NONE);
275         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
276         RNA_def_property_ui_text(prop, "Stiffness Scaling", "If enabled, stiffness can be scaled along a weight painted vertex group");
277         RNA_def_property_update(prop, 0, "rna_cloth_update");
278         
279         prop= RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
280         RNA_def_property_float_sdna(prop, NULL, "Cdis");
281         RNA_def_property_range(prop, 0.0f, 50.0f);
282         RNA_def_property_ui_text(prop, "Spring Damping", "Damping of cloth velocity. (higher = more smooth, less jiggling)");
283         RNA_def_property_update(prop, 0, "rna_cloth_update");
284         
285         prop= RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
286         RNA_def_property_float_sdna(prop, NULL, "structural");
287         RNA_def_property_range(prop, 0.0f, 10000.0f);
288         RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure");
289         RNA_def_property_update(prop, 0, "rna_cloth_update");
290
291         prop= RNA_def_property(srna, "structural_stiffness_max", PROP_FLOAT, PROP_NONE);
292         RNA_def_property_float_sdna(prop, NULL, "max_struct");
293         RNA_def_property_range(prop, 0.0f, 10000.0f);
294         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
295         RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value");
296         RNA_def_property_update(prop, 0, "rna_cloth_update");
297
298         prop= RNA_def_property(srna, "structural_stiffness_vertex_group", PROP_STRING, PROP_NONE);
299         RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get", "rna_ClothSettings_struct_vgroup_length", "rna_ClothSettings_struct_vgroup_set");
300         RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group", "Vertex group for fine control over structural stiffness");
301         RNA_def_property_update(prop, 0, "rna_cloth_update");
302
303         prop= RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
304         RNA_def_property_float_sdna(prop, NULL, "bending");
305         RNA_def_property_range(prop, 0.0f, 10000.0f);
306         RNA_def_property_ui_text(prop, "Bending Stiffness", "Wrinkle coefficient. (higher = less smaller but more big wrinkles)");
307         RNA_def_property_update(prop, 0, "rna_cloth_update");
308
309         prop= RNA_def_property(srna, "bending_stiffness_max", PROP_FLOAT, PROP_NONE);
310         RNA_def_property_float_sdna(prop, NULL, "max_bend");
311         RNA_def_property_range(prop, 0.0f, 10000.0f);
312         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
313         RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value");
314         RNA_def_property_update(prop, 0, "rna_cloth_update");
315
316         prop= RNA_def_property(srna, "bending_vertex_group", PROP_STRING, PROP_NONE);
317         RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length", "rna_ClothSettings_bend_vgroup_set");
318         RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group", "Vertex group for fine control over bending stiffness");
319         RNA_def_property_update(prop, 0, "rna_cloth_update");
320
321         prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
322         RNA_def_property_struct_type(prop, "EffectorWeights");
323         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
324         RNA_def_property_ui_text(prop, "Effector Weights", "");
325
326         prop= RNA_def_property(srna, "pre_roll", PROP_INT, PROP_NONE);
327         RNA_def_property_int_sdna(prop, NULL, "preroll");
328         RNA_def_property_range(prop, 0, 200);
329         RNA_def_property_ui_text(prop, "Pre Roll", "Simulation starts on this frame");
330         RNA_def_property_update(prop, 0, "rna_cloth_reset");
331
332
333         /* unused */
334
335         /* unused still
336         prop= RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
337         RNA_def_property_float_sdna(prop, NULL, "shear");
338         RNA_def_property_range(prop, 0.0f, 1000.0f);
339         RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness"); */
340
341         /* unused still
342         prop= RNA_def_property(srna, "shear_stiffness_max", PROP_FLOAT, PROP_NONE);
343         RNA_def_property_float_sdna(prop, NULL, "max_shear");
344         RNA_def_property_range(prop, 0.0f, upperLimitf);
345         RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value"); */
346         
347         /* unused still
348         prop= RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
349         RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
350         RNA_def_property_range(prop, 0.0f, 100.0f);
351         RNA_def_property_ui_text(prop, "Effector Force Scale", ""); */
352
353         /* unused still
354         prop= RNA_def_property(srna, "effector_wind_scale", PROP_FLOAT, PROP_NONE);
355         RNA_def_property_float_sdna(prop, NULL, "eff_wind_scale");
356         RNA_def_property_range(prop, 0.0f, 100.0f);
357         RNA_def_property_ui_text(prop, "Effector Wind Scale", ""); */
358         
359         /* unused still
360         prop= RNA_def_property(srna, "tearing", PROP_BOOLEAN, PROP_NONE);
361         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_TEARING);
362         RNA_def_property_ui_text(prop, "Tearing", "");*/
363         
364         /* unused still
365         prop= RNA_def_property(srna, "max_spring_extensions", PROP_INT, PROP_NONE);
366         RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
367         RNA_def_property_range(prop, 1.0, 1000.0);
368         RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum extension before spring gets cut"); */
369 }
370
371 static void rna_def_cloth_collision_settings(BlenderRNA *brna)
372 {
373         StructRNA *srna;
374         PropertyRNA *prop;
375         
376         srna = RNA_def_struct(brna, "ClothCollisionSettings", NULL);
377         RNA_def_struct_ui_text(srna, "Cloth Collision Settings", "Cloth simulation settings for self collision and collision with other objects");
378         RNA_def_struct_sdna(srna, "ClothCollSettings");
379         RNA_def_struct_path_func(srna, "rna_ClothCollisionSettings_path");
380
381         /* general collision */
382
383         prop= RNA_def_property(srna, "enable_collision", PROP_BOOLEAN, PROP_NONE);
384         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
385         RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects");
386         RNA_def_property_update(prop, 0, "rna_cloth_update");
387         
388         prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_NONE);
389         RNA_def_property_float_sdna(prop, NULL, "epsilon");
390         RNA_def_property_range(prop, 0.001f, 1.0f);
391         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance between collision objects before collision response takes in");
392         RNA_def_property_update(prop, 0, "rna_cloth_update");
393
394         prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
395         RNA_def_property_range(prop, 0.0f, 80.0f);
396         RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened. (higher = less movement)");
397         RNA_def_property_update(prop, 0, "rna_cloth_update");
398
399         prop= RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
400         RNA_def_property_int_sdna(prop, NULL, "loop_count");
401         RNA_def_property_range(prop, 1, 20);
402         RNA_def_property_ui_text(prop, "Collision Quality", "How many collision iterations should be done. (higher is better quality but slower)");
403         RNA_def_property_update(prop, 0, "rna_cloth_update");
404
405         /* self collision */
406
407         prop= RNA_def_property(srna, "enable_self_collision", PROP_BOOLEAN, PROP_NONE);
408         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
409         RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions");
410         RNA_def_property_update(prop, 0, "rna_cloth_update");
411         
412         prop= RNA_def_property(srna, "self_min_distance", PROP_FLOAT, PROP_NONE);
413         RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
414         RNA_def_property_range(prop, 0.5f, 1.0f);
415         RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
416         RNA_def_property_update(prop, 0, "rna_cloth_update");
417         
418         prop= RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
419         RNA_def_property_range(prop, 0.0f, 80.0f);
420         RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact");
421         RNA_def_property_update(prop, 0, "rna_cloth_update");
422
423         prop= RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
424         RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
425         RNA_def_property_range(prop, 1, 10);
426         RNA_def_property_ui_text(prop, "Self Collision Quality", "How many self collision iterations should be done. (higher is better quality but slower)");
427         RNA_def_property_update(prop, 0, "rna_cloth_update");
428 }
429
430 void RNA_def_cloth(BlenderRNA *brna)
431 {
432         rna_def_cloth_sim_settings(brna);
433         rna_def_cloth_collision_settings(brna);
434 }
435
436 #endif
437