Merged changes in the trunk up to revision 53146.
[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
35 #ifndef __DNA_TRACKING_TYPES_H__
36 #define __DNA_TRACKING_TYPES_H__
37
38 #include "DNA_defs.h"
39 #include "DNA_listBase.h"
40
41 /* match-moving data */
42
43 struct bGPdata;
44 struct ImBuf;
45 struct MovieReconstructedCamera;
46 struct MovieTrackingCamera;
47 struct MovieTrackingBundle;
48 struct MovieTrackingMarker;
49 struct MovieTrackingTrack;
50 struct MovieTracking;
51
52 typedef struct MovieReconstructedCamera {
53         int framenr;
54         float error;
55         float mat[4][4];
56 } MovieReconstructedCamera;
57
58 typedef struct MovieTrackingCamera {
59         void *intrinsics;   /* intrinsics handle */
60
61         float sensor_width; /* width of CCD sensor */
62         float pixel_aspect; /* pixel aspect ratio */
63         float pad;
64         float focal;        /* focal length */
65         short units;        /* units of focal length user is working with */
66         short pad1;
67         float principal[2]; /* principal point */
68         float k1, k2, k3;   /* radial distortion */
69 } MovieTrackingCamera;
70
71 typedef struct MovieTrackingMarker {
72         float pos[2];   /* 2d position of marker on frame (in unified 0..1 space) */
73
74         /* corners of pattern in the following order:
75          *
76          *       Y
77          *       ^
78          *       | (3) --- (2)
79          *       |  |       |
80          *       |  |       |
81          *       |  |       |
82          *       | (0) --- (1)
83          *       +-------------> X
84          *
85          * the coordinates are stored relative to pos.
86          */
87         float pattern_corners[4][2];
88
89         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
90          * relative to marker->pos
91          */
92         float search_min[2], search_max[2];
93
94         int framenr;    /* number of frame marker is associated with */
95         int flag;       /* Marker's flag (alive, ...) */
96 } MovieTrackingMarker;
97
98 typedef struct MovieTrackingTrack {
99         struct MovieTrackingTrack *next, *prev;
100
101         char name[64];  /* MAX_NAME */
102
103         /* ** setings ** */
104
105         /* positions of left-bottom and right-top corners of pattern (in unified 0..1 units,
106          * relative to marker->pos)
107          * moved to marker's corners since planar tracking implementation
108          */
109         float pat_min[2] DNA_DEPRECATED, pat_max[2] DNA_DEPRECATED;
110
111         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
112          * relative to marker->pos
113          * moved to marker since affine tracking implementation
114          */
115         float search_min[2] DNA_DEPRECATED, search_max[2] DNA_DEPRECATED;
116
117         float offset[2];                    /* offset to "parenting" point */
118
119         /* ** track ** */
120         int markersnr;                  /* count of markers in track */
121         int last_marker;                /* most recently used marker */
122         MovieTrackingMarker *markers;   /* markers in track */
123
124         /* ** reconstruction data ** */
125         float bundle_pos[3];            /* reconstructed position */
126         float error;                    /* average track reprojection error */
127
128         /* ** UI editing ** */
129         int flag, pat_flag, search_flag;    /* flags (selection, ...) */
130         float color[3];                     /* custom color for track */
131
132         /* ** control how tracking happens */
133         short frames_limit;     /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
134         short margin;           /* margin from frame boundaries */
135         short pattern_match;    /* re-adjust every N frames */
136
137         /* tracking parameters */
138         short motion_model;     /* model of the motion for this track */
139         int algorithm_flag;    /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
140         float minimum_correlation;          /* minimal correlation which is still treated as successful tracking */
141
142         struct bGPdata *gpd;        /* grease-pencil data */
143 } MovieTrackingTrack;
144
145 typedef struct MovieTrackingSettings {
146         int flag;
147
148         /* ** default tracker settings */
149         short default_motion_model;         /* model of the motion for this track */
150         short default_algorithm_flag;       /* flags for the tracking algorithm (use brute, use esm, use pyramid, etc */
151         float default_minimum_correlation;  /* minimal correlation which is still treated as successful tracking */
152         short default_pattern_size;         /* size of pattern area for new tracks */
153         short default_search_size;          /* size of search area for new tracks */
154         short default_frames_limit;         /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
155         short default_margin;               /* margin from frame boundaries */
156         short default_pattern_match;        /* re-adjust every N frames */
157         short default_flag;                 /* default flags like color channels used by default */
158
159         short motion_flag;      /* flags describes motion type */
160
161         /* ** common tracker settings ** */
162         short speed;            /* speed of tracking */
163
164         /* ** reconstruction settings ** */
165         int keyframe1 DNA_DEPRECATED,
166                 keyframe2 DNA_DEPRECATED;   /* two keyframes for reconstruction initialization
167                                              * were moved to per-tracking object settings
168                                              */
169
170         float reconstruction_success_threshold;
171         int reconstruction_flag;
172
173         /* which camera intrinsics to refine. uses on the REFINE_* flags */
174         short refine_camera_intrinsics, pad2;
175
176         /* ** tool settings ** */
177
178         /* set scale */
179         float dist;                 /* distance between two bundles used for scene scaling */
180
181         /* cleanup */
182         int clean_frames, clean_action;
183         float clean_error;
184
185         /* set object scale */
186         float object_distance;      /* distance between two bundles used for object scaling */
187
188         int pad3;
189 } MovieTrackingSettings;
190
191 typedef struct MovieTrackingStabilization {
192         int flag;
193         int tot_track, act_track;       /* total number and index of active track in list */
194
195         /* 2d stabilization */
196         float maxscale;         /* max auto-scale factor */
197         MovieTrackingTrack *rot_track;  /* track used to stabilize rotation */
198
199         float locinf, scaleinf, rotinf; /* influence on location, scale and rotation */
200
201         int filter;     /* filter used for pixel interpolation */
202
203         /* some pre-computing run-time variables */
204         int ok;                     /* are precomputed values and scaled buf relevant? */
205         float scale;                /* autoscale factor */
206
207         struct ImBuf *scaleibuf;    /* currently scaled ibuf */
208 } MovieTrackingStabilization;
209
210 typedef struct MovieTrackingReconstruction {
211         int flag;
212
213         float error;        /* average error of reconstruction */
214
215         int last_camera;        /* most recently used camera */
216         int camnr;              /* number of reconstructed cameras */
217         struct MovieReconstructedCamera *cameras;   /* reconstructed cameras */
218 } MovieTrackingReconstruction;
219
220 typedef struct MovieTrackingObject {
221         struct MovieTrackingObject *next, *prev;
222
223         char name[64];          /* Name of tracking object, MAX_NAME */
224         int flag;
225         float scale;            /* scale of object solution in amera space */
226
227         ListBase tracks;        /* list of tracks use to tracking this object */
228         MovieTrackingReconstruction reconstruction; /* reconstruction data for this object */
229
230         /* reconstruction options */
231         int keyframe1, keyframe2;   /* two keyframes for reconstruction initialization */
232 } MovieTrackingObject;
233
234 typedef struct MovieTrackingStats {
235         char message[256];
236 } MovieTrackingStats;
237
238 typedef struct MovieTrackingDopesheetChannel {
239         struct MovieTrackingDopesheetChannel *next, *prev;
240
241         MovieTrackingTrack *track;  /* motion track for which channel is created */
242         int pad;
243
244         char name[64];          /* name of channel */
245
246         int tot_segment;        /* total number of segments */
247         int *segments;          /* tracked segments */
248         int max_segment, total_frames;  /* longest segment length and total number of tracked frames */
249 } MovieTrackingDopesheetChannel;
250
251 typedef struct MovieTrackingDopesheet {
252         int ok;                     /* flag if dopesheet information is still relevant */
253
254         short sort_method;          /* method to be used to sort tracks */
255         short flag;                 /* dopesheet building flag such as inverted order of sort */
256
257         /* runtime stuff */
258         ListBase channels;
259         int tot_channel;
260
261         int pad;
262 } MovieTrackingDopesheet;
263
264 typedef struct MovieTracking {
265         MovieTrackingSettings settings; /* different tracking-related settings */
266         MovieTrackingCamera camera;     /* camera intrinsics */
267         ListBase tracks;                /* list of tracks used for camera object */
268         MovieTrackingReconstruction reconstruction; /* reconstruction data for camera object */
269         MovieTrackingStabilization stabilization;   /* stabilization data */
270         MovieTrackingTrack *act_track;      /* active track */
271
272         ListBase objects;
273         int objectnr, tot_object;       /* index of active object and total number of objects */
274
275         MovieTrackingStats *stats;      /* statistics displaying in clip editor */
276
277         MovieTrackingDopesheet dopesheet;   /* dopesheet data */
278 } MovieTracking;
279
280 /* MovieTrackingCamera->units */
281 enum {
282         CAMERA_UNITS_PX = 0,
283         CAMERA_UNITS_MM = 1
284 };
285
286 /* MovieTrackingMarker->flag */
287 enum {
288         MARKER_DISABLED    = (1 << 0),
289         MARKER_TRACKED     = (1 << 1),
290         MARKER_GRAPH_SEL_X = (1 << 2),
291         MARKER_GRAPH_SEL_Y = (1 << 3),
292         MARKER_GRAPH_SEL   = (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y)
293 };
294
295 /* MovieTrackingTrack->flag */
296 enum {
297         TRACK_HAS_BUNDLE        = (1 << 1),
298         TRACK_DISABLE_RED       = (1 << 2),
299         TRACK_DISABLE_GREEN     = (1 << 3),
300         TRACK_DISABLE_BLUE      = (1 << 4),
301         TRACK_HIDDEN            = (1 << 5),
302         TRACK_LOCKED            = (1 << 6),
303         TRACK_CUSTOMCOLOR       = (1 << 7),
304         TRACK_USE_2D_STAB       = (1 << 8),
305         TRACK_PREVIEW_GRAYSCALE = (1 << 9),
306         TRACK_DOPE_SEL          = (1 << 10),
307         TRACK_PREVIEW_ALPHA     = (1 << 11)
308 };
309
310 /* MovieTrackingTrack->motion_model */
311 enum {
312         TRACK_MOTION_MODEL_TRANSLATION                 = 0,
313         TRACK_MOTION_MODEL_TRANSLATION_ROTATION        = 1,
314         TRACK_MOTION_MODEL_TRANSLATION_SCALE           = 2,
315         TRACK_MOTION_MODEL_TRANSLATION_ROTATION_SCALE  = 3,
316         TRACK_MOTION_MODEL_AFFINE                      = 4,
317         TRACK_MOTION_MODEL_HOMOGRAPHY                  = 5
318 };
319
320 /* MovieTrackingTrack->algorithm_flag */
321 enum {
322         TRACK_ALGORITHM_FLAG_USE_BRUTE                  = (1 << 0),
323         TRACK_ALGORITHM_FLAG_USE_NORMALIZATION  = (1 << 2),
324         TRACK_ALGORITHM_FLAG_USE_MASK                   = (1 << 3)
325 };
326
327 /* MovieTrackingTrack->adjframes */
328 enum {
329         TRACK_MATCH_KEYFRAME  = 0,
330         TRACK_MATCH_PREVFRAME = 1
331 };
332
333 /* MovieTrackingSettings->flag */
334 enum {
335         TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0)
336 };
337
338 /* MovieTrackingSettings->motion_flag */
339 enum {
340         TRACKING_MOTION_TRIPOD = (1 << 0),
341
342         TRACKING_MOTION_MODAL  = (TRACKING_MOTION_TRIPOD)
343 };
344
345 /* MovieTrackingSettings->speed */
346 enum {
347         TRACKING_SPEED_FASTEST  = 0,
348         TRACKING_SPEED_REALTIME = 1,
349         TRACKING_SPEED_HALF     = 2,
350         TRACKING_SPEED_QUARTER  = 4,
351         TRACKING_SPEED_DOUBLE   = 5
352 };
353
354 /* MovieTrackingObject->reconstruction_flag */
355 enum {
356         TRACKING_USE_FALLBACK_RECONSTRUCTION = (1 << 0)
357 };
358
359 /* MovieTrackingSettings->refine_camera_intrinsics */
360 enum {
361         REFINE_FOCAL_LENGTH         = (1 << 0),
362         REFINE_PRINCIPAL_POINT      = (1 << 1),
363         REFINE_RADIAL_DISTORTION_K1 = (1 << 2),
364         REFINE_RADIAL_DISTORTION_K2 = (1 << 4)
365 };
366
367 /* MovieTrackingStrabilization->flag */
368 enum {
369         TRACKING_2D_STABILIZATION   = (1 << 0),
370         TRACKING_AUTOSCALE          = (1 << 1),
371         TRACKING_STABILIZE_ROTATION = (1 << 2)
372 };
373
374 /* MovieTrackingStrabilization->filter */
375 enum {
376         TRACKING_FILTER_NEAREST  = 0,
377         TRACKING_FILTER_BILINEAR = 1,
378         TRACKING_FILTER_BICUBIC  = 2
379 };
380
381 /* MovieTrackingReconstruction->flag */
382 enum {
383         TRACKING_RECONSTRUCTED = (1 << 0)
384 };
385
386 /* MovieTrackingObject->flag */
387 enum {
388         TRACKING_OBJECT_CAMERA = (1 << 0)
389 };
390
391 enum {
392         TRACKING_CLEAN_SELECT         = 0,
393         TRACKING_CLEAN_DELETE_TRACK   = 1,
394         TRACKING_CLEAN_DELETE_SEGMENT = 2
395 };
396
397 /* MovieTrackingDopesheet->sort_method */
398 enum {
399         TRACKING_DOPE_SORT_NAME          = 0,
400         TRACKING_DOPE_SORT_LONGEST       = 1,
401         TRACKING_DOPE_SORT_TOTAL         = 2,
402         TRACKING_DOPE_SORT_AVERAGE_ERROR = 3
403 };
404
405 /* MovieTrackingDopesheet->flag */
406 enum {
407         TRACKING_DOPE_SORT_INVERSE  = (1 << 0),
408         TRACKING_DOPE_SELECTED_ONLY = (1 << 1),
409         TRACKING_DOPE_SHOW_HIDDEN   = (1 << 2)
410 };
411
412 #endif