Animato - RNA Wrapping:
[blender-staging.git] / source / blender / makesrna / intern / rna_action.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), Roland Hess
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_anim_types.h"
33 #include "DNA_action_types.h"
34 #include "DNA_scene_types.h"
35
36 #include "MEM_guardedalloc.h"
37
38 #ifdef RNA_RUNTIME
39
40 static void rna_Driver_RnaPath_get(PointerRNA *ptr, char *value)
41 {
42         ChannelDriver *driver= (ChannelDriver *)ptr->data;
43
44         if (driver->rna_path)
45                 strcpy(value, driver->rna_path);
46         else
47                 strcpy(value, "");
48 }
49
50 static int rna_Driver_RnaPath_length(PointerRNA *ptr)
51 {
52         ChannelDriver *driver= (ChannelDriver *)ptr->data;
53         
54         if (driver->rna_path)
55                 return strlen(driver->rna_path);
56         else
57                 return 0;
58 }
59
60 static void rna_Driver_RnaPath_set(PointerRNA *ptr, const char *value)
61 {
62         ChannelDriver *driver= (ChannelDriver *)ptr->data;
63         
64         // XXX in this case we need to be very careful, as this will require some new dependencies to be added!
65         if (driver->rna_path)
66                 MEM_freeN(driver->rna_path);
67         
68         if (strlen(value))
69                 driver->rna_path= BLI_strdup(value);
70         else 
71                 driver->rna_path= NULL;
72 }
73
74
75 static void rna_FCurve_RnaPath_get(PointerRNA *ptr, char *value)
76 {
77         FCurve *fcu= (FCurve *)ptr->data;
78
79         if (fcu->rna_path)
80                 strcpy(value, fcu->rna_path);
81         else
82                 strcpy(value, "");
83 }
84
85 static int rna_FCurve_RnaPath_length(PointerRNA *ptr)
86 {
87         FCurve *fcu= (FCurve *)ptr->data;
88         
89         if (fcu->rna_path)
90                 return strlen(fcu->rna_path);
91         else
92                 return 0;
93 }
94
95 static void rna_FCurve_RnaPath_set(PointerRNA *ptr, const char *value)
96 {
97         FCurve *fcu= (FCurve *)ptr->data;
98
99         if (fcu->rna_path)
100                 MEM_freeN(fcu->rna_path);
101         
102         if (strlen(value))
103                 fcu->rna_path= BLI_strdup(value);
104         else 
105                 fcu->rna_path= NULL;
106 }
107
108 #else
109
110 // XXX maybe this should be in a separate file?
111 void rna_def_channeldriver(BlenderRNA *brna)
112 {
113         StructRNA *srna;
114         PropertyRNA *prop;
115         
116         static EnumPropertyItem prop_type_items[] = {
117                 {DRIVER_TYPE_CHANNEL, "NORMAL", "Normal", ""},
118                 {DRIVER_TYPE_PYTHON, "SCRIPTED", "Scripted Expression", ""},
119                 {DRIVER_TYPE_ROTDIFF, "ROTDIFF", "Rotational Difference", ""},
120                 {0, NULL, NULL, NULL}};
121
122         srna= RNA_def_struct(brna, "ChannelDriver", NULL);
123         RNA_def_struct_ui_text(srna, "Driver", "Driver for the value of a setting based on an external value.");
124
125         /* Enums */
126         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
127         RNA_def_property_enum_items(prop, prop_type_items);
128         RNA_def_property_ui_text(prop, "Type", "Driver types.");
129
130         /* String values */
131         prop= RNA_def_property(srna, "expression", PROP_STRING, PROP_NONE);
132         RNA_def_property_ui_text(prop, "Expression", "Expression to use for Scripted Expression.");
133
134         /* Pointers */
135         prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
136         RNA_def_property_pointer_sdna(prop, NULL, "id");
137         RNA_def_property_ui_text(prop, "Driver Object", "Object that controls this Driver.");
138         
139         prop= RNA_def_property(srna, "rna_path", PROP_STRING, PROP_NONE);
140         RNA_def_property_string_funcs(prop, "rna_Driver_RnaPath_get", "rna_Driver_RnaPath_length", "rna_Driver_RnaPath_set");
141         RNA_def_property_ui_text(prop, "Driver RNA Path", "RNA Path (from Driver Object) to property used as Driver.");
142         
143         prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
144         RNA_def_property_ui_text(prop, "Driver RNA Array Index", "Index to the specific property used as Driver if applicable.");
145 }
146
147 // XXX maybe this should be in a separate file?
148 void rna_def_fcurve(BlenderRNA *brna)
149 {
150         StructRNA *srna;
151         PropertyRNA *prop;
152         
153         static EnumPropertyItem prop_mode_extend_items[] = {
154                 {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", "Constant", ""},
155                 {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", "Linear", ""},
156                 {0, NULL, NULL, NULL}};
157         static EnumPropertyItem prop_mode_color_items[] = {
158                 {FCURVE_COLOR_AUTO_RAINBOW, "AUTO_RAINBOW", "Automatic Rainbow", ""},
159                 {FCURVE_COLOR_AUTO_RGB, "AUTO_RGB", "Automatic XYZ to RGB", ""},
160                 {FCURVE_COLOR_CUSTOM, "CUSTOM", "User Defined", ""},
161                 {0, NULL, NULL, NULL}};
162
163         srna= RNA_def_struct(brna, "FCurve", NULL);
164         RNA_def_struct_ui_text(srna, "F-Curve", "F-Curve defining values of a period of time.");
165
166         /* Enums */
167         prop= RNA_def_property(srna, "extrapolation", PROP_ENUM, PROP_NONE);
168         RNA_def_property_enum_sdna(prop, NULL, "extend");
169         RNA_def_property_enum_items(prop, prop_mode_extend_items);
170         RNA_def_property_ui_text(prop, "Extrapolation", "");
171
172         /* Pointers */
173         prop= RNA_def_property(srna, "driver", PROP_POINTER, PROP_NONE);
174         RNA_def_property_clear_flag(prop, PROP_EDITABLE); // xxx?
175         RNA_def_property_ui_text(prop, "Driver", "Channel Driver (only set for Driver F-Curves)");
176         
177         /* Path + Array Index */
178         prop= RNA_def_property(srna, "rna_path", PROP_STRING, PROP_NONE);
179         //RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now editable
180         RNA_def_property_string_funcs(prop, "rna_FCurve_RnaPath_get", "rna_FCurve_RnaPath_length", "rna_FCurve_RnaPath_set");
181         RNA_def_property_ui_text(prop, "RNA Path", "RNA Path to property affected by F-Curve.");
182         
183         prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
184         //RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now editable
185         RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific property affected by F-Curve if applicable.");
186         
187         /* Color */
188         prop= RNA_def_property(srna, "color_mode", PROP_ENUM, PROP_NONE);
189         RNA_def_property_enum_items(prop, prop_mode_color_items);
190         RNA_def_property_ui_text(prop, "Color Mode", "Method used to determine color of F-Curve in Graph Editor.");
191         
192         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
193         RNA_def_property_array(prop, 3);
194         RNA_def_property_ui_text(prop, "Color", "Color of the F-Curve in the Graph Editor.");
195         
196         /* Collections */
197         prop= RNA_def_property(srna, "sampled_points", PROP_COLLECTION, PROP_NONE);
198         RNA_def_property_collection_sdna(prop, NULL, "fpt", "totvert");
199         RNA_def_property_struct_type(prop, "CurvePoint");
200         RNA_def_property_ui_text(prop, "Sampled Points", "Sampled animation data");
201
202         prop= RNA_def_property(srna, "keyframe_points", PROP_COLLECTION, PROP_NONE);
203         RNA_def_property_collection_sdna(prop, NULL, "bezt", "totvert");
204         RNA_def_property_struct_type(prop, "BezierCurvePoint");
205         RNA_def_property_ui_text(prop, "Keyframes", "User-editable keyframes");
206         
207         // XXX to add modifiers...
208 }
209
210 /* --- */
211
212 void rna_def_action_group(BlenderRNA *brna)
213 {
214         StructRNA *srna;
215         PropertyRNA *prop;
216
217         srna= RNA_def_struct(brna, "ActionGroup", NULL);
218         RNA_def_struct_sdna(srna, "bActionGroup");
219         RNA_def_struct_ui_text(srna, "Action Group", "Groups of F-Curves.");
220
221         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
222         RNA_def_property_ui_text(prop, "Name", "");
223         RNA_def_struct_name_property(srna, prop);
224
225         /* dna warns not to treat the Action Channel listbase in the Action Group struct like a
226            normal listbase. I'll leave this here but comment out, for Joshua to review. He can 
227            probably shed some more light on why this is */
228         /*prop= RNA_def_property(srna, "channels", PROP_COLLECTION, PROP_NONE);
229         RNA_def_property_collection_sdna(prop, NULL, "channels", NULL);
230         RNA_def_property_struct_type(prop, "FCurve");
231         RNA_def_property_ui_text(prop, "Channels", "F-Curves in this group.");*/
232
233         prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
234         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_SELECTED);
235         RNA_def_property_ui_text(prop, "Selected", "Action Group is selected.");
236
237         prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
238         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_PROTECTED);
239         RNA_def_property_ui_text(prop, "Locked", "Action Group is locked.");
240
241         prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
242         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_EXPANDED);
243         RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded.");
244
245         prop= RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE);
246         RNA_def_property_int_sdna(prop, NULL, "customCol");
247         RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set.");
248 }
249
250 void rna_def_action(BlenderRNA *brna)
251 {
252         StructRNA *srna;
253         PropertyRNA *prop;
254         
255         srna= RNA_def_struct(brna, "Action", "ID");
256         RNA_def_struct_sdna(srna, "bAction");
257         RNA_def_struct_ui_text(srna, "Action", "A collection of F-Curves for animation.");
258
259         prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
260         RNA_def_property_collection_sdna(prop, NULL, "curves", NULL);
261         RNA_def_property_struct_type(prop, "FCurve");
262         RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action.");
263
264         prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
265         RNA_def_property_collection_sdna(prop, NULL, "groups", NULL);
266         RNA_def_property_struct_type(prop, "ActionGroup");
267         RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves.");
268
269         prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE);
270         RNA_def_property_collection_sdna(prop, NULL, "markers", NULL);
271         RNA_def_property_struct_type(prop, "TimelineMarker");
272         RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses.");
273 }
274
275 /* --------- */
276
277 void RNA_def_action(BlenderRNA *brna)
278 {
279         rna_def_action(brna);
280         rna_def_action_group(brna);
281         
282         // should these be in their own file, or is that overkill?
283         rna_def_fcurve(brna);
284         rna_def_channeldriver(brna);
285 }
286
287
288 #endif