Merge remote-tracking branch 'origin/master' into blender2.8
[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 Image;
47 struct MovieReconstructedCamera;
48 struct MovieTrackingCamera;
49 struct MovieTrackingMarker;
50 struct MovieTrackingTrack;
51 struct MovieTracking;
52
53 typedef struct MovieReconstructedCamera {
54         int framenr;
55         float error;
56         float mat[4][4];
57 } MovieReconstructedCamera;
58
59 typedef struct MovieTrackingCamera {
60         void *intrinsics;   /* intrinsics handle */
61
62         short distortion_model;
63         short pad;
64
65         float sensor_width; /* width of CCD sensor */
66         float pixel_aspect; /* pixel aspect ratio */
67         float focal;        /* focal length */
68         short units;        /* units of focal length user is working with */
69         short pad1;
70         float principal[2]; /* principal point */
71
72         /* Polynomial distortion */
73         float k1, k2, k3;   /* polynomial radial distortion */
74
75         /* Division distortion model coefficients */
76         float division_k1, division_k2;
77 } MovieTrackingCamera;
78
79 typedef struct MovieTrackingMarker {
80         float pos[2];   /* 2d position of marker on frame (in unified 0..1 space) */
81
82         /* corners of pattern in the following order:
83          *
84          *       Y
85          *       ^
86          *       | (3) --- (2)
87          *       |  |       |
88          *       |  |       |
89          *       |  |       |
90          *       | (0) --- (1)
91          *       +-------------> X
92          *
93          * the coordinates are stored relative to pos.
94          */
95         float pattern_corners[4][2];
96
97         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
98          * relative to marker->pos
99          */
100         float search_min[2], search_max[2];
101
102         int framenr;    /* number of frame marker is associated with */
103         int flag;       /* Marker's flag (alive, ...) */
104 } MovieTrackingMarker;
105
106 typedef struct MovieTrackingTrack {
107         struct MovieTrackingTrack *next, *prev;
108
109         char name[64];  /* MAX_NAME */
110
111         /* ** settings ** */
112
113         /* positions of left-bottom and right-top corners of pattern (in unified 0..1 units,
114          * relative to marker->pos)
115          * moved to marker's corners since planar tracking implementation
116          */
117         float pat_min[2] DNA_DEPRECATED, pat_max[2] DNA_DEPRECATED;
118
119         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
120          * relative to marker->pos
121          * moved to marker since affine tracking implementation
122          */
123         float search_min[2] DNA_DEPRECATED, search_max[2] DNA_DEPRECATED;
124
125         float offset[2];                    /* offset to "parenting" point */
126
127         /* ** track ** */
128         int markersnr;                  /* count of markers in track */
129         int last_marker;                /* most recently used marker */
130         MovieTrackingMarker *markers;   /* markers in track */
131
132         /* ** reconstruction data ** */
133         float bundle_pos[3];            /* reconstructed position */
134         float error;                    /* average track reprojection error */
135
136         /* ** UI editing ** */
137         int flag, pat_flag, search_flag;    /* flags (selection, ...) */
138         float color[3];                     /* custom color for track */
139
140         /* ** control how tracking happens */
141         short frames_limit;     /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
142         short margin;           /* margin from frame boundaries */
143         short pattern_match;    /* re-adjust every N frames */
144
145         /* tracking parameters */
146         short motion_model;     /* model of the motion for this track */
147         int algorithm_flag;    /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
148         float minimum_correlation;          /* minimal correlation which is still treated as successful tracking */
149
150         struct bGPdata *gpd;        /* grease-pencil data */
151
152         /* Weight of this track.
153          *
154          * Weight defines how much the track affects on the final reconstruction,
155          * usually gets animated in a way so when track has just appeared it's
156          * weight is zero and then it gets faded up.
157          *
158          * Used to prevent jumps of the camera when tracks are appearing or
159          * disappearing.
160          */
161         float weight;
162
163         /* track weight especially for 2D stabilization */
164         float weight_stab;
165 } MovieTrackingTrack;
166
167 typedef struct MovieTrackingPlaneMarker {
168         /* Corners of the plane in the following order:
169          *
170          *       Y
171          *       ^
172          *       | (3) --- (2)
173          *       |  |       |
174          *       |  |       |
175          *       |  |       |
176          *       | (0) --- (1)
177          *       +-------------> X
178          *
179          * The coordinates are stored in frame normalized coordinates.
180          */
181         float corners[4][2];
182
183         int framenr;    /* Number of frame plane marker is associated with */
184         int flag;       /* Marker's flag (alive, ...) */
185 } MovieTrackingPlaneMarker;
186
187 typedef struct MovieTrackingPlaneTrack {
188         struct MovieTrackingPlaneTrack *next, *prev;
189
190         char name[64];  /* MAX_NAME */
191
192         MovieTrackingTrack **point_tracks;  /* Array of point tracks used to define this plane.
193                                              * Each element is a pointer to MovieTrackingTrack. */
194         int point_tracksnr, pad;  /* Number of tracks in point_tracks array. */
195
196         MovieTrackingPlaneMarker *markers;   /* Markers in the plane track */
197         int markersnr;                       /* Count of markers in track (size of markers array) */
198
199         int flag;    /* flags (selection, ...) */
200
201         struct Image *image;                 /* Image displaying during editing */
202         float image_opacity;                 /* Opacity of the image */
203
204         /* Runtime data */
205         int last_marker;                     /* Most recently used marker */
206 } MovieTrackingPlaneTrack;
207
208 typedef struct MovieTrackingSettings {
209         int flag;
210
211         /* ** default tracker settings */
212         short default_motion_model;         /* model of the motion for this track */
213         short default_algorithm_flag;       /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
214         float default_minimum_correlation;  /* minimal correlation which is still treated as successful tracking */
215         short default_pattern_size;         /* size of pattern area for new tracks */
216         short default_search_size;          /* size of search area for new tracks */
217         short default_frames_limit;         /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
218         short default_margin;               /* margin from frame boundaries */
219         short default_pattern_match;        /* re-adjust every N frames */
220         short default_flag;                 /* default flags like color channels used by default */
221         float default_weight;               /* default weight of the track */
222
223         short motion_flag;      /* flags describes motion type */
224
225         /* ** common tracker settings ** */
226         short speed;            /* speed of tracking */
227
228         /* ** reconstruction settings ** */
229         int keyframe1 DNA_DEPRECATED,
230                 keyframe2 DNA_DEPRECATED;   /* two keyframes for reconstruction initialization
231                                              * were moved to per-tracking object settings
232                                              */
233
234         int reconstruction_flag;
235
236         /* which camera intrinsics to refine. uses on the REFINE_* flags */
237         short refine_camera_intrinsics, pad2;
238
239         /* ** tool settings ** */
240
241         /* set scale */
242         float dist;                 /* distance between two bundles used for scene scaling */
243
244         /* cleanup */
245         int clean_frames, clean_action;
246         float clean_error;
247
248         /* set object scale */
249         float object_distance;      /* distance between two bundles used for object scaling */
250
251         int pad3;
252 } MovieTrackingSettings;
253
254 typedef struct MovieTrackingStabilization {
255         int flag;
256         int tot_track, act_track;               /* total number of translation tracks and index of active track in list */
257         int tot_rot_track, act_rot_track;       /* total number of rotation tracks and index of active track in list */
258
259         /* 2d stabilization */
260         float maxscale;         /* max auto-scale factor */
261         MovieTrackingTrack *rot_track DNA_DEPRECATED;  /* use TRACK_USE_2D_STAB_ROT on individual tracks instead */
262
263         int anchor_frame;               /* reference point to anchor stabilization offset */
264         float target_pos[2];    /* expected target position of frame after raw stabilization, will be subtracted */
265         float target_rot;       /* expected target rotation of frame after raw stabilization, will be compensated */
266         float scale;                    /* zoom factor known to be present on original footage. Also used for autoscale */
267
268         float locinf, scaleinf, rotinf; /* influence on location, scale and rotation */
269
270         int filter;     /* filter used for pixel interpolation */
271
272         /* initialization and run-time data */
273         int ok DNA_DEPRECATED;  /* Without effect now, we initialize on every frame. Formerly used for caching of init values */
274 } MovieTrackingStabilization;
275
276 typedef struct MovieTrackingReconstruction {
277         int flag;
278
279         float error;        /* average error of reconstruction */
280
281         int last_camera;        /* most recently used camera */
282         int camnr;              /* number of reconstructed cameras */
283         struct MovieReconstructedCamera *cameras;   /* reconstructed cameras */
284 } MovieTrackingReconstruction;
285
286 typedef struct MovieTrackingObject {
287         struct MovieTrackingObject *next, *prev;
288
289         char name[64];          /* Name of tracking object, MAX_NAME */
290         int flag;
291         float scale;            /* scale of object solution in amera space */
292
293         ListBase tracks;        /* list of tracks use to tracking this object */
294         ListBase plane_tracks;  /* list of plane tracks used by this object */
295         MovieTrackingReconstruction reconstruction; /* reconstruction data for this object */
296
297         /* reconstruction options */
298         int keyframe1, keyframe2;   /* two keyframes for reconstruction initialization */
299 } MovieTrackingObject;
300
301 typedef struct MovieTrackingStats {
302         char message[256];
303 } MovieTrackingStats;
304
305 typedef struct MovieTrackingDopesheetChannel {
306         struct MovieTrackingDopesheetChannel *next, *prev;
307
308         MovieTrackingTrack *track;  /* motion track for which channel is created */
309         int pad;
310
311         char name[64];          /* name of channel */
312
313         int tot_segment;        /* total number of segments */
314         int *segments;          /* tracked segments */
315         int max_segment, total_frames;  /* longest segment length and total number of tracked frames */
316 } MovieTrackingDopesheetChannel;
317
318 typedef struct MovieTrackingDopesheetCoverageSegment {
319         struct MovieTrackingDopesheetCoverageSegment *next, *prev;
320
321         int coverage;
322         int start_frame;
323         int end_frame;
324
325         int pad;
326 } MovieTrackingDopesheetCoverageSegment;
327
328 typedef struct MovieTrackingDopesheet {
329         int ok;                     /* flag if dopesheet information is still relevant */
330
331         short sort_method;          /* method to be used to sort tracks */
332         short flag;                 /* dopesheet building flag such as inverted order of sort */
333
334         /* ** runtime stuff ** */
335
336         /* summary */
337         ListBase coverage_segments;
338
339         /* detailed */
340         ListBase channels;
341         int tot_channel;
342
343         int pad;
344 } MovieTrackingDopesheet;
345
346 typedef struct MovieTracking {
347         MovieTrackingSettings settings; /* different tracking-related settings */
348         MovieTrackingCamera camera;     /* camera intrinsics */
349         ListBase tracks;                /* list of tracks used for camera object */
350         ListBase plane_tracks;          /* list of plane tracks used by camera object */
351         MovieTrackingReconstruction reconstruction; /* reconstruction data for camera object */
352         MovieTrackingStabilization stabilization;   /* stabilization data */
353         MovieTrackingTrack *act_track;             /* active track */
354         MovieTrackingPlaneTrack *act_plane_track;  /* active plane track */
355
356         ListBase objects;
357         int objectnr, tot_object;       /* index of active object and total number of objects */
358
359         MovieTrackingStats *stats;      /* statistics displaying in clip editor */
360
361         MovieTrackingDopesheet dopesheet;   /* dopesheet data */
362 } MovieTracking;
363
364 /* MovieTrackingCamera->distortion_model */
365 enum {
366         TRACKING_DISTORTION_MODEL_POLYNOMIAL = 0,
367         TRACKING_DISTORTION_MODEL_DIVISION = 1
368 };
369
370 /* MovieTrackingCamera->units */
371 enum {
372         CAMERA_UNITS_PX = 0,
373         CAMERA_UNITS_MM = 1
374 };
375
376 /* MovieTrackingMarker->flag */
377 enum {
378         MARKER_DISABLED    = (1 << 0),
379         MARKER_TRACKED     = (1 << 1),
380         MARKER_GRAPH_SEL_X = (1 << 2),
381         MARKER_GRAPH_SEL_Y = (1 << 3),
382         MARKER_GRAPH_SEL   = (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)
383 };
384
385 /* MovieTrackingTrack->flag */
386 enum {
387         TRACK_HAS_BUNDLE        = (1 << 1),
388         TRACK_DISABLE_RED       = (1 << 2),
389         TRACK_DISABLE_GREEN     = (1 << 3),
390         TRACK_DISABLE_BLUE      = (1 << 4),
391         TRACK_HIDDEN            = (1 << 5),
392         TRACK_LOCKED            = (1 << 6),
393         TRACK_CUSTOMCOLOR       = (1 << 7),
394         TRACK_USE_2D_STAB       = (1 << 8),
395         TRACK_PREVIEW_GRAYSCALE = (1 << 9),
396         TRACK_DOPE_SEL          = (1 << 10),
397         TRACK_PREVIEW_ALPHA     = (1 << 11),
398         TRACK_USE_2D_STAB_ROT   = (1 << 12)
399 };
400
401 /* MovieTrackingTrack->motion_model */
402 enum {
403         TRACK_MOTION_MODEL_TRANSLATION                 = 0,
404         TRACK_MOTION_MODEL_TRANSLATION_ROTATION        = 1,
405         TRACK_MOTION_MODEL_TRANSLATION_SCALE           = 2,
406         TRACK_MOTION_MODEL_TRANSLATION_ROTATION_SCALE  = 3,
407         TRACK_MOTION_MODEL_AFFINE                      = 4,
408         TRACK_MOTION_MODEL_HOMOGRAPHY                  = 5
409 };
410
411 /* MovieTrackingTrack->algorithm_flag */
412 enum {
413         TRACK_ALGORITHM_FLAG_USE_BRUTE                  = (1 << 0),
414         TRACK_ALGORITHM_FLAG_USE_NORMALIZATION  = (1 << 2),
415         TRACK_ALGORITHM_FLAG_USE_MASK                   = (1 << 3)
416 };
417
418 /* MovieTrackingTrack->adjframes */
419 enum {
420         TRACK_MATCH_KEYFRAME  = 0,
421         TRACK_MATCH_PREVFRAME = 1
422 };
423
424 /* MovieTrackingSettings->flag */
425 enum {
426         TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0),
427         TRACKING_SETTINGS_SHOW_EXTRA_EXPANDED = (1 << 1)
428 };
429
430 /* MovieTrackingSettings->motion_flag */
431 enum {
432         TRACKING_MOTION_TRIPOD = (1 << 0),
433
434         TRACKING_MOTION_MODAL  = (TRACKING_MOTION_TRIPOD)
435 };
436
437 /* MovieTrackingSettings->speed */
438 enum {
439         TRACKING_SPEED_FASTEST  = 0,
440         TRACKING_SPEED_REALTIME = 1,
441         TRACKING_SPEED_HALF     = 2,
442         TRACKING_SPEED_QUARTER  = 4,
443         TRACKING_SPEED_DOUBLE   = 5
444 };
445
446 /* MovieTrackingSettings->reconstruction_flag */
447 enum {
448         /* TRACKING_USE_FALLBACK_RECONSTRUCTION = (1 << 0), */  /* DEPRECATED */
449         TRACKING_USE_KEYFRAME_SELECTION      = (1 << 1)
450 };
451
452 /* MovieTrackingSettings->refine_camera_intrinsics */
453 enum {
454         REFINE_FOCAL_LENGTH         = (1 << 0),
455         REFINE_PRINCIPAL_POINT      = (1 << 1),
456         REFINE_RADIAL_DISTORTION_K1 = (1 << 2),
457         REFINE_RADIAL_DISTORTION_K2 = (1 << 4)
458 };
459
460 /* MovieTrackingStrabilization->flag */
461 enum {
462         TRACKING_2D_STABILIZATION   = (1 << 0),
463         TRACKING_AUTOSCALE          = (1 << 1),
464         TRACKING_STABILIZE_ROTATION = (1 << 2),
465         TRACKING_STABILIZE_SCALE    = (1 << 3),
466         TRACKING_SHOW_STAB_TRACKS   = (1 << 5)
467 };
468
469 /* MovieTrackingStrabilization->filter */
470 enum {
471         TRACKING_FILTER_NEAREST  = 0,
472         TRACKING_FILTER_BILINEAR = 1,
473         TRACKING_FILTER_BICUBIC  = 2
474 };
475
476 /* MovieTrackingReconstruction->flag */
477 enum {
478         TRACKING_RECONSTRUCTED = (1 << 0)
479 };
480
481 /* MovieTrackingObject->flag */
482 enum {
483         TRACKING_OBJECT_CAMERA = (1 << 0)
484 };
485
486 enum {
487         TRACKING_CLEAN_SELECT         = 0,
488         TRACKING_CLEAN_DELETE_TRACK   = 1,
489         TRACKING_CLEAN_DELETE_SEGMENT = 2
490 };
491
492 /* MovieTrackingDopesheet->sort_method */
493 enum {
494         TRACKING_DOPE_SORT_NAME          = 0,
495         TRACKING_DOPE_SORT_LONGEST       = 1,
496         TRACKING_DOPE_SORT_TOTAL         = 2,
497         TRACKING_DOPE_SORT_AVERAGE_ERROR = 3
498 };
499
500 /* MovieTrackingDopesheet->flag */
501 enum {
502         TRACKING_DOPE_SORT_INVERSE  = (1 << 0),
503         TRACKING_DOPE_SELECTED_ONLY = (1 << 1),
504         TRACKING_DOPE_SHOW_HIDDEN   = (1 << 2)
505 };
506
507 /* MovieTrackingDopesheetCoverageSegment->trackness */
508 enum {
509         TRACKING_COVERAGE_BAD        = 0,
510         TRACKING_COVERAGE_ACCEPTABLE = 1,
511         TRACKING_COVERAGE_OK         = 2
512 };
513
514 /* MovieTrackingPlaneMarker->flag */
515 enum {
516         PLANE_MARKER_DISABLED = (1 << 0),
517         PLANE_MARKER_TRACKED  = (1 << 1),
518 };
519
520 /* MovieTrackingPlaneTrack->flag */
521 enum {
522         PLANE_TRACK_HIDDEN  = (1 << 1),
523         PLANE_TRACK_LOCKED  = (1 << 2),
524         PLANE_TRACK_AUTOKEY = (1 << 3),
525 };
526
527 #endif  /* __DNA_TRACKING_TYPES_H__ */