RNA
[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 #else
66
67 void RNA_def_keyblock(BlenderRNA *brna)
68 {
69         StructRNA *srna;
70         PropertyRNA *prop;
71
72         static EnumPropertyItem prop_keyblock_type_items[] = {
73                 {KEY_LINEAR, "KEY_LINEAR", "Linear", ""},
74                 {KEY_CARDINAL, "KEY_CARDINAL", "Cardinal", ""},
75                 {KEY_BSPLINE, "KEY_BSPLINE", "BSpline", ""},
76                 {0, NULL, NULL, NULL}};
77
78         srna= RNA_def_struct(brna, "ShapeKey", NULL, "Shape Key");
79         RNA_def_struct_sdna(srna, "KeyBlock");
80
81         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
82         RNA_def_property_ui_text(prop, "Name", "");
83         RNA_def_struct_name_property(srna, prop);
84
85         /* the current value isn't easily editable this way, it's linked to an IPO.
86         prop= RNA_def_property(srna, "current_position", PROP_FLOAT, PROP_NONE);
87         RNA_def_property_float_sdna(prop, NULL, "pos");
88         RNA_def_property_ui_text(prop, "Current Position", "");
89
90         prop= RNA_def_property(srna, "current_value", PROP_FLOAT, PROP_NONE);
91         RNA_def_property_float_sdna(prop, NULL, "curval");
92         RNA_def_property_ui_text(prop, "Current Value", "");*/
93
94         prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
95         RNA_def_property_enum_sdna(prop, NULL, "type");
96         RNA_def_property_enum_items(prop, prop_keyblock_type_items);
97         RNA_def_property_ui_text(prop, "Interpolation", "Interpolation type.");
98
99         prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
100         RNA_def_property_string_sdna(prop, NULL, "vgroup");
101         RNA_def_property_ui_text(prop, "Vertex Group", "Vertex weight group, to blend with basis shape.");
102
103         prop= RNA_def_property(srna, "relative_key", PROP_POINTER, PROP_NONE);
104         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
105         RNA_def_property_struct_type(prop, "ShapeKey");
106         RNA_def_property_ui_text(prop, "Relative Key", "Shape used as a relative key.");
107         RNA_def_property_pointer_funcs(prop, "rna_ShapeKey_relative_key_get", NULL, NULL);
108
109         prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
110         RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE);
111         RNA_def_property_ui_text(prop, "Mute", "Mute this shape key.");
112
113         prop= RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
114         RNA_def_property_float_sdna(prop, NULL, "slidermin");
115         RNA_def_property_range(prop, -10.0f, 10.0f);
116         RNA_def_property_ui_text(prop, "Slider Min", "Minimum for slider.");
117
118         prop= RNA_def_property(srna, "slider_max", PROP_FLOAT, PROP_NONE);
119         RNA_def_property_float_sdna(prop, NULL, "slidermax");
120         RNA_def_property_range(prop, -10.0f, 10.0f);
121         RNA_def_property_ui_text(prop, "Slider Max", "Maximum for slider.");
122
123         /* KeyBlock.data has to be wrapped still */
124 }
125
126 void RNA_def_key(BlenderRNA *brna)
127 {
128         StructRNA *srna;
129         PropertyRNA *prop;
130
131         RNA_def_keyblock(brna);
132
133         srna= RNA_def_struct(brna, "Key", "ID", "Key");
134
135         prop= RNA_def_property(srna, "reference_key", PROP_POINTER, PROP_NONE);
136         RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
137         RNA_def_property_pointer_sdna(prop, NULL, "refkey");
138         RNA_def_property_ui_text(prop, "Reference Key", "");
139
140         prop= RNA_def_property(srna, "shape_keys", PROP_COLLECTION, PROP_NONE);
141         RNA_def_property_collection_sdna(prop, NULL, "block", NULL);
142         RNA_def_property_struct_type(prop, "ShapeKey");
143         RNA_def_property_ui_text(prop, "Shape Keys", "");
144
145         rna_def_ipo_common(srna);
146
147         prop= RNA_def_property(srna, "from", PROP_POINTER, PROP_NONE);
148         RNA_def_property_ui_text(prop, "From", "Datablock using these shape keys.");
149
150         prop= RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
151         RNA_def_property_boolean_sdna(prop, NULL, "type", KEY_RELATIVE);
152         RNA_def_property_ui_text(prop, "Relative", "Makes shape keys relative.");
153
154         prop= RNA_def_property(srna, "slurph", PROP_INT, PROP_UNSIGNED);
155         RNA_def_property_int_sdna(prop, NULL, "slurph");
156         RNA_def_property_range(prop, -500, 500);
157         RNA_def_property_ui_text(prop, "Slurph", "Creates a delay in amount of frames in applying keypositions, first vertex goes first.");
158 }
159
160 #endif
161