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