Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_tracking_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2011 Blender Foundation.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup DNA
21  *
22  * Structs used for camera tracking and the movie-clip editor.
23  */
24
25 #ifndef __DNA_TRACKING_TYPES_H__
26 #define __DNA_TRACKING_TYPES_H__
27
28 #include "DNA_defs.h"
29 #include "DNA_listBase.h"
30
31 /* match-moving data */
32
33 struct Image;
34 struct MovieReconstructedCamera;
35 struct MovieTracking;
36 struct MovieTrackingCamera;
37 struct MovieTrackingMarker;
38 struct MovieTrackingTrack;
39 struct bGPdata;
40
41 typedef struct MovieReconstructedCamera {
42         int framenr;
43         float error;
44         float mat[4][4];
45 } MovieReconstructedCamera;
46
47 typedef struct MovieTrackingCamera {
48         /** Intrinsics handle. */
49         void *intrinsics;
50
51         short distortion_model;
52         short pad;
53
54         /** Width of CCD sensor. */
55         float sensor_width;
56         /** Pixel aspect ratio. */
57         float pixel_aspect;
58         /** Focal length. */
59         float focal;
60         /** Units of focal length user is working with. */
61         short units;
62         short pad1;
63         /** Principal point. */
64         float principal[2];
65
66         /* Polynomial distortion */
67         /** Polynomial radial distortion. */
68         float k1, k2, k3;
69
70         /* Division distortion model coefficients */
71         float division_k1, division_k2;
72 } MovieTrackingCamera;
73
74 typedef struct MovieTrackingMarker {
75         /** 2d position of marker on frame (in unified 0..1 space). */
76         float pos[2];
77
78         /* corners of pattern in the following order:
79          *
80          *       Y
81          *       ^
82          *       | (3) --- (2)
83          *       |  |       |
84          *       |  |       |
85          *       |  |       |
86          *       | (0) --- (1)
87          *       +-------------> X
88          *
89          * the coordinates are stored relative to pos.
90          */
91         float pattern_corners[4][2];
92
93         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
94          * relative to marker->pos
95          */
96         float search_min[2], search_max[2];
97
98         /** Number of frame marker is associated with. */
99         int framenr;
100         /** Marker's flag (alive, ...). */
101         int flag;
102 } MovieTrackingMarker;
103
104 typedef struct MovieTrackingTrack {
105         struct MovieTrackingTrack *next, *prev;
106
107         /** MAX_NAME. */
108         char name[64];
109
110         /* ** settings ** */
111
112         /* positions of left-bottom and right-top corners of pattern (in unified 0..1 units,
113          * relative to marker->pos)
114          * moved to marker's corners since planar tracking implementation
115          */
116         float pat_min[2] DNA_DEPRECATED, pat_max[2] DNA_DEPRECATED;
117
118         /* positions of left-bottom and right-top corners of search area (in unified 0..1 units,
119          * relative to marker->pos
120          * moved to marker since affine tracking implementation
121          */
122         float search_min[2] DNA_DEPRECATED, search_max[2] DNA_DEPRECATED;
123
124         /** Offset to "parenting" point. */
125         float offset[2];
126
127         /* ** track ** */
128         /** Count of markers in track. */
129         int markersnr;
130         /** Most recently used marker. */
131         int last_marker;
132         /** Markers in track. */
133         MovieTrackingMarker *markers;
134
135         /* ** reconstruction data ** */
136         /** Reconstructed position. */
137         float bundle_pos[3];
138         /** Average track reprojection error. */
139         float error;
140
141         /* ** UI editing ** */
142         /** Flags (selection, ...). */
143         int flag, pat_flag, search_flag;
144         /** Custom color for track. */
145         float color[3];
146
147         /* ** control how tracking happens */
148         /**
149          * Number of frames to be tarcked during single tracking session
150          * (if TRACKING_FRAMES_LIMIT is set).
151          */
152         short frames_limit;
153         /** Margin from frame boundaries. */
154         short margin;
155         /** Re-adjust every N frames. */
156         short pattern_match;
157
158         /* tracking parameters */
159         /** Model of the motion for this track. */
160         short motion_model;
161         /** Flags for the tracking algorithm (use brute, use esm, use pyramid, etc. */
162         int algorithm_flag;
163         /** Minimal correlation which is still treated as successful tracking. */
164         float minimum_correlation;
165
166         /** Grease-pencil data. */
167         struct bGPdata *gpd;
168
169         /* Weight of this track.
170          *
171          * Weight defines how much the track affects on the final reconstruction,
172          * usually gets animated in a way so when track has just appeared it's
173          * weight is zero and then it gets faded up.
174          *
175          * Used to prevent jumps of the camera when tracks are appearing or
176          * disappearing.
177          */
178         float weight;
179
180         /* track weight especially for 2D stabilization */
181         float weight_stab;
182 } MovieTrackingTrack;
183
184 typedef struct MovieTrackingPlaneMarker {
185         /* Corners of the plane in the following order:
186          *
187          *       Y
188          *       ^
189          *       | (3) --- (2)
190          *       |  |       |
191          *       |  |       |
192          *       |  |       |
193          *       | (0) --- (1)
194          *       +-------------> X
195          *
196          * The coordinates are stored in frame normalized coordinates.
197          */
198         float corners[4][2];
199
200         /** Number of frame plane marker is associated with. */
201         int framenr;
202         /** Marker's flag (alive, ...). */
203         int flag;
204 } MovieTrackingPlaneMarker;
205
206 typedef struct MovieTrackingPlaneTrack {
207         struct MovieTrackingPlaneTrack *next, *prev;
208
209         /** MAX_NAME. */
210         char name[64];
211
212         /**
213          * Array of point tracks used to define this pla.ne.
214          * Each element is a pointer to MovieTrackingTrack.
215          */
216         MovieTrackingTrack **point_tracks;
217         /** Number of tracks in point_tracks array. */
218         int point_tracksnr, pad;
219
220         /** Markers in the plane track. */
221         MovieTrackingPlaneMarker *markers;
222         /** Count of markers in track (size of markers array). */
223         int markersnr;
224
225         /** Flags (selection, ...). */
226         int flag;
227
228         /** Image displaying during editing. */
229         struct Image *image;
230         /** Opacity of the image. */
231         float image_opacity;
232
233         /* Runtime data */
234         /** Most recently used marker. */
235         int last_marker;
236 } MovieTrackingPlaneTrack;
237
238 typedef struct MovieTrackingSettings {
239         int flag;
240
241         /* ** default tracker settings */
242         /** Model of the motion for this track. */
243         short default_motion_model;
244         /** Flags for the tracking algorithm (use brute, use esm, use pyramid, etc. */
245         short default_algorithm_flag;
246         /** Minimal correlation which is still treated as successful tracking. */
247         float default_minimum_correlation;
248         /** Size of pattern area for new tracks. */
249         short default_pattern_size;
250         /** Size of search area for new tracks. */
251         short default_search_size;
252         /** Number of frames to be tarcked during single tracking session
253          * (if TRACKING_FRAMES_LIMIT is set). */
254         short default_frames_limit;
255         /** Margin from frame boundaries. */
256         short default_margin;
257         /** Re-adjust every N frames. */
258         short default_pattern_match;
259         /** Default flags like color channels used by default. */
260         short default_flag;
261         /** Default weight of the track. */
262         float default_weight;
263
264         /** Flags describes motion type. */
265         short motion_flag;
266
267         /* ** common tracker settings ** */
268         /** Speed of tracking. */
269         short speed;
270
271         /* ** reconstruction settings ** */
272         /* two keyframes for reconstruction initialization
273          * were moved to per-tracking object settings
274          */
275         int keyframe1 DNA_DEPRECATED,
276                 keyframe2 DNA_DEPRECATED;
277
278         int reconstruction_flag;
279
280         /* which camera intrinsics to refine. uses on the REFINE_* flags */
281         short refine_camera_intrinsics, pad2;
282
283         /* ** tool settings ** */
284
285         /* set scale */
286         /** Distance between two bundles used for scene scaling. */
287         float dist;
288
289         /* cleanup */
290         int clean_frames, clean_action;
291         float clean_error;
292
293         /* set object scale */
294         /** Distance between two bundles used for object scaling. */
295         float object_distance;
296
297         int pad3;
298 } MovieTrackingSettings;
299
300 typedef struct MovieTrackingStabilization {
301         int flag;
302         /** Total number of translation tracks and index of active track in list. */
303         int tot_track, act_track;
304         /** Total number of rotation tracks and index of active track in list. */
305         int tot_rot_track, act_rot_track;
306
307         /* 2d stabilization */
308         /** Max auto-scale factor. */
309         float maxscale;
310         /** Use TRACK_USE_2D_STAB_ROT on individual tracks instead. */
311         MovieTrackingTrack *rot_track DNA_DEPRECATED;
312
313         /** Reference point to anchor stabilization offset. */
314         int anchor_frame;
315         /** Expected target position of frame after raw stabilization, will be subtracted. */
316         float target_pos[2];
317         /** Expected target rotation of frame after raw stabilization, will be compensated. */
318         float target_rot;
319         /** Zoom factor known to be present on original footage. Also used for autoscale. */
320         float scale;
321
322         /** Influence on location, scale and rotation. */
323         float locinf, scaleinf, rotinf;
324
325         /** Filter used for pixel interpolation. */
326         int filter;
327
328         /* initialization and run-time data */
329         /** Without effect now, we initialize on every frame.
330          * Formerly used for caching of init values. */
331         int ok DNA_DEPRECATED;
332 } MovieTrackingStabilization;
333
334 typedef struct MovieTrackingReconstruction {
335         int flag;
336
337         /** Average error of reconstruction. */
338         float error;
339
340         /** Most recently used camera. */
341         int last_camera;
342         /** Number of reconstructed cameras. */
343         int camnr;
344         /** Reconstructed cameras. */
345         struct MovieReconstructedCamera *cameras;
346 } MovieTrackingReconstruction;
347
348 typedef struct MovieTrackingObject {
349         struct MovieTrackingObject *next, *prev;
350
351         /** Name of tracking object, MAX_NAME. */
352         char name[64];
353         int flag;
354         /** Scale of object solution in amera space. */
355         float scale;
356
357         /** List of tracks use to tracking this object. */
358         ListBase tracks;
359         /** List of plane tracks used by this object. */
360         ListBase plane_tracks;
361         /** Reconstruction data for this object. */
362         MovieTrackingReconstruction reconstruction;
363
364         /* reconstruction options */
365         /** Two keyframes for reconstruction initialization. */
366         int keyframe1, keyframe2;
367 } MovieTrackingObject;
368
369 typedef struct MovieTrackingStats {
370         char message[256];
371 } MovieTrackingStats;
372
373 typedef struct MovieTrackingDopesheetChannel {
374         struct MovieTrackingDopesheetChannel *next, *prev;
375
376         /** Motion track for which channel is created. */
377         MovieTrackingTrack *track;
378         int pad;
379
380         /** Name of channel. */
381         char name[64];
382
383         /** Total number of segments. */
384         int tot_segment;
385         /** Tracked segments. */
386         int *segments;
387         /** Longest segment length and total number of tracked frames. */
388         int max_segment, total_frames;
389 } MovieTrackingDopesheetChannel;
390
391 typedef struct MovieTrackingDopesheetCoverageSegment {
392         struct MovieTrackingDopesheetCoverageSegment *next, *prev;
393
394         int coverage;
395         int start_frame;
396         int end_frame;
397
398         int pad;
399 } MovieTrackingDopesheetCoverageSegment;
400
401 typedef struct MovieTrackingDopesheet {
402         /** Flag if dopesheet information is still relevant. */
403         int ok;
404
405         /** Method to be used to sort tracks. */
406         short sort_method;
407         /** Dopesheet building flag such as inverted order of sort. */
408         short flag;
409
410         /* ** runtime stuff ** */
411
412         /* summary */
413         ListBase coverage_segments;
414
415         /* detailed */
416         ListBase channels;
417         int tot_channel;
418
419         int pad;
420 } MovieTrackingDopesheet;
421
422 typedef struct MovieTracking {
423         /** Different tracking-related settings. */
424         MovieTrackingSettings settings;
425         /** Camera intrinsics. */
426         MovieTrackingCamera camera;
427         /** List of tracks used for camera object. */
428         ListBase tracks;
429         /** List of plane tracks used by camera object. */
430         ListBase plane_tracks;
431         /** Reconstruction data for camera object. */
432         MovieTrackingReconstruction reconstruction;
433         /** Stabilization data. */
434         MovieTrackingStabilization stabilization;
435         /** Active track. */
436         MovieTrackingTrack *act_track;
437         /** Active plane track. */
438         MovieTrackingPlaneTrack *act_plane_track;
439
440         ListBase objects;
441         /** Index of active object and total number of objects. */
442         int objectnr, tot_object;
443
444         /** Statistics displaying in clip editor. */
445         MovieTrackingStats *stats;
446
447         /** Dopesheet data. */
448         MovieTrackingDopesheet dopesheet;
449 } MovieTracking;
450
451 /* MovieTrackingCamera->distortion_model */
452 enum {
453         TRACKING_DISTORTION_MODEL_POLYNOMIAL = 0,
454         TRACKING_DISTORTION_MODEL_DIVISION = 1,
455 };
456
457 /* MovieTrackingCamera->units */
458 enum {
459         CAMERA_UNITS_PX = 0,
460         CAMERA_UNITS_MM = 1,
461 };
462
463 /* MovieTrackingMarker->flag */
464 enum {
465         MARKER_DISABLED    = (1 << 0),
466         MARKER_TRACKED     = (1 << 1),
467         MARKER_GRAPH_SEL_X = (1 << 2),
468         MARKER_GRAPH_SEL_Y = (1 << 3),
469         MARKER_GRAPH_SEL   = (MARKER_GRAPH_SEL_X | MARKER_GRAPH_SEL_Y),
470 };
471
472 /* MovieTrackingTrack->flag */
473 enum {
474         TRACK_HAS_BUNDLE        = (1 << 1),
475         TRACK_DISABLE_RED       = (1 << 2),
476         TRACK_DISABLE_GREEN     = (1 << 3),
477         TRACK_DISABLE_BLUE      = (1 << 4),
478         TRACK_HIDDEN            = (1 << 5),
479         TRACK_LOCKED            = (1 << 6),
480         TRACK_CUSTOMCOLOR       = (1 << 7),
481         TRACK_USE_2D_STAB       = (1 << 8),
482         TRACK_PREVIEW_GRAYSCALE = (1 << 9),
483         TRACK_DOPE_SEL          = (1 << 10),
484         TRACK_PREVIEW_ALPHA     = (1 << 11),
485         TRACK_USE_2D_STAB_ROT   = (1 << 12),
486 };
487
488 /* MovieTrackingTrack->motion_model */
489 enum {
490         TRACK_MOTION_MODEL_TRANSLATION                 = 0,
491         TRACK_MOTION_MODEL_TRANSLATION_ROTATION        = 1,
492         TRACK_MOTION_MODEL_TRANSLATION_SCALE           = 2,
493         TRACK_MOTION_MODEL_TRANSLATION_ROTATION_SCALE  = 3,
494         TRACK_MOTION_MODEL_AFFINE                      = 4,
495         TRACK_MOTION_MODEL_HOMOGRAPHY                  = 5,
496 };
497
498 /* MovieTrackingTrack->algorithm_flag */
499 enum {
500         TRACK_ALGORITHM_FLAG_USE_BRUTE                  = (1 << 0),
501         TRACK_ALGORITHM_FLAG_USE_NORMALIZATION  = (1 << 2),
502         TRACK_ALGORITHM_FLAG_USE_MASK                   = (1 << 3),
503 };
504
505 /* MovieTrackingTrack->adjframes */
506 enum {
507         TRACK_MATCH_KEYFRAME  = 0,
508         TRACK_MATCH_PREVFRAME = 1,
509 };
510
511 /* MovieTrackingSettings->flag */
512 enum {
513         TRACKING_SETTINGS_SHOW_DEFAULT_EXPANDED = (1 << 0),
514         TRACKING_SETTINGS_SHOW_EXTRA_EXPANDED = (1 << 1),
515 };
516
517 /* MovieTrackingSettings->motion_flag */
518 enum {
519         TRACKING_MOTION_TRIPOD = (1 << 0),
520
521         TRACKING_MOTION_MODAL  = (TRACKING_MOTION_TRIPOD),
522 };
523
524 /* MovieTrackingSettings->speed */
525 enum {
526         TRACKING_SPEED_FASTEST  = 0,
527         TRACKING_SPEED_REALTIME = 1,
528         TRACKING_SPEED_HALF     = 2,
529         TRACKING_SPEED_QUARTER  = 4,
530         TRACKING_SPEED_DOUBLE   = 5,
531 };
532
533 /* MovieTrackingSettings->reconstruction_flag */
534 enum {
535         /* TRACKING_USE_FALLBACK_RECONSTRUCTION = (1 << 0), */  /* DEPRECATED */
536         TRACKING_USE_KEYFRAME_SELECTION      = (1 << 1),
537 };
538
539 /* MovieTrackingSettings->refine_camera_intrinsics */
540 enum {
541         REFINE_FOCAL_LENGTH         = (1 << 0),
542         REFINE_PRINCIPAL_POINT      = (1 << 1),
543         REFINE_RADIAL_DISTORTION_K1 = (1 << 2),
544         REFINE_RADIAL_DISTORTION_K2 = (1 << 4),
545 };
546
547 /* MovieTrackingStrabilization->flag */
548 enum {
549         TRACKING_2D_STABILIZATION   = (1 << 0),
550         TRACKING_AUTOSCALE          = (1 << 1),
551         TRACKING_STABILIZE_ROTATION = (1 << 2),
552         TRACKING_STABILIZE_SCALE    = (1 << 3),
553         TRACKING_SHOW_STAB_TRACKS   = (1 << 5),
554 };
555
556 /* MovieTrackingStrabilization->filter */
557 enum {
558         TRACKING_FILTER_NEAREST  = 0,
559         TRACKING_FILTER_BILINEAR = 1,
560         TRACKING_FILTER_BICUBIC  = 2,
561 };
562
563 /* MovieTrackingReconstruction->flag */
564 enum {
565         TRACKING_RECONSTRUCTED = (1 << 0),
566 };
567
568 /* MovieTrackingObject->flag */
569 enum {
570         TRACKING_OBJECT_CAMERA = (1 << 0),
571 };
572
573 enum {
574         TRACKING_CLEAN_SELECT         = 0,
575         TRACKING_CLEAN_DELETE_TRACK   = 1,
576         TRACKING_CLEAN_DELETE_SEGMENT = 2,
577 };
578
579 /* MovieTrackingDopesheet->sort_method */
580 enum {
581         TRACKING_DOPE_SORT_NAME          = 0,
582         TRACKING_DOPE_SORT_LONGEST       = 1,
583         TRACKING_DOPE_SORT_TOTAL         = 2,
584         TRACKING_DOPE_SORT_AVERAGE_ERROR = 3,
585 };
586
587 /* MovieTrackingDopesheet->flag */
588 enum {
589         TRACKING_DOPE_SORT_INVERSE  = (1 << 0),
590         TRACKING_DOPE_SELECTED_ONLY = (1 << 1),
591         TRACKING_DOPE_SHOW_HIDDEN   = (1 << 2),
592 };
593
594 /* MovieTrackingDopesheetCoverageSegment->trackness */
595 enum {
596         TRACKING_COVERAGE_BAD        = 0,
597         TRACKING_COVERAGE_ACCEPTABLE = 1,
598         TRACKING_COVERAGE_OK         = 2,
599 };
600
601 /* MovieTrackingPlaneMarker->flag */
602 enum {
603         PLANE_MARKER_DISABLED = (1 << 0),
604         PLANE_MARKER_TRACKED  = (1 << 1),
605 };
606
607 /* MovieTrackingPlaneTrack->flag */
608 enum {
609         PLANE_TRACK_HIDDEN  = (1 << 1),
610         PLANE_TRACK_LOCKED  = (1 << 2),
611         PLANE_TRACK_AUTOKEY = (1 << 3),
612 };
613
614 #endif  /* __DNA_TRACKING_TYPES_H__ */