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