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