Blender V4.3
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
9#include "DNA_scene_types.h"
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_listbase.h"
14#include "BLI_math_matrix.h"
15#include "BLI_rect.h"
16#include "BLI_utildefines.h"
17
18#include "BKE_animsys.h"
19#include "BKE_context.hh"
20#include "BKE_mask.h"
21#include "BKE_movieclip.h"
22#include "BKE_tracking.h"
23
24#include "DEG_depsgraph.hh"
26
27#include "GPU_immediate.hh"
28#include "GPU_state.hh"
29
30#include "WM_api.hh"
31#include "WM_types.hh"
32
33#include "ED_clip.hh"
34#include "ED_mask.hh"
35
36#include "UI_resources.hh"
37#include "UI_view2d.hh"
38
39#include "clip_intern.hh" /* own include */
40
42{
44 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_MOTION) == 0) {
45 return false;
46 }
47 }
48 else if (value_source == CLIP_VALUE_SOURCE_REPROJECTION_ERROR) {
49 if ((sc->flag & SC_SHOW_GRAPH_TRACKS_ERROR) == 0) {
50 return false;
51 }
52 }
53 return true;
54}
55
57 SpaceClip *sc,
58 MovieTrackingTrack *track,
59 void *userdata,
63{
65 int width, height, coord;
66
67 BKE_movieclip_get_size(clip, &sc->user, &width, &height);
68
69 for (coord = 0; coord < 2; coord++) {
70 eClipCurveValueSource value_source = (coord == 0) ? CLIP_VALUE_SOURCE_SPEED_X :
72 int i, prevfra = track->markers[0].framenr;
73 bool open = false;
74 float prevval = 0.0f;
75
76 for (i = 0; i < track->markersnr; i++) {
77 MovieTrackingMarker *marker = &track->markers[i];
78 float val;
79
80 if (marker->flag & MARKER_DISABLED) {
81 if (open) {
82 if (segment_end) {
83 segment_end(userdata, value_source);
84 }
85
86 open = false;
87 }
88
89 continue;
90 }
91
92 if (!open) {
93 if (segment_start) {
94 if ((i + 1) == track->markersnr) {
95 segment_start(userdata, track, value_source, true);
96 }
97 else {
98 segment_start(
99 userdata, track, value_source, (track->markers[i + 1].flag & MARKER_DISABLED));
100 }
101 }
102
103 open = true;
104 prevval = marker->pos[coord];
105 }
106
107 /* value is a pixels per frame speed */
108 val = (marker->pos[coord] - prevval) * ((coord == 0) ? (width) : (height));
109 val /= marker->framenr - prevfra;
110
111 if (func) {
112 int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
113
114 func(userdata, track, marker, value_source, scene_framenr, val);
115 }
116
117 prevval = marker->pos[coord];
118 prevfra = marker->framenr;
119 }
120
121 if (open) {
122 if (segment_end) {
123 segment_end(userdata, value_source);
124 }
125 }
126 }
127}
128
130 MovieTracking *tracking,
131 MovieTrackingObject *tracking_object,
132 MovieTrackingTrack *track,
133 MovieTrackingMarker *marker,
134 const int clip_width,
135 const int clip_height,
136 const int scene_framenr)
137{
138 float reprojected_position[4], bundle_position[4], marker_position[2], delta[2];
139 float weight = BKE_tracking_track_get_weight_for_marker(clip, track, marker);
140 const float aspy = 1.0f / tracking->camera.pixel_aspect;
141
142 float projection_matrix[4][4];
144 tracking, tracking_object, scene_framenr, clip_width, clip_height, projection_matrix);
145
146 copy_v3_v3(bundle_position, track->bundle_pos);
147 bundle_position[3] = 1;
148
149 mul_v4_m4v4(reprojected_position, projection_matrix, bundle_position);
150 reprojected_position[0] = (reprojected_position[0] / (reprojected_position[3] * 2.0f) + 0.5f) *
151 clip_width;
152 reprojected_position[1] = (reprojected_position[1] / (reprojected_position[3] * 2.0f) + 0.5f) *
153 clip_height * aspy;
154
156 tracking, clip_width, clip_height, reprojected_position, reprojected_position);
157
158 marker_position[0] = (marker->pos[0] + track->offset[0]) * clip_width;
159 marker_position[1] = (marker->pos[1] + track->offset[1]) * clip_height * aspy;
160
161 sub_v2_v2v2(delta, reprojected_position, marker_position);
162 return len_v2(delta) * weight;
163}
164
166 SpaceClip *sc,
167 MovieTrackingTrack *track,
168 void *userdata,
172{
173 /* Tracks without bundle can not have any reprojection error curve. */
174 if ((track->flag & TRACK_HAS_BUNDLE) == 0) {
175 return;
176 }
177
179 MovieTracking *tracking = &clip->tracking;
180 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
181
182 int clip_width, clip_height;
183 BKE_movieclip_get_size(clip, &sc->user, &clip_width, &clip_height);
184
185 /* Iterate over segments. */
186 bool is_segment_open = false;
187 for (int marker_index = 0; marker_index < track->markersnr; marker_index++) {
188 MovieTrackingMarker *marker = &track->markers[marker_index];
189
190 /* End of tracked segment, no reprojection error can be calculated here since the ground truth
191 * 2D position is not known. */
192 if (marker->flag & MARKER_DISABLED) {
193 if (is_segment_open) {
194 if (segment_end != nullptr) {
195 segment_end(userdata, CLIP_VALUE_SOURCE_REPROJECTION_ERROR);
196 }
197 is_segment_open = false;
198 }
199 continue;
200 }
201
202 /* Begin new segment if it is not open yet. */
203 if (!is_segment_open) {
204 if (segment_start != nullptr) {
205 if ((marker_index + 1) == track->markersnr) {
206 segment_start(userdata, track, CLIP_VALUE_SOURCE_REPROJECTION_ERROR, true);
207 }
208 else {
209 segment_start(userdata,
210 track,
212 (track->markers[marker_index + 1].flag & MARKER_DISABLED));
213 }
214 }
215 is_segment_open = true;
216 }
217
218 if (func != nullptr) {
219 const int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
220 const float reprojection_error = calculate_reprojection_error_at_marker(
221 clip, tracking, tracking_object, track, marker, clip_width, clip_height, scene_framenr);
222 func(userdata,
223 track,
224 marker,
226 scene_framenr,
227 reprojection_error);
228 }
229 }
230
231 if (is_segment_open && segment_end != nullptr) {
232 segment_end(userdata, CLIP_VALUE_SOURCE_REPROJECTION_ERROR);
233 }
234}
235
237 MovieTrackingTrack *track,
238 void *userdata,
242{
244 sc, track, userdata, func, segment_start, segment_end);
245
247 sc, track, userdata, func, segment_start, segment_end);
248}
249
251 bool selected_only,
252 bool include_hidden,
253 void *userdata,
257{
259 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
260
261 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
262 if (!include_hidden && (track->flag & TRACK_HIDDEN) != 0) {
263 continue;
264 }
265
266 if (selected_only && !TRACK_SELECTED(track)) {
267 continue;
268 }
269
271 sc, track, userdata, func, segment_start, segment_end);
272 }
273}
274
276 bool selected_only,
277 bool include_hidden,
278 void *userdata,
279 void (*func)(void *userdata, MovieTrackingMarker *marker))
280{
282 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
283
284 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
285 if (!include_hidden && (track->flag & TRACK_HIDDEN) != 0) {
286 continue;
287 }
288
289 if (selected_only && !TRACK_SELECTED(track)) {
290 continue;
291 }
292
293 for (int i = 0; i < track->markersnr; i++) {
294 MovieTrackingMarker *marker = &track->markers[i];
295
296 if (marker->flag & MARKER_DISABLED) {
297 continue;
298 }
299
300 if (func) {
301 func(userdata, marker);
302 }
303 }
304 }
305}
306
308{
309 MovieTracking *tracking = &clip->tracking;
310 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
311 bool has_bundle = false;
312 const bool used_for_stabilization = (track->flag &
314 if (track == tracking_object->active_track) {
315 tracking_object->active_track = nullptr;
316 }
317 /* Handle reconstruction display in 3d viewport. */
318 if (track->flag & TRACK_HAS_BUNDLE) {
319 has_bundle = true;
320 }
321 /* Make sure no plane will use freed track */
323 /* Delete f-curves associated with the track (such as weight, i.e.) */
324 /* Escaped object name, escaped track name, rest of the path. */
325 char rna_path[MAX_NAME * 4 + 64];
326 BKE_tracking_get_rna_path_for_track(tracking, track, rna_path, sizeof(rna_path));
327 if (BKE_animdata_fix_paths_remove(&clip->id, rna_path)) {
329 }
330 /* Delete track itself. */
332 BLI_freelinkN(&tracking_object->tracks, track);
333 /* Send notifiers. */
335 if (used_for_stabilization) {
337 }
338 /* Inform dependency graph. */
339 DEG_id_tag_update(&clip->id, 0);
340 if (has_bundle) {
342 }
343}
344
346 MovieClip *clip,
347 MovieTrackingTrack *track,
348 MovieTrackingMarker *marker)
349{
350 if (track->markersnr == 1) {
351 clip_delete_track(C, clip, track);
352 }
353 else {
354 BKE_tracking_marker_delete(track, marker->framenr);
355
357 }
358}
359
361{
362 MovieTracking *tracking = &clip->tracking;
363 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
364
365 if (plane_track == tracking_object->active_plane_track) {
366 tracking_object->active_plane_track = nullptr;
367 }
368
369 /* Delete f-curves associated with the track (such as weight, i.e.) */
370 /* Escaped object name, escaped track name, rest of the path. */
371 char rna_path[MAX_NAME * 4 + 64];
372 BKE_tracking_get_rna_path_for_plane_track(tracking, plane_track, rna_path, sizeof(rna_path));
373 if (BKE_animdata_fix_paths_remove(&clip->id, rna_path)) {
375 }
376 /* Delete the plane track itself. */
378 BLI_freelinkN(&tracking_object->plane_tracks, plane_track);
379 /* TODO(sergey): Any notifiers to be sent here? */
380 (void)C;
381 /* Inform dependency graph. */
382 DEG_id_tag_update(&clip->id, 0);
383}
384
386 SpaceClip *sc, const float x, const float y, float *r_offset_x, float *r_offset_y)
387{
388 int width, height;
389 ED_space_clip_get_size(sc, &width, &height);
390
391 float aspx, aspy;
392 ED_space_clip_get_aspect(sc, &aspx, &aspy);
393
394 *r_offset_x = (x - 0.5f) * width * aspx;
395 *r_offset_y = (y - 0.5f) * height * aspy;
396}
397
398void clip_view_center_to_point(SpaceClip *sc, float x, float y)
399{
400 clip_view_offset_for_center_to_point(sc, x, y, &sc->xof, &sc->yof);
401}
402
403static bool selected_tracking_boundbox(SpaceClip *sc, float min[2], float max[2])
404{
406 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
407 const int framenr = ED_space_clip_get_clip_frame_number(sc);
408 int width, height;
409 bool ok = false;
410
411 INIT_MINMAX2(min, max);
412
413 ED_space_clip_get_size(sc, &width, &height);
414
415 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
416 if (TRACK_VIEW_SELECTED(sc, track)) {
417 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
418
419 if (marker) {
420 float pos[3];
421
422 pos[0] = marker->pos[0] + track->offset[0];
423 pos[1] = marker->pos[1] + track->offset[1];
424 pos[2] = 0.0f;
425
426 /* undistortion happens for normalized coords */
428 /* undistortion happens for normalized coords */
430 }
431
432 pos[0] *= width;
433 pos[1] *= height;
434
435 mul_v3_m4v3(pos, sc->stabmat, pos);
436
437 minmax_v2v2_v2(min, max, pos);
438
439 ok = true;
440 }
441 }
442 }
443
444 return ok;
445}
446
447static bool tracking_has_selection(SpaceClip *space_clip)
448{
449 MovieClip *clip = ED_space_clip_get_clip(space_clip);
450 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
451 const int framenr = ED_space_clip_get_clip_frame_number(space_clip);
452
453 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
454 if (!TRACK_VIEW_SELECTED(space_clip, track)) {
455 continue;
456 }
457 const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
458 if (marker != nullptr) {
459 return true;
460 }
461 }
462
463 return false;
464}
465
466static bool mask_has_selection(const bContext *C)
467{
468 Mask *mask = CTX_data_edit_mask(C);
469 if (mask == nullptr) {
470 return false;
471 }
472
473 LISTBASE_FOREACH (MaskLayer *, mask_layer, &mask->masklayers) {
474 if (mask_layer->visibility_flag & (MASK_HIDE_VIEW | MASK_HIDE_SELECT)) {
475 continue;
476 }
477 LISTBASE_FOREACH (MaskSpline *, spline, &mask_layer->splines) {
478 for (int i = 0; i < spline->tot_point; i++) {
479 const MaskSplinePoint *point = &spline->points[i];
480 const BezTriple *bezt = &point->bezt;
481 if (!MASKPOINT_ISSEL_ANY(point)) {
482 continue;
483 }
484 if (bezt->f2 & SELECT) {
485 return true;
486 }
487
489 return true;
490 }
491
492 if ((bezt->f1 & SELECT) && (bezt->h1 != HD_VECT)) {
493 return true;
494 }
495 if ((bezt->f3 & SELECT) && (bezt->h2 != HD_VECT)) {
496 return true;
497 }
498 }
499 }
500 }
501
502 return false;
503}
504
505static bool selected_boundbox(const bContext *C,
506 float min[2],
507 float max[2],
508 bool handles_as_control_point)
509{
511 if (sc->mode == SC_MODE_TRACKING) {
512 return selected_tracking_boundbox(sc, min, max);
513 }
514
515 if (ED_mask_selected_minmax(C, min, max, handles_as_control_point)) {
517 int width, height;
518 ED_space_clip_get_size(sc, &width, &height);
520 BKE_mask_coord_to_movieclip(clip, &sc->user, max, max);
521 min[0] *= width;
522 min[1] *= height;
523 max[0] *= width;
524 max[1] *= height;
525 return true;
526 }
527 return false;
528}
529
531 const bContext *C, bool fit, float *r_offset_x, float *r_offset_y, float *r_zoom)
532{
534
535 int frame_width, frame_height;
536 ED_space_clip_get_size(sc, &frame_width, &frame_height);
537
538 if ((frame_width == 0) || (frame_height == 0) || (sc->clip == nullptr)) {
539 return false;
540 }
541
542 /* NOTE: The `fit` argument is set to truth when doing "View to Selected" operator, and it set to
543 * false when this function is used for Lock-to-Selection functionality. When locking to
544 * selection the handles are to use control point position. So we can derive the
545 * `handles_as_control_point` from `fit`.
546 *
547 * TODO(sergey): Make such decision more explicit. Maybe pass use-case for the calculation to
548 * tell operator from lock-to-selection apart. */
549 float min[2], max[2];
550 if (!selected_boundbox(C, min, max, !fit)) {
551 return false;
552 }
553
554 /* center view */
556 (max[0] + min[0]) / (2 * frame_width),
557 (max[1] + min[1]) / (2 * frame_height),
558 r_offset_x,
559 r_offset_y);
560
561 const int w = max[0] - min[0];
562 const int h = max[1] - min[1];
563
564 /* set zoom to see all selection */
565 *r_zoom = sc->zoom;
566 if (w > 0 && h > 0) {
567 ARegion *region = CTX_wm_region(C);
568
569 int width, height;
570 float zoomx, zoomy, newzoom, aspx, aspy;
571
572 ED_space_clip_get_aspect(sc, &aspx, &aspy);
573
574 width = BLI_rcti_size_x(&region->winrct) + 1;
575 height = BLI_rcti_size_y(&region->winrct) + 1;
576
577 zoomx = float(width) / w / aspx;
578 zoomy = float(height) / h / aspy;
579
580 newzoom = 1.0f / power_of_2(1.0f / min_ff(zoomx, zoomy));
581
582 if (fit) {
583 *r_zoom = newzoom;
584 }
585 }
586
587 return true;
588}
589
591{
592 SpaceClip *space_clip = CTX_wm_space_clip(C);
593
594 if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
595 return false;
596 }
597
598 if (space_clip->mode == SC_MODE_TRACKING) {
599 return tracking_has_selection(space_clip);
600 }
601
602 return mask_has_selection(C);
603}
604
606{
608
609 /* currently clip editor supposes that editing clip length is equal to scene frame range */
611
614
615 immUniformColor4f(0.0f, 0.0f, 0.0f, 0.4f);
616 immRectf(pos, v2d->cur.xmin, v2d->cur.ymin, float(scene->r.sfra), v2d->cur.ymax);
617 immRectf(pos, float(scene->r.efra), v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax);
618
620
622
623 /* thin lines where the actual frames are */
624 GPU_line_width(1.0f);
625
627 immVertex2f(pos, float(scene->r.sfra), v2d->cur.ymin);
628 immVertex2f(pos, float(scene->r.sfra), v2d->cur.ymax);
629 immVertex2f(pos, float(scene->r.efra), v2d->cur.ymin);
630 immVertex2f(pos, float(scene->r.efra), v2d->cur.ymax);
631 immEnd();
632
634}
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:41
#define MASKPOINT_ISSEL_ANY(p)
Definition BKE_mask.h:297
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:2421
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:386
void BKE_tracking_marker_delete(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1281
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:269
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:193
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
unsigned int uint
#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)
void immEnd()
void immUnbindProgram()
void immUniformColor4f(float r, float g, float b, float a)
void immVertex2f(uint attr_id, float x, float y)
void immUniformThemeColorShade(int color_id, int offset)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
GPUVertFormat * immVertexFormat()
void immBegin(GPUPrimType, uint vertex_len)
void immRectf(uint pos, float x1, float y1, float x2, float y2)
@ GPU_PRIM_LINES
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_BLEND_NONE
Definition GPU_state.hh:85
@ GPU_BLEND_ALPHA
Definition GPU_state.hh:87
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
void GPU_line_width(float width)
Definition gpu_state.cc:161
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
Read Guarded memory(de)allocation.
@ TH_BACK
void UI_view2d_view_ortho(const View2D *v2d)
Definition view2d.cc:1091
#define ND_DISPLAY
Definition WM_types.hh:458
#define NC_MOVIECLIP
Definition WM_types.hh:364
#define NA_EDITED
Definition WM_types.hh:550
#define ND_SPACE_VIEW3D
Definition WM_types.hh:494
#define NC_SPACE
Definition WM_types.hh:359
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
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, eClipCurveValueSource value_source, bool is_point) ClipTrackValueSegmentStartCallback
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:41
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])
void clip_draw_sfra_efra(View2D *v2d, Scene *scene)
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:56
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)
#define SELECT
draw_view in_light_buf[] float
#define min(a, b)
Definition sort.c:32
MovieTrackingPlaneTrack * active_plane_track
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
struct MovieClipUser user
float stabmat[4][4]
struct MovieClip * clip
float xmax
float xmin
float ymax
float ymin
void WM_event_add_notifier(const bContext *C, uint type, void *reference)