Blender V5.0
clip_utils.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "DNA_scene_types.h"
10
11#include "BLI_listbase.h"
12#include "BLI_math_matrix.h"
13#include "BLI_math_vector.h"
14#include "BLI_rect.h"
15#include "BLI_utildefines.h"
16
17#include "BKE_animsys.h"
18#include "BKE_context.hh"
19#include "BKE_mask.h"
20#include "BKE_movieclip.h"
21#include "BKE_tracking.h"
22
23#include "DEG_depsgraph.hh"
25
26#include "GPU_immediate.hh"
27#include "GPU_state.hh"
28
29#include "WM_api.hh"
30#include "WM_types.hh"
31
32#include "ED_clip.hh"
33#include "ED_mask.hh"
34
35#include "UI_resources.hh"
36#include "UI_view2d.hh"
37
38#include "clip_intern.hh" /* own include */
39
41{
43 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
44 return false;
45 }
46 }
47 else if (value_source == CLIP_VALUE_SOURCE_REPROJECTION_ERROR) {
48 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_ERROR) == 0) {
49 return false;
50 }
51 }
52 return true;
53}
54
56 SpaceClip *sc,
57 MovieTrackingTrack *track,
58 void *userdata,
62{
64 int width, height, coord;
65
66 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
67
68 for (coord = 0; coord < 2; coord++) {
69 eClipCurveValueSource value_source = (coord == 0) ? CLIP_VALUE_SOURCE_SPEED_X :
71 int i, prevfra = track->markers[0].framenr;
72 bool open = false;
73 float prevval = 0.0f;
74
75 for (i = 0; i < track->markersnr; i++) {
76 MovieTrackingMarker *marker = &track->markers[i];
77 float val;
78
79 if (marker->flag & MARKER_DISABLED) {
80 if (open) {
81 if (segment_end) {
82 segment_end(userdata, value_source);
83 }
84
85 open = false;
86 }
87
88 continue;
89 }
90
91 if (!open) {
92 if (segment_start) {
93 if ((i + 1) == track->markersnr) {
94 segment_start(userdata, track, value_source, true);
95 }
96 else {
97 segment_start(
98 userdata, track, value_source, (track->markers[i + 1].flag & MARKER_DISABLED));
99 }
100 }
101
102 open = true;
103 prevval = marker->pos[coord];
104 }
105
106 /* value is a pixels per frame speed */
107 val = (marker->pos[coord] - prevval) * ((coord == 0) ? (width) : (height));
108 val /= marker->framenr - prevfra;
109
110 if (func) {
111 int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
112
113 func(userdata, track, marker, value_source, scene_framenr, val);
114 }
115
116 prevval = marker->pos[coord];
117 prevfra = marker->framenr;
118 }
119
120 if (open) {
121 if (segment_end) {
122 segment_end(userdata, value_source);
123 }
124 }
125 }
126}
127
129 MovieTracking *tracking,
130 MovieTrackingObject *tracking_object,
131 MovieTrackingTrack *track,
132 MovieTrackingMarker *marker,
133 const int clip_width,
134 const int clip_height,
135 const int scene_framenr)
136{
137 float reprojected_position[4], bundle_position[4], marker_position[2], delta[2];
138 float weight = BKE_tracking_track_get_weight_for_marker(clip, track, marker);
139 const float aspy = 1.0f / tracking->camera.pixel_aspect;
140
141 float projection_matrix[4][4];
143 tracking, tracking_object, scene_framenr, clip_width, clip_height, projection_matrix);
144
145 copy_v3_v3(bundle_position, track->bundle_pos);
146 bundle_position[3] = 1;
147
148 mul_v4_m4v4(reprojected_position, projection_matrix, bundle_position);
149 reprojected_position[0] = (reprojected_position[0] / (reprojected_position[3] * 2.0f) + 0.5f) *
150 clip_width;
151 reprojected_position[1] = (reprojected_position[1] / (reprojected_position[3] * 2.0f) + 0.5f) *
152 clip_height * aspy;
153
155 tracking, clip_width, clip_height, reprojected_position, reprojected_position);
156
157 marker_position[0] = (marker->pos[0] + track->offset[0]) * clip_width;
158 marker_position[1] = (marker->pos[1] + track->offset[1]) * clip_height * aspy;
159
160 sub_v2_v2v2(delta, reprojected_position, marker_position);
161 return len_v2(delta) * weight;
162}
163
165 SpaceClip *sc,
166 MovieTrackingTrack *track,
167 void *userdata,
171{
172 /* Tracks without bundle can not have any reprojection error curve. */
173 if ((track->flag & TRACK_HAS_BUNDLE) == 0) {
174 return;
175 }
176
178 MovieTracking *tracking = &clip->tracking;
179 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
180
181 int clip_width, clip_height;
182 BKE_movieclip_get_size(clip, &sc->user, &clip_width, &clip_height);
183
184 /* Iterate over segments. */
185 bool is_segment_open = false;
186 for (int marker_index = 0; marker_index < track->markersnr; marker_index++) {
187 MovieTrackingMarker *marker = &track->markers[marker_index];
188
189 /* End of tracked segment, no reprojection error can be calculated here since the ground truth
190 * 2D position is not known. */
191 if (marker->flag & MARKER_DISABLED) {
192 if (is_segment_open) {
193 if (segment_end != nullptr) {
194 segment_end(userdata, CLIP_VALUE_SOURCE_REPROJECTION_ERROR);
195 }
196 is_segment_open = false;
197 }
198 continue;
199 }
200
201 /* Begin new segment if it is not open yet. */
202 if (!is_segment_open) {
203 if (segment_start != nullptr) {
204 if ((marker_index + 1) == track->markersnr) {
205 segment_start(userdata, track, CLIP_VALUE_SOURCE_REPROJECTION_ERROR, true);
206 }
207 else {
208 segment_start(userdata,
209 track,
211 (track->markers[marker_index + 1].flag & MARKER_DISABLED));
212 }
213 }
214 is_segment_open = true;
215 }
216
217 if (func != nullptr) {
218 const int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
219 const float reprojection_error = calculate_reprojection_error_at_marker(
220 clip, tracking, tracking_object, track, marker, clip_width, clip_height, scene_framenr);
221 func(userdata,
222 track,
223 marker,
225 scene_framenr,
226 reprojection_error);
227 }
228 }
229
230 if (is_segment_open && segment_end != nullptr) {
231 segment_end(userdata, CLIP_VALUE_SOURCE_REPROJECTION_ERROR);
232 }
233}
234
236 MovieTrackingTrack *track,
237 void *userdata,
241{
243 sc, track, userdata, func, segment_start, segment_end);
244
246 sc, track, userdata, func, segment_start, segment_end);
247}
248
250 bool selected_only,
251 bool include_hidden,
252 void *userdata,
256{
258 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
259
260 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
261 if (!include_hidden && (track->flag & TRACK_HIDDEN) != 0) {
262 continue;
263 }
264
265 if (selected_only && !TRACK_SELECTED(track)) {
266 continue;
267 }
268
270 sc, track, userdata, func, segment_start, segment_end);
271 }
272}
273
275 bool selected_only,
276 bool include_hidden,
277 void *userdata,
278 void (*func)(void *userdata, MovieTrackingMarker *marker))
279{
281 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
282
283 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
284 if (!include_hidden && (track->flag & TRACK_HIDDEN) != 0) {
285 continue;
286 }
287
288 if (selected_only && !TRACK_SELECTED(track)) {
289 continue;
290 }
291
292 for (int i = 0; i < track->markersnr; i++) {
293 MovieTrackingMarker *marker = &track->markers[i];
294
295 if (marker->flag & MARKER_DISABLED) {
296 continue;
297 }
298
299 if (func) {
300 func(userdata, marker);
301 }
302 }
303 }
304}
305
307{
308 MovieTracking *tracking = &clip->tracking;
309 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
310 bool has_bundle = false;
311 const bool used_for_stabilization = (track->flag &
313 if (track == tracking_object->active_track) {
314 tracking_object->active_track = nullptr;
315 }
316 /* Handle reconstruction display in 3d viewport. */
317 if (track->flag & TRACK_HAS_BUNDLE) {
318 has_bundle = true;
319 }
320 /* Make sure no plane will use freed track */
322 /* Delete f-curves associated with the track (such as weight, i.e.) */
323 /* Escaped object name, escaped track name, rest of the path. */
324 char rna_path[MAX_NAME * 4 + 64];
325 BKE_tracking_get_rna_path_for_track(tracking, track, rna_path, sizeof(rna_path));
326 if (BKE_animdata_fix_paths_remove(&clip->id, rna_path)) {
328 }
329 /* Delete track itself. */
331 BLI_freelinkN(&tracking_object->tracks, track);
332 /* Send notifiers. */
334 if (used_for_stabilization) {
336 }
337 /* Inform dependency graph. */
338 DEG_id_tag_update(&clip->id, 0);
339 if (has_bundle) {
341 }
342}
343
345 MovieClip *clip,
346 MovieTrackingTrack *track,
347 MovieTrackingMarker *marker)
348{
349 if (track->markersnr == 1) {
350 clip_delete_track(C, clip, track);
351 }
352 else {
353 BKE_tracking_marker_delete(track, marker->framenr);
354
356 }
357}
358
360{
361 MovieTracking *tracking = &clip->tracking;
363
364 if (plane_track == tracking_object->active_plane_track) {
365 tracking_object->active_plane_track = nullptr;
366 }
367
368 /* Delete f-curves associated with the track (such as weight, i.e.) */
369 /* Escaped object name, escaped track name, rest of the path. */
370 char rna_path[MAX_NAME * 4 + 64];
371 BKE_tracking_get_rna_path_for_plane_track(tracking, plane_track, rna_path, sizeof(rna_path));
372 if (BKE_animdata_fix_paths_remove(&clip->id, rna_path)) {
374 }
375 /* Delete the plane track itself. */
377 BLI_freelinkN(&tracking_object->plane_tracks, plane_track);
378 /* TODO(sergey): Any notifiers to be sent here? */
379 (void)C;
380 /* Inform dependency graph. */
381 DEG_id_tag_update(&clip->id, 0);
382}
383
385 SpaceClip *sc, const float x, const float y, float *r_offset_x, float *r_offset_y)
386{
387 int width, height;
388 ED_space_clip_get_size(sc, &width, &height);
389
390 float aspx, aspy;
391 ED_space_clip_get_aspect(sc, &aspx, &aspy);
392
393 *r_offset_x = (x - 0.5f) * width * aspx;
394 *r_offset_y = (y - 0.5f) * height * aspy;
395}
396
397void clip_view_center_to_point(SpaceClip *sc, float x, float y)
398{
400}
401
402static bool selected_tracking_boundbox(SpaceClip *sc, float min[2], float max[2])
403{
405 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
406 const int framenr = ED_space_clip_get_clip_frame_number(sc);
407 int width, height;
408 bool ok = false;
409
411
412 ED_space_clip_get_size(sc, &width, &height);
413
414 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
415 if (TRACK_VIEW_SELECTED(sc, track)) {
416 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
417
418 if (marker) {
419 float pos[3];
420
421 pos[0] = marker->pos[0] + track->offset[0];
422 pos[1] = marker->pos[1] + track->offset[1];
423 pos[2] = 0.0f;
424
425 /* undistortion happens for normalized coords */
427 /* undistortion happens for normalized coords */
429 }
430
431 pos[0] *= width;
432 pos[1] *= height;
433
434 mul_v3_m4v3(pos, sc->stabmat, pos);
435
437
438 ok = true;
439 }
440 }
441 }
442
443 return ok;
444}
445
446static bool tracking_has_selection(SpaceClip *space_clip)
447{
448 MovieClip *clip = ED_space_clip_get_clip(space_clip);
449 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
450 const int framenr = ED_space_clip_get_clip_frame_number(space_clip);
451
452 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
453 if (!TRACK_VIEW_SELECTED(space_clip, track)) {
454 continue;
455 }
456 const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
457 if (marker != nullptr) {
458 return true;
459 }
460 }
461
462 return false;
463}
464
465static bool mask_has_selection(const bContext *C)
466{
468 if (mask == nullptr) {
469 return false;
470 }
471
472 LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
473 if (mask_layer->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) {
474 continue;
475 }
476 LISTBASE_FOREACH (MaskSpline *, spline, &mask_layer->splines) {
477 for (int i = 0; i < spline->tot_point; i++) {
478 const MaskSplinePoint *point = &spline->points[i];
479 const BezTriple *bezt = &point->bezt;
480 if (!MASKPOINT_ISSEL_ANY(point)) {
481 continue;
482 }
483 if (bezt->f2 & SELECT) {
484 return true;
485 }
486
488 return true;
489 }
490
491 if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) {
492 return true;
493 }
494 if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) {
495 return true;
496 }
497 }
498 }
499 }
500
501 return false;
502}
503
504static bool selected_boundbox(const bContext *C,
505 float min[2],
506 float max[2],
507 bool handles_as_control_point)
508{
510 if (sc->mode == SC_MODE_TRACKING) {
512 }
513
514 if (ED_mask_selected_minmax(C, min, max, handles_as_control_point)) {
516 int width, height;
517 ED_space_clip_get_size(sc, &width, &height);
520 min[0] *= width;
521 min[1] *= height;
522 max[0] *= width;
523 max[1] *= height;
524 return true;
525 }
526 return false;
527}
528
530 const bContext *C, bool fit, float *r_offset_x, float *r_offset_y, float *r_zoom)
531{
533
534 int frame_width, frame_height;
535 ED_space_clip_get_size(sc, &frame_width, &frame_height);
536
537 if ((frame_width == 0) || (frame_height == 0) || (sc->clip == nullptr)) {
538 return false;
539 }
540
541 /* NOTE: The `fit` argument is set to truth when doing "View to Selected" operator, and it set to
542 * false when this function is used for Lock-to-Selection functionality. When locking to
543 * selection the handles are to use control point position. So we can derive the
544 * `handles_as_control_point` from `fit`.
545 *
546 * TODO(sergey): Make such decision more explicit. Maybe pass use-case for the calculation to
547 * tell operator from lock-to-selection apart. */
548 float min[2], max[2];
549 if (!selected_boundbox(C, min, max, !fit)) {
550 return false;
551 }
552
553 /* center view */
555 (max[0] + min[0]) / (2 * frame_width),
556 (max[1] + min[1]) / (2 * frame_height),
557 r_offset_x,
558 r_offset_y);
559
560 const int w = max[0] - min[0];
561 const int h = max[1] - min[1];
562
563 /* set zoom to see all selection */
564 *r_zoom = sc->zoom;
565 if (w > 0 && h > 0) {
566 ARegion *region = CTX_wm_region(C);
567
568 int width, height;
569 float zoomx, zoomy, newzoom, aspx, aspy;
570
571 ED_space_clip_get_aspect(sc, &aspx, &aspy);
572
573 width = BLI_rcti_size_x(&region->winrct) + 1;
574 height = BLI_rcti_size_y(&region->winrct) + 1;
575
576 zoomx = float(width) / w / aspx;
577 zoomy = float(height) / h / aspy;
578
579 newzoom = 1.0f / power_of_2(1.0f / min_ff(zoomx, zoomy));
580
581 if (fit) {
582 *r_zoom = newzoom;
583 }
584 }
585
586 return true;
587}
588
590{
591 SpaceClip *space_clip = CTX_wm_space_clip(C);
592
593 if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
594 return false;
595 }
596
597 if (space_clip->mode == SC_MODE_TRACKING) {
598 return tracking_has_selection(space_clip);
599 }
600
601 return mask_has_selection(C);
602}
bool BKE_animdata_fix_paths_remove(struct ID *id, const char *prefix)
Mask * CTX_data_edit_mask(const bContext *C)
Main * CTX_data_main(const bContext *C)
SpaceClip * CTX_wm_space_clip(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
@ MASK_HANDLE_MODE_STICK
Definition BKE_mask.h:37
#define MASKPOINT_ISSEL_ANY(p)
Definition BKE_mask.h:292
void BKE_mask_coord_to_movieclip(struct MovieClip *clip, struct MovieClipUser *user, float r_co[2], const float co[2])
eMaskhandleMode BKE_mask_point_handles_mode_get(const struct MaskSplinePoint *point)
void BKE_movieclip_get_size(struct MovieClip *clip, const struct MovieClipUser *user, int *r_width, int *r_height)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
void BKE_tracking_plane_tracks_remove_point_track(struct MovieTracking *tracking, struct MovieTrackingTrack *track)
Definition tracking.cc:1675
void BKE_tracking_plane_track_free(struct MovieTrackingPlaneTrack *plane_track)
Definition tracking.cc:1625
#define TRACK_SELECTED(track)
float BKE_tracking_track_get_weight_for_marker(struct MovieClip *clip, struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker)
Definition tracking.cc:1172
void BKE_tracking_get_rna_path_for_track(const struct MovieTracking *tracking, const struct MovieTrackingTrack *track, char *rna_path, size_t rna_path_maxncpy)
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1358
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
void BKE_tracking_track_free(struct MovieTrackingTrack *track)
Definition tracking.cc:596
void BKE_tracking_distort_v2(struct MovieTracking *tracking, int image_width, int image_height, const float co[2], float r_co[2])
Definition tracking.cc:2415
void BKE_tracking_get_rna_path_for_plane_track(const struct MovieTracking *tracking, const struct MovieTrackingPlaneTrack *plane_track, char *rna_path, size_t rna_path_len)
#define TRACK_VIEW_SELECTED(sc, track)
void BKE_tracking_get_projection_matrix(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object, int framenr, int winx, int winy, float mat[4][4])
Definition tracking.cc:387
void BKE_tracking_marker_delete(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1281
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
MINLINE float min_ff(float a, float b)
MINLINE float power_of_2(float f)
void mul_v4_m4v4(float r[4], const float mat[4][4], const float v[4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:198
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:194
#define INIT_MINMAX2(min, max)
#define ELEM(...)
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ HD_VECT
#define MAX_NAME
Definition DNA_defs.h:50
@ MASK_HIDE_SELECT
@ MASK_HIDE_VIEW
@ MCLIP_PROXY_RENDER_UNDISTORT
@ SC_MODE_TRACKING
@ SC_LOCK_SELECTION
@ SC_SHOW_GRAPH_TRACKS_MOTION
@ SC_SHOW_GRAPH_TRACKS_ERROR
@ TRACK_HIDDEN
@ TRACK_USE_2D_STAB
@ TRACK_HAS_BUNDLE
@ TRACK_USE_2D_STAB_ROT
@ MARKER_DISABLED
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
void ED_space_clip_get_size(const SpaceClip *sc, int *r_width, int *r_height)
void ED_space_clip_get_aspect(const SpaceClip *sc, float *r_aspx, float *r_aspy)
int ED_space_clip_get_clip_frame_number(const SpaceClip *sc)
void ED_clip_point_undistorted_pos(const SpaceClip *sc, const float co[2], float r_co[2])
bool ED_mask_selected_minmax(const bContext *C, float min[2], float max[2], bool handles_as_control_point)
#define C
Definition RandGen.cpp:29
#define ND_DISPLAY
Definition WM_types.hh:491
#define NC_MOVIECLIP
Definition WM_types.hh:397
#define NA_EDITED
Definition WM_types.hh:584
#define ND_SPACE_VIEW3D
Definition WM_types.hh:528
#define NC_SPACE
Definition WM_types.hh:392
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
void(*)(void *userdata, MovieTrackingTrack *track, eClipCurveValueSource value_source, bool is_point) ClipTrackValueSegmentStartCallback
eClipCurveValueSource
@ CLIP_VALUE_SOURCE_REPROJECTION_ERROR
@ CLIP_VALUE_SOURCE_SPEED_Y
@ CLIP_VALUE_SOURCE_SPEED_X
void(*)(void *userdata, eClipCurveValueSource value_source) ClipTrackValueSegmentEndCallback
void(*)(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, eClipCurveValueSource value_source, int scene_framenr, float val) ClipTrackValueCallback
static bool mask_has_selection(const bContext *C)
void clip_graph_tracking_values_iterate_track(SpaceClip *sc, MovieTrackingTrack *track, void *userdata, ClipTrackValueCallback func, ClipTrackValueSegmentStartCallback segment_start, ClipTrackValueSegmentEndCallback segment_end)
bool clip_graph_value_visible(SpaceClip *sc, eClipCurveValueSource value_source)
Definition clip_utils.cc:40
static float calculate_reprojection_error_at_marker(MovieClip *clip, MovieTracking *tracking, MovieTrackingObject *tracking_object, MovieTrackingTrack *track, MovieTrackingMarker *marker, const int clip_width, const int clip_height, const int scene_framenr)
void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
static bool tracking_has_selection(SpaceClip *space_clip)
void clip_delete_plane_track(bContext *C, MovieClip *clip, MovieTrackingPlaneTrack *plane_track)
void clip_view_center_to_point(SpaceClip *sc, float x, float y)
static bool selected_tracking_boundbox(SpaceClip *sc, float min[2], float max[2])
static void clip_graph_tracking_values_iterate_track_reprojection_error_values(SpaceClip *sc, MovieTrackingTrack *track, void *userdata, ClipTrackValueCallback func, ClipTrackValueSegmentStartCallback segment_start, ClipTrackValueSegmentEndCallback segment_end)
bool clip_view_calculate_view_selection(const bContext *C, bool fit, float *r_offset_x, float *r_offset_y, float *r_zoom)
bool clip_view_has_locked_selection(const bContext *C)
void clip_graph_tracking_values_iterate(SpaceClip *sc, bool selected_only, bool include_hidden, void *userdata, ClipTrackValueCallback func, ClipTrackValueSegmentStartCallback segment_start, ClipTrackValueSegmentEndCallback segment_end)
void clip_graph_tracking_iterate(SpaceClip *sc, bool selected_only, bool include_hidden, void *userdata, void(*func)(void *userdata, MovieTrackingMarker *marker))
static void clip_graph_tracking_values_iterate_track_speed_values(SpaceClip *sc, MovieTrackingTrack *track, void *userdata, ClipTrackValueCallback func, ClipTrackValueSegmentStartCallback segment_start, ClipTrackValueSegmentEndCallback segment_end)
Definition clip_utils.cc:55
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
void clip_view_offset_for_center_to_point(SpaceClip *sc, const float x, const float y, float *r_offset_x, float *r_offset_y)
static bool selected_boundbox(const bContext *C, float min[2], float max[2], bool handles_as_control_point)
nullptr float
#define SELECT
uint pos
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
#define min(a, b)
Definition sort.cc:36
struct MovieTracking tracking
MovieTrackingPlaneTrack * active_plane_track
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
MovieTrackingCamera camera
struct MovieClipUser user
float stabmat[4][4]
struct MovieClip * clip
i
Definition text_draw.cc:230
max
Definition text_draw.cc:251
void WM_event_add_notifier(const bContext *C, uint type, void *reference)