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