68075823a86ae08c6c695fc8a607bcc77734528f
[blender.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 /* Which part of bone(s) get baked */
43 // TODO: icons?
44 EnumPropertyItem motionpath_bake_location_items[] = {
45         {MOTIONPATH_BAKE_HEADS, "HEADS", 0, "Heads", "Calculate bone paths from heads"},
46         {0, "TAILS", 0, "Tails", "Calculate bone paths from tails"},
47         //{MOTIONPATH_BAKE_CENTERS, "CENTROID", 0, "Centers", "Calculate bone paths from center of mass"},
48         {0, NULL, 0, NULL, NULL}
49 };
50
51 #ifdef RNA_RUNTIME
52
53 static PointerRNA rna_AnimViz_onion_skinning_get(PointerRNA *ptr)
54 {
55         return rna_pointer_inherit_refine(ptr, &RNA_AnimVizOnionSkinning, ptr->data);
56 }
57
58 static PointerRNA rna_AnimViz_motion_paths_get(PointerRNA *ptr)
59 {
60         return rna_pointer_inherit_refine(ptr, &RNA_AnimVizMotionPaths, ptr->data);
61 }
62
63 static void rna_AnimViz_ghost_start_frame_set(PointerRNA *ptr, int value)
64 {
65         bAnimVizSettings *data = (bAnimVizSettings *)ptr->data;
66         
67         CLAMP(value, 1, data->ghost_ef);
68         data->ghost_sf = value;
69 }
70
71 static void rna_AnimViz_ghost_end_frame_set(PointerRNA *ptr, int value)
72 {
73         bAnimVizSettings *data = (bAnimVizSettings *)ptr->data;
74         
75         CLAMP(value, data->ghost_sf, (int)(MAXFRAMEF / 2));
76         data->ghost_ef = value;
77 }
78
79 static void rna_AnimViz_path_start_frame_set(PointerRNA *ptr, int value)
80 {
81         bAnimVizSettings *data = (bAnimVizSettings *)ptr->data;
82         
83         CLAMP(value, 1, data->path_ef - 1);
84         data->path_sf = value;
85 }
86
87 static void rna_AnimViz_path_end_frame_set(PointerRNA *ptr, int value)
88 {
89         bAnimVizSettings *data = (bAnimVizSettings *)ptr->data;
90         
91         /* XXX: watchit! Path Start > MAXFRAME/2 could be a problem... */
92         CLAMP(value, data->path_sf + 1, (int)(MAXFRAMEF / 2));
93         data->path_ef = value;
94 }
95
96 #else
97
98 void rna_def_motionpath_common(StructRNA *srna)
99 {
100         PropertyRNA *prop;
101         
102         prop = RNA_def_property(srna, "motion_path", PROP_POINTER, PROP_NONE);
103         RNA_def_property_pointer_sdna(prop, NULL, "mpath");
104         RNA_def_property_ui_text(prop, "Motion Path", "Motion Path for this element");
105 }
106
107 static void rna_def_animviz_motionpath_vert(BlenderRNA *brna)
108 {
109         StructRNA *srna;
110         PropertyRNA *prop;
111         
112         srna = RNA_def_struct(brna, "MotionPathVert", NULL);
113         RNA_def_struct_sdna(srna, "bMotionPathVert");
114         RNA_def_struct_ui_text(srna, "Motion Path Cache Point", "Cached location on path");
115         
116         prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ);
117         RNA_def_property_array(prop, 3);
118         RNA_def_property_ui_text(prop, "Coordinates", "");
119         
120         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
121         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_VERT_SEL);
122         RNA_def_property_ui_text(prop, "Select", "Path point is selected for editing");
123 }
124
125 static void rna_def_animviz_motion_path(BlenderRNA *brna)
126 {
127         StructRNA *srna;
128         PropertyRNA *prop;
129         
130         srna = RNA_def_struct(brna, "MotionPath", NULL);
131         RNA_def_struct_sdna(srna, "bMotionPath");
132         RNA_def_struct_ui_text(srna, "Motion Path", "Cache of the worldspace positions of an element over a frame range");
133         
134         /* Collections */
135         prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
136         RNA_def_property_collection_sdna(prop, NULL, "points", "length");
137         RNA_def_property_struct_type(prop, "MotionPathVert");
138         RNA_def_property_ui_text(prop, "Motion Path Points", "Cached positions per frame");
139         
140         /* Playback Ranges */
141         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
142         RNA_def_property_int_sdna(prop, NULL, "start_frame");
143         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
144         RNA_def_property_ui_text(prop, "Start Frame", "Starting frame of the stored range");
145         
146         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
147         RNA_def_property_int_sdna(prop, NULL, "end_frame");
148         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
149         RNA_def_property_ui_text(prop, "End Frame", "End frame of the stored range");
150         
151         prop = RNA_def_property(srna, "length", PROP_INT, PROP_TIME);
152         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
153         RNA_def_property_ui_text(prop, "Length", "Number of frames cached");
154         
155         /* Settings */
156         prop = RNA_def_property(srna, "use_bone_head", PROP_BOOLEAN, PROP_NONE);
157         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_FLAG_BHEAD);
158         RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* xxx */
159         RNA_def_property_ui_text(prop, "Use Bone Heads",
160                                  "For PoseBone paths, use the bone head location when calculating this path");
161         
162         prop = RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
163         RNA_def_property_boolean_sdna(prop, NULL, "flag", MOTIONPATH_FLAG_EDIT);
164         RNA_def_property_ui_text(prop, "Edit Path", "Path is being edited");
165 }
166
167 /* --- */
168
169 static void rna_def_animviz_ghosts(BlenderRNA *brna)
170 {
171         StructRNA *srna;
172         PropertyRNA *prop;
173         
174         static const EnumPropertyItem prop_type_items[] = {
175                 {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Do not show any ghosts"},
176                 {GHOST_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Current Frame", "Show ghosts from around the current frame"},
177                 {GHOST_TYPE_RANGE, "RANGE", 0, "In Range", "Show ghosts for the specified frame range"},
178                 {GHOST_TYPE_KEYS, "KEYS", 0, "On Keyframes", "Show ghosts on keyframes"},
179                 {0, NULL, 0, NULL, NULL}
180         };
181         
182         
183         srna = RNA_def_struct(brna, "AnimVizOnionSkinning", NULL);
184         RNA_def_struct_sdna(srna, "bAnimVizSettings");
185         RNA_def_struct_nested(brna, srna, "AnimViz");
186         RNA_def_struct_ui_text(srna, "Onion Skinning Settings", "Onion Skinning settings for animation visualization");
187
188         /* Enums */
189         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
190         RNA_def_property_enum_sdna(prop, NULL, "ghost_type");
191         RNA_def_property_enum_items(prop, prop_type_items);
192         RNA_def_property_ui_text(prop, "Type", "Method used for determining what ghosts get drawn");
193         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
194         
195         /* Settings */
196         prop = RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
197         RNA_def_property_boolean_sdna(prop, NULL, "ghost_flag", GHOST_FLAG_ONLYSEL);
198         RNA_def_property_ui_text(prop, "On Selected Bones Only",
199                                  "For Pose-Mode drawing, only draw ghosts for selected bones");
200         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
201         
202         prop = RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
203         RNA_def_property_int_sdna(prop, NULL, "ghost_step");
204         RNA_def_property_range(prop, 1, 20);
205         RNA_def_property_ui_text(prop, "Frame Step",
206                                  "Number of frames between ghosts shown (not for 'On Keyframes' 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         /* Playback Ranges */
210         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
211         RNA_def_property_int_sdna(prop, NULL, "ghost_sf");
212         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_start_frame_set", NULL);
213         RNA_def_property_ui_text(prop, "Start Frame",
214                                  "Starting frame of range of Ghosts to display "
215                                  "(not 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         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
219         RNA_def_property_int_sdna(prop, NULL, "ghost_ef");
220         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_ghost_end_frame_set", NULL);
221         RNA_def_property_ui_text(prop, "End Frame",
222                                  "End frame of range of Ghosts to display "
223                                  "(not for 'Around Current Frame' Onion-skinning method)");
224         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
225         
226         /* Around Current Ranges */
227         prop = RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
228         RNA_def_property_int_sdna(prop, NULL, "ghost_bc");
229         RNA_def_property_range(prop, 0, 30);
230         RNA_def_property_ui_text(prop, "Before Current",
231                                  "Number of frames to show before the current frame "
232                                  "(only for 'Around Current Frame' Onion-skinning method)");
233         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
234         
235         prop = RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
236         RNA_def_property_int_sdna(prop, NULL, "ghost_ac");
237         RNA_def_property_range(prop, 0, 30);
238         RNA_def_property_ui_text(prop, "After Current",
239                                  "Number of frames to show after the current frame "
240                                  "(only for 'Around Current Frame' Onion-skinning method)");
241         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
242 }
243
244 static void rna_def_animviz_paths(BlenderRNA *brna)
245 {
246         StructRNA *srna;
247         PropertyRNA *prop;
248         
249         static const EnumPropertyItem prop_type_items[] = {
250                 {MOTIONPATH_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Frame",
251                  "Display Paths of poses within a fixed number of frames around the current frame"},
252                 {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"},
253                 {0, NULL, 0, NULL, NULL}
254         };
255         
256         srna = RNA_def_struct(brna, "AnimVizMotionPaths", NULL);
257         RNA_def_struct_sdna(srna, "bAnimVizSettings");
258         RNA_def_struct_nested(brna, srna, "AnimViz");
259         RNA_def_struct_ui_text(srna, "Motion Path Settings", "Motion Path settings for animation visualization");
260         
261         /* Enums */
262         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
263         RNA_def_property_enum_sdna(prop, NULL, "path_type");
264         RNA_def_property_enum_items(prop, prop_type_items);
265         RNA_def_property_ui_text(prop, "Paths Type", "Type of range to show for Motion Paths");
266         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
267         
268         prop = RNA_def_property(srna, "bake_location", PROP_ENUM, PROP_NONE);
269         RNA_def_property_enum_bitflag_sdna(prop, NULL, "path_bakeflag");
270         RNA_def_property_enum_items(prop, motionpath_bake_location_items);
271         RNA_def_property_ui_text(prop, "Bake Location", "When calculating Bone Paths, use Head or Tips");
272         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
273         
274         /* Settings */
275         prop = RNA_def_property(srna, "show_frame_numbers", PROP_BOOLEAN, PROP_NONE);
276         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_FNUMS);
277         RNA_def_property_ui_text(prop, "Show Frame Numbers", "Show frame numbers on Motion Paths");
278         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
279         
280         prop = RNA_def_property(srna, "show_keyframe_highlight", PROP_BOOLEAN, PROP_NONE);
281         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFRAS);
282         RNA_def_property_ui_text(prop, "Highlight Keyframes", "Emphasize position of keyframes on Motion Paths");
283         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
284         
285         prop = RNA_def_property(srna, "show_keyframe_numbers", PROP_BOOLEAN, PROP_NONE);
286         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFNOS);
287         RNA_def_property_ui_text(prop, "Show Keyframe Numbers", "Show frame numbers of Keyframes on Motion Paths");
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, "show_keyframe_action_all", PROP_BOOLEAN, PROP_NONE);
291         RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFACT);
292         RNA_def_property_ui_text(prop, "All Action Keyframes",
293                                  "For bone motion paths, search whole Action for keyframes instead of in group"
294                                  " with matching name only (is slower)");
295         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
296         
297         prop = RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE);
298         RNA_def_property_int_sdna(prop, NULL, "path_step");
299         RNA_def_property_range(prop, 1, 100);
300         RNA_def_property_ui_text(prop, "Frame Step",
301                                  "Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method)");
302         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
303         
304         
305         /* Playback Ranges */
306         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
307         RNA_def_property_int_sdna(prop, NULL, "path_sf");
308         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_start_frame_set", NULL);
309         RNA_def_property_ui_text(prop, "Start Frame",
310                                  "Starting frame of range of paths to display/calculate "
311                                  "(not for 'Around Current Frame' Onion-skinning method)");
312         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
313         
314         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
315         RNA_def_property_int_sdna(prop, NULL, "path_ef");
316         RNA_def_property_int_funcs(prop, NULL, "rna_AnimViz_path_end_frame_set", NULL);
317         RNA_def_property_ui_text(prop, "End Frame",
318                                  "End frame of range of paths to display/calculate "
319                                  "(not for 'Around Current Frame' Onion-skinning method)");
320         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
321         
322         /* Around Current Ranges */
323         prop = RNA_def_property(srna, "frame_before", PROP_INT, PROP_TIME);
324         RNA_def_property_int_sdna(prop, NULL, "path_bc");
325         RNA_def_property_range(prop, 1, MAXFRAMEF / 2);
326         RNA_def_property_ui_text(prop, "Before Current",
327                                  "Number of frames to show before the current frame "
328                                  "(only for 'Around Current Frame' Onion-skinning method)");
329         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
330         
331         prop = RNA_def_property(srna, "frame_after", PROP_INT, PROP_TIME);
332         RNA_def_property_int_sdna(prop, NULL, "path_ac");
333         RNA_def_property_range(prop, 1, MAXFRAMEF / 2);
334         RNA_def_property_ui_text(prop, "After Current",
335                                  "Number of frames to show after the current frame "
336                                  "(only for 'Around Current Frame' Onion-skinning method)");
337         RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */
338 }
339
340 /* --- */
341
342 void rna_def_animviz_common(StructRNA *srna)
343 {
344         PropertyRNA *prop;
345         
346         prop = RNA_def_property(srna, "animation_visualization", PROP_POINTER, PROP_NONE);
347         RNA_def_property_flag(prop, PROP_NEVER_NULL);
348         RNA_def_property_pointer_sdna(prop, NULL, "avs");
349         RNA_def_property_ui_text(prop, "Animation Visualization", "Animation data for this datablock");
350 }
351
352 static void rna_def_animviz(BlenderRNA *brna)
353 {
354         StructRNA *srna;
355         PropertyRNA *prop;
356         
357         srna = RNA_def_struct(brna, "AnimViz", NULL);
358         RNA_def_struct_sdna(srna, "bAnimVizSettings");
359         RNA_def_struct_ui_text(srna, "Animation Visualization", "Settings for the visualization of motion");
360         
361         /* onion-skinning settings (nested struct) */
362         prop = RNA_def_property(srna, "onion_skin_frames", PROP_POINTER, PROP_NONE);
363         RNA_def_property_flag(prop, PROP_NEVER_NULL);
364         RNA_def_property_struct_type(prop, "AnimVizOnionSkinning");
365         RNA_def_property_pointer_funcs(prop, "rna_AnimViz_onion_skinning_get", NULL, NULL, NULL);
366         RNA_def_property_ui_text(prop, "Onion Skinning", "Onion Skinning (ghosting) settings for visualization");
367         
368         /* motion path settings (nested struct) */
369         prop = RNA_def_property(srna, "motion_path", PROP_POINTER, PROP_NONE);
370         RNA_def_property_flag(prop, PROP_NEVER_NULL);
371         RNA_def_property_struct_type(prop, "AnimVizMotionPaths");
372         RNA_def_property_pointer_funcs(prop, "rna_AnimViz_motion_paths_get", NULL, NULL, NULL);
373         RNA_def_property_ui_text(prop, "Motion Paths", "Motion Path settings for visualization");
374 }
375
376 /* --- */
377
378 void RNA_def_animviz(BlenderRNA *brna)
379 {
380         rna_def_animviz(brna);
381         rna_def_animviz_ghosts(brna);
382         rna_def_animviz_paths(brna);
383                 
384         rna_def_animviz_motion_path(brna);
385         rna_def_animviz_motionpath_vert(brna);
386 }
387
388 #endif