bf328388836c68282a9ec44a68c16202b47d7218
[blender.git] / source / blender / makesrna / intern / rna_key.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
27 #include "RNA_define.h"
28 #include "RNA_types.h"
29
30 #include "rna_internal.h"
31
32 #include "DNA_ID.h"
33 #include "DNA_curve_types.h"
34 #include "DNA_key_types.h"
35 #include "DNA_lattice_types.h"
36 #include "DNA_mesh_types.h"
37
38 #ifdef RNA_RUNTIME
39
40 static Key *rna_ShapeKey_find_key(ID *id)
41 {
42         switch(GS(id->name)) {
43                 case ID_CU: return ((Curve*)id)->key;
44                 case ID_KE: return (Key*)id;
45                 case ID_LT: return ((Lattice*)id)->key;
46                 case ID_ME: return ((Mesh*)id)->key;
47                 default: return NULL;
48         }
49 }
50
51 static void *rna_ShapeKey_relative_key_get(PointerRNA *ptr)
52 {
53         Key *key= rna_ShapeKey_find_key(ptr->id.data);
54         KeyBlock *kb= (KeyBlock*)ptr->data, *kbrel;
55         int a;
56
57         if(key && kb->relative < key->totkey)
58                 for(a=0, kbrel=key->block.first; kbrel; kbrel=kbrel->next, a++)
59                         if(a == kb->relative)
60                                 return kbrel;
61
62         return NULL;
63 }
64
65 static float rna_ShapeKeyPoint_co_get(PointerRNA *ptr, int index)
66 {
67         float *vec= (float*)ptr->data;
68         return vec[index];
69 }
70
71 static void rna_ShapeKeyPoint_co_set(PointerRNA *ptr, int index, float value)
72 {
73         float *vec= (float*)ptr->data;
74         vec[index]= value;
75 }
76
77 static float rna_ShapeKeyCurvePoint_tilt_get(PointerRNA *ptr)
78 {
79         float *vec= (float*)ptr->data;
80         return vec[3];
81 }
82
83 static void rna_ShapeKeyCurvePoint_tilt_set(PointerRNA *ptr, float value)
84 {
85         float *vec= (float*)ptr->data;
86         vec[3]= value;
87 }
88
89 static float rna_ShapeKeyBezierPoint_co_get(PointerRNA *ptr, int index)
90 {
91         float *vec= (float*)ptr->data;
92         return vec[index+3];
93 }
94
95 static void rna_ShapeKeyBezierPoint_co_set(PointerRNA *ptr, int index, float value)
96 {
97         float *vec= (float*)ptr->data;
98         vec[index+3]= value;
99 }
100
101 static float rna_ShapeKeyBezierPoint_handle_1_co_get(PointerRNA *ptr, int index)
102 {
103         float *vec= (float*)ptr->data;
104         return vec[index];
105 }
106
107 static void rna_ShapeKeyBezierPoint_handle_1_co_set(PointerRNA *ptr, int index, float value)
108 {
109         float *vec= (float*)ptr->data;
110         vec[index]= value;
111 }
112
113 static float rna_ShapeKeyBezierPoint_handle_2_co_get(PointerRNA *ptr, int index)
114 {
115         float *vec= (float*)ptr->data;
116         return vec[6+index];
117 }
118
119 static void rna_ShapeKeyBezierPoint_handle_2_co_set(PointerRNA *ptr, int index, float value)
120 {
121         float *vec= (float*)ptr->data;
122         vec[6+index]= value;
123 }
124
125 /*static float rna_ShapeKeyBezierPoint_tilt_get(PointerRNA *ptr)
126 {
127         float *vec= (float*)ptr->data;
128         return vec[10];
129 }
130
131 static void rna_ShapeKeyBezierPoint_tilt_set(PointerRNA *ptr, float value)
132 {
133         float *vec= (float*)ptr->data;
134         vec[10]= value;
135 }*/
136
137 static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
138 {
139         Key *key= rna_ShapeKey_find_key(ptr->id.data);
140         KeyBlock *kb= (KeyBlock*)ptr->data;
141         Curve *cu;
142         Nurb *nu;
143         int tot= kb->totelem, size= key->elemsize;
144
145     if(GS(key->from->name) == ID_CU) {
146                 cu= (Curve*)key->from;
147                 nu= cu->nurb.first;
148
149                 if(nu->bezt) {
150                         tot /= 3;
151                         size *= 3;
152                 }
153         }
154
155         rna_iterator_array_begin(iter, (void*)kb->data, size, tot, NULL);
156 }
157
158 static int rna_ShapeKey_data_length(PointerRNA *ptr)
159 {
160         Key *key= rna_ShapeKey_find_key(ptr->id.data);
161         KeyBlock *kb= (KeyBlock*)ptr->data;
162         Curve *cu;
163         Nurb *nu;
164         int tot= kb->totelem;
165
166     if(GS(key->from->name) == ID_CU) {
167                 cu= (Curve*)key->from;
168                 nu= cu->nurb.first;
169
170                 if(nu->bezt)
171                         tot /= 3;
172         }
173
174         return tot;
175 }
176
177 static StructRNA *rna_ShapeKey_data_type(CollectionPropertyIterator *iter)
178 {
179         Key *key= rna_ShapeKey_find_key(iter->parent.id.data);
180         Curve *cu;
181         Nurb *nu;
182
183         if(GS(key->from->name) == ID_CU) {
184                 cu= (Curve*)key->from;
185                 nu= cu->nurb.first;
186
187                 if(nu->bezt)
188                         return &RNA_ShapeKeyBezierPoint;
189                 else
190                         return &RNA_ShapeKeyCurvePoint;
191         }
192         else
193                 return &RNA_ShapeKeyPoint;
194 }
195
196 #else
197
198 static void rna_def_keydata(BlenderRNA *brna)
199 {
200         StructRNA *srna;
201         PropertyRNA *prop;
202
203         srna= RNA_def_struct(brna, "ShapeKeyPoint", NULL);
204         RNA_def_struct_ui_text(srna, "Shape Key Point", "DOC_BROKEN");
205
206         prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
207         RNA_def_property_array(prop, 3);
208         RNA_def_property_float_funcs(prop, "rna_ShapeKeyPoint_co_get", "rna_ShapeKeyPoint_co_set", NULL);
209         RNA_def_property_ui_text(prop, "Location", "");
210
211         srna= RNA_def_struct(brna, "ShapeKeyCurvePoint", NULL);
212         RNA_def_struct_ui_text(srna, "Shape Key Curve Point", "DOC_BROKEN");
213
214         prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
215         RNA_def_property_array(prop, 3);
216         RNA_def_property_float_funcs(prop, "rna_ShapeKeyPoint_co_get", "rna_ShapeKeyPoint_co_set", NULL);
217         RNA_def_property_ui_text(prop, "Location", "");
218
219         prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
220         RNA_def_property_float_funcs(prop, "rna_ShapeKeyCurvePoint_tilt_get", "rna_ShapeKeyCurvePoint_tilt_set", NULL);
221         RNA_def_property_ui_text(prop, "Tilt", "");
222
223         srna= RNA_def_struct(brna, "ShapeKeyBezierPoint", NULL);
224         RNA_def_struct_ui_text(srna, "Shape Key Bezier Point", "DOC_BROKEN");
225
226         prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_VECTOR);
227         RNA_def_property_array(prop, 3);
228         RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_co_get", "rna_ShapeKeyBezierPoint_co_set", NULL);
229         RNA_def_property_ui_text(prop, "Location", "");
230
231         prop= RNA_def_property(srna, "handle_1_co", PROP_FLOAT, PROP_VECTOR);
232         RNA_def_property_array(prop, 3);
233         RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_1_co_get", "rna_ShapeKeyBezierPoint_handle_1_co_set", NULL);
234         RNA_def_property_ui_text(prop, "Handle 1 Location", "");
235
236         prop= RNA_def_property(srna, "handle_2_co", PROP_FLOAT, PROP_VECTOR);
237         RNA_def_property_array(prop, 3);
238         RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_handle_2_co_get", "rna_ShapeKeyBezierPoint_handle_2_co_set", NULL);
239         RNA_def_property_ui_text(prop, "Handle 2 Location", "");
240
241         /* appears to be unused currently
242         prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
243         RNA_def_property_float_funcs(prop, "rna_ShapeKeyBezierPoint_tilt_get", "rna_ShapeKeyBezierPoint_tilt_set", NULL);
244         RNA_def_property_ui_text(prop, "Tilt", "");*/
245 }
246
247 static void rna_def_keyblock(BlenderRNA *brna)
248 {
249         StructRNA *srna;
250         PropertyRNA *prop;
251
252         static EnumPropertyItem prop_keyblock_type_items[] = {
253                 {KEY_LINEAR, "KEY_LINEAR", "Linear", ""},
254                 {KEY_CARDINAL, "KEY_CARDINAL", "Cardinal", ""},
255                 {KEY_BSPLINE, "KEY_BSPLINE", "BSpline", ""},
256                 {0, NULL, NULL, NULL}};
257
258         srna= RNA_def_struct(brna, "ShapeKey", NULL);
259         RNA_def_struct_ui_text(srna, "Shape Key", "DOC_BROKEN");
260         RNA_def_struct_sdna(srna, "KeyBlock");
261
262         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
263         RNA_def_property_ui_text(prop, "Name", "");
264         RNA_def_struct_name_property(srna, prop);
265
266         /* keys need to be sorted to edit this */
267         prop= RNA_def_property(srna, "frame", PROP_FLOAT, PROP_NONE);
268         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
269         RNA_def_property_float_sdna(prop, NULL, "pos");
270         RNA_def_property_ui_text(prop, "Frame", "Frame for absolute keys.");
271
272         /* the current value isn't easily editable this way, it's linked to an IPO.
273          * these seem to be mostly the values that are being written to, not edited */
274         prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
275         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
276         RNA_def_property_float_sdna(prop, NULL, "curval");
277         RNA_def_property_ui_text(prop, "Value", "Value of shape key at the current frame.");
278
279         prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
280         RNA_def_property_enum_sdna(prop, NULL, "type");
281         RNA_def_property_enum_items(prop, prop_keyblock_type_items);
282         RNA_def_property_ui_text(prop, "Interpolation", "Interpolation type.");
283
284         prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
285         RNA_def_property_string_sdna(prop, NULL, "vgroup");
286         RNA_def_property_ui_text(prop, "Vertex Group", "Vertex weight group, to blend with basis shape.");
287
288         prop= RNA_def_property(srna, "relative_key", PROP_POINTER, PROP_NONE);
289         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
290         RNA_def_property_struct_type(prop, "ShapeKey");
291         RNA_def_property_ui_text(prop, "Relative Key", "Shape used as a relative key.");
292         RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", NULL, NULL);
293
294         prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
295         RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE);
296         RNA_def_property_ui_text(prop, "Mute", "Mute this shape key.");
297
298         prop= RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
299         RNA_def_property_float_sdna(prop, NULL, "slidermin");
300         RNA_def_property_range(prop, -10.0f, 10.0f);
301         RNA_def_property_ui_text(prop, "Slider Min", "Minimum for slider.");
302
303         prop= RNA_def_property(srna, "slider_max", PROP_FLOAT, PROP_NONE);
304         RNA_def_property_float_sdna(prop, NULL, "slidermax");
305         RNA_def_property_range(prop, -10.0f, 10.0f);
306         RNA_def_property_ui_text(prop, "Slider Max", "Maximum for slider.");
307
308         prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
309         RNA_def_property_collection_sdna(prop, NULL, "data", "totelem");
310         RNA_def_property_ui_text(prop, "Data", "");
311         RNA_def_property_collection_funcs(prop, "rna_ShapeKey_data_begin", 0, 0, 0, "rna_ShapeKey_data_type", "rna_ShapeKey_data_length", 0, 0);
312 }
313
314 static void rna_def_key(BlenderRNA *brna)
315 {
316         StructRNA *srna;
317         PropertyRNA *prop;
318
319         srna= RNA_def_struct(brna, "Key", "ID");
320         RNA_def_struct_ui_text(srna, "Key", "DOC_BROKEN");
321
322         prop= RNA_def_property(srna, "reference_key", PROP_POINTER, PROP_NONE);
323         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
324         RNA_def_property_pointer_sdna(prop, NULL, "refkey");
325         RNA_def_property_ui_text(prop, "Reference Key", "");
326
327         prop= RNA_def_property(srna, "shape_keys", PROP_COLLECTION, PROP_NONE);
328         RNA_def_property_collection_sdna(prop, NULL, "block", NULL);
329         RNA_def_property_struct_type(prop, "ShapeKey");
330         RNA_def_property_ui_text(prop, "Shape Keys", "");
331
332         rna_def_ipo_common(srna);
333
334         prop= RNA_def_property(srna, "user", PROP_POINTER, PROP_NONE);
335         RNA_def_property_pointer_sdna(prop, NULL, "from");
336         RNA_def_property_ui_text(prop, "User", "Datablock using these shape keys.");
337
338         prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
339         RNA_def_property_boolean_sdna(prop, NULL, "type", KEY_RELATIVE);
340         RNA_def_property_ui_text(prop, "Relative", "Makes shape keys relative.");
341
342         prop= RNA_def_property(srna, "slurph", PROP_INT, PROP_UNSIGNED);
343         RNA_def_property_int_sdna(prop, NULL, "slurph");
344         RNA_def_property_range(prop, -500, 500);
345         RNA_def_property_ui_text(prop, "Slurph", "Creates a delay in amount of frames in applying keypositions, first vertex goes first.");
346 }
347
348 void RNA_def_key(BlenderRNA *brna)
349 {
350         rna_def_key(brna);
351         rna_def_keyblock(brna);
352         rna_def_keydata(brna);
353 }
354
355 #endif
356