Assorted Animation/RNA fixes:
[blender.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, Joshua Leung
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 #include "WM_types.h"
39
40
41 #ifdef RNA_RUNTIME
42
43 static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter)
44 {
45         ListBaseIterator *internal= iter->internal;
46         FCurve *fcu= (FCurve*)internal->link;
47         bActionGroup *grp= fcu->grp;
48         
49         /* only continue if the next F-Curve (if existant) belongs in the same group */
50         if ((fcu->next) && (fcu->next->grp == grp))
51                 internal->link= (Link*)fcu->next;
52         else
53                 internal->link= NULL;
54                 
55         iter->valid= (internal->link != NULL);
56 }
57
58 #else
59
60 static void rna_def_dopesheet(BlenderRNA *brna)
61 {
62         StructRNA *srna;
63         PropertyRNA *prop;
64
65         srna= RNA_def_struct(brna, "DopeSheet", NULL);
66         RNA_def_struct_sdna(srna, "bDopeSheet");
67         RNA_def_struct_ui_text(srna, "DopeSheet", "Storage for Dopesheet/Grease-Pencil Editor data.");
68
69         prop= RNA_def_property(srna, "source", PROP_POINTER, PROP_NONE);
70         RNA_def_property_struct_type(prop, "ID");
71         RNA_def_property_ui_text(prop, "Source", "ID-Block representing source data, currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil).");
72
73         prop= RNA_def_property(srna, "only_selected", PROP_BOOLEAN, PROP_NONE);
74         RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLYSEL);
75         RNA_def_property_ui_text(prop, "Only Selected", "Only include channels relating to selected objects and data.");
76         RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 0);
77         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
78
79         prop= RNA_def_property(srna, "only_nla", PROP_BOOLEAN, PROP_NONE);
80         RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLYNLA);
81         RNA_def_property_ui_text(prop, "Only NLA", "Only include NLA data from Animation data.");
82         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
83
84         prop= RNA_def_property(srna, "use_filter", PROP_BOOLEAN, PROP_NONE);
85         RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_SELEDIT);
86         RNA_def_property_ui_text(prop, "Use Filter", "Indicates if filtering options must be taken into account.");
87         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
88
89         prop= RNA_def_property(srna, "display_summary", PROP_BOOLEAN, PROP_NONE);
90         RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_SUMMARY);
91         RNA_def_property_ui_text(prop, "Display Summary", "Display an additional 'summary' line.");
92         RNA_def_property_ui_icon(prop, ICON_BORDERMOVE, 0);
93         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
94
95         prop= RNA_def_property(srna, "display_shapekeys", PROP_BOOLEAN, PROP_NONE);
96         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOSHAPEKEYS);
97         RNA_def_property_ui_text(prop, "Display Shapekeys", "Include visualization of ShapeKey related Animation data.");
98         RNA_def_property_ui_icon(prop, ICON_SHAPEKEY_DATA, 0);
99         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
100
101         prop= RNA_def_property(srna, "display_mesh", PROP_BOOLEAN, PROP_NONE);
102         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMESH);
103         RNA_def_property_ui_text(prop, "Display Meshes", "Include visualization of Mesh related Animation data.");
104         RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
105         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
106         
107         prop= RNA_def_property(srna, "display_camera", PROP_BOOLEAN, PROP_NONE);
108         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCAM);
109         RNA_def_property_ui_text(prop, "Display Camera", "Include visualization of Camera related Animation data.");
110         RNA_def_property_ui_icon(prop, ICON_CAMERA_DATA, 0);
111         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
112
113         prop= RNA_def_property(srna, "display_material", PROP_BOOLEAN, PROP_NONE);
114         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMAT);
115         RNA_def_property_ui_text(prop, "Display Material", "Include visualization of Material related Animation data.");
116         RNA_def_property_ui_icon(prop, ICON_MATERIAL_DATA, 0);
117         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
118
119         prop= RNA_def_property(srna, "display_lamp", PROP_BOOLEAN, PROP_NONE);
120         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAM);
121         RNA_def_property_ui_text(prop, "Display Lamp", "Include visualization of Lamp related Animation data.");
122         RNA_def_property_ui_icon(prop, ICON_LAMP_DATA, 0);
123         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
124
125         prop= RNA_def_property(srna, "display_curve", PROP_BOOLEAN, PROP_NONE);
126         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCUR);
127         RNA_def_property_ui_text(prop, "Display Curve", "Include visualization of Curve related Animation data.");
128         RNA_def_property_ui_icon(prop, ICON_CURVE_DATA, 0);
129         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
130
131         prop= RNA_def_property(srna, "display_world", PROP_BOOLEAN, PROP_NONE);
132         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOWOR);
133         RNA_def_property_ui_text(prop, "Display World", "Include visualization of World related Animation data.");
134         RNA_def_property_ui_icon(prop, ICON_WORLD_DATA, 0);
135         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
136
137         prop= RNA_def_property(srna, "display_scene", PROP_BOOLEAN, PROP_NONE);
138         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOSCE);
139         RNA_def_property_ui_text(prop, "Display Scene", "Include visualization of Scene related Animation data.");
140         RNA_def_property_ui_icon(prop, ICON_SCENE_DATA, 0);
141         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
142
143         prop= RNA_def_property(srna, "display_particle", PROP_BOOLEAN, PROP_NONE);
144         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOPART);
145         RNA_def_property_ui_text(prop, "Display Particle", "Include visualization of Particle related Animation data.");
146         RNA_def_property_ui_icon(prop, ICON_PARTICLE_DATA, 0);
147         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
148
149         prop= RNA_def_property(srna, "display_metaball", PROP_BOOLEAN, PROP_NONE);
150         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOMBA);
151         RNA_def_property_ui_text(prop, "Display Metaball", "Include visualization of Metaball related Animation data.");
152         RNA_def_property_ui_icon(prop, ICON_META_DATA, 0);
153         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
154
155         prop= RNA_def_property(srna, "display_armature", PROP_BOOLEAN, PROP_NONE);
156         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOARM);
157         RNA_def_property_ui_text(prop, "Display Armature", "Include visualization of Armature related Animation data.");
158         RNA_def_property_ui_icon(prop, ICON_ARMATURE_DATA, 0);
159         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
160
161         prop= RNA_def_property(srna, "display_node", PROP_BOOLEAN, PROP_NONE);
162         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NONTREE);
163         RNA_def_property_ui_text(prop, "Display Node", "Include visualization of Node related Animation data.");
164         RNA_def_property_ui_icon(prop, ICON_NODETREE, 0);
165         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
166
167         prop= RNA_def_property(srna, "include_missing_nla", PROP_BOOLEAN, PROP_NONE);
168         RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NLA_NOACT);
169         RNA_def_property_ui_text(prop, "Include Missing NLA", "Include Animation Data blocks with no NLA data. (NLA Editor only)");
170         RNA_def_property_ui_icon(prop, ICON_ACTION, 0);
171         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
172
173         prop= RNA_def_property(srna, "collapse_summary", PROP_BOOLEAN, PROP_NONE);
174         RNA_def_property_boolean_sdna(prop, NULL, "flag", ADS_FLAG_SUMMARY_COLLAPSED);
175         RNA_def_property_ui_text(prop, "Collapse Summary", "Collapse summary when shown, so all other channels get hidden. (DopeSheet Window Editors Only)");
176         RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN_EDIT, NULL);
177 }
178
179 static void rna_def_action_group(BlenderRNA *brna)
180 {
181         StructRNA *srna;
182         PropertyRNA *prop;
183         
184         srna= RNA_def_struct(brna, "ActionGroup", NULL);
185         RNA_def_struct_sdna(srna, "bActionGroup");
186         RNA_def_struct_ui_text(srna, "Action Group", "Groups of F-Curves.");
187         
188         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
189         RNA_def_property_ui_text(prop, "Name", "");
190         RNA_def_struct_name_property(srna, prop);
191         
192         /* WARNING: be very careful when working with this list, since the endpoint is not
193          * defined like a standard ListBase. Adding/removing channels from this list needs
194          * extreme care, otherwise the F-Curve list running through adjacent groups does
195          * not match up with the one stored in the Action, resulting in curves which do not
196          * show up in animation editors. For that reason, such operations are currently 
197          * prohibited.
198          */
199         prop= RNA_def_property(srna, "channels", PROP_COLLECTION, PROP_NONE);
200         RNA_def_property_collection_sdna(prop, NULL, "channels", NULL);
201         RNA_def_property_struct_type(prop, "FCurve");
202         RNA_def_property_collection_funcs(prop, 0, "rna_ActionGroup_channels_next", 0, 0, 0, 0, 0);
203         RNA_def_property_ui_text(prop, "Channels", "F-Curves in this group.");
204         
205         prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
206         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_SELECTED);
207         RNA_def_property_ui_text(prop, "Selected", "Action Group is selected.");
208         
209         prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
210         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_PROTECTED);
211         RNA_def_property_ui_text(prop, "Locked", "Action Group is locked.");
212         
213         prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
214         RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_EXPANDED);
215         RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded.");
216         
217         prop= RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE);
218         RNA_def_property_int_sdna(prop, NULL, "customCol");
219         RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set.");
220 }
221
222 static void rna_def_action(BlenderRNA *brna)
223 {
224         StructRNA *srna;
225         PropertyRNA *prop;
226
227         srna= RNA_def_struct(brna, "Action", "ID");
228         RNA_def_struct_sdna(srna, "bAction");
229         RNA_def_struct_ui_text(srna, "Action", "A collection of F-Curves for animation.");
230         RNA_def_struct_ui_icon(srna, ICON_ACTION);
231
232         prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
233         RNA_def_property_collection_sdna(prop, NULL, "curves", NULL);
234         RNA_def_property_struct_type(prop, "FCurve");
235         RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action.");
236
237         prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
238         RNA_def_property_collection_sdna(prop, NULL, "groups", NULL);
239         RNA_def_property_struct_type(prop, "ActionGroup");
240         RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves.");
241
242         prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE);
243         RNA_def_property_collection_sdna(prop, NULL, "markers", NULL);
244         RNA_def_property_struct_type(prop, "TimelineMarker");
245         RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses.");
246
247         RNA_api_action(srna);
248 }
249
250 /* --------- */
251
252 void RNA_def_action(BlenderRNA *brna)
253 {
254         rna_def_action(brna);
255         rna_def_action_group(brna);
256         rna_def_dopesheet(brna);
257 }
258
259
260 #endif