2 * ***** BEGIN GPL LICENSE BLOCK *****
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.
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.
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.
18 * The Original Code is Copyright (C) 2011 Blender Foundation.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): Blender Foundation,
26 * ***** END GPL LICENSE BLOCK *****
29 /** \file DNA_tracking_types.h
32 * \author Sergey Sharybin
34 * Structs used for camera tracking and the movie-clip editor.
37 #ifndef __DNA_TRACKING_TYPES_H__
38 #define __DNA_TRACKING_TYPES_H__
41 #include "DNA_listBase.h"
43 /* match-moving data */
47 struct MovieReconstructedCamera;
48 struct MovieTrackingCamera;
49 struct MovieTrackingBundle;
50 struct MovieTrackingMarker;
51 struct MovieTrackingTrack;
54 typedef struct MovieReconstructedCamera {
58 } MovieReconstructedCamera;
60 typedef struct MovieTrackingCamera {
61 void *intrinsics; /* intrinsics handle */
63 float sensor_width; /* width of CCD sensor */
64 float pixel_aspect; /* pixel aspect ratio */
66 float focal; /* focal length */
67 short units; /* units of focal length user is working with */
69 float principal[2]; /* principal point */
70 float k1, k2, k3; /* radial distortion */
71 } MovieTrackingCamera;
73 typedef struct MovieTrackingMarker {
74 float pos[2]; /* 2d position of marker on frame (in unified 0..1 space) */
76 /* corners of pattern in the following order:
87 * the coordinates are stored relative to pos.
89 float pattern_corners[4][2];
91 /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
92 * relative to marker->pos
94 float search_min[2], search_max[2];
96 int framenr; /* number of frame marker is associated with */
97 int flag; /* Marker's flag (alive, ...) */
98 } MovieTrackingMarker;
100 typedef struct MovieTrackingTrack {
101 struct MovieTrackingTrack *next, *prev;
103 char name[64]; /* MAX_NAME */
107 /* positions of left-bottom and right-top corners of pattern (in unified 0..1 units,
108 * relative to marker->pos)
109 * moved to marker's corners since planar tracking implementation
111 float pat_min[2] DNA_DEPRECATED, pat_max[2] DNA_DEPRECATED;
113 /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
114 * relative to marker->pos
115 * moved to marker since affine tracking implementation
117 float search_min[2] DNA_DEPRECATED, search_max[2] DNA_DEPRECATED;
119 float offset[2]; /* offset to "parenting" point */
122 int markersnr; /* count of markers in track */
123 int last_marker; /* most recently used marker */
124 MovieTrackingMarker *markers; /* markers in track */
126 /* ** reconstruction data ** */
127 float bundle_pos[3]; /* reconstructed position */
128 float error; /* average track reprojection error */
130 /* ** UI editing ** */
131 int flag, pat_flag, search_flag; /* flags (selection, ...) */
132 float color[3]; /* custom color for track */
134 /* ** control how tracking happens */
135 short frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
136 short margin; /* margin from frame boundaries */
137 short pattern_match; /* re-adjust every N frames */
139 /* tracking parameters */
140 short motion_model; /* model of the motion for this track */
141 int algorithm_flag; /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
142 float minimum_correlation; /* minimal correlation which is still treated as successful tracking */
144 struct bGPdata *gpd; /* grease-pencil data */
146 /* Weight of this track.
148 * Weight defines how much the track affects on the final reconstruction,
149 * usually gets animated in a way so when track has just appeared it's
150 * weight is zero and then it gets faded up.
152 * Used to prevent jumps of the camera when tracks are appearing or
156 } MovieTrackingTrack;
158 typedef struct MovieTrackingPlaneMarker {
159 /* Corners of the plane in the following order:
170 * The coordinates are stored in frame normalized coordinates.
174 int framenr; /* Number of frame plane marker is associated with */
175 int flag; /* Marker's flag (alive, ...) */
176 } MovieTrackingPlaneMarker;
178 typedef struct MovieTrackingPlaneTrack {
179 struct MovieTrackingPlaneTrack *next, *prev;
181 char name[64]; /* MAX_NAME */
183 MovieTrackingTrack **point_tracks; /* Array of point tracks used to define this plane.
184 * Each element is a pointer to MovieTrackingTrack. */
185 int point_tracksnr, pad; /* Number of tracks in point_tracks array. */
187 MovieTrackingPlaneMarker *markers; /* Markers in the plane track */
188 int markersnr; /* Count of markers in track (size of markers array) */
190 int flag; /* flags (selection, ...) */
193 int last_marker, pad2; /* Most recently used marker */
194 } MovieTrackingPlaneTrack;
196 typedef struct MovieTrackingSettings {
199 /* ** default tracker settings */
200 short default_motion_model; /* model of the motion for this track */
201 short default_algorithm_flag; /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
202 float default_minimum_correlation; /* minimal correlation which is still treated as successful tracking */
203 short default_pattern_size; /* size of pattern area for new tracks */
204 short default_search_size; /* size of search area for new tracks */
205 short default_frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
206 short default_margin; /* margin from frame boundaries */
207 short default_pattern_match; /* re-adjust every N frames */
208 short default_flag; /* default flags like color channels used by default */
210 short motion_flag; /* flags describes motion type */
212 /* ** common tracker settings ** */
213 short speed; /* speed of tracking */
215 /* ** reconstruction settings ** */
216 int keyframe1 DNA_DEPRECATED,
217 keyframe2 DNA_DEPRECATED; /* two keyframes for reconstruction initialization
218 * were moved to per-tracking object settings
221 int reconstruction_flag, pad;
223 /* which camera intrinsics to refine. uses on the REFINE_* flags */
224 short refine_camera_intrinsics, pad2;
226 /* ** tool settings ** */
229 float dist; /* distance between two bundles used for scene scaling */
232 int clean_frames, clean_action;
235 /* set object scale */
236 float object_distance; /* distance between two bundles used for object scaling */
239 } MovieTrackingSettings;
241 typedef struct MovieTrackingStabilization {
243 int tot_track, act_track; /* total number and index of active track in list */
245 /* 2d stabilization */
246 float maxscale; /* max auto-scale factor */
247 MovieTrackingTrack *rot_track; /* track used to stabilize rotation */
249 float locinf, scaleinf, rotinf; /* influence on location, scale and rotation */
251 int filter; /* filter used for pixel interpolation */
253 /* some pre-computing run-time variables */
254 int ok; /* are precomputed values and scaled buf relevant? */
255 float scale; /* autoscale factor */
256 } MovieTrackingStabilization;
258 typedef struct MovieTrackingReconstruction {
261 float error; /* average error of reconstruction */
263 int last_camera; /* most recently used camera */
264 int camnr; /* number of reconstructed cameras */
265 struct MovieReconstructedCamera *cameras; /* reconstructed cameras */
266 } MovieTrackingReconstruction;
268 typedef struct MovieTrackingObject {
269 struct MovieTrackingObject *next, *prev;
271 char name[64]; /* Name of tracking object, MAX_NAME */
273 float scale; /* scale of object solution in amera space */
275 ListBase tracks; /* list of tracks use to tracking this object */
276 ListBase plane_tracks; /* list of plane tracks used by this object */
277 MovieTrackingReconstruction reconstruction; /* reconstruction data for this object */
279 /* reconstruction options */
280 int keyframe1, keyframe2; /* two keyframes for reconstruction initialization */
281 } MovieTrackingObject;
283 typedef struct MovieTrackingStats {
285 } MovieTrackingStats;
287 typedef struct MovieTrackingDopesheetChannel {
288 struct MovieTrackingDopesheetChannel *next, *prev;
290 MovieTrackingTrack *track; /* motion track for which channel is created */
293 char name[64]; /* name of channel */
295 int tot_segment; /* total number of segments */
296 int *segments; /* tracked segments */
297 int max_segment, total_frames; /* longest segment length and total number of tracked frames */
298 } MovieTrackingDopesheetChannel;
300 typedef struct MovieTrackingDopesheetCoverageSegment {
301 struct MovieTrackingDopesheetCoverageSegment *next, *prev;
308 } MovieTrackingDopesheetCoverageSegment;
310 typedef struct MovieTrackingDopesheet {
311 int ok; /* flag if dopesheet information is still relevant */
313 short sort_method; /* method to be used to sort tracks */
314 short flag; /* dopesheet building flag such as inverted order of sort */
316 /* ** runtime stuff ** */
319 ListBase coverage_segments;
326 } MovieTrackingDopesheet;
328 typedef struct MovieTracking {
329 MovieTrackingSettings settings; /* different tracking-related settings */
330 MovieTrackingCamera camera; /* camera intrinsics */
331 ListBase tracks; /* list of tracks used for camera object */
332 ListBase plane_tracks; /* list of plane tracks used by camera object */
333 MovieTrackingReconstruction reconstruction; /* reconstruction data for camera object */
334 MovieTrackingStabilization stabilization; /* stabilization data */
335 MovieTrackingTrack *act_track; /* active track */
336 MovieTrackingPlaneTrack *act_plane_track; /* active plane track */
339 int objectnr, tot_object; /* index of active object and total number of objects */
341 MovieTrackingStats *stats; /* statistics displaying in clip editor */
343 MovieTrackingDopesheet dopesheet; /* dopesheet data */
346 /* MovieTrackingCamera->units */
352 /* MovieTrackingMarker->flag */
354 MARKER_DISABLED = (1 << 0),
355 MARKER_TRACKED = (1 << 1),
356 MARKER_GRAPH_SEL_X = (1 << 2),
357 MARKER_GRAPH_SEL_Y = (1 << 3),
358 MARKER_GRAPH_SEL = (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)
361 /* MovieTrackingTrack->flag */
363 TRACK_HAS_BUNDLE = (1 << 1),
364 TRACK_DISABLE_RED = (1 << 2),
365 TRACK_DISABLE_GREEN = (1 << 3),
366 TRACK_DISABLE_BLUE = (1 << 4),
367 TRACK_HIDDEN = (1 << 5),
368 TRACK_LOCKED = (1 << 6),
369 TRACK_CUSTOMCOLOR = (1 << 7),
370 TRACK_USE_2D_STAB = (1 << 8),
371 TRACK_PREVIEW_GRAYSCALE = (1 << 9),
372 TRACK_DOPE_SEL = (1 << 10),
373 TRACK_PREVIEW_ALPHA = (1 << 11)
376 /* MovieTrackingTrack->motion_model */
378 TRACK_MOTION_MODEL_TRANSLATION = 0,
379 TRACK_MOTION_MODEL_TRANSLATION_ROTATION = 1,
380 TRACK_MOTION_MODEL_TRANSLATION_SCALE = 2,
381 TRACK_MOTION_MODEL_TRANSLATION_ROTATION_SCALE = 3,
382 TRACK_MOTION_MODEL_AFFINE = 4,
383 TRACK_MOTION_MODEL_HOMOGRAPHY = 5
386 /* MovieTrackingTrack->algorithm_flag */
388 TRACK_ALGORITHM_FLAG_USE_BRUTE = (1 << 0),
389 TRACK_ALGORITHM_FLAG_USE_NORMALIZATION = (1 << 2),
390 TRACK_ALGORITHM_FLAG_USE_MASK = (1 << 3)
393 /* MovieTrackingTrack->adjframes */
395 TRACK_MATCH_KEYFRAME = 0,
396 TRACK_MATCH_PREVFRAME = 1
399 /* MovieTrackingSettings->flag */
401 TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0)
404 /* MovieTrackingSettings->motion_flag */
406 TRACKING_MOTION_TRIPOD = (1 << 0),
408 TRACKING_MOTION_MODAL = (TRACKING_MOTION_TRIPOD)
411 /* MovieTrackingSettings->speed */
413 TRACKING_SPEED_FASTEST = 0,
414 TRACKING_SPEED_REALTIME = 1,
415 TRACKING_SPEED_HALF = 2,
416 TRACKING_SPEED_QUARTER = 4,
417 TRACKING_SPEED_DOUBLE = 5
420 /* MovieTrackingSettings->reconstruction_flag */
422 /* TRACKING_USE_FALLBACK_RECONSTRUCTION = (1 << 0), */ /* DEPRECATED */
423 TRACKING_USE_KEYFRAME_SELECTION = (1 << 1)
426 /* MovieTrackingSettings->refine_camera_intrinsics */
428 REFINE_FOCAL_LENGTH = (1 << 0),
429 REFINE_PRINCIPAL_POINT = (1 << 1),
430 REFINE_RADIAL_DISTORTION_K1 = (1 << 2),
431 REFINE_RADIAL_DISTORTION_K2 = (1 << 4)
434 /* MovieTrackingStrabilization->flag */
436 TRACKING_2D_STABILIZATION = (1 << 0),
437 TRACKING_AUTOSCALE = (1 << 1),
438 TRACKING_STABILIZE_ROTATION = (1 << 2)
441 /* MovieTrackingStrabilization->filter */
443 TRACKING_FILTER_NEAREST = 0,
444 TRACKING_FILTER_BILINEAR = 1,
445 TRACKING_FILTER_BICUBIC = 2
448 /* MovieTrackingReconstruction->flag */
450 TRACKING_RECONSTRUCTED = (1 << 0)
453 /* MovieTrackingObject->flag */
455 TRACKING_OBJECT_CAMERA = (1 << 0)
459 TRACKING_CLEAN_SELECT = 0,
460 TRACKING_CLEAN_DELETE_TRACK = 1,
461 TRACKING_CLEAN_DELETE_SEGMENT = 2
464 /* MovieTrackingDopesheet->sort_method */
466 TRACKING_DOPE_SORT_NAME = 0,
467 TRACKING_DOPE_SORT_LONGEST = 1,
468 TRACKING_DOPE_SORT_TOTAL = 2,
469 TRACKING_DOPE_SORT_AVERAGE_ERROR = 3
472 /* MovieTrackingDopesheet->flag */
474 TRACKING_DOPE_SORT_INVERSE = (1 << 0),
475 TRACKING_DOPE_SELECTED_ONLY = (1 << 1),
476 TRACKING_DOPE_SHOW_HIDDEN = (1 << 2)
479 /* MovieTrackingDopesheetCoverageSegment->trackness */
481 TRACKING_COVERAGE_BAD = 0,
482 TRACKING_COVERAGE_ACCEPTABLE = 1,
483 TRACKING_COVERAGE_OK = 2
486 /* MovieTrackingPlaneMarker->flag */
488 PLANE_MARKER_DISABLED = (1 << 0),
489 PLANE_MARKER_TRACKED = (1 << 1),
492 /* MovieTrackingPlaneTrack->flag */
494 PLANE_TRACK_HIDDEN = (1 << 1),
495 PLANE_TRACK_LOCKED = (1 << 2),
496 PLANE_TRACK_AUTOKEY = (1 << 3),
499 #endif /* __DNA_TRACKING_TYPES_H__ */