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