3e0e0235072fbff65a94e1ee19ba0883f4c24914
[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 "DNA_cloth_types.h"
35
36 #ifdef RNA_RUNTIME
37
38 static void rna_ClothSettings_max_bend_set(struct PointerRNA *ptr, float value)
39 {
40         ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
41         
42         /* check for clipping */
43         if(value < settings->bending)
44                 value = settings->bending;
45         
46         settings->max_bend = value;
47 }
48
49 static void rna_ClothSettings_max_struct_set(struct PointerRNA *ptr, float value)
50 {
51         ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
52         
53         /* check for clipping */
54         if(value < settings->structural)
55                 value = settings->structural;
56         
57         settings->max_struct = value;
58 }
59
60 static void rna_ClothSettings_mass_vgroup_get(PointerRNA *ptr, char *value)
61 {
62         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
63         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_mass);
64 }
65
66 static int rna_ClothSettings_mass_vgroup_length(PointerRNA *ptr)
67 {
68         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
69         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_mass);
70 }
71
72 static void rna_ClothSettings_mass_vgroup_set(PointerRNA *ptr, const char *value)
73 {
74         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
75         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_mass);
76 }
77
78 static void rna_ClothSettings_struct_vgroup_get(PointerRNA *ptr, char *value)
79 {
80         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
81         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_struct);
82 }
83
84 static int rna_ClothSettings_struct_vgroup_length(PointerRNA *ptr)
85 {
86         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
87         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_struct);
88 }
89
90 static void rna_ClothSettings_struct_vgroup_set(PointerRNA *ptr, const char *value)
91 {
92         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
93         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_struct);
94 }
95
96 static void rna_ClothSettings_bend_vgroup_get(PointerRNA *ptr, char *value)
97 {
98         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
99         rna_object_vgroup_name_index_get(ptr, value, sim->vgroup_bend);
100 }
101
102 static int rna_ClothSettings_bend_vgroup_length(PointerRNA *ptr)
103 {
104         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
105         return rna_object_vgroup_name_index_length(ptr, sim->vgroup_bend);
106 }
107
108 static void rna_ClothSettings_bend_vgroup_set(PointerRNA *ptr, const char *value)
109 {
110         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
111         rna_object_vgroup_name_index_set(ptr, value, &sim->vgroup_bend);
112 }
113
114 static float rna_ClothSettings_gravity_get(PointerRNA *ptr, int index)
115 {
116         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
117         return sim->gravity[index];
118 }
119
120 static void rna_ClothSettings_gravity_set(PointerRNA *ptr, int index, float value)
121 {
122         ClothSimSettings *sim= (ClothSimSettings*)ptr->data;
123         sim->gravity[index]= value;
124 }
125
126 #else
127
128 static void rna_def_cloth_sim_settings(BlenderRNA *brna)
129 {
130         StructRNA *srna;
131         PropertyRNA *prop;
132         
133         srna = RNA_def_struct(brna, "ClothSettings", NULL);
134         RNA_def_struct_ui_text(srna, "Cloth Settings", "Cloth simulation settings for an object.");
135         RNA_def_struct_sdna(srna, "ClothSimSettings");
136         
137         /* goal */
138         
139         prop= RNA_def_property(srna, "goal_minimum", PROP_FLOAT, PROP_NONE);
140         RNA_def_property_float_sdna(prop, NULL, "mingoal");
141         RNA_def_property_range(prop, 0.0f, 1.0f);
142         RNA_def_property_ui_text(prop, "Goal Minimum", "Goal minimum, vertex group weights are scaled to match this range.");
143
144         prop= RNA_def_property(srna, "goal_maximum", PROP_FLOAT, PROP_NONE);
145         RNA_def_property_float_sdna(prop, NULL, "maxgoal");
146         RNA_def_property_range(prop, 0.0f, 1.0f);
147         RNA_def_property_ui_text(prop, "Goal Maximum", "Goal maximum, vertex group weights are scaled to match this range.");
148
149         prop= RNA_def_property(srna, "goal_default", PROP_FLOAT, PROP_NONE);
150         RNA_def_property_float_sdna(prop, NULL, "defgoal");
151         RNA_def_property_range(prop, 0.0f, 1.0f);
152         RNA_def_property_ui_text(prop, "Goal Default", "Default Goal (vertex target position) value, when no Vertex Group used.");
153         
154         prop= RNA_def_property(srna, "goal_spring", PROP_FLOAT, PROP_NONE);
155         RNA_def_property_float_sdna(prop, NULL, "goalspring");
156         RNA_def_property_range(prop, 0.0f, 0.999f);
157         RNA_def_property_ui_text(prop, "Goal Stiffness", "Goal (vertex target position) spring stiffness.");
158         
159         prop= RNA_def_property(srna, "goal_friction", PROP_FLOAT, PROP_NONE);
160         RNA_def_property_float_sdna(prop, NULL, "goalfrict");
161         RNA_def_property_range(prop, 0.0f, 50.0f);
162         RNA_def_property_ui_text(prop, "Goal Damping", "Goal (vertex target position) friction.");
163
164         /* mass */
165
166         prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
167         RNA_def_property_range(prop, 0.0f, 10.0f);
168         RNA_def_property_ui_text(prop, "Mass", "Mass of cloth material.");
169
170         prop= RNA_def_property(srna, "mass_vertex_group", PROP_STRING, PROP_NONE);
171         RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length", "rna_ClothSettings_mass_vgroup_set");
172         RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex group for fine control over mass distribution.");
173         
174         prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_VECTOR);
175         RNA_def_property_array(prop, 3);
176         RNA_def_property_range(prop, -100.0, 100.0);
177         RNA_def_property_float_funcs(prop, "rna_ClothSettings_gravity_get", "rna_ClothSettings_gravity_set", NULL);
178         RNA_def_property_ui_text(prop, "Gravity", "Gravity or external force vector.");
179
180         /* various */
181
182         prop= RNA_def_property(srna, "air_damping", PROP_FLOAT, PROP_NONE);
183         RNA_def_property_float_sdna(prop, NULL, "Cvi");
184         RNA_def_property_range(prop, 0.0f, 10.0f);
185         RNA_def_property_ui_text(prop, "Air Damping", "Air has normaly some thickness which slows falling things down.");
186
187         prop= RNA_def_property(srna, "pin_cloth", PROP_BOOLEAN, PROP_NONE);
188         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
189         RNA_def_property_ui_text(prop, "Pin Cloth", "Define forces for vertices to stick to animated position.");
190
191         prop= RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
192         RNA_def_property_float_sdna(prop, NULL, "goalspring");
193         RNA_def_property_range(prop, 0.0f, 0.50);
194         RNA_def_property_ui_text(prop, "Pin Stiffness", "Pin (vertex target position) spring stiffness.");
195
196         prop= RNA_def_property(srna, "quality", PROP_INT, PROP_NONE);
197         RNA_def_property_int_sdna(prop, NULL, "stepsPerFrame");
198         RNA_def_property_range(prop, 4, 80);
199         RNA_def_property_ui_text(prop, "Quality", "Quality of the simulation in steps per frame (higher is better quality but slower).");
200
201         /* springs */
202
203         prop= RNA_def_property(srna, "stiffness_scaling", PROP_BOOLEAN, PROP_NONE);
204         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_SCALING);
205         RNA_def_property_ui_text(prop, "Stiffness Scaling", "If enabled, stiffness can be scaled along a weight painted vertex group.");
206         
207         prop= RNA_def_property(srna, "spring_damping", PROP_FLOAT, PROP_NONE);
208         RNA_def_property_float_sdna(prop, NULL, "Cdis");
209         RNA_def_property_range(prop, 0.0f, 50.0f);
210         RNA_def_property_ui_text(prop, "Spring Damping", "Damping of cloth velocity (higher = more smooth, less jiggling)");
211         
212         prop= RNA_def_property(srna, "structural_stiffness", PROP_FLOAT, PROP_NONE);
213         RNA_def_property_float_sdna(prop, NULL, "structural");
214         RNA_def_property_range(prop, 1.0f, 10000.0f);
215         RNA_def_property_ui_text(prop, "Structural Stiffness", "Overall stiffness of structure.");
216
217         prop= RNA_def_property(srna, "structural_stiffness_maximum", PROP_FLOAT, PROP_NONE);
218         RNA_def_property_float_sdna(prop, NULL, "max_struct");
219         RNA_def_property_range(prop, 0.0f, 10000.0f);
220         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_struct_set", NULL);
221         RNA_def_property_ui_text(prop, "Structural Stiffness Maximum", "Maximum structural stiffness value.");
222
223         prop= RNA_def_property(srna, "structural_stiffness_vertex_group", PROP_STRING, PROP_NONE);
224         RNA_def_property_string_funcs(prop, "rna_ClothSettings_struct_vgroup_get", "rna_ClothSettings_struct_vgroup_length", "rna_ClothSettings_struct_vgroup_set");
225         RNA_def_property_ui_text(prop, "Structural Stiffness Vertex Group", "Vertex group for fine control over structural stiffness.");
226
227         prop= RNA_def_property(srna, "bending_stiffness", PROP_FLOAT, PROP_NONE);
228         RNA_def_property_float_sdna(prop, NULL, "bending");
229         RNA_def_property_range(prop, 0.0f, 10000.0f);
230         RNA_def_property_ui_text(prop, "Bending Stiffness", "Wrinkle coefficient (higher = less smaller but more big wrinkles).");
231
232         prop= RNA_def_property(srna, "bending_stiffness_maximum", PROP_FLOAT, PROP_NONE);
233         RNA_def_property_float_sdna(prop, NULL, "max_bend");
234         RNA_def_property_range(prop, 0.0f, 10000.0f);
235         RNA_def_property_float_funcs(prop, NULL, "rna_ClothSettings_max_bend_set", NULL);
236         RNA_def_property_ui_text(prop, "Bending Stiffness Maximum", "Maximum bending stiffness value.");
237
238         prop= RNA_def_property(srna, "bending_vertex_group", PROP_STRING, PROP_NONE);
239         RNA_def_property_string_funcs(prop, "rna_ClothSettings_bend_vgroup_get", "rna_ClothSettings_bend_vgroup_length", "rna_ClothSettings_bend_vgroup_set");
240         RNA_def_property_ui_text(prop, "Bending Stiffness Vertex Group", "Vertex group for fine control over bending stiffness.");
241
242         /* unused */
243
244         /* unused still
245         prop= RNA_def_property(srna, "shear_stiffness", PROP_FLOAT, PROP_NONE);
246         RNA_def_property_float_sdna(prop, NULL, "shear");
247         RNA_def_property_range(prop, 0.0f, 1000.0f);
248         RNA_def_property_ui_text(prop, "Shear Stiffness", "Shear spring stiffness."); */
249
250         /* unused still
251         prop= RNA_def_property(srna, "shear_stiffness_maximum", PROP_FLOAT, PROP_NONE);
252         RNA_def_property_float_sdna(prop, NULL, "max_shear");
253         RNA_def_property_range(prop, 0.0f, upperLimitf);
254         RNA_def_property_ui_text(prop, "Shear Stiffness Maximum", "Maximum shear scaling value."); */
255         
256         /* unused still
257         prop= RNA_def_property(srna, "effector_force_scale", PROP_FLOAT, PROP_NONE);
258         RNA_def_property_float_sdna(prop, NULL, "eff_force_scale");
259         RNA_def_property_range(prop, 0.0f, 100.0f);
260         RNA_def_property_ui_text(prop, "Effector Force Scale", ""); */
261
262         /* unused still
263         prop= RNA_def_property(srna, "effector_wind_scale", PROP_FLOAT, PROP_NONE);
264         RNA_def_property_float_sdna(prop, NULL, "eff_wind_scale");
265         RNA_def_property_range(prop, 0.0f, 100.0f);
266         RNA_def_property_ui_text(prop, "Effector Wind Scale", ""); */
267         
268         /* unused still
269         prop= RNA_def_property(srna, "pre_roll", PROP_INT, PROP_NONE);
270         RNA_def_property_int_sdna(prop, NULL, "preroll");
271         RNA_def_property_range(prop, 10, 80;
272         RNA_def_property_ui_text(prop, "Pre Roll", "Simulation starts on this frame."); */
273
274         /* unused still
275         prop= RNA_def_property(srna, "tearing", PROP_BOOLEAN, PROP_NONE);
276         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_TEARING);
277         RNA_def_property_ui_text(prop, "Tearing", "");*/
278         
279         /* unused still
280         prop= RNA_def_property(srna, "max_spring_extensions", PROP_INT, PROP_NONE);
281         RNA_def_property_int_sdna(prop, NULL, "maxspringlen");
282         RNA_def_property_range(prop, 1.0, 1000.0);
283         RNA_def_property_ui_text(prop, "Maximum Spring Extension", "Maximum extension before spring gets cut."); */
284 }
285
286 static void rna_def_cloth_collision_settings(BlenderRNA *brna)
287 {
288         StructRNA *srna;
289         PropertyRNA *prop;
290         
291         srna = RNA_def_struct(brna, "ClothCollisionSettings", NULL);
292         RNA_def_struct_ui_text(srna, "Cloth Collision Settings", "DOC_BROKEN");
293         RNA_def_struct_sdna(srna, "ClothCollSettings");
294
295         /* general collision */
296
297         prop= RNA_def_property(srna, "enable_collision", PROP_BOOLEAN, PROP_NONE);
298         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_ENABLED);
299         RNA_def_property_ui_text(prop, "Enable Collision", "Enable collisions with other objects.");
300         
301         prop= RNA_def_property(srna, "minimum_distance", PROP_FLOAT, PROP_NONE);
302         RNA_def_property_float_sdna(prop, NULL, "epsilon");
303         RNA_def_property_range(prop, 0.001f, 1.0f);
304         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance between collision objects before collision response takes in, can be changed for each frame.");
305
306         prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
307         RNA_def_property_range(prop, 0.0f, 80.0f);
308         RNA_def_property_ui_text(prop, "Friction", "Friction force if a collision happened (0=movement not changed, 100=no movement left)");
309
310         prop= RNA_def_property(srna, "collision_quality", PROP_INT, PROP_NONE);
311         RNA_def_property_int_sdna(prop, NULL, "loop_count");
312         RNA_def_property_range(prop, 1, 20);
313         RNA_def_property_ui_text(prop, "Collision Quality", "How many collision iterations should be done. (higher is better quality but slower)");
314
315         /* self collision */
316
317         prop= RNA_def_property(srna, "enable_self_collision", PROP_BOOLEAN, PROP_NONE);
318         RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_COLLSETTINGS_FLAG_SELF);
319         RNA_def_property_ui_text(prop, "Enable Self Collision", "Enable self collisions.");
320         
321         prop= RNA_def_property(srna, "self_minimum_distance", PROP_FLOAT, PROP_NONE);
322         RNA_def_property_float_sdna(prop, NULL, "selfepsilon");
323         RNA_def_property_range(prop, 0.5f, 1.0f);
324         RNA_def_property_ui_text(prop, "Self Minimum Distance", "0.5 means no distance at all, 1.0 is maximum distance");
325         
326         prop= RNA_def_property(srna, "self_friction", PROP_FLOAT, PROP_NONE);
327         RNA_def_property_range(prop, 0.0f, 80.0f);
328         RNA_def_property_ui_text(prop, "Self Friction", "Friction/damping with self contact.");
329
330         prop= RNA_def_property(srna, "self_collision_quality", PROP_INT, PROP_NONE);
331         RNA_def_property_int_sdna(prop, NULL, "self_loop_count");
332         RNA_def_property_range(prop, 1, 10);
333         RNA_def_property_ui_text(prop, "Self Collision Quality", "How many self collision iterations should be done. (higher is better quality but slower), can be changed for each frame.");
334 }
335
336 void RNA_def_cloth(BlenderRNA *brna)
337 {
338         rna_def_cloth_sim_settings(brna);
339         rna_def_cloth_collision_settings(brna);
340 }
341
342 #endif
343