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 #pragma once 21 22 /** \file 23 * \ingroup bke 24 */ 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 struct Camera; 31 struct ImBuf; 32 struct ListBase; 33 struct MovieClipUser; 34 struct MovieDistortion; 35 struct MovieReconstructContext; 36 struct MovieTracking; 37 struct MovieTrackingMarker; 38 struct MovieTrackingObject; 39 struct MovieTrackingPlaneMarker; 40 struct MovieTrackingPlaneTrack; 41 struct MovieTrackingTrack; 42 struct Object; 43 struct Scene; 44 struct bGPDlayer; 45 struct rcti; 46 47 /* **** Common functions **** */ 48 49 void BKE_tracking_free(struct MovieTracking *tracking); 50 void BKE_tracking_copy(struct MovieTracking *tracking_dst, 51 const struct MovieTracking *tracking_src, 52 const int flag); 53 54 void BKE_tracking_settings_init(struct MovieTracking *tracking); 55 56 struct ListBase *BKE_tracking_get_active_tracks(struct MovieTracking *tracking); 57 struct ListBase *BKE_tracking_get_active_plane_tracks(struct MovieTracking *tracking); 58 struct MovieTrackingReconstruction *BKE_tracking_get_active_reconstruction( 59 struct MovieTracking *tracking); 60 61 /* matrices for constraints and drawing */ 62 void BKE_tracking_get_camera_object_matrix(struct Object *camera_object, float mat[4][4]); 63 void BKE_tracking_get_projection_matrix(struct MovieTracking *tracking, 64 struct MovieTrackingObject *object, 65 int framenr, 66 int winx, 67 int winy, 68 float mat[4][4]); 69 70 /* **** Clipboard **** */ 71 void BKE_tracking_clipboard_free(void); 72 void BKE_tracking_clipboard_copy_tracks(struct MovieTracking *tracking, 73 struct MovieTrackingObject *object); 74 bool BKE_tracking_clipboard_has_tracks(void); 75 void BKE_tracking_clipboard_paste_tracks(struct MovieTracking *tracking, 76 struct MovieTrackingObject *object); 77 78 /* **** Track **** */ 79 struct MovieTrackingTrack *BKE_tracking_track_add(struct MovieTracking *tracking, 80 struct ListBase *tracksbase, 81 float x, 82 float y, 83 int framenr, 84 int width, 85 int height); 86 struct MovieTrackingTrack *BKE_tracking_track_duplicate(struct MovieTrackingTrack *track); 87 void BKE_tracking_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track); 88 void BKE_tracking_track_free(struct MovieTrackingTrack *track); 89 90 void BKE_tracking_track_flag_set(struct MovieTrackingTrack *track, int area, int flag); 91 void BKE_tracking_track_flag_clear(struct MovieTrackingTrack *track, int area, int flag); 92 93 bool BKE_tracking_track_has_marker_at_frame(struct MovieTrackingTrack *track, int framenr); 94 bool BKE_tracking_track_has_enabled_marker_at_frame(struct MovieTrackingTrack *track, int framenr); 95 96 void BKE_tracking_track_path_clear(struct MovieTrackingTrack *track, int ref_frame, int action); 97 void BKE_tracking_tracks_join(struct MovieTracking *tracking, 98 struct MovieTrackingTrack *dst_track, 99 struct MovieTrackingTrack *src_track); 100 101 struct MovieTrackingTrack *BKE_tracking_track_get_named(struct MovieTracking *tracking, 102 struct MovieTrackingObject *object, 103 const char *name); 104 struct MovieTrackingTrack *BKE_tracking_track_get_indexed(struct MovieTracking *tracking, 105 int tracknr, 106 struct ListBase **r_tracksbase); 107 108 struct MovieTrackingTrack *BKE_tracking_track_get_active(struct MovieTracking *tracking); 109 110 float *BKE_tracking_track_get_mask(int frame_width, 111 int frame_height, 112 struct MovieTrackingTrack *track, 113 struct MovieTrackingMarker *marker); 114 115 float BKE_tracking_track_get_weight_for_marker(struct MovieClip *clip, 116 struct MovieTrackingTrack *track, 117 struct MovieTrackingMarker *marker); 118 119 /* selection */ 120 void BKE_tracking_track_select(struct ListBase *tracksbase, 121 struct MovieTrackingTrack *track, 122 int area, 123 bool extend); 124 void BKE_tracking_track_deselect(struct MovieTrackingTrack *track, int area); 125 void BKE_tracking_tracks_deselect_all(struct ListBase *tracksbase); 126 127 /* **** Marker **** */ 128 struct MovieTrackingMarker *BKE_tracking_marker_insert(struct MovieTrackingTrack *track, 129 struct MovieTrackingMarker *marker); 130 void BKE_tracking_marker_delete(struct MovieTrackingTrack *track, int framenr); 131 132 void BKE_tracking_marker_clamp(struct MovieTrackingMarker *marker, int event); 133 134 struct MovieTrackingMarker *BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr); 135 struct MovieTrackingMarker *BKE_tracking_marker_get_exact(struct MovieTrackingTrack *track, 136 int framenr); 137 struct MovieTrackingMarker *BKE_tracking_marker_ensure(struct MovieTrackingTrack *track, 138 int framenr); 139 140 void BKE_tracking_marker_pattern_minmax(const struct MovieTrackingMarker *marker, 141 float min[2], 142 float max[2]); 143 144 void BKE_tracking_marker_get_subframe_position(struct MovieTrackingTrack *track, 145 float framenr, 146 float pos[2]); 147 148 /* **** Plane Track **** */ 149 struct MovieTrackingPlaneTrack *BKE_tracking_plane_track_add(struct MovieTracking *tracking, 150 struct ListBase *plane_tracks_base, 151 struct ListBase *tracks, 152 int framenr); 153 void BKE_tracking_plane_track_unique_name(struct ListBase *plane_tracks_base, 154 struct MovieTrackingPlaneTrack *plane_track); 155 void BKE_tracking_plane_track_free(struct MovieTrackingPlaneTrack *plane_track); 156 157 bool BKE_tracking_plane_track_has_marker_at_frame(struct MovieTrackingPlaneTrack *plane_track, 158 int framenr); 159 bool BKE_tracking_plane_track_has_enabled_marker_at_frame( 160 struct MovieTrackingPlaneTrack *plane_track, int framenr); 161 162 struct MovieTrackingPlaneTrack *BKE_tracking_plane_track_get_named( 163 struct MovieTracking *tracking, struct MovieTrackingObject *object, const char *name); 164 165 struct MovieTrackingPlaneTrack *BKE_tracking_plane_track_get_active( 166 struct MovieTracking *tracking); 167 168 void BKE_tracking_plane_tracks_deselect_all(struct ListBase *plane_tracks_base); 169 170 bool BKE_tracking_plane_track_has_point_track(struct MovieTrackingPlaneTrack *plane_track, 171 struct MovieTrackingTrack *track); 172 bool BKE_tracking_plane_track_remove_point_track(struct MovieTrackingPlaneTrack *plane_track, 173 struct MovieTrackingTrack *track); 174 175 void BKE_tracking_plane_tracks_remove_point_track(struct MovieTracking *tracking, 176 struct MovieTrackingTrack *track); 177 178 void BKE_tracking_plane_track_replace_point_track(struct MovieTrackingPlaneTrack *plane_track, 179 struct MovieTrackingTrack *old_track, 180 struct MovieTrackingTrack *new_track); 181 void BKE_tracking_plane_tracks_replace_point_track(struct MovieTracking *tracking, 182 struct MovieTrackingTrack *old_track, 183 struct MovieTrackingTrack *new_track); 184 185 /* **** Plane Marker **** */ 186 struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_insert( 187 struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingPlaneMarker *plane_marker); 188 void BKE_tracking_plane_marker_delete(struct MovieTrackingPlaneTrack *plane_track, int framenr); 189 190 struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get( 191 struct MovieTrackingPlaneTrack *plane_track, int framenr); 192 struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get_exact( 193 struct MovieTrackingPlaneTrack *plane_track, int framenr); 194 struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_ensure( 195 struct MovieTrackingPlaneTrack *plane_track, int framenr); 196 void BKE_tracking_plane_marker_get_subframe_corners(struct MovieTrackingPlaneTrack *plane_track, 197 float framenr, 198 float corners[4][2]); 199 200 /* **** Object **** */ 201 struct MovieTrackingObject *BKE_tracking_object_add(struct MovieTracking *tracking, 202 const char *name); 203 bool BKE_tracking_object_delete(struct MovieTracking *tracking, 204 struct MovieTrackingObject *object); 205 206 void BKE_tracking_object_unique_name(struct MovieTracking *tracking, 207 struct MovieTrackingObject *object); 208 209 struct MovieTrackingObject *BKE_tracking_object_get_named(struct MovieTracking *tracking, 210 const char *name); 211 212 struct MovieTrackingObject *BKE_tracking_object_get_active(struct MovieTracking *tracking); 213 struct MovieTrackingObject *BKE_tracking_object_get_camera(struct MovieTracking *tracking); 214 215 struct ListBase *BKE_tracking_object_get_tracks(struct MovieTracking *tracking, 216 struct MovieTrackingObject *object); 217 struct ListBase *BKE_tracking_object_get_plane_tracks(struct MovieTracking *tracking, 218 struct MovieTrackingObject *object); 219 struct MovieTrackingReconstruction *BKE_tracking_object_get_reconstruction( 220 struct MovieTracking *tracking, struct MovieTrackingObject *object); 221 222 /* **** Camera **** */ 223 void BKE_tracking_camera_shift_get( 224 struct MovieTracking *tracking, int winx, int winy, float *shiftx, float *shifty); 225 void BKE_tracking_camera_to_blender(struct MovieTracking *tracking, 226 struct Scene *scene, 227 struct Camera *camera, 228 int width, 229 int height); 230 231 struct MovieReconstructedCamera *BKE_tracking_camera_get_reconstructed( 232 struct MovieTracking *tracking, struct MovieTrackingObject *object, int framenr); 233 void BKE_tracking_camera_get_reconstructed_interpolate(struct MovieTracking *tracking, 234 struct MovieTrackingObject *object, 235 float framenr, 236 float mat[4][4]); 237 238 /* **** Distortion/Undistortion **** */ 239 struct MovieDistortion *BKE_tracking_distortion_new(struct MovieTracking *tracking, 240 int calibration_width, 241 int calibration_height); 242 void BKE_tracking_distortion_update(struct MovieDistortion *distortion, 243 struct MovieTracking *tracking, 244 int calibration_width, 245 int calibration_height); 246 void BKE_tracking_distortion_set_threads(struct MovieDistortion *distortion, int threads); 247 struct MovieDistortion *BKE_tracking_distortion_copy(struct MovieDistortion *distortion); 248 struct ImBuf *BKE_tracking_distortion_exec(struct MovieDistortion *distortion, 249 struct MovieTracking *tracking, 250 struct ImBuf *ibuf, 251 int width, 252 int height, 253 float overscan, 254 bool undistort); 255 void BKE_tracking_distortion_distort_v2(struct MovieDistortion *distortion, 256 const float co[2], 257 float r_co[2]); 258 void BKE_tracking_distortion_undistort_v2(struct MovieDistortion *distortion, 259 const float co[2], 260 float r_co[2]); 261 void BKE_tracking_distortion_free(struct MovieDistortion *distortion); 262 263 void BKE_tracking_distort_v2(struct MovieTracking *tracking, 264 int image_width, 265 int image_height, 266 const float co[2], 267 float r_co[2]); 268 void BKE_tracking_undistort_v2(struct MovieTracking *tracking, 269 int image_width, 270 int image_height, 271 const float co[2], 272 float r_co[2]); 273 274 struct ImBuf *BKE_tracking_undistort_frame(struct MovieTracking *tracking, 275 struct ImBuf *ibuf, 276 int calibration_width, 277 int calibration_height, 278 float overscan); 279 struct ImBuf *BKE_tracking_distort_frame(struct MovieTracking *tracking, 280 struct ImBuf *ibuf, 281 int calibration_width, 282 int calibration_height, 283 float overscan); 284 285 void BKE_tracking_max_distortion_delta_across_bound(struct MovieTracking *tracking, 286 int image_width, 287 int image_height, 288 struct rcti *rect, 289 bool undistort, 290 float delta[2]); 291 292 /* **** Image sampling **** */ 293 struct ImBuf *BKE_tracking_sample_pattern(int frame_width, 294 int frame_height, 295 struct ImBuf *search_ib, 296 struct MovieTrackingTrack *track, 297 struct MovieTrackingMarker *marker, 298 bool from_anchor, 299 bool use_mask, 300 int num_samples_x, 301 int num_samples_y, 302 float pos[2]); 303 struct ImBuf *BKE_tracking_get_pattern_imbuf(struct ImBuf *ibuf, 304 struct MovieTrackingTrack *track, 305 struct MovieTrackingMarker *marker, 306 bool anchored, 307 bool disable_channels); 308 struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, 309 struct MovieTrackingTrack *track, 310 struct MovieTrackingMarker *marker, 311 bool anchored, 312 bool disable_channels); 313 314 void BKE_tracking_disable_channels( 315 struct ImBuf *ibuf, bool disable_red, bool disable_green, bool disable_blue, bool grayscale); 316 317 /* **** 2D tracking **** */ 318 void BKE_tracking_refine_marker(struct MovieClip *clip, 319 struct MovieTrackingTrack *track, 320 struct MovieTrackingMarker *marker, 321 bool backwards); 322 323 /* *** 2D auto track *** */ 324 325 struct AutoTrackContext *BKE_autotrack_context_new(struct MovieClip *clip, 326 struct MovieClipUser *user, 327 const bool backwards, 328 const bool sequence); 329 bool BKE_autotrack_context_step(struct AutoTrackContext *context); 330 void BKE_autotrack_context_sync(struct AutoTrackContext *context); 331 void BKE_autotrack_context_sync_user(struct AutoTrackContext *context, struct MovieClipUser *user); 332 void BKE_autotrack_context_finish(struct AutoTrackContext *context); 333 void BKE_autotrack_context_free(struct AutoTrackContext *context); 334 335 /* **** Plane tracking **** */ 336 337 void BKE_tracking_track_plane_from_existing_motion(struct MovieTrackingPlaneTrack *plane_track, 338 int start_frame); 339 void BKE_tracking_retrack_plane_from_existing_motion_at_segment( 340 struct MovieTrackingPlaneTrack *plane_track, int start_frame); 341 void BKE_tracking_homography_between_two_quads(/*const*/ float reference_corners[4][2], 342 /*const*/ float corners[4][2], 343 float H[3][3]); 344 345 /* **** Camera solving **** */ 346 bool BKE_tracking_reconstruction_check(struct MovieTracking *tracking, 347 struct MovieTrackingObject *object, 348 char *error_msg, 349 int error_size); 350 351 struct MovieReconstructContext *BKE_tracking_reconstruction_context_new( 352 struct MovieClip *clip, 353 struct MovieTrackingObject *object, 354 int keyframe1, 355 int keyframe2, 356 int width, 357 int height); 358 void BKE_tracking_reconstruction_context_free(struct MovieReconstructContext *context); 359 void BKE_tracking_reconstruction_solve(struct MovieReconstructContext *context, 360 short *stop, 361 short *do_update, 362 float *progress, 363 char *stats_message, 364 int message_size); 365 bool BKE_tracking_reconstruction_finish(struct MovieReconstructContext *context, 366 struct MovieTracking *tracking); 367 368 void BKE_tracking_reconstruction_report_error_message(struct MovieReconstructContext *context, 369 const char *error_message); 370 371 const char *BKE_tracking_reconstruction_error_message_get( 372 const struct MovieReconstructContext *context); 373 374 void BKE_tracking_reconstruction_scale(struct MovieTracking *tracking, float scale[3]); 375 376 /* **** Feature detection **** */ 377 void BKE_tracking_detect_fast(struct MovieTracking *tracking, 378 struct ListBase *tracksbase, 379 struct ImBuf *ibuf, 380 int framenr, 381 int margin, 382 int min_trackness, 383 int min_distance, 384 struct bGPDlayer *layer, 385 bool place_outside_layer); 386 387 void BKE_tracking_detect_harris(struct MovieTracking *tracking, 388 struct ListBase *tracksbase, 389 struct ImBuf *ibuf, 390 int framenr, 391 int margin, 392 float threshold, 393 int min_distance, 394 struct bGPDlayer *layer, 395 bool place_outside_layer); 396 397 /* **** 2D stabilization **** */ 398 void BKE_tracking_stabilization_data_get(struct MovieClip *clip, 399 int framenr, 400 int width, 401 int height, 402 float translation[2], 403 float *scale, 404 float *angle); 405 struct ImBuf *BKE_tracking_stabilize_frame(struct MovieClip *clip, 406 int framenr, 407 struct ImBuf *ibuf, 408 float translation[2], 409 float *scale, 410 float *angle); 411 void BKE_tracking_stabilization_data_to_mat4(int width, 412 int height, 413 float aspect, 414 float translation[2], 415 float scale, 416 float angle, 417 float mat[4][4]); 418 419 /* Dopesheet */ 420 void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking); 421 void BKE_tracking_dopesheet_update(struct MovieTracking *tracking); 422 423 /* **** Query/search **** */ 424 425 struct MovieTrackingObject *BKE_tracking_find_object_for_track( 426 const struct MovieTracking *tracking, const struct MovieTrackingTrack *track); 427 struct ListBase *BKE_tracking_find_tracks_list_for_track(struct MovieTracking *tracking, 428 const struct MovieTrackingTrack *track); 429 430 struct MovieTrackingObject *BKE_tracking_find_object_for_plane_track( 431 const struct MovieTracking *tracking, const struct MovieTrackingPlaneTrack *plane_track); 432 struct ListBase *BKE_tracking_find_tracks_list_for_plane_track( 433 struct MovieTracking *tracking, const struct MovieTrackingPlaneTrack *plane_track); 434 435 void BKE_tracking_get_rna_path_for_track(const struct MovieTracking *tracking, 436 const struct MovieTrackingTrack *track, 437 char *rna_path, 438 size_t rna_path_len); 439 void BKE_tracking_get_rna_path_prefix_for_track(const struct MovieTracking *tracking, 440 const struct MovieTrackingTrack *track, 441 char *rna_path, 442 size_t rna_path_len); 443 void BKE_tracking_get_rna_path_for_plane_track(const struct MovieTracking *tracking, 444 const struct MovieTrackingPlaneTrack *plane_track, 445 char *rna_path, 446 size_t rna_path_len); 447 void BKE_tracking_get_rna_path_prefix_for_plane_track( 448 const struct MovieTracking *tracking, 449 const struct MovieTrackingPlaneTrack *plane_track, 450 char *rna_path, 451 size_t rna_path_len); 452 453 /* **** Utility macros **** */ 454 455 #define TRACK_SELECTED(track) \ 456 ((track)->flag & SELECT || (track)->pat_flag & SELECT || (track)->search_flag & SELECT) 457 458 #define TRACK_AREA_SELECTED(track, area) \ 459 ((area) == TRACK_AREA_POINT ? \ 460 (track)->flag & SELECT : \ 461 ((area) == TRACK_AREA_PAT ? (track)->pat_flag & SELECT : (track)->search_flag & SELECT)) 462 463 #define TRACK_VIEW_SELECTED(sc, track) \ 464 ((((track)->flag & TRACK_HIDDEN) == 0) && \ 465 (TRACK_AREA_SELECTED(track, TRACK_AREA_POINT) || \ 466 (((sc)->flag & SC_SHOW_MARKER_PATTERN) && TRACK_AREA_SELECTED(track, TRACK_AREA_PAT)) || \ 467 (((sc)->flag & SC_SHOW_MARKER_SEARCH) && TRACK_AREA_SELECTED(track, TRACK_AREA_SEARCH)))) 468 469 #define PLANE_TRACK_VIEW_SELECTED(plane_track) \ 470 ((((plane_track)->flag & PLANE_TRACK_HIDDEN) == 0) && ((plane_track)->flag & SELECT)) 471 472 #define MARKER_VISIBLE(sc, track, marker) \ 473 (((marker)->flag & MARKER_DISABLED) == 0 || ((sc)->flag & SC_HIDE_DISABLED) == 0 || \ 474 ((sc)->clip->tracking.act_track == track)) 475 476 #define TRACK_CLEAR_UPTO 0 477 #define TRACK_CLEAR_REMAINED 1 478 #define TRACK_CLEAR_ALL 2 479 480 #define CLAMP_PAT_DIM 1 481 #define CLAMP_PAT_POS 2 482 #define CLAMP_SEARCH_DIM 3 483 #define CLAMP_SEARCH_POS 4 484 485 #define TRACK_AREA_NONE -1 486 #define TRACK_AREA_POINT 1 487 #define TRACK_AREA_PAT 2 488 #define TRACK_AREA_SEARCH 4 489 490 #define TRACK_AREA_ALL (TRACK_AREA_POINT | TRACK_AREA_PAT | TRACK_AREA_SEARCH) 491 492 #ifdef __cplusplus 493 } 494 #endif 495