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