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