Camera tracking: animation datablock for MovieClip
[blender.git] / source / blender / makesrna / intern / rna_movieclip.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,
19  *                 Sergey Sharybin
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/makesrna/intern/rna_movieclip.c
25  *  \ingroup RNA
26  */
27
28
29 #include <stdlib.h>
30 #include <limits.h>
31
32 #include "MEM_guardedalloc.h"
33
34 #include "BKE_movieclip.h"
35 #include "BKE_tracking.h"
36
37 #include "RNA_define.h"
38
39 #include "rna_internal.h"
40
41 #include "DNA_movieclip_types.h"
42 #include "DNA_scene_types.h"
43
44 #include "WM_types.h"
45
46 #include "IMB_imbuf_types.h"
47 #include "IMB_imbuf.h"
48
49 #ifdef RNA_RUNTIME
50
51 #include "BKE_depsgraph.h"
52
53 static void rna_MovieClip_reload_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
54 {
55         MovieClip *clip= (MovieClip*)ptr->id.data;
56
57         BKE_movieclip_reload(clip);
58         DAG_id_tag_update(&clip->id, 0);
59 }
60
61 static void rna_MovieClip_size_get(PointerRNA *ptr, int *values)
62 {
63         MovieClip *clip= (MovieClip*)ptr->id.data;
64
65         values[0]= clip->lastsize[0];
66         values[1]= clip->lastsize[1];
67 }
68
69 #else
70
71 static void rna_def_movieclip_proxy(BlenderRNA *brna)
72 {
73         StructRNA *srna;
74         PropertyRNA *prop;
75
76         static const EnumPropertyItem clip_tc_items[]= {
77                 {IMB_TC_NONE, "NONE", 0, "No TC in use", ""},
78                 {IMB_TC_RECORD_RUN, "RECORD_RUN", 0, "Record Run", "Use images in the order they are recorded"},
79                 {IMB_TC_FREE_RUN, "FREE_RUN", 0, "Free Run", "Use global timestamp written by recording device"},
80                 {IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN, "FREE_RUN_REC_DATE", 0, "Free Run (rec date)", "Interpolate a global timestamp using the record date and time written by recording device"},
81                 {IMB_TC_RECORD_RUN_NO_GAPS, "FREE_RUN_NO_GAPS", 0, "Free Run No Gaps", "Record run, but ignore timecode, changes in framerate or dropouts"},
82                 {0, NULL, 0, NULL, NULL}};
83
84         srna = RNA_def_struct(brna, "MovieClipProxy", NULL);
85         RNA_def_struct_ui_text(srna, "Movie Clip Proxy", "Proxy parameters for a movie clip");
86         RNA_def_struct_sdna(srna, "MovieClipProxy");
87
88         /* build proxy sized */
89         prop= RNA_def_property(srna, "build_25", PROP_BOOLEAN, PROP_NONE);
90         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_25);
91         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
92         RNA_def_property_ui_text(prop, "25%", "Build proxy resolution 25% of the original footage dimension");
93
94         prop= RNA_def_property(srna, "build_50", PROP_BOOLEAN, PROP_NONE);
95         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_50);
96         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
97         RNA_def_property_ui_text(prop, "50%", "Build proxy resolution 50% of the original footage dimension");
98
99         prop= RNA_def_property(srna, "build_75", PROP_BOOLEAN, PROP_NONE);
100         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_75);
101         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
102         RNA_def_property_ui_text(prop, "75%", "Build proxy resolution 75% of the original footage dimension");
103
104         prop= RNA_def_property(srna, "build_100", PROP_BOOLEAN, PROP_NONE);
105         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_SIZE_100);
106         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
107         RNA_def_property_ui_text(prop, "100%", "Build proxy resolution 100% of the original footage dimension");
108
109         prop= RNA_def_property(srna, "build_undistorted_25", PROP_BOOLEAN, PROP_NONE);
110         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_25);
111         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
112         RNA_def_property_ui_text(prop, "25%", "Build proxy resolution 25% of the original undistorted footage dimension");
113
114         prop= RNA_def_property(srna, "build_undistorted_50", PROP_BOOLEAN, PROP_NONE);
115         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_50);
116         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
117         RNA_def_property_ui_text(prop, "50%", "Build proxy resolution 50% of the original undistorted footage dimension");
118
119         prop= RNA_def_property(srna, "build_undistorted_75", PROP_BOOLEAN, PROP_NONE);
120         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_75);
121         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
122         RNA_def_property_ui_text(prop, "75%", "Build proxy resolution 75% of the original undistorted footage dimension");
123
124         prop= RNA_def_property(srna, "build_undistorted_100", PROP_BOOLEAN, PROP_NONE);
125         RNA_def_property_boolean_sdna(prop, NULL, "build_size_flag", MCLIP_PROXY_UNDISTORTED_SIZE_100);
126         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
127         RNA_def_property_ui_text(prop, "100%", "Build proxy resolution 100% of the original undistorted footage dimension");
128
129         /* build timecodes */
130         prop= RNA_def_property(srna, "build_record_run", PROP_BOOLEAN, PROP_NONE);
131         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_RECORD_RUN);
132         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
133         RNA_def_property_ui_text(prop, "Rec Run", "Build record run time code index");
134
135         prop= RNA_def_property(srna, "build_free_run", PROP_BOOLEAN, PROP_NONE);
136         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_FREE_RUN);
137         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
138         RNA_def_property_ui_text(prop, "Free Run", "Build free run time code index");
139
140         prop= RNA_def_property(srna, "build_free_run_rec_date", PROP_BOOLEAN, PROP_NONE);
141         RNA_def_property_boolean_sdna(prop, NULL, "build_tc_flag", IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN);
142         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
143         RNA_def_property_ui_text(prop, "Free Run (Rec Date)", "Build free run time code index using Record Date/Time");
144
145         /* quality of proxied image */
146         prop= RNA_def_property(srna, "quality", PROP_INT, PROP_UNSIGNED);
147         RNA_def_property_int_sdna(prop, NULL, "quality");
148         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
149         RNA_def_property_ui_text(prop, "Quality", "JPEG quality of proxy images");
150         RNA_def_property_ui_range(prop, 1, 100, 1, 0);
151
152         prop= RNA_def_property(srna, "timecode", PROP_ENUM, PROP_NONE);
153         RNA_def_property_enum_sdna(prop, NULL, "tc");
154         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
155         RNA_def_property_enum_items(prop, clip_tc_items);
156         RNA_def_property_ui_text(prop, "Timecode", "");
157         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
158
159         /* directory */
160         prop= RNA_def_property(srna, "directory", PROP_STRING, PROP_DIRPATH);
161         RNA_def_property_string_sdna(prop, NULL, "dir");
162         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
163         RNA_def_property_ui_text(prop, "Directory", "Location to store the proxy files");
164         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_MovieClip_reload_update");
165 }
166
167 static void rna_def_moviecliUser(BlenderRNA *brna)
168 {
169         StructRNA *srna;
170         PropertyRNA *prop;
171
172         static EnumPropertyItem clip_render_size_items[] = {
173                 {MCLIP_PROXY_RENDER_SIZE_25, "PROXY_25", 0, "Proxy size 25%", ""},
174                 {MCLIP_PROXY_RENDER_SIZE_50, "PROXY_50", 0, "Proxy size 50%", ""},
175                 {MCLIP_PROXY_RENDER_SIZE_75, "PROXY_75", 0, "Proxy size 75%", ""},
176                 {MCLIP_PROXY_RENDER_SIZE_100, "PROXY_100", 0, "Proxy size 100%", ""},
177                 {MCLIP_PROXY_RENDER_SIZE_FULL, "FULL", 0, "No proxy, full render", ""},
178                 {0, NULL, 0, NULL, NULL}};
179
180         srna= RNA_def_struct(brna, "MovieClipUser", NULL);
181         RNA_def_struct_ui_text(srna, "Movie Clip User", "Parameters defining how a MovieClip datablock is used by another datablock");
182
183         prop= RNA_def_property(srna, "current_frame", PROP_INT, PROP_TIME);
184         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
185         RNA_def_property_int_sdna(prop, NULL, "framenr");
186         RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
187         RNA_def_property_ui_text(prop, "Current Frame", "Current frame number in movie or image sequence");
188
189         /* render size */
190         prop= RNA_def_property(srna, "proxy_render_size", PROP_ENUM, PROP_NONE);
191         RNA_def_property_enum_sdna(prop, NULL, "render_size");
192         RNA_def_property_enum_items(prop, clip_render_size_items);
193         RNA_def_property_ui_text(prop, "Proxy render size", "Draw preview using full resolution or different proxy resolutions");
194         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
195
196         /* render undistorted */
197         prop= RNA_def_property(srna, "use_render_undistorted", PROP_BOOLEAN, PROP_NONE);
198         RNA_def_property_boolean_sdna(prop, NULL, "render_flag", MCLIP_PROXY_RENDER_UNDISTORT);
199         RNA_def_property_ui_text(prop, "Render Undistorted", "Render preview using undistorted proxy");
200         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
201 }
202
203 static void rna_def_movieClipScopes(BlenderRNA *brna)
204 {
205         StructRNA *srna;
206
207         srna= RNA_def_struct(brna, "MovieClipScopes", NULL);
208         RNA_def_struct_ui_text(srna, "MovieClipScopes", "Scopes for statistical view of a movie clip");
209 }
210
211
212 static void rna_def_movieclip(BlenderRNA *brna)
213 {
214         StructRNA *srna;
215         PropertyRNA *prop;
216
217         static EnumPropertyItem clip_source_items[]= {
218                 {MCLIP_SRC_SEQUENCE, "SEQUENCE", 0, "Image Sequence", "Multiple image files, as a sequence"},
219                 {MCLIP_SRC_MOVIE, "MOVIE", 0, "Movie File", "Movie file"},
220                 {0, NULL, 0, NULL, NULL}};
221
222         srna= RNA_def_struct(brna, "MovieClip", "ID");
223         RNA_def_struct_ui_text(srna, "MovieClip", "MovieClip datablock referencing an external movie file");
224         RNA_def_struct_ui_icon(srna, ICON_SEQUENCE);
225
226         prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
227         RNA_def_property_string_sdna(prop, NULL, "name");
228         RNA_def_property_ui_text(prop, "File Path", "Filename of the movie or sequence file");
229         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_MovieClip_reload_update");
230
231         prop= RNA_def_property(srna, "tracking", PROP_POINTER, PROP_NONE);
232         RNA_def_property_struct_type(prop, "MovieTracking");
233
234         prop= RNA_def_property(srna, "proxy", PROP_POINTER, PROP_NONE);
235         RNA_def_property_struct_type(prop, "MovieClipProxy");
236
237         /* use proxy */
238         prop= RNA_def_property(srna, "use_proxy", PROP_BOOLEAN, PROP_NONE);
239         RNA_def_property_boolean_sdna(prop, NULL, "flag", MCLIP_USE_PROXY);
240         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
241         RNA_def_property_ui_text(prop, "Use Proxy / Timecode", "Use a preview proxy and/or timecode index for this clip");
242         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
243
244         prop= RNA_def_int_vector(srna, "size" , 2 , NULL , 0, 0, "Size" , "Width and height in pixels, zero when image data cant be loaded" , 0 , 0);
245         RNA_def_property_int_funcs(prop, "rna_MovieClip_size_get" , NULL, NULL);
246         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
247
248         prop= RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
249         RNA_def_property_float_sdna(prop, NULL, "aspx");
250         RNA_def_property_array(prop, 2);
251         RNA_def_property_range(prop, 0.1f, 5000.0f);
252         RNA_def_property_ui_range(prop, 0.1f, 5000.0f, 1, 2);
253         RNA_def_property_ui_text(prop, "Display Aspect", "Display Aspect for this clip, does not affect rendering");
254         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
255
256         /* source */
257         prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
258         RNA_def_property_enum_items(prop, clip_source_items);
259         RNA_def_property_ui_text(prop, "Source", "Where the clip comes from");
260         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
261
262         /* custom proxy directory */
263         prop= RNA_def_property(srna, "use_proxy_custom_directory", PROP_BOOLEAN, PROP_NONE);
264         RNA_def_property_boolean_sdna(prop, NULL, "flag", MCLIP_USE_PROXY_CUSTOM_DIR);
265         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
266         RNA_def_property_ui_text(prop, "Proxy Custom Directory", "Create proxy images in a custom directory (default is movie location)");
267         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_MovieClip_reload_update");
268
269         /* grease pencil */
270         prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
271         RNA_def_property_pointer_sdna(prop, NULL, "gpd");
272         RNA_def_property_flag(prop, PROP_EDITABLE);
273         RNA_def_property_struct_type(prop, "GreasePencil");
274         RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this movie clip");
275 }
276
277 void RNA_def_movieclip(BlenderRNA *brna)
278 {
279         rna_def_movieclip(brna);
280         rna_def_movieclip_proxy(brna);
281         rna_def_moviecliUser(brna);
282         rna_def_movieClipScopes(brna);
283 }
284
285 #endif