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