65d36adde180e719a0e76de18fe8d9d2c2801103
[blender.git] / source / blender / makesdna / DNA_tracking_types.h
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  * The Original Code is Copyright (C) 2011 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Blender Foundation,
24  *                 Sergey Sharybin
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 /** \file DNA_tracking_types.h
30  *  \ingroup DNA
31  *  \since may-2011
32  *  \author Sergey Sharybin
33  *
34  * Structs used for camera tracking and the movie-clip editor.
35  */
36
37 #ifndef __DNA_TRACKING_TYPES_H__
38 #define __DNA_TRACKING_TYPES_H__
39
40 #include "DNA_defs.h"
41 #include "DNA_listBase.h"
42
43 /* match-moving data */
44
45 struct bGPdata;
46 struct ImBuf;
47 struct MovieReconstructedCamera;
48 struct MovieTrackingCamera;
49 struct MovieTrackingBundle;
50 struct MovieTrackingMarker;
51 struct MovieTrackingTrack;
52 struct MovieTracking;
53
54 typedef struct MovieReconstructedCamera {
55         int framenr;
56         float error;
57         float mat[4][4];
58 } MovieReconstructedCamera;
59
60 typedef struct MovieTrackingCamera {
61         void *intrinsics;   /* intrinsics handle */
62
63         float sensor_width; /* width of CCD sensor */
64         float pixel_aspect; /* pixel aspect ratio */
65         float pad;
66         float focal;        /* focal length */
67         short units;        /* units of focal length user is working with */
68         short pad1;
69         float principal[2]; /* principal point */
70         float k1, k2, k3;   /* radial distortion */
71 } MovieTrackingCamera;
72
73 typedef struct MovieTrackingMarker {
74         float pos[2];   /* 2d position of marker on frame (in unified 0..1 space) */
75
76         /* corners of pattern in the following order:
77          *
78          *       Y
79          *       ^
80          *       | (3) --- (2)
81          *       |  |       |
82          *       |  |       |
83          *       |  |       |
84          *       | (0) --- (1)
85          *       +-------------> X
86          *
87          * the coordinates are stored relative to pos.
88          */
89         float pattern_corners[4][2];
90
91         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
92          * relative to marker->pos
93          */
94         float search_min[2], search_max[2];
95
96         int framenr;    /* number of frame marker is associated with */
97         int flag;       /* Marker's flag (alive, ...) */
98 } MovieTrackingMarker;
99
100 typedef struct MovieTrackingTrack {
101         struct MovieTrackingTrack *next, *prev;
102
103         char name[64];  /* MAX_NAME */
104
105         /* ** setings ** */
106
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
110          */
111         float pat_min[2] DNA_DEPRECATED, pat_max[2] DNA_DEPRECATED;
112
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
116          */
117         float search_min[2] DNA_DEPRECATED, search_max[2] DNA_DEPRECATED;
118
119         float offset[2];                    /* offset to "parenting" point */
120
121         /* ** track ** */
122         int markersnr;                  /* count of markers in track */
123         int last_marker;                /* most recently used marker */
124         MovieTrackingMarker *markers;   /* markers in track */
125
126         /* ** reconstruction data ** */
127         float bundle_pos[3];            /* reconstructed position */
128         float error;                    /* average track reprojection error */
129
130         /* ** UI editing ** */
131         int flag, pat_flag, search_flag;    /* flags (selection, ...) */
132         float color[3];                     /* custom color for track */
133
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 */
138
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 */
143
144         struct bGPdata *gpd;        /* grease-pencil data */
145 } MovieTrackingTrack;
146
147 typedef struct MovieTrackingPlaneMarker {
148         /* Corners of the plane in the following order:
149          *
150          *       Y
151          *       ^
152          *       | (3) --- (2)
153          *       |  |       |
154          *       |  |       |
155          *       |  |       |
156          *       | (0) --- (1)
157          *       +-------------> X
158          *
159          * The coordinates are stored in frame normalized coordinates.
160          */
161         float corners[4][2];
162
163         int framenr;    /* Number of frame plane marker is associated with */
164         int flag;       /* Marker's flag (alive, ...) */
165 } MovieTrackingPlaneMarker;
166
167 typedef struct MovieTrackingPlaneTrack {
168         struct MovieTrackingPlaneTrack *next, *prev;
169
170         char name[64];  /* MAX_NAME */
171
172         MovieTrackingTrack **point_tracks;  /* Array of point tracks used to define this plane.
173                                              * Each element is a pointer to MovieTrackingTrack. */
174         int point_tracksnr, pad;  /* Number of tracks in point_tracks array. */
175
176         MovieTrackingPlaneMarker *markers;   /* Markers in the plane track */
177         int markersnr;                       /* Count of markers in track (size of markers array) */
178
179         int flag;    /* flags (selection, ...) */
180
181         /* Runtime data */
182         int last_marker, pad2;               /* Most recently used marker */
183 } MovieTrackingPlaneTrack;
184
185 typedef struct MovieTrackingSettings {
186         int flag;
187
188         /* ** default tracker settings */
189         short default_motion_model;         /* model of the motion for this track */
190         short default_algorithm_flag;       /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
191         float default_minimum_correlation;  /* minimal correlation which is still treated as successful tracking */
192         short default_pattern_size;         /* size of pattern area for new tracks */
193         short default_search_size;          /* size of search area for new tracks */
194         short default_frames_limit;         /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
195         short default_margin;               /* margin from frame boundaries */
196         short default_pattern_match;        /* re-adjust every N frames */
197         short default_flag;                 /* default flags like color channels used by default */
198
199         short motion_flag;      /* flags describes motion type */
200
201         /* ** common tracker settings ** */
202         short speed;            /* speed of tracking */
203
204         /* ** reconstruction settings ** */
205         int keyframe1 DNA_DEPRECATED,
206                 keyframe2 DNA_DEPRECATED;   /* two keyframes for reconstruction initialization
207                                              * were moved to per-tracking object settings
208                                              */
209
210         int reconstruction_flag, pad;
211
212         /* which camera intrinsics to refine. uses on the REFINE_* flags */
213         short refine_camera_intrinsics, pad2;
214
215         /* ** tool settings ** */
216
217         /* set scale */
218         float dist;                 /* distance between two bundles used for scene scaling */
219
220         /* cleanup */
221         int clean_frames, clean_action;
222         float clean_error;
223
224         /* set object scale */
225         float object_distance;      /* distance between two bundles used for object scaling */
226
227         int pad3;
228 } MovieTrackingSettings;
229
230 typedef struct MovieTrackingStabilization {
231         int flag;
232         int tot_track, act_track;       /* total number and index of active track in list */
233
234         /* 2d stabilization */
235         float maxscale;         /* max auto-scale factor */
236         MovieTrackingTrack *rot_track;  /* track used to stabilize rotation */
237
238         float locinf, scaleinf, rotinf; /* influence on location, scale and rotation */
239
240         int filter;     /* filter used for pixel interpolation */
241
242         /* some pre-computing run-time variables */
243         int ok;                     /* are precomputed values and scaled buf relevant? */
244         float scale;                /* autoscale factor */
245 } MovieTrackingStabilization;
246
247 typedef struct MovieTrackingReconstruction {
248         int flag;
249
250         float error;        /* average error of reconstruction */
251
252         int last_camera;        /* most recently used camera */
253         int camnr;              /* number of reconstructed cameras */
254         struct MovieReconstructedCamera *cameras;   /* reconstructed cameras */
255 } MovieTrackingReconstruction;
256
257 typedef struct MovieTrackingObject {
258         struct MovieTrackingObject *next, *prev;
259
260         char name[64];          /* Name of tracking object, MAX_NAME */
261         int flag;
262         float scale;            /* scale of object solution in amera space */
263
264         ListBase tracks;        /* list of tracks use to tracking this object */
265         ListBase plane_tracks;  /* list of plane tracks used by this object */
266         MovieTrackingReconstruction reconstruction; /* reconstruction data for this object */
267
268         /* reconstruction options */
269         int keyframe1, keyframe2;   /* two keyframes for reconstruction initialization */
270 } MovieTrackingObject;
271
272 typedef struct MovieTrackingStats {
273         char message[256];
274 } MovieTrackingStats;
275
276 typedef struct MovieTrackingDopesheetChannel {
277         struct MovieTrackingDopesheetChannel *next, *prev;
278
279         MovieTrackingTrack *track;  /* motion track for which channel is created */
280         int pad;
281
282         char name[64];          /* name of channel */
283
284         int tot_segment;        /* total number of segments */
285         int *segments;          /* tracked segments */
286         int max_segment, total_frames;  /* longest segment length and total number of tracked frames */
287 } MovieTrackingDopesheetChannel;
288
289 typedef struct MovieTrackingDopesheetCoverageSegment {
290         struct MovieTrackingDopesheetCoverageSegment *next, *prev;
291
292         int coverage;
293         int start_frame;
294         int end_frame;
295
296         int pad;
297 } MovieTrackingDopesheetCoverageSegment;
298
299 typedef struct MovieTrackingDopesheet {
300         int ok;                     /* flag if dopesheet information is still relevant */
301
302         short sort_method;          /* method to be used to sort tracks */
303         short flag;                 /* dopesheet building flag such as inverted order of sort */
304
305         /* ** runtime stuff ** */
306
307         /* summary */
308         ListBase coverage_segments;
309
310         /* detailed */
311         ListBase channels;
312         int tot_channel;
313
314         int pad;
315 } MovieTrackingDopesheet;
316
317 typedef struct MovieTracking {
318         MovieTrackingSettings settings; /* different tracking-related settings */
319         MovieTrackingCamera camera;     /* camera intrinsics */
320         ListBase tracks;                /* list of tracks used for camera object */
321         ListBase plane_tracks;          /* list of plane tracks used by camera object */
322         MovieTrackingReconstruction reconstruction; /* reconstruction data for camera object */
323         MovieTrackingStabilization stabilization;   /* stabilization data */
324         MovieTrackingTrack *act_track;             /* active track */
325         MovieTrackingPlaneTrack *act_plane_track;  /* active plane track */
326
327         ListBase objects;
328         int objectnr, tot_object;       /* index of active object and total number of objects */
329
330         MovieTrackingStats *stats;      /* statistics displaying in clip editor */
331
332         MovieTrackingDopesheet dopesheet;   /* dopesheet data */
333 } MovieTracking;
334
335 /* MovieTrackingCamera->units */
336 enum {
337         CAMERA_UNITS_PX = 0,
338         CAMERA_UNITS_MM = 1
339 };
340
341 /* MovieTrackingMarker->flag */
342 enum {
343         MARKER_DISABLED    = (1 << 0),
344         MARKER_TRACKED     = (1 << 1),
345         MARKER_GRAPH_SEL_X = (1 << 2),
346         MARKER_GRAPH_SEL_Y = (1 << 3),
347         MARKER_GRAPH_SEL   = (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)
348 };
349
350 /* MovieTrackingTrack->flag */
351 enum {
352         TRACK_HAS_BUNDLE        = (1 << 1),
353         TRACK_DISABLE_RED       = (1 << 2),
354         TRACK_DISABLE_GREEN     = (1 << 3),
355         TRACK_DISABLE_BLUE      = (1 << 4),
356         TRACK_HIDDEN            = (1 << 5),
357         TRACK_LOCKED            = (1 << 6),
358         TRACK_CUSTOMCOLOR       = (1 << 7),
359         TRACK_USE_2D_STAB       = (1 << 8),
360         TRACK_PREVIEW_GRAYSCALE = (1 << 9),
361         TRACK_DOPE_SEL          = (1 << 10),
362         TRACK_PREVIEW_ALPHA     = (1 << 11)
363 };
364
365 /* MovieTrackingTrack->motion_model */
366 enum {
367         TRACK_MOTION_MODEL_TRANSLATION                 = 0,
368         TRACK_MOTION_MODEL_TRANSLATION_ROTATION        = 1,
369         TRACK_MOTION_MODEL_TRANSLATION_SCALE           = 2,
370         TRACK_MOTION_MODEL_TRANSLATION_ROTATION_SCALE  = 3,
371         TRACK_MOTION_MODEL_AFFINE                      = 4,
372         TRACK_MOTION_MODEL_HOMOGRAPHY                  = 5
373 };
374
375 /* MovieTrackingTrack->algorithm_flag */
376 enum {
377         TRACK_ALGORITHM_FLAG_USE_BRUTE                  = (1 << 0),
378         TRACK_ALGORITHM_FLAG_USE_NORMALIZATION  = (1 << 2),
379         TRACK_ALGORITHM_FLAG_USE_MASK                   = (1 << 3)
380 };
381
382 /* MovieTrackingTrack->adjframes */
383 enum {
384         TRACK_MATCH_KEYFRAME  = 0,
385         TRACK_MATCH_PREVFRAME = 1
386 };
387
388 /* MovieTrackingSettings->flag */
389 enum {
390         TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0)
391 };
392
393 /* MovieTrackingSettings->motion_flag */
394 enum {
395         TRACKING_MOTION_TRIPOD = (1 << 0),
396
397         TRACKING_MOTION_MODAL  = (TRACKING_MOTION_TRIPOD)
398 };
399
400 /* MovieTrackingSettings->speed */
401 enum {
402         TRACKING_SPEED_FASTEST  = 0,
403         TRACKING_SPEED_REALTIME = 1,
404         TRACKING_SPEED_HALF     = 2,
405         TRACKING_SPEED_QUARTER  = 4,
406         TRACKING_SPEED_DOUBLE   = 5
407 };
408
409 /* MovieTrackingSettings->reconstruction_flag */
410 enum {
411         /* TRACKING_USE_FALLBACK_RECONSTRUCTION = (1 << 0), */  /* DEPRECATED */
412         TRACKING_USE_KEYFRAME_SELECTION      = (1 << 1)
413 };
414
415 /* MovieTrackingSettings->refine_camera_intrinsics */
416 enum {
417         REFINE_FOCAL_LENGTH         = (1 << 0),
418         REFINE_PRINCIPAL_POINT      = (1 << 1),
419         REFINE_RADIAL_DISTORTION_K1 = (1 << 2),
420         REFINE_RADIAL_DISTORTION_K2 = (1 << 4)
421 };
422
423 /* MovieTrackingStrabilization->flag */
424 enum {
425         TRACKING_2D_STABILIZATION   = (1 << 0),
426         TRACKING_AUTOSCALE          = (1 << 1),
427         TRACKING_STABILIZE_ROTATION = (1 << 2)
428 };
429
430 /* MovieTrackingStrabilization->filter */
431 enum {
432         TRACKING_FILTER_NEAREST  = 0,
433         TRACKING_FILTER_BILINEAR = 1,
434         TRACKING_FILTER_BICUBIC  = 2
435 };
436
437 /* MovieTrackingReconstruction->flag */
438 enum {
439         TRACKING_RECONSTRUCTED = (1 << 0)
440 };
441
442 /* MovieTrackingObject->flag */
443 enum {
444         TRACKING_OBJECT_CAMERA = (1 << 0)
445 };
446
447 enum {
448         TRACKING_CLEAN_SELECT         = 0,
449         TRACKING_CLEAN_DELETE_TRACK   = 1,
450         TRACKING_CLEAN_DELETE_SEGMENT = 2
451 };
452
453 /* MovieTrackingDopesheet->sort_method */
454 enum {
455         TRACKING_DOPE_SORT_NAME          = 0,
456         TRACKING_DOPE_SORT_LONGEST       = 1,
457         TRACKING_DOPE_SORT_TOTAL         = 2,
458         TRACKING_DOPE_SORT_AVERAGE_ERROR = 3
459 };
460
461 /* MovieTrackingDopesheet->flag */
462 enum {
463         TRACKING_DOPE_SORT_INVERSE  = (1 << 0),
464         TRACKING_DOPE_SELECTED_ONLY = (1 << 1),
465         TRACKING_DOPE_SHOW_HIDDEN   = (1 << 2)
466 };
467
468 /* MovieTrackingDopesheetCoverageSegment->trackness */
469 enum {
470         TRACKING_COVERAGE_BAD        = 0,
471         TRACKING_COVERAGE_ACCEPTABLE = 1,
472         TRACKING_COVERAGE_OK         = 2
473 };
474
475 /* MovieTrackingPlaneMarker->flag */
476 enum {
477         PLANE_MARKER_DISABLED = (1 << 0),
478         PLANE_MARKER_TRACKED  = (1 << 1),
479 };
480
481 /* MovieTrackingPlaneTrack->flag */
482 enum {
483         PLANE_TRACK_HIDDEN  = (1 << 1),
484         PLANE_TRACK_LOCKED  = (1 << 2),
485         PLANE_TRACK_AUTOKEY = (1 << 3),
486 };
487
488 #endif  /* __DNA_TRACKING_TYPES_H__ */