Fixes and tweaks to RNA messages (found while translating in french).
[blender.git] / source / blender / makesrna / intern / rna_tracking.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_tracking.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_object_types.h"   /* SELECT */
43 #include "DNA_scene_types.h"
44
45 #include "WM_types.h"
46
47 #ifdef RNA_RUNTIME
48
49 #include "BKE_depsgraph.h"
50 #include "BKE_node.h"
51
52 #include "IMB_imbuf.h"
53
54 #include "WM_api.h"
55
56 static void rna_tracking_defaultSettings_levelsUpdate(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
57 {
58         MovieClip *clip= (MovieClip*)ptr->id.data;
59         MovieTracking *tracking= &clip->tracking;
60         MovieTrackingSettings *settings= &tracking->settings;
61
62         if(settings->default_tracker==TRACKER_KLT) {
63                 int max_pyramid_level_factor= 1 << (settings->default_pyramid_levels - 1);
64                 float search_ratio= 2.3f * max_pyramid_level_factor;
65
66                 settings->default_search_size= settings->default_pattern_size*search_ratio;
67         }
68 }
69
70 static void rna_tracking_defaultSettings_patternUpdate(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
71 {
72         MovieClip *clip= (MovieClip*)ptr->id.data;
73         MovieTracking *tracking= &clip->tracking;
74         MovieTrackingSettings *settings= &tracking->settings;
75
76         if(settings->default_search_size<settings->default_pattern_size)
77                 settings->default_search_size= settings->default_pattern_size;
78 }
79
80 static void rna_tracking_defaultSettings_searchUpdate(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
81 {
82         MovieClip *clip= (MovieClip*)ptr->id.data;
83         MovieTracking *tracking= &clip->tracking;
84         MovieTrackingSettings *settings= &tracking->settings;
85
86         if(settings->default_pattern_size>settings->default_search_size)
87                 settings->default_pattern_size= settings->default_search_size;
88 }
89
90 static void rna_tracking_tracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
91 {
92         MovieClip *clip= (MovieClip*)ptr->id.data;
93         rna_iterator_listbase_begin(iter, &clip->tracking.tracks, NULL);
94 }
95
96 static void rna_tracking_tracks_add(MovieTracking *tracking, int frame, int number)
97 {
98         int a;
99
100         for(a= 0; a<number; a++)
101                 BKE_tracking_add_track(tracking, 0, 0, frame, 1, 1);
102
103         WM_main_add_notifier(NC_MOVIECLIP|NA_EDITED, NULL);
104 }
105
106 static PointerRNA rna_tracking_active_track_get(PointerRNA *ptr)
107 {
108         MovieClip *clip= (MovieClip*)ptr->id.data;
109
110         return rna_pointer_inherit_refine(ptr, &RNA_MovieTrackingTrack, clip->tracking.act_track);
111 }
112
113 static void rna_tracking_active_track_set(PointerRNA *ptr, PointerRNA value)
114 {
115         MovieClip *clip= (MovieClip*)ptr->id.data;
116         MovieTrackingTrack *track= (MovieTrackingTrack *)value.data;
117         int index= BLI_findindex(&clip->tracking.tracks, track);
118
119         if(index>=0) clip->tracking.act_track= track;
120         else clip->tracking.act_track= NULL;
121 }
122
123 void rna_trackingTrack_name_set(PointerRNA *ptr, const char *value)
124 {
125         MovieClip *clip= (MovieClip *)ptr->id.data;
126         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
127         BLI_strncpy(track->name, value, sizeof(track->name));
128
129         BKE_track_unique_name(&clip->tracking, track);
130 }
131
132 static int rna_trackingTrack_select_get(PointerRNA *ptr)
133 {
134         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
135
136         return TRACK_SELECTED(track);
137 }
138
139 static void rna_trackingTrack_select_set(PointerRNA *ptr, int value)
140 {
141         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
142
143         if(value) {
144                 track->flag|= SELECT;
145                 track->pat_flag|= SELECT;
146                 track->search_flag|= SELECT;
147         }
148         else {
149                 track->flag&= ~SELECT;
150                 track->pat_flag&= ~SELECT;
151                 track->search_flag&= ~SELECT;
152         }
153 }
154
155 static void rna_tracking_trackerPattern_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
156 {
157         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
158
159         BKE_tracking_clamp_track(track, CLAMP_PAT_DIM);
160 }
161
162 static void rna_tracking_trackerSearch_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
163 {
164         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
165
166         BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
167 }
168
169 static void rna_tracking_trackerAlgorithm_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
170 {
171         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
172
173         if(track->tracker==TRACKER_KLT)
174           BKE_tracking_clamp_track(track, CLAMP_PYRAMID_LEVELS);
175         else
176           BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
177 }
178
179 static void rna_tracking_trackerPyramid_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
180 {
181         MovieTrackingTrack *track= (MovieTrackingTrack *)ptr->data;
182
183         BKE_tracking_clamp_track(track, CLAMP_PYRAMID_LEVELS);
184 }
185
186 static float rna_trackingCamera_focal_mm_get(PointerRNA *ptr)
187 {
188         MovieClip *clip= (MovieClip*)ptr->id.data;
189         MovieTrackingCamera *camera= &clip->tracking.camera;
190         float val= camera->focal;
191
192         if(clip->lastsize[0])
193                 val= val*camera->sensor_width/(float)clip->lastsize[0];
194
195         return val;
196 }
197
198 static void rna_trackingCamera_focal_mm_set(PointerRNA *ptr, float value)
199 {
200         MovieClip *clip= (MovieClip*)ptr->id.data;
201         MovieTrackingCamera *camera= &clip->tracking.camera;
202
203         if(clip->lastsize[0])
204                 value= clip->lastsize[0]*value/camera->sensor_width;
205
206         if(value>=0.0001)
207                 camera->focal= value;
208 }
209
210 static int rna_track_2d_stabilization(CollectionPropertyIterator *UNUSED(iter), void *data)
211 {
212         MovieTrackingTrack *track= (MovieTrackingTrack*)data;
213
214         if((track->flag&TRACK_USE_2D_STAB)==0)
215                 return 1;
216
217         return 0;
218 }
219
220 static void rna_tracking_stabTracks_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
221 {
222         MovieClip *clip= (MovieClip*)ptr->id.data;
223         rna_iterator_listbase_begin(iter, &clip->tracking.tracks, rna_track_2d_stabilization);
224 }
225
226 static int rna_tracking_stabTracks_active_index_get(PointerRNA *ptr)
227 {
228         MovieClip *clip= (MovieClip*)ptr->id.data;
229         return clip->tracking.stabilization.act_track;
230 }
231
232 static void rna_tracking_stabTracks_active_index_set(PointerRNA *ptr, int value)
233 {
234         MovieClip *clip= (MovieClip*)ptr->id.data;
235         clip->tracking.stabilization.act_track= value;
236 }
237
238 static void rna_tracking_stabTracks_active_index_range(PointerRNA *ptr, int *min, int *max)
239 {
240         MovieClip *clip= (MovieClip*)ptr->id.data;
241
242         *min= 0;
243         *max= clip->tracking.stabilization.tot_track-1;
244         *max= MAX2(0, *max);
245 }
246
247 static void rna_tracking_flushUpdate(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
248 {
249         MovieClip *clip= (MovieClip*)ptr->id.data;
250         MovieTrackingStabilization *stab= &clip->tracking.stabilization;
251
252         stab->ok= 0;
253
254         nodeUpdateID(scene->nodetree, &clip->id);
255
256         WM_main_add_notifier(NC_SCENE|ND_NODES, NULL);
257         DAG_id_tag_update(&clip->id, 0);
258 }
259
260 /* API */
261
262 static MovieTrackingMarker *rna_trackingTrack_marker_find_frame(MovieTrackingTrack *track, int framenr)
263 {
264         return BKE_tracking_get_marker(track, framenr);
265 }
266
267 #else
268
269 static EnumPropertyItem tracker_items[] = {
270         {TRACKER_KLT, "KLT", 0, "KLT", "Kanade–Lucas–Tomasi tracker which works with most of video clips, a bit slower than SAD"},
271         {TRACKER_SAD, "SAD", 0, "SAD", "Sum of Absolute Differences tracker which can be used when KLT tracker fails"},
272         {0, NULL, 0, NULL, NULL}};
273
274 static EnumPropertyItem pattern_match_items[] = {
275         {TRACK_MATCH_KEYFRAME, "KEYFRAME", 0, "Keyframe", "Track pattern from keyframe to next frame"},
276         {TRACK_MATCH_PREVFRAME, "PREV_FRAME", 0, "Previous frame", "Track pattern from current frame to next frame"},
277         {0, NULL, 0, NULL, NULL}};
278
279 static int rna_matrix_dimsize_4x4[]= {4, 4};
280
281 static void rna_def_trackingSettings(BlenderRNA *brna)
282 {
283         StructRNA *srna;
284         PropertyRNA *prop;
285
286         static EnumPropertyItem speed_items[] = {
287                 {0, "FASTEST", 0, "Fastest", "Track as fast as it's possible"},
288             {TRACKING_SPEED_DOUBLE, "DOUBLE", 0, "Double", "Track with double speed"},
289                 {TRACKING_SPEED_REALTIME, "REALTIME", 0, "Realtime", "Track with realtime speed"},
290                 {TRACKING_SPEED_HALF, "HALF", 0, "Half", "Track with half of realtime speed"},
291                 {TRACKING_SPEED_QUARTER, "QUARTER", 0, "Quarter", "Track with quarter of realtime speed"},
292                 {0, NULL, 0, NULL, NULL}};
293
294         static EnumPropertyItem cleanup_items[] = {
295                 {TRACKING_CLEAN_SELECT, "SELECT", 0, "Select", "Select unclean tracks"},
296                 {TRACKING_CLEAN_DELETE_TRACK, "DELETE_TRACK", 0, "Delete Track", "Delete unclean tracks"},
297                 {TRACKING_CLEAN_DELETE_SEGMENT, "DELETE_SEGMENTS", 0, "Delete Segments", "Delete unclean segments of tracks"},
298                 {0, NULL, 0, NULL, NULL}
299         };
300
301         static EnumPropertyItem refine_items[] = {
302                 {0, "NONE", 0, "Nothing", "Do not refine camera intrinsics"},
303                 {REFINE_FOCAL_LENGTH, "FOCAL_LENGTH", 0, "Focal Length", "Refine focal length"},
304                 {REFINE_FOCAL_LENGTH|
305                  REFINE_PRINCIPAL_POINT, "FOCAL_LENGTH_PRINCIPAL_POINT", 0, "Focal Length, Optical Center", "Refine focal length and optical center"},
306                 {REFINE_FOCAL_LENGTH|
307                  REFINE_PRINCIPAL_POINT|
308                  REFINE_RADIAL_DISTORTION_K1|
309                  REFINE_RADIAL_DISTORTION_K2,
310                  "FOCAL_LENGTH_PRINCIPAL_POINT_RADIAL_K1_K2", 0, "Focal Length, Optical Center, K1, K2", "Refine focal length, optical center and radial distortion K1 and K2"},
311                 {REFINE_FOCAL_LENGTH|
312                  REFINE_RADIAL_DISTORTION_K1|
313                  REFINE_RADIAL_DISTORTION_K2, "FOCAL_LENGTH_RADIAL_K1_K2", 0, "Focal length, K1. K2", "Refine focal length and radial distortion K1 and K2"},
314                 {REFINE_FOCAL_LENGTH|REFINE_RADIAL_DISTORTION_K1, "FOCAL_LENGTH_RADIAL_K1", 0, "Focal length, K1", "Refine focal length and radial distortion K1"},
315                 {0, NULL, 0, NULL, NULL}
316         };
317
318         srna= RNA_def_struct(brna, "MovieTrackingSettings", NULL);
319         RNA_def_struct_ui_text(srna, "Movie tracking settings", "Match moving settings");
320
321         /* speed */
322         prop= RNA_def_property(srna, "speed", PROP_ENUM, PROP_NONE);
323         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
324         RNA_def_property_enum_items(prop, speed_items);
325         RNA_def_property_ui_text(prop, "Speed", "Limit speed of tracking to make visual feedback easier (this does not affect the tracking quality)");
326
327         /* keyframe_a */
328         prop= RNA_def_property(srna, "keyframe_a", PROP_INT, PROP_NONE);
329         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
330         RNA_def_property_int_sdna(prop, NULL, "keyframe1");
331         RNA_def_property_ui_text(prop, "Keyframe A", "First keyframe used for reconstruction initialization");
332
333         /* keyframe_b */
334         prop= RNA_def_property(srna, "keyframe_b", PROP_INT, PROP_NONE);
335         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
336         RNA_def_property_int_sdna(prop, NULL, "keyframe2");
337         RNA_def_property_ui_text(prop, "Keyframe B", "Second keyframe used for reconstruction initialization");
338
339         /* intrinsics refinement during bundle adjustment */
340         prop= RNA_def_property(srna, "refine_intrinsics", PROP_ENUM, PROP_NONE);
341         RNA_def_property_enum_sdna(prop, NULL, "refine_camera_intrinsics");
342         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
343         RNA_def_property_enum_items(prop, refine_items);
344         RNA_def_property_ui_text(prop, "Refine", "Refine intrinsics during camera solving");
345
346         /* tool settings */
347
348         /* distance */
349         prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
350         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
351         RNA_def_property_float_sdna(prop, NULL, "dist");
352         RNA_def_property_ui_text(prop, "Distance", "Distance between two bundles used for scene scaling");
353
354         /* frames count */
355         prop= RNA_def_property(srna, "clean_frames", PROP_INT, PROP_NONE);
356         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
357         RNA_def_property_int_sdna(prop, NULL, "clean_frames");
358         RNA_def_property_range(prop, 0, INT_MAX);
359         RNA_def_property_ui_text(prop, "Tracked Frames", "Effect on tracks which are tracked less than the specified amount of frames");
360
361         /* reprojection error */
362         prop= RNA_def_property(srna, "clean_error", PROP_FLOAT, PROP_NONE);
363         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
364         RNA_def_property_float_sdna(prop, NULL, "clean_error");
365         RNA_def_property_range(prop, 0, FLT_MAX);
366         RNA_def_property_ui_text(prop, "Reprojection Error", "Effect on tracks which have a larger reprojection error");
367
368         /* cleanup action */
369         prop= RNA_def_property(srna, "clean_action", PROP_ENUM, PROP_NONE);
370         RNA_def_property_enum_sdna(prop, NULL, "clean_action");
371         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
372         RNA_def_property_enum_items(prop, cleanup_items);
373         RNA_def_property_ui_text(prop, "Action", "Cleanup action to execute");
374
375         /* ** default tracker settings ** */
376         prop= RNA_def_property(srna, "show_default_expanded", PROP_BOOLEAN, PROP_NONE);
377         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
378         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED);
379         RNA_def_property_ui_text(prop, "Show Expanded", "Show the expanded in the user interface");
380         RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
381
382         /* limit frames */
383         prop= RNA_def_property(srna, "default_frames_limit", PROP_INT, PROP_NONE);
384         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
385         RNA_def_property_int_sdna(prop, NULL, "default_frames_limit");
386         RNA_def_property_range(prop, 0, SHRT_MAX);
387         RNA_def_property_ui_text(prop, "Frames Limit", "Every tracking cycle, this number of frames are tracked");
388
389         /* pattern match */
390         prop= RNA_def_property(srna, "default_pattern_match", PROP_ENUM, PROP_NONE);
391         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
392         RNA_def_property_enum_sdna(prop, NULL, "default_pattern_match");
393         RNA_def_property_enum_items(prop, pattern_match_items);
394         RNA_def_property_ui_text(prop, "Pattern Match", "Track pattern from given frame when tracking marker to next frame");
395
396         /* margin */
397         prop= RNA_def_property(srna, "default_margin", PROP_INT, PROP_NONE);
398         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
399         RNA_def_property_int_sdna(prop, NULL, "default_margin");
400         RNA_def_property_range(prop, 0, 300);
401         RNA_def_property_ui_text(prop, "Margin", "Default distance from image boudary at which marker stops tracking");
402
403         /* tracking algorithm */
404         prop= RNA_def_property(srna, "default_tracker", PROP_ENUM, PROP_NONE);
405         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
406         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
407         RNA_def_property_enum_items(prop, tracker_items);
408         RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_levelsUpdate");
409         RNA_def_property_ui_text(prop, "Tracker", "Default tracking algorithm to use");
410
411         /* pyramid level for pyramid klt tracking */
412         prop= RNA_def_property(srna, "default_pyramid_levels", PROP_INT, PROP_NONE);
413         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
414         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
415         RNA_def_property_int_sdna(prop, NULL, "default_pyramid_levels");
416         RNA_def_property_range(prop, 1, 16);
417         RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_levelsUpdate");
418         RNA_def_property_ui_text(prop, "Pyramid levels", "Default number of pyramid levels (increase on blurry footage)");
419
420         /* minmal correlation - only used for SAD tracker */
421         prop= RNA_def_property(srna, "default_correlation_min", PROP_FLOAT, PROP_NONE);
422         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
423         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
424         RNA_def_property_float_sdna(prop, NULL, "default_minimum_correlation");
425         RNA_def_property_range(prop, -1.0f, 1.0f);
426         RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3);
427         RNA_def_property_ui_text(prop, "Correlation", "Default minimal value of correlation between matched pattern and reference which is still treated as successful tracking");
428
429         /* default pattern size */
430         prop= RNA_def_property(srna, "default_pattern_size", PROP_INT, PROP_NONE);
431         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
432         RNA_def_property_int_sdna(prop, NULL, "default_pattern_size");
433         RNA_def_property_range(prop, 5, 1000);
434         RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_patternUpdate");
435         RNA_def_property_ui_text(prop, "Pattern Size", "Size of pattern area for newly created tracks");
436
437         /* default search size */
438         prop= RNA_def_property(srna, "default_search_size", PROP_INT, PROP_NONE);
439         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
440         RNA_def_property_int_sdna(prop, NULL, "default_search_size");
441         RNA_def_property_range(prop, 5, 1000);
442         RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_searchUpdate");
443         RNA_def_property_ui_text(prop, "Search Size", "Size of search area for newly created tracks");
444 }
445
446 static void rna_def_trackingCamera(BlenderRNA *brna)
447 {
448         StructRNA *srna;
449         PropertyRNA *prop;
450
451         static EnumPropertyItem camera_units_items[] = {
452                 {CAMERA_UNITS_PX, "PIXELS", 0, "px", "Use pixels for units of focal length"},
453                 {CAMERA_UNITS_MM, "MILLIMETERS", 0, "mm", "Use millimeters for units of focal length"},
454                 {0, NULL, 0, NULL, NULL}};
455
456         srna= RNA_def_struct(brna, "MovieTrackingCamera", NULL);
457         RNA_def_struct_ui_text(srna, "Movie tracking camera data", "Match-moving camera data for tracking");
458
459         /* Sensor */
460         prop= RNA_def_property(srna, "sensor_width", PROP_FLOAT, PROP_NONE);
461         RNA_def_property_float_sdna(prop, NULL, "sensor_width");
462         RNA_def_property_range(prop, 0.0f, 500.0f);
463         RNA_def_property_ui_text(prop, "Sensor", "Width of CCD sensor in millimeters");
464         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
465
466         /* Focal Length */
467         prop= RNA_def_property(srna, "focal_length", PROP_FLOAT, PROP_NONE);
468         RNA_def_property_float_sdna(prop, NULL, "focal");
469         RNA_def_property_range(prop, 0.0001f, 5000.0f);
470         RNA_def_property_float_funcs(prop, "rna_trackingCamera_focal_mm_get", "rna_trackingCamera_focal_mm_set", NULL);
471         RNA_def_property_ui_text(prop, "Focal Length", "Camera's focal length");
472         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
473
474         /* Focal Length in pixels */
475         prop= RNA_def_property(srna, "focal_length_pixels", PROP_FLOAT, PROP_NONE);
476         RNA_def_property_float_sdna(prop, NULL, "focal");
477         RNA_def_property_range(prop, 0.0f, 5000.0f);
478         RNA_def_property_ui_text(prop, "Focal Length", "Camera's focal length");
479         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
480
481         /* Units */
482         prop= RNA_def_property(srna, "units", PROP_ENUM, PROP_NONE);
483         RNA_def_property_enum_sdna(prop, NULL, "units");
484         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
485         RNA_def_property_enum_items(prop, camera_units_items);
486         RNA_def_property_ui_text(prop, "Units", "Units used for camera focal length");
487
488         /* Principal Point */
489         prop= RNA_def_property(srna, "principal", PROP_FLOAT, PROP_NONE);
490         RNA_def_property_array(prop, 2);
491         RNA_def_property_float_sdna(prop, NULL, "principal");
492         RNA_def_property_ui_text(prop, "Principal Point", "Optical center of lens");
493         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
494
495         /* Radial distortion parameters */
496         prop= RNA_def_property(srna, "k1", PROP_FLOAT, PROP_NONE);
497         RNA_def_property_float_sdna(prop, NULL, "k1");
498         RNA_def_property_ui_range(prop, -10, 10, .1, 3);
499         RNA_def_property_ui_text(prop, "K1", "First coefficient of third order polynomial radial distortion");
500         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_flushUpdate");
501
502         prop= RNA_def_property(srna, "k2", PROP_FLOAT, PROP_NONE);
503         RNA_def_property_float_sdna(prop, NULL, "k2");
504         RNA_def_property_ui_range(prop, -10, 10, .1, 3);
505         RNA_def_property_ui_text(prop, "K2", "Second coefficient of third order polynomial radial distortion");
506         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_flushUpdate");
507
508         prop= RNA_def_property(srna, "k3", PROP_FLOAT, PROP_NONE);
509         RNA_def_property_float_sdna(prop, NULL, "k3");
510         RNA_def_property_ui_range(prop, -10, 10, .1, 3);
511         RNA_def_property_ui_text(prop, "K3", "Third coefficient of third order polynomial radial distortion");
512         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_flushUpdate");
513
514         /* pixel aspect */
515         prop= RNA_def_property(srna, "pixel_aspect", PROP_FLOAT, PROP_XYZ);
516         RNA_def_property_float_sdna(prop, NULL, "pixel_aspect");
517         RNA_def_property_range(prop, 0.1f, 5000.0f);
518         RNA_def_property_ui_range(prop, 0.1f, 5000.0f, 1, 2);
519         RNA_def_property_ui_text(prop, "Pixel Aspect Ratio", "Pixel aspect ratio");
520         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
521 }
522
523 static void rna_def_trackingMarker(BlenderRNA *brna)
524 {
525         StructRNA *srna;
526         PropertyRNA *prop;
527
528         srna= RNA_def_struct(brna, "MovieTrackingMarker", NULL);
529         RNA_def_struct_ui_text(srna, "Movie tracking marker data", "Match-moving marker data for tracking");
530
531         /* position */
532         prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
533         RNA_def_property_array(prop, 2);
534         RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 5);
535         RNA_def_property_float_sdna(prop, NULL, "pos");
536         RNA_def_property_ui_text(prop, "Position", "Marker position at frame in normalized coordinates");
537         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
538
539         /* frame */
540         prop= RNA_def_property(srna, "frame", PROP_INT, PROP_NONE);
541         RNA_def_property_clear_flag(prop, PROP_EDITABLE);       /* can't be safty edited for now, need to re-sort markers array after change */
542         RNA_def_property_int_sdna(prop, NULL, "framenr");
543         RNA_def_property_ui_text(prop, "Frame", "Frame number marker is keyframed on");
544         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
545
546         /* enable */
547         prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
548         RNA_def_property_boolean_sdna(prop, NULL, "flag", MARKER_DISABLED);
549         RNA_def_property_ui_text(prop, "Mode", "Is marker muted for current frame");
550         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
551 }
552
553 static void rna_def_trackingTrack(BlenderRNA *brna)
554 {
555         StructRNA *srna;
556         PropertyRNA *prop;
557
558         FunctionRNA *func;
559         PropertyRNA *parm;
560
561         rna_def_trackingMarker(brna);
562
563         srna= RNA_def_struct(brna, "MovieTrackingTrack", NULL);
564         RNA_def_struct_ui_text(srna, "Movie tracking track data", "Match-moving track data for tracking");
565         RNA_def_struct_ui_icon(srna, ICON_ANIM_DATA);
566
567         /* name */
568         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
569         RNA_def_property_ui_text(prop, "Name", "Unique name of track");
570         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_trackingTrack_name_set");
571         RNA_def_property_string_maxlength(prop, MAX_ID_NAME);
572         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
573         RNA_def_struct_name_property(srna, prop);
574
575         /* Pattern */
576         prop= RNA_def_property(srna, "pattern_min", PROP_FLOAT, PROP_TRANSLATION);
577         RNA_def_property_array(prop, 2);
578         RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 5);
579         RNA_def_property_float_sdna(prop, NULL, "pat_min");
580         RNA_def_property_ui_text(prop, "Pattern Min", "Left-bottom corner of pattern area in normalized coordinates relative to marker position");
581         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerPattern_update");
582
583         prop= RNA_def_property(srna, "pattern_max", PROP_FLOAT, PROP_TRANSLATION);
584         RNA_def_property_array(prop, 2);
585         RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 5);
586         RNA_def_property_float_sdna(prop, NULL, "pat_max");
587         RNA_def_property_ui_text(prop, "Pattern Max", "Right-bottom corner of pattern area in normalized coordinates relative to marker position");
588         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerPattern_update");
589
590         /* Search */
591         prop= RNA_def_property(srna, "search_min", PROP_FLOAT, PROP_TRANSLATION);
592         RNA_def_property_array(prop, 2);
593         RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 5);
594         RNA_def_property_float_sdna(prop, NULL, "search_min");
595         RNA_def_property_ui_text(prop, "Search Min", "Left-bottom corner of search area in normalized coordinates relative to marker position");
596         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerSearch_update");
597
598         prop= RNA_def_property(srna, "search_max", PROP_FLOAT, PROP_TRANSLATION);
599         RNA_def_property_array(prop, 2);
600         RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 5);
601         RNA_def_property_float_sdna(prop, NULL, "search_max");
602         RNA_def_property_ui_text(prop, "Search Max", "Right-bottom corner of search area in normalized coordinates relative to marker position");
603         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerSearch_update");
604
605         /* limit frames */
606         prop= RNA_def_property(srna, "frames_limit", PROP_INT, PROP_NONE);
607         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
608         RNA_def_property_int_sdna(prop, NULL, "frames_limit");
609         RNA_def_property_range(prop, 0, SHRT_MAX);
610         RNA_def_property_ui_text(prop, "Frames Limit", "Every tracking cycle, this number of frames are tracked");
611
612         /* pattern match */
613         prop= RNA_def_property(srna, "pattern_match", PROP_ENUM, PROP_NONE);
614         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
615         RNA_def_property_enum_sdna(prop, NULL, "pattern_match");
616         RNA_def_property_enum_items(prop, pattern_match_items);
617         RNA_def_property_ui_text(prop, "Pattern Match", "Track pattern from given frame when tracking marker to next frame");
618
619         /* margin */
620         prop= RNA_def_property(srna, "margin", PROP_INT, PROP_NONE);
621         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
622         RNA_def_property_int_sdna(prop, NULL, "margin");
623         RNA_def_property_range(prop, 0, 300);
624         RNA_def_property_ui_text(prop, "Margin", "Distance from image boudary at which marker stops tracking");
625
626         /* tracking algorithm */
627         prop= RNA_def_property(srna, "tracker", PROP_ENUM, PROP_NONE);
628         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
629         RNA_def_property_enum_items(prop, tracker_items);
630         RNA_def_property_ui_text(prop, "Tracker", "Tracking algorithm to use");
631         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerAlgorithm_update");
632
633         /* pyramid level for pyramid klt tracking */
634         prop= RNA_def_property(srna, "pyramid_levels", PROP_INT, PROP_NONE);
635         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
636         RNA_def_property_int_sdna(prop, NULL, "pyramid_levels");
637         RNA_def_property_range(prop, 1, 16);
638         RNA_def_property_ui_text(prop, "Pyramid levels", "Number of pyramid levels (increase on blurry footage)");
639         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_trackerPyramid_update");
640
641         /* minmal correlation - only used for SAD tracker */
642         prop= RNA_def_property(srna, "correlation_min", PROP_FLOAT, PROP_NONE);
643         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
644         RNA_def_property_float_sdna(prop, NULL, "minimum_correlation");
645         RNA_def_property_range(prop, -1.0f, 1.0f);
646         RNA_def_property_ui_range(prop, -1.0f, 1.0f, 0.1, 3);
647         RNA_def_property_ui_text(prop, "Correlation", "Minimal value of correlation between matched pattern and reference which is still treated as successful tracking");
648
649         /* markers */
650         prop= RNA_def_property(srna, "markers", PROP_COLLECTION, PROP_NONE);
651         RNA_def_property_struct_type(prop, "MovieTrackingMarker");
652         RNA_def_property_collection_sdna(prop, NULL, "markers", "markersnr");
653         RNA_def_property_ui_text(prop, "Markers", "Collection of markers in track");
654
655         /* ** channels ** */
656
657         /* use_red_channel */
658         prop= RNA_def_property(srna, "use_red_channel", PROP_BOOLEAN, PROP_NONE);
659         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", TRACK_DISABLE_RED);
660         RNA_def_property_ui_text(prop, "Use Red Channel", "Use red channel from footage for tracking");
661         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
662
663         /* use_green_channel */
664         prop= RNA_def_property(srna, "use_green_channel", PROP_BOOLEAN, PROP_NONE);
665         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", TRACK_DISABLE_GREEN);
666         RNA_def_property_ui_text(prop, "Use Green Channel", "Use green channel from footage for tracking");
667         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
668
669         /* use_blue_channel */
670         prop= RNA_def_property(srna, "use_blue_channel", PROP_BOOLEAN, PROP_NONE);
671         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", TRACK_DISABLE_BLUE);
672         RNA_def_property_ui_text(prop, "Use Blue Channel", "Use blue channel from footage for tracking");
673         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
674
675         /* has bundle */
676         prop= RNA_def_property(srna, "has_bundle", PROP_BOOLEAN, PROP_NONE);
677         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_HAS_BUNDLE);
678         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
679         RNA_def_property_ui_text(prop, "Has Bundle", "True if track has a valid bundle");
680
681         /* bundle position */
682         prop= RNA_def_property(srna, "bundle", PROP_FLOAT, PROP_TRANSLATION);
683         RNA_def_property_array(prop, 3);
684         RNA_def_property_float_sdna(prop, NULL, "bundle_pos");
685         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
686         RNA_def_property_ui_text(prop, "Bundle", "Position of bundle reconstructed from this track");
687
688         /* hide */
689         prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
690         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_HIDDEN);
691         RNA_def_property_ui_text(prop, "Hide", "Track is hidden");
692         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
693
694         /* select */
695         prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
696         RNA_def_property_boolean_funcs(prop, "rna_trackingTrack_select_get", "rna_trackingTrack_select_set");
697         RNA_def_property_ui_text(prop, "Select", "Track is selected");
698         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
699
700         /* select_anchor */
701         prop= RNA_def_property(srna, "select_anchor", PROP_BOOLEAN, PROP_NONE);
702         RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
703         RNA_def_property_ui_text(prop, "Select Anchor", "Track's anchor point is selected");
704         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
705
706         /* select_pattern */
707         prop= RNA_def_property(srna, "select_pattern", PROP_BOOLEAN, PROP_NONE);
708         RNA_def_property_boolean_sdna(prop, NULL, "pat_flag", SELECT);
709         RNA_def_property_ui_text(prop, "Select Pattern", "Track's pattern area is selected");
710         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
711
712         /* select_search */
713         prop= RNA_def_property(srna, "select_search", PROP_BOOLEAN, PROP_NONE);
714         RNA_def_property_boolean_sdna(prop, NULL, "search_flag", SELECT);
715         RNA_def_property_ui_text(prop, "Select Search", "Track's search area is selected");
716         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
717
718         /* locked */
719         prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
720         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_LOCKED);
721         RNA_def_property_ui_text(prop, "Lock", "Track is locked and all changes to it are disabled");
722         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
723
724         /* custom color */
725         prop= RNA_def_property(srna, "use_custom_color", PROP_BOOLEAN, PROP_NONE);
726         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACK_CUSTOMCOLOR);
727         RNA_def_property_ui_text(prop, "Custom Color", "Use custom color instead of theme-defined");
728         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
729
730         /* color */
731         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
732         RNA_def_property_array(prop, 3);
733         RNA_def_property_range(prop, 0.0f, 1.0f);
734         RNA_def_property_ui_text(prop, "Color", "Color of the track in the Movie Track Editor and the 3D viewport after a solve");
735         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
736
737         /* average error */
738         prop= RNA_def_property(srna, "average_error", PROP_FLOAT, PROP_NONE);
739         RNA_def_property_float_sdna(prop, NULL, "error");
740         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
741         RNA_def_property_ui_text(prop, "Average Error", "Average error of re-projection");
742
743         /* ** api ** */
744
745         func= RNA_def_function(srna, "marker_find_frame", "rna_trackingTrack_marker_find_frame");
746         RNA_def_function_ui_description(func, "Get marker for specified frame");
747         parm= RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "type for the new spline", MINFRAME, MAXFRAME);
748         RNA_def_property_flag(parm, PROP_REQUIRED);
749         parm= RNA_def_pointer(func, "marker", "MovieTrackingMarker", "", "Marker for specified frame");
750         RNA_def_function_return(func, parm);
751 }
752
753 static void rna_def_trackingStabilization(BlenderRNA *brna)
754 {
755         StructRNA *srna;
756         PropertyRNA *prop;
757
758         srna= RNA_def_struct(brna, "MovieTrackingStabilization", NULL);
759         RNA_def_struct_ui_text(srna, "Movie tracking stabilization data", "Match-moving stabilization data for tracking");
760
761         /* 2d stabilization */
762         prop= RNA_def_property(srna, "use_2d_stabilization", PROP_BOOLEAN, PROP_NONE);
763         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_2D_STABILIZATION);
764         RNA_def_property_ui_text(prop, "Use 2D stabilization", "Use 2D stabilization for footage");
765         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
766
767         /* tracks */
768         prop= RNA_def_property(srna, "tracks", PROP_COLLECTION, PROP_NONE);
769         RNA_def_property_collection_funcs(prop, "rna_tracking_stabTracks_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
770         RNA_def_property_struct_type(prop, "MovieTrackingTrack");
771         RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks used for stabilization");
772         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
773
774         /* rotation track */
775         prop= RNA_def_property(srna, "rotation_track", PROP_POINTER, PROP_NONE);
776         RNA_def_property_pointer_sdna(prop, NULL, "rot_track");
777         RNA_def_property_flag(prop, PROP_EDITABLE);
778         RNA_def_property_ui_text(prop, "Rotation Track", "Track used to compensate rotation");
779         RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, "rna_tracking_flushUpdate");
780
781         /* active track index */
782         prop= RNA_def_property(srna, "active_track_index", PROP_INT, PROP_NONE);
783         RNA_def_property_int_sdna(prop, NULL, "act_track");
784         RNA_def_property_int_funcs(prop, "rna_tracking_stabTracks_active_index_get", "rna_tracking_stabTracks_active_index_set", "rna_tracking_stabTracks_active_index_range");
785         RNA_def_property_ui_text(prop, "Active Track Index", "Index of active track in stabilization tracks list");
786
787         /* autoscale */
788         prop= RNA_def_property(srna, "use_autoscale", PROP_BOOLEAN, PROP_NONE);
789         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_AUTOSCALE);
790         RNA_def_property_ui_text(prop, "Autoscale", "Automatically scale footage to cover unfilled areas when stabilizating");
791         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
792
793         /* max scale */
794         prop= RNA_def_property(srna, "scale_max", PROP_FLOAT, PROP_FACTOR);
795         RNA_def_property_float_sdna(prop, NULL, "maxscale");
796         RNA_def_property_range(prop, 0.0f, 10.0f);
797         RNA_def_property_ui_text(prop, "Maximal Scale", "Limit the amount of automatic scaling");
798         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
799
800         /* influence_location */
801         prop= RNA_def_property(srna, "influence_location", PROP_FLOAT, PROP_FACTOR);
802         RNA_def_property_float_sdna(prop, NULL, "locinf");
803         RNA_def_property_range(prop, 0.0f, 1.0f);
804         RNA_def_property_ui_text(prop, "Location Influence", "Influence of stabilization algorithm on footage location");
805         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
806
807         /* influence_scale */
808         prop= RNA_def_property(srna, "influence_scale", PROP_FLOAT, PROP_FACTOR);
809         RNA_def_property_float_sdna(prop, NULL, "scaleinf");
810         RNA_def_property_range(prop, 0.0f, 1.0f);
811         RNA_def_property_ui_text(prop, "Scale Influence", "Influence of stabilization algorithm on footage scale");
812         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
813
814         /* use_stabilize_rotation */
815         prop= RNA_def_property(srna, "use_stabilize_rotation", PROP_BOOLEAN, PROP_NONE);
816         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_STABILIZE_ROTATION);
817         RNA_def_property_ui_text(prop, "Stabilize Rotation", "Stabilize horizon line on the shot");
818         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
819
820         /* influence_rotation */
821         prop= RNA_def_property(srna, "influence_rotation", PROP_FLOAT, PROP_FACTOR);
822         RNA_def_property_float_sdna(prop, NULL, "rotinf");
823         RNA_def_property_range(prop, 0.0f, 1.0f);
824         RNA_def_property_ui_text(prop, "Rotation Influence", "Influence of stabilization algorithm on footage rotation");
825         RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, "rna_tracking_flushUpdate");
826 }
827
828 static void rna_def_reconstructedCamera(BlenderRNA *brna)
829 {
830         StructRNA *srna;
831         PropertyRNA *prop;
832
833         srna= RNA_def_struct(brna, "MovieReconstructedCamera", NULL);
834         RNA_def_struct_ui_text(srna, "Movie tracking reconstructed camera data", "Match-moving reconstructed camera data from tracker");
835
836         /* frame */
837         prop= RNA_def_property(srna, "frame", PROP_INT, PROP_NONE);
838         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
839         RNA_def_property_int_sdna(prop, NULL, "framenr");
840         RNA_def_property_ui_text(prop, "Frame", "Frame number marker is keyframed on");
841
842         /* matrix */
843         prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
844         RNA_def_property_float_sdna(prop, NULL, "mat");
845         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
846         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
847         RNA_def_property_ui_text(prop, "Matrix", "Worldspace transformation matrix");
848
849         /* average_error */
850         prop= RNA_def_property(srna, "average_error", PROP_FLOAT, PROP_NONE);
851         RNA_def_property_float_sdna(prop, NULL, "error");
852         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
853         RNA_def_property_ui_text(prop, "Average Error", "Average error of resonctruction");
854 }
855
856 static void rna_def_trackingReconstruction(BlenderRNA *brna)
857 {
858         StructRNA *srna;
859         PropertyRNA *prop;
860
861         rna_def_reconstructedCamera(brna);
862
863         srna= RNA_def_struct(brna, "MovieTrackingReconstruction", NULL);
864         RNA_def_struct_ui_text(srna, "Movie tracking reconstruction data", "Match-moving reconstruction data from tracker");
865
866         /* is_valid */
867         prop= RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
868         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
869         RNA_def_property_boolean_sdna(prop, NULL, "flag", TRACKING_RECONSTRUCTED);
870         RNA_def_property_ui_text(prop, "Reconstructed", "Is tracking data contains valid reconstruction information");
871
872         /* average_error */
873         prop= RNA_def_property(srna, "average_error", PROP_FLOAT, PROP_NONE);
874         RNA_def_property_float_sdna(prop, NULL, "error");
875         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
876         RNA_def_property_ui_text(prop, "Average Error", "Average error of resonctruction");
877
878         /* cameras */
879         prop= RNA_def_property(srna, "cameras", PROP_COLLECTION, PROP_NONE);
880         RNA_def_property_struct_type(prop, "MovieReconstructedCamera");
881         RNA_def_property_collection_sdna(prop, NULL, "cameras", "camnr");
882         RNA_def_property_ui_text(prop, "Cameras", "Collection of solved cameras");
883 }
884
885 static void rna_def_trackingTracks(BlenderRNA *brna, PropertyRNA *cprop)
886 {
887         StructRNA *srna;
888         FunctionRNA *func;
889         PropertyRNA *prop;
890
891         RNA_def_property_srna(cprop, "MovieTrackingTracks");
892         srna= RNA_def_struct(brna, "MovieTrackingTracks", NULL);
893         RNA_def_struct_sdna(srna, "MovieTracking");
894         RNA_def_struct_ui_text(srna, "Movie Tracks", "Collection of movie tracking tracks");
895
896         func= RNA_def_function(srna, "add", "rna_tracking_tracks_add");
897         RNA_def_function_ui_description(func, "Add a number of tracks to this movie clip");
898         RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to add tracks on", MINFRAME, MAXFRAME);
899         RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of tracks to add to the movie clip", 0, INT_MAX);
900
901         /* active track */
902         prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
903         RNA_def_property_struct_type(prop, "MovieTrackingTrack");
904         RNA_def_property_pointer_funcs(prop, "rna_tracking_active_track_get", "rna_tracking_active_track_set", NULL, NULL);
905         RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
906         RNA_def_property_ui_text(prop, "Active Track", "Active track in this tracking data object");
907 }
908
909 static void rna_def_tracking(BlenderRNA *brna)
910 {
911         StructRNA *srna;
912         PropertyRNA *prop;
913
914         rna_def_trackingSettings(brna);
915         rna_def_trackingCamera(brna);
916         rna_def_trackingTrack(brna);
917         rna_def_trackingStabilization(brna);
918         rna_def_trackingReconstruction(brna);
919
920         srna= RNA_def_struct(brna, "MovieTracking", NULL);
921         RNA_def_struct_ui_text(srna, "Movie tracking data", "Match-moving data for tracking");
922
923         /* settings */
924         prop= RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
925         RNA_def_property_struct_type(prop, "MovieTrackingSettings");
926
927         /* camera properties */
928         prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
929         RNA_def_property_struct_type(prop, "MovieTrackingCamera");
930
931         /* tracks */
932         prop= RNA_def_property(srna, "tracks", PROP_COLLECTION, PROP_NONE);
933         RNA_def_property_collection_funcs(prop, "rna_tracking_tracks_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
934         RNA_def_property_struct_type(prop, "MovieTrackingTrack");
935         RNA_def_property_ui_text(prop, "Tracks", "Collection of tracks in this tracking data object");
936         rna_def_trackingTracks(brna, prop);
937
938         /* stabilization */
939         prop= RNA_def_property(srna, "stabilization", PROP_POINTER, PROP_NONE);
940         RNA_def_property_struct_type(prop, "MovieTrackingStabilization");
941
942         /* reconstruction */
943         prop= RNA_def_property(srna, "reconstruction", PROP_POINTER, PROP_NONE);
944         RNA_def_property_struct_type(prop, "MovieTrackingReconstruction");
945 }
946
947 void RNA_def_tracking(BlenderRNA *brna)
948 {
949         rna_def_tracking(brna);
950 }
951
952 #endif