adc3640dae46e27e6aff009a4394024a2d15beda
[blender-staging.git] / source / blender / makesrna / intern / rna_animviz.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2010), Joshua Leung
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_animviz.c
24  *  \ingroup RNA
25  */
26
27
28 #include <stdlib.h>
29
30 #include "RNA_define.h"
31
32 #include "rna_internal.h"
33
34 #include "DNA_anim_types.h"
35 #include "DNA_action_types.h"
36 #include "DNA_scene_types.h"
37
38 #include "MEM_guardedalloc.h"
39
40 #include "WM_types.h"
41
42 #ifdef RNA_RUNTIME
43
44 static PointerRNA rna_AnimViz_onion_skinning_get(PointerRNA *ptr)
45 {
46         return rna_pointer_inherit_refine(ptr, &RNA_AnimVizOnionSkinning, ptr->data);
47 }
48
49 static PointerRNA rna_AnimViz_motion_paths_get(PointerRNA *ptr)
50 {
51         return rna_pointer_inherit_refine(ptr, &RNA_AnimVizMotionPaths, ptr->data);
52 }
53
54 static void rna_AnimViz_ghost_start_frame_set(PointerRNA *ptr, int value)
55 {
56         bAnimVizSettings *data = (bAnimVizSettings*)ptr->data;
57         
58         CLAMP(value, 1, data->ghost_ef);
59         data->ghost_sf = value;
60 }
61
62 static void rna_AnimViz_ghost_end_frame_set(PointerRNA *ptr, int value)
63 {
64         bAnimVizSettings *data = (bAnimVizSettings*)ptr->data;
65         
66         CLAMP(value, data->ghost_sf, (int)(MAXFRAMEF/2));
67         data->ghost_ef = value;
68 }
69
70 static void rna_AnimViz_path_start_frame_set(PointerRNA *ptr, int value)
71 {
72         bAnimVizSettings *data = (bAnimVizSettings*)ptr->data;
73         
74         CLAMP(value, 1, data->path_ef-1);
75         data->path_sf = value;
76 }
77
78 static void rna_AnimViz_path_end_frame_set(PointerRNA *ptr, int value)
79 {
80         bAnimVizSettings *data = (bAnimVizSettings*)ptr->data;
81         
82         /* XXX: watchit! Path Start > MAXFRAME/2 could be a problem... */
83         CLAMP(value, data->path_sf+1, (int)(MAXFRAMEF/2));
84         data->path_ef = value;
85 }
86
87 #else
88
89 void rna_def_motionpath_common(StructRNA *srna)
90 {
91         PropertyRNA *prop;
92         
93         prop = RNA_def_property(srna, "motion_path", PROP_POINTER, PROP_NONE);
94         RNA_def_property_pointer_sdna(prop, NULL, "mpath");
95         RNA_def_property_ui_text(prop, "Motion Path", "Motion Path for this element");  
96 }
97
98 static void rna_def_animviz_motionpath_vert(BlenderRNA *brna)
99 {
100         StructRNA *srna;
101         PropertyRNA *prop;
102         
103         srna = RNA_def_struct(brna, "MotionPathVert", NULL);
104         RNA_def_struct_sdna(srna, "bMotionPathVert");
105         RNA_def_struct_ui_text(srna, "Motion Path Cache Point", "Cached location on path");
106         
107         prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ);
108         RNA_def_property_array(prop, 3);
109         RNA_def_property_ui_text(prop, "Coordinates", "");
110         
111         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
112         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_VERT_SEL);
113         RNA_def_property_ui_text(prop, "Select", "Path point is selected for editing");
114 }
115
116 static void rna_def_animviz_motion_path(BlenderRNA *brna)
117 {
118         StructRNA *srna;
119         PropertyRNA *prop;
120         
121         srna = RNA_def_struct(brna, "MotionPath", NULL);
122         RNA_def_struct_sdna(srna, "bMotionPath");
123         RNA_def_struct_ui_text(srna, "Motion Path", "Cache of the worldspace positions of an element over a frame range");
124         
125         /* Collections */
126         prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
127         RNA_def_property_collection_sdna(prop, NULL, "points", "length");
128         RNA_def_property_struct_type(prop, "MotionPathVert");
129         RNA_def_property_ui_text(prop, "Motion Path Points", "Cached positions per frame");
130         
131         /* Playback Ranges */
132         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
133         RNA_def_property_int_sdna(prop, NULL, "start_frame");
134         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
135         RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of the stored range");
136         
137         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
138         RNA_def_property_int_sdna(prop, NULL, "end_frame");
139         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
140         RNA_def_property_ui_text(prop, "End Frame", "End frame of the stored range");
141         
142         prop = RNA_def_property(srna, "length", PROP_INT, PROP_TIME);
143         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
144         RNA_def_property_ui_text(prop, "Length", "Number of frames cached");
145         
146         /* Settings */
147         prop = RNA_def_property(srna, "use_bone_head", PROP_BOOLEAN, PROP_NONE);
148         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_FLAG_BHEAD);
149         RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* xxx */
150         RNA_def_property_ui_text(prop, "Use Bone Heads", "For PoseBone paths, use the bone head location when calculating this path");
151         
152         prop = RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
153         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_FLAG_EDIT);
154         RNA_def_property_ui_text(prop, "Edit Path", "Path is being edited");
155 }
156
157 /* --- */
158
159 static void rna_def_animviz_ghosts(BlenderRNA *brna)
160 {
161         StructRNA *srna;
162         PropertyRNA *prop;
163         
164         static const EnumPropertyItem prop_type_items[] = {
165                 {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Do not show any ghosts"},
166                 {GHOST_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Current Frame", "Show ghosts from around the current frame"},
167                 {GHOST_TYPE_RANGE, "RANGE", 0, "In Range", "Show ghosts for the specified frame range"},
168                 {GHOST_TYPE_KEYS, "KEYS", 0, "On Keyframes", "Show ghosts on keyframes"},
169                 {0, NULL, 0, NULL, NULL}};
170         
171         
172         srna = RNA_def_struct(brna, "AnimVizOnionSkinning", NULL);
173         RNA_def_struct_sdna(srna, "bAnimVizSettings");
174         RNA_def_struct_nested(brna, srna, "AnimViz");
175         RNA_def_struct_ui_text(srna, "Onion Skinning Settings", "Onion Skinning settings for animation visualisation");
176
177         /* Enums */
178         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
179         RNA_def_property_enum_sdna(prop, NULL, "ghost_type");
180         RNA_def_property_enum_items(prop, prop_type_items);
181         RNA_def_property_ui_text(prop, "Type", "Method used for determining what ghosts get drawn");
182         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
183         
184         /* Settings */
185         prop = RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
186         RNA_def_property_boolean_sdna(prop, NULL, "ghost_flag", GHOST_FLAG_ONLYSEL);
187         RNA_def_property_ui_text(prop, "On Selected Bones Only", "For Pose-Mode drawing, only draw ghosts for selected bones");
188         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
189         
190         prop = RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
191         RNA_def_property_int_sdna(prop, NULL, "ghost_step");
192         RNA_def_property_range(prop, 1, 20);
193         RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between ghosts shown (not for 'On Keyframes' Onion-skinning method)");
194         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
195         
196         /* Playback Ranges */
197         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
198         RNA_def_property_int_sdna(prop, NULL, "ghost_sf");
199         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_start_frame_set", NULL);
200         RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)");
201         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
202         
203         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
204         RNA_def_property_int_sdna(prop, NULL, "ghost_ef");
205         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_end_frame_set", NULL);
206         RNA_def_property_ui_text(prop, "End Frame", "End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)");
207         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
208         
209         /* Around Current Ranges */
210         prop = RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
211         RNA_def_property_int_sdna(prop, NULL, "ghost_bc");
212         RNA_def_property_range(prop, 0, 30);
213         RNA_def_property_ui_text(prop, "Before Current", "Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method)");
214         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
215         
216         prop = RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
217         RNA_def_property_int_sdna(prop, NULL, "ghost_ac");
218         RNA_def_property_range(prop, 0, 30);
219         RNA_def_property_ui_text(prop, "After Current", "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)");
220         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
221 }
222
223 static void rna_def_animviz_paths(BlenderRNA *brna)
224 {
225         StructRNA *srna;
226         PropertyRNA *prop;
227         
228         static const EnumPropertyItem prop_type_items[] = {
229                 {MOTIONPATH_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Frame", "Display Paths of poses within a fixed number of frames around the current frame"},
230                 {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"},
231                 {0, NULL, 0, NULL, NULL}};
232         static const EnumPropertyItem prop_location_items[] = {
233                 {MOTIONPATH_BAKE_HEADS, "HEADS", 0, "Heads", "Calculate bone paths from heads"},
234                 {0, "TAILS", 0, "Tails", "Calculate bone paths from tails"},
235                 {0, NULL, 0, NULL, NULL}};
236         
237         srna = RNA_def_struct(brna, "AnimVizMotionPaths", NULL);
238         RNA_def_struct_sdna(srna, "bAnimVizSettings");
239         RNA_def_struct_nested(brna, srna, "AnimViz");
240         RNA_def_struct_ui_text(srna, "Motion Path Settings", "Motion Path settings for animation visualisation");
241         
242         /* Enums */
243         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
244         RNA_def_property_enum_sdna(prop, NULL, "path_type");
245         RNA_def_property_enum_items(prop, prop_type_items);
246         RNA_def_property_ui_text(prop, "Paths Type", "Type of range to show for Motion Paths");
247         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
248         
249         prop = RNA_def_property(srna, "bake_location", PROP_ENUM, PROP_NONE);
250         RNA_def_property_enum_bitflag_sdna(prop, NULL, "path_bakeflag");
251         RNA_def_property_enum_items(prop, prop_location_items);
252         RNA_def_property_ui_text(prop, "Bake Location", "When calculating Bone Paths, use Head or Tips");
253         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
254         
255         /* Settings */
256         prop = RNA_def_property(srna, "show_frame_numbers", PROP_BOOLEAN, PROP_NONE);
257         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_FNUMS);
258         RNA_def_property_ui_text(prop, "Show Frame Numbers", "Show frame numbers on Motion Paths");
259         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
260         
261         prop = RNA_def_property(srna, "show_keyframe_highlight", PROP_BOOLEAN, PROP_NONE);
262         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFRAS);
263         RNA_def_property_ui_text(prop, "Highlight Keyframes", "Emphasize position of keyframes on Motion Paths");
264         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
265         
266         prop = RNA_def_property(srna, "show_keyframe_numbers", PROP_BOOLEAN, PROP_NONE);
267         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFNOS);
268         RNA_def_property_ui_text(prop, "Show Keyframe Numbers", "Show frame numbers of Keyframes on Motion Paths");
269         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
270         
271         prop = RNA_def_property(srna, "show_keyframe_action_all", PROP_BOOLEAN, PROP_NONE);
272         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFACT);
273         RNA_def_property_ui_text(prop, "All Action Keyframes", "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)");
274         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
275         
276         prop = RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
277         RNA_def_property_int_sdna(prop, NULL, "path_step");
278         RNA_def_property_range(prop, 1, 100);
279         RNA_def_property_ui_text(prop, "Frame Step", "Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method)");
280         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
281         
282         
283         /* Playback Ranges */
284         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
285         RNA_def_property_int_sdna(prop, NULL, "path_sf");
286         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_start_frame_set", NULL);
287         RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)");
288         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
289         
290         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
291         RNA_def_property_int_sdna(prop, NULL, "path_ef");
292         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_end_frame_set", NULL);
293         RNA_def_property_ui_text(prop, "End Frame", "End frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)");
294         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
295         
296         /* Around Current Ranges */
297         prop = RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
298         RNA_def_property_int_sdna(prop, NULL, "path_bc");
299         RNA_def_property_range(prop, 1, MAXFRAMEF/2);
300         RNA_def_property_ui_text(prop, "Before Current", "Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method)");
301         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
302         
303         prop = RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
304         RNA_def_property_int_sdna(prop, NULL, "path_ac");
305         RNA_def_property_range(prop, 1, MAXFRAMEF/2);
306         RNA_def_property_ui_text(prop, "After Current", "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)");
307         RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
308 }
309
310 /* --- */
311
312 void rna_def_animviz_common(StructRNA *srna)
313 {
314         PropertyRNA *prop;
315         
316         prop = RNA_def_property(srna, "animation_visualisation", PROP_POINTER, PROP_NONE);
317         RNA_def_property_flag(prop, PROP_NEVER_NULL);
318         RNA_def_property_pointer_sdna(prop, NULL, "avs");
319         RNA_def_property_ui_text(prop, "Animation Visualisation", "Animation data for this datablock"); 
320 }
321
322 static void rna_def_animviz(BlenderRNA *brna)
323 {
324         StructRNA *srna;
325         PropertyRNA *prop;
326         
327         srna = RNA_def_struct(brna, "AnimViz", NULL);
328         RNA_def_struct_sdna(srna, "bAnimVizSettings");
329         RNA_def_struct_ui_text(srna, "Animation Visualisation", "Settings for the visualisation of motion");
330         
331         /* onion-skinning settings (nested struct) */
332         prop = RNA_def_property(srna, "onion_skin_frames", PROP_POINTER, PROP_NONE);
333         RNA_def_property_flag(prop, PROP_NEVER_NULL);
334         RNA_def_property_struct_type(prop, "AnimVizOnionSkinning");
335         RNA_def_property_pointer_funcs(prop, "rna_AnimViz_onion_skinning_get", NULL, NULL, NULL);
336         RNA_def_property_ui_text(prop, "Onion Skinning", "Onion Skinning (ghosting) settings for visualisation");
337         
338         /* motion path settings (nested struct) */
339         prop = RNA_def_property(srna, "motion_path", PROP_POINTER, PROP_NONE);
340         RNA_def_property_flag(prop, PROP_NEVER_NULL);
341         RNA_def_property_struct_type(prop, "AnimVizMotionPaths");
342         RNA_def_property_pointer_funcs(prop, "rna_AnimViz_motion_paths_get", NULL, NULL, NULL);
343         RNA_def_property_ui_text(prop, "Motion Paths", "Motion Path settings for visualisation");
344 }
345
346 /* --- */
347
348 void RNA_def_animviz(BlenderRNA *brna)
349 {
350         rna_def_animviz(brna);
351                 rna_def_animviz_ghosts(brna);
352                 rna_def_animviz_paths(brna);
353                 
354         rna_def_animviz_motion_path(brna);
355         rna_def_animviz_motionpath_vert(brna);
356 }
357
358 #endif