Blender V5.0
clip_graph_ops.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 <algorithm>
10
11#include "DNA_scene_types.h"
12
13#include "BLI_math_geom.h"
14#include "BLI_math_vector.h"
15#include "BLI_rect.h"
16#include "BLI_utildefines.h"
17
18#include "BLT_translation.hh"
19
20#include "BKE_context.hh"
21#include "BKE_tracking.h"
22
23#include "DEG_depsgraph.hh"
24
25#include "UI_interface_icons.hh"
26
27#include "WM_api.hh"
28#include "WM_types.hh"
29
30#include "ED_clip.hh"
31#include "ED_screen.hh"
32#include "ED_select_utils.hh"
33
34#include "RNA_access.hh"
35#include "RNA_define.hh"
36
37#include "UI_view2d.hh"
38
39#include "clip_intern.hh" /* own include */
40
41/******************** common graph-editing utilities ********************/
42
44{
47
48 return sc->view == SC_VIEW_GRAPH;
49 }
50
51 return false;
52}
53
55{
58
60 }
61 return false;
62}
63
65 int action;
66};
67
68static void toggle_selection_cb(void *userdata, MovieTrackingMarker *marker)
69{
70 SelectUserData *data = (SelectUserData *)userdata;
71
72 switch (data->action) {
73 case SEL_SELECT:
74 marker->flag |= MARKER_GRAPH_SEL;
75 break;
76 case SEL_DESELECT:
77 marker->flag &= ~MARKER_GRAPH_SEL;
78 break;
79 case SEL_INVERT:
80 marker->flag ^= MARKER_GRAPH_SEL;
81 break;
82 }
83}
84
85/******************** mouse select operator ********************/
86
90 bool has_prev; /* if there's valid coordinate of previous point of curve segment */
91
92 float min_dist_sq; /* minimal distance between mouse and currently found entity */
93 float mouse_co[2]; /* mouse coordinate */
94 float prev_co[2]; /* coordinate of previous point of segment */
95 float min_co[2]; /* coordinate of entity with minimal distance */
96
97 MovieTrackingTrack *track; /* nearest found track */
98 MovieTrackingMarker *marker; /* nearest found marker */
99};
100
101static void find_nearest_tracking_segment_cb(void *userdata,
102 MovieTrackingTrack *track,
103 MovieTrackingMarker * /*marker*/,
104 eClipCurveValueSource value_source,
105 int scene_framenr,
106 float val)
107{
108 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
109 const float co[2] = {float(scene_framenr), val};
110
111 if (!clip_graph_value_visible(data->sc, value_source)) {
112 return;
113 }
114
115 if (data->has_prev) {
116 float dist_sq = dist_squared_to_line_segment_v2(data->mouse_co, data->prev_co, co);
117
118 if (data->track == nullptr || dist_sq < data->min_dist_sq) {
119 data->track = track;
120 data->min_dist_sq = dist_sq;
121 data->value_source = value_source;
122 copy_v2_v2(data->min_co, co);
123 }
124 }
125
126 data->has_prev = true;
127 copy_v2_v2(data->prev_co, co);
128}
129
130static void find_nearest_tracking_segment_end_cb(void *userdata,
131 eClipCurveValueSource /*source_value*/)
132{
133 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
134
135 data->has_prev = false;
136}
137
138static void find_nearest_tracking_knot_cb(void *userdata,
139 MovieTrackingTrack *track,
140 MovieTrackingMarker *marker,
141 eClipCurveValueSource value_source,
142 int scene_framenr,
143 float val)
144{
145 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
146 const float mdiff[2] = {scene_framenr - data->mouse_co[0], val - data->mouse_co[1]};
147 float dist_sq = len_squared_v2(mdiff);
148
149 if (!clip_graph_value_visible(data->sc, value_source)) {
150 return;
151 }
152
153 if (data->marker == nullptr || dist_sq < data->min_dist_sq) {
154 const float co[2] = {float(scene_framenr), val};
155
156 data->track = track;
157 data->marker = marker;
158 data->min_dist_sq = dist_sq;
159 data->value_source = value_source;
160 copy_v2_v2(data->min_co, co);
161 }
162}
163
164static void mouse_select_init_data(bContext *C, MouseSelectUserData *userdata, const float co[2])
165{
167 memset(userdata, 0, sizeof(MouseSelectUserData));
168 userdata->sc = sc;
169 userdata->min_dist_sq = FLT_MAX;
170 copy_v2_v2(userdata->mouse_co, co);
171}
172
173static bool mouse_select_knot(bContext *C, const float co[2], bool extend)
174{
177 ARegion *region = CTX_wm_region(C);
178 View2D *v2d = &region->v2d;
179 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
180 MovieTrackingTrack *active_track = tracking_object->active_track;
181 static const int delta = 6;
182
183 if (active_track) {
184 MouseSelectUserData userdata;
185
186 mouse_select_init_data(C, &userdata, co);
188 sc, active_track, &userdata, find_nearest_tracking_knot_cb, nullptr, nullptr);
189
190 if (userdata.marker) {
191 int x1, y1, x2, y2;
192
193 if (UI_view2d_view_to_region_clip(v2d, co[0], co[1], &x1, &y1) &&
194 UI_view2d_view_to_region_clip(v2d, userdata.min_co[0], userdata.min_co[1], &x2, &y2) &&
195 (abs(x2 - x1) <= delta && abs(y2 - y1) <= delta))
196 {
197 if (!extend) {
198 SelectUserData selectdata = {SEL_DESELECT};
199
201 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
202 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
203 &selectdata,
205 }
206
207 if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_X) {
208 if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_X) != 0) {
209 userdata.marker->flag &= ~MARKER_GRAPH_SEL_X;
210 }
211 else {
212 userdata.marker->flag |= MARKER_GRAPH_SEL_X;
213 }
214 }
215 else if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
216 if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_Y) != 0) {
217 userdata.marker->flag &= ~MARKER_GRAPH_SEL_Y;
218 }
219 else {
220 userdata.marker->flag |= MARKER_GRAPH_SEL_Y;
221 }
222 }
223
224 return true;
225 }
226 }
227 }
228
229 return false;
230}
231
232static bool mouse_select_curve(bContext *C, const float co[2], bool extend)
233{
237 MovieTrackingTrack *active_track = tracking_object->active_track;
238 MouseSelectUserData userdata;
239
240 mouse_select_init_data(C, &userdata, co);
242 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
243 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
244 &userdata,
246 nullptr,
248
249 if (userdata.track) {
250 if (extend) {
251 if (active_track == userdata.track) {
252 /* currently only single curve can be selected
253 * (selected curve represents active track) */
254 active_track = nullptr;
255 }
256 }
257 else if (active_track != userdata.track) {
258 SelectUserData selectdata = {SEL_DESELECT};
259
260 tracking_object->active_track = userdata.track;
261 if ((sc->flag & SC_SHOW_GRAPH_SEL_ONLY) == 0) {
262 BKE_tracking_track_select(&tracking_object->tracks, userdata.track, TRACK_AREA_ALL, false);
263 }
264
265 /* deselect all knots on newly selected curve */
267 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
268 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
269 &selectdata,
271 }
272
273 return true;
274 }
275
276 return false;
277}
278
279static wmOperatorStatus mouse_select(bContext *C, float co[2], bool extend)
280{
281 bool sel = false;
282
283 /* first try to select knot on selected curves */
284 sel = mouse_select_knot(C, co, extend);
285
286 if (!sel) {
287 /* if there's no close enough knot to mouse position, select nearest curve */
288 sel = mouse_select_curve(C, co, extend);
289 }
290
291 if (sel) {
293 }
294
295 return OPERATOR_FINISHED;
296}
297
299{
300 float co[2];
301 bool extend = RNA_boolean_get(op->ptr, "extend");
302
303 RNA_float_get_array(op->ptr, "location", co);
304
305 return mouse_select(C, co, extend);
306}
307
309{
310 ARegion *region = CTX_wm_region(C);
311 float co[2];
312
313 UI_view2d_region_to_view(&region->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
314 RNA_float_set_array(op->ptr, "location", co);
315
316 return select_exec(C, op);
317}
318
320{
321 PropertyRNA *prop;
322
323 /* identifiers */
324 ot->name = "Select";
325 ot->description = "Select graph curves";
326 ot->idname = "CLIP_OT_graph_select";
327
328 /* API callbacks. */
329 ot->exec = select_exec;
330 ot->invoke = select_invoke;
332
333 /* flags */
334 ot->flag = OPTYPE_UNDO;
335
336 /* properties */
338 "location",
339 2,
340 nullptr,
341 -FLT_MAX,
342 FLT_MAX,
343 "Location",
344 "Mouse location to select nearest entity",
345 -100.0f,
346 100.0f);
347 prop = RNA_def_boolean(ot->srna,
348 "extend",
349 false,
350 "Extend",
351 "Extend selection rather than clearing the existing selection");
353}
354
355/********************** box select operator *********************/
356
361
362static void box_select_cb(void *userdata,
363 MovieTrackingTrack * /*track*/,
364 MovieTrackingMarker *marker,
365 eClipCurveValueSource value_source,
366 int scene_framenr,
367 float val)
368{
371 return;
372 }
373
374 if (BLI_rctf_isect_pt(&data->rect, scene_framenr, val)) {
375 int flag = 0;
376
377 if (value_source == CLIP_VALUE_SOURCE_SPEED_X) {
379 }
380 else {
382 }
383
384 if (data->select) {
385 marker->flag |= flag;
386 }
387 else {
388 marker->flag &= ~flag;
389 }
390 data->changed = true;
391 }
392 else if (!data->extend) {
393 marker->flag &= ~MARKER_GRAPH_SEL;
394 }
395}
396
398{
400 ARegion *region = CTX_wm_region(C);
401
403 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
404 MovieTrackingTrack *active_track = tracking_object->active_track;
405 BoxSelectuserData userdata;
406 rctf rect;
407
408 if (active_track == nullptr) {
409 return OPERATOR_CANCELLED;
410 }
411
412 /* get rectangle from operator */
414 UI_view2d_region_to_view_rctf(&region->v2d, &rect, &userdata.rect);
415
416 userdata.changed = false;
417 userdata.select = !RNA_boolean_get(op->ptr, "deselect");
418 userdata.extend = RNA_boolean_get(op->ptr, "extend");
419
421 sc, active_track, &userdata, box_select_cb, nullptr, nullptr);
422
423 if (userdata.changed) {
425
426 return OPERATOR_FINISHED;
427 }
428
429 return OPERATOR_CANCELLED;
430}
431
433{
434 /* identifiers */
435 ot->name = "Box Select";
436 ot->description = "Select curve points using box selection";
437 ot->idname = "CLIP_OT_graph_select_box";
438
439 /* API callbacks. */
440 ot->invoke = WM_gesture_box_invoke;
442 ot->modal = WM_gesture_box_modal;
444
445 /* flags */
446 ot->flag = OPTYPE_UNDO;
447
448 /* properties */
450}
451
452/********************** select all operator *********************/
453
455{
458 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
459 MovieTrackingTrack *active_track = tracking_object->active_track;
460 int action = RNA_enum_get(op->ptr, "action");
461
462 if (!active_track) {
463 return OPERATOR_CANCELLED;
464 }
465
466 if (action == SEL_TOGGLE) {
467 action = SEL_SELECT;
468
469 for (int a = 0; a < active_track->markersnr; a++) {
470 MovieTrackingMarker *marker = &active_track->markers[a];
471
472 if (marker->flag & MARKER_GRAPH_SEL) {
473 action = SEL_DESELECT;
474 break;
475 }
476 }
477 }
478
479 for (int a = 0; a < active_track->markersnr; a++) {
480 MovieTrackingMarker *marker = &active_track->markers[a];
481
482 switch (action) {
483 case SEL_SELECT:
484 marker->flag |= MARKER_GRAPH_SEL;
485 break;
486 case SEL_DESELECT:
487 marker->flag &= ~MARKER_GRAPH_SEL;
488 break;
489 case SEL_INVERT:
490 marker->flag ^= MARKER_GRAPH_SEL;
491 break;
492 }
493 }
494
496
497 return OPERATOR_FINISHED;
498}
499
501{
502 /* identifiers */
503 ot->name = "(De)select All Markers";
504 ot->description = "Change selection of all markers of active track";
505 ot->idname = "CLIP_OT_graph_select_all_markers";
506
507 /* API callbacks. */
510
511 /* flags */
513
515}
516
517/******************** delete curve operator ********************/
518
520{
523 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
524 MovieTrackingTrack *active_track = tracking_object->active_track;
525
526 if (!active_track) {
527 return OPERATOR_CANCELLED;
528 }
529
530 clip_delete_track(C, clip, active_track);
531
532 return OPERATOR_FINISHED;
533}
534
536{
537 if (RNA_boolean_get(op->ptr, "confirm")) {
539 op,
540 IFACE_("Delete track corresponding to the selected curve?"),
541 nullptr,
542 IFACE_("Delete"),
544 false);
545 }
546 return delete_curve_exec(C, op);
547}
548
550{
551 /* identifiers */
552 ot->name = "Delete Curve";
553 ot->description = "Delete track corresponding to the selected curve";
554 ot->idname = "CLIP_OT_graph_delete_curve";
555
556 /* API callbacks. */
557 ot->invoke = delete_curve_invoke;
558 ot->exec = delete_curve_exec;
560
561 /* flags */
564}
565
566/******************** delete knot operator ********************/
567
569{
572 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
573 MovieTrackingTrack *active_track = tracking_object->active_track;
574
575 if (active_track) {
576 int a = 0;
577
578 while (a < active_track->markersnr) {
579 MovieTrackingMarker *marker = &active_track->markers[a];
580
581 if (marker->flag & MARKER_GRAPH_SEL) {
582 clip_delete_marker(C, clip, active_track, marker);
583 }
584 else {
585 a++;
586 }
587 }
588 }
589
590 return OPERATOR_FINISHED;
591}
592
594{
595 /* identifiers */
596 ot->name = "Delete Knot";
597 ot->description = "Delete curve knots";
598 ot->idname = "CLIP_OT_graph_delete_knot";
599
600 /* API callbacks. */
601 ot->exec = delete_knot_exec;
603
604 /* flags */
606}
607
608/******************** view all operator ********************/
609
611 float min, max;
612};
613
614static void view_all_cb(void *userdata,
615 MovieTrackingTrack * /*track*/,
616 MovieTrackingMarker * /*marker*/,
617 eClipCurveValueSource /*value_source*/,
618 int /*scene_framenr*/,
619 float val)
620{
621 ViewAllUserData *data = (ViewAllUserData *)userdata;
622
623 data->min = std::min(val, data->min);
624 data->max = std::max(val, data->max);
625}
626
628{
629 Scene *scene = CTX_data_scene(C);
630 ARegion *region = CTX_wm_region(C);
632 View2D *v2d = &region->v2d;
633 ViewAllUserData userdata;
634 float extra;
635
636 userdata.max = -FLT_MAX;
637 userdata.min = FLT_MAX;
638
640 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
641 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
642 &userdata,
644 nullptr,
645 nullptr);
646
647 /* set extents of view to start/end frames */
648 v2d->cur.xmin = float(scene->r.sfra);
649 v2d->cur.xmax = float(scene->r.efra);
650
651 if (userdata.min < userdata.max) {
652 v2d->cur.ymin = userdata.min;
653 v2d->cur.ymax = userdata.max;
654 }
655 else {
656 v2d->cur.ymin = -10;
657 v2d->cur.ymax = 10;
658 }
659
660 /* we need an extra "buffer" factor on either side so that the endpoints are visible */
661 extra = 0.01f * BLI_rctf_size_x(&v2d->cur);
662 v2d->cur.xmin -= extra;
663 v2d->cur.xmax += extra;
664
665 extra = 0.01f * BLI_rctf_size_y(&v2d->cur);
666 v2d->cur.ymin -= extra;
667 v2d->cur.ymax += extra;
668
669 ED_region_tag_redraw(region);
670
671 return OPERATOR_FINISHED;
672}
673
675{
676 /* identifiers */
677 ot->name = "Frame All";
678 ot->description = "View all curves in editor";
679 ot->idname = "CLIP_OT_graph_view_all";
680
681 /* API callbacks. */
682 ot->exec = view_all_exec;
684}
685
686/******************** jump to current frame operator ********************/
687
689{
690 View2D *v2d = &region->v2d;
691 float extra = BLI_rctf_size_x(&v2d->cur) / 2.0f;
692
693 /* set extents of view to start/end frames */
694 v2d->cur.xmin = float(scene->r.cfra) - extra;
695 v2d->cur.xmax = float(scene->r.cfra) + extra;
696}
697
699{
700 Scene *scene = CTX_data_scene(C);
701 ARegion *region = CTX_wm_region(C);
702
704
705 ED_region_tag_redraw(region);
706
707 return OPERATOR_FINISHED;
708}
709
711{
712 /* identifiers */
713 ot->name = "Center Current Frame";
714 ot->description = "Scroll view so current frame would be centered";
715 ot->idname = "CLIP_OT_graph_center_current_frame";
716
717 /* API callbacks. */
720}
721
722/********************** disable markers operator *********************/
723
725{
728 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
729 MovieTrackingTrack *active_track = tracking_object->active_track;
730 const int action = RNA_enum_get(op->ptr, "action");
731
732 if (!active_track || (active_track->flag & TRACK_LOCKED)) {
733 return OPERATOR_CANCELLED;
734 }
735
736 for (int a = 0; a < active_track->markersnr; a++) {
737 MovieTrackingMarker *marker = &active_track->markers[a];
738
739 if (marker->flag & MARKER_GRAPH_SEL) {
740 if (action == 0) {
741 marker->flag |= MARKER_DISABLED;
742 }
743 else if (action == 1) {
744 marker->flag &= ~MARKER_DISABLED;
745 }
746 else {
747 marker->flag ^= MARKER_DISABLED;
748 }
749 }
750 }
751
752 DEG_id_tag_update(&clip->id, 0);
753
755
756 return OPERATOR_FINISHED;
757}
758
760{
761 static const EnumPropertyItem actions_items[] = {
762 {0, "DISABLE", 0, "Disable", "Disable selected markers"},
763 {1, "ENABLE", 0, "Enable", "Enable selected markers"},
764 {2, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"},
765 {0, nullptr, 0, nullptr, nullptr},
766 };
767
768 /* identifiers */
769 ot->name = "Disable Markers";
770 ot->description = "Disable/enable selected markers";
771 ot->idname = "CLIP_OT_graph_disable_markers";
772
773 /* API callbacks. */
776
777 /* flags */
779
780 /* properties */
781 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute");
782}
Scene * CTX_data_scene(const bContext *C)
SpaceClip * CTX_wm_space_clip(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
@ TRACK_AREA_ALL
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
void BKE_tracking_track_select(struct ListBase *tracksbase, struct MovieTrackingTrack *track, int area, bool extend)
Definition tracking.cc:1190
float dist_squared_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2])
Definition math_geom.cc:291
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
bool BLI_rctf_isect_pt(const struct rctf *rect, float x, float y)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:202
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:206
#define ELEM(...)
#define IFACE_(msgid)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ SC_VIEW_GRAPH
@ SC_SHOW_GRAPH_HIDDEN
@ SC_SHOW_GRAPH_SEL_ONLY
@ SC_SHOW_GRAPH_TRACKS_MOTION
@ SC_SHOW_GRAPH_TRACKS_ERROR
@ TRACK_LOCKED
@ MARKER_GRAPH_SEL_X
@ MARKER_GRAPH_SEL_Y
@ MARKER_DISABLED
@ MARKER_GRAPH_SEL
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
bool ED_space_clip_tracking_poll(bContext *C)
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:618
@ SEL_SELECT
@ SEL_INVERT
@ SEL_DESELECT
@ SEL_TOGGLE
@ PROP_SKIP_SAVE
Definition RNA_types.hh:344
#define C
Definition RandGen.cpp:29
@ ALERT_ICON_NONE
bool UI_view2d_view_to_region_clip(const View2D *v2d, float x, float y, int *r_region_x, int *r_region_y) ATTR_NONNULL()
Definition view2d.cc:1702
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
Definition view2d.cc:1668
void UI_view2d_region_to_view_rctf(const View2D *v2d, const rctf *rect_src, rctf *rect_dst) ATTR_NONNULL()
Definition view2d.cc:1675
#define NC_GEOM
Definition WM_types.hh:393
#define NA_EVALUATED
Definition WM_types.hh:585
#define NC_MOVIECLIP
Definition WM_types.hh:397
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_REGISTER
Definition WM_types.hh:180
#define ND_SELECT
Definition WM_types.hh:508
BMesh const char void * data
static wmOperatorStatus graph_disable_markers_exec(bContext *C, wmOperator *op)
static void find_nearest_tracking_segment_cb(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *, eClipCurveValueSource value_source, int scene_framenr, float val)
static wmOperatorStatus box_select_graph_exec(bContext *C, wmOperator *op)
void CLIP_OT_graph_delete_knot(wmOperatorType *ot)
static bool mouse_select_curve(bContext *C, const float co[2], bool extend)
static wmOperatorStatus delete_curve_invoke(bContext *C, wmOperator *op, const wmEvent *)
static bool mouse_select_knot(bContext *C, const float co[2], bool extend)
static void find_nearest_tracking_knot_cb(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *marker, eClipCurveValueSource value_source, int scene_framenr, float val)
static void toggle_selection_cb(void *userdata, MovieTrackingMarker *marker)
static void view_all_cb(void *userdata, MovieTrackingTrack *, MovieTrackingMarker *, eClipCurveValueSource, int, float val)
static wmOperatorStatus delete_knot_exec(bContext *C, wmOperator *)
static wmOperatorStatus select_exec(bContext *C, wmOperator *op)
static bool space_clip_graph_poll(bContext *C)
void CLIP_OT_graph_center_current_frame(wmOperatorType *ot)
static wmOperatorStatus delete_curve_exec(bContext *C, wmOperator *)
void CLIP_OT_graph_delete_curve(wmOperatorType *ot)
void CLIP_OT_graph_select_all_markers(wmOperatorType *ot)
static void box_select_cb(void *userdata, MovieTrackingTrack *, MovieTrackingMarker *marker, eClipCurveValueSource value_source, int scene_framenr, float val)
static wmOperatorStatus select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void ED_clip_graph_center_current_frame(Scene *scene, ARegion *region)
static void find_nearest_tracking_segment_end_cb(void *userdata, eClipCurveValueSource)
void CLIP_OT_graph_select(wmOperatorType *ot)
static wmOperatorStatus center_current_frame_exec(bContext *C, wmOperator *)
void CLIP_OT_graph_select_box(wmOperatorType *ot)
static void mouse_select_init_data(bContext *C, MouseSelectUserData *userdata, const float co[2])
static bool clip_graph_knots_poll(bContext *C)
void CLIP_OT_graph_view_all(wmOperatorType *ot)
static wmOperatorStatus mouse_select(bContext *C, float co[2], bool extend)
void CLIP_OT_graph_disable_markers(wmOperatorType *ot)
static wmOperatorStatus view_all_exec(bContext *C, wmOperator *)
static wmOperatorStatus graph_select_all_markers_exec(bContext *C, wmOperator *op)
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
void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
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))
eClipCurveValueSource
@ CLIP_VALUE_SOURCE_SPEED_Y
@ CLIP_VALUE_SOURCE_SPEED_X
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
nullptr float
#define abs
static wmOperatorStatus select_exec(bContext *C, wmOperator *op)
static wmOperatorStatus select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
#define FLT_MAX
Definition stdcycles.h:14
eClipCurveValueSource value_source
MovieTrackingTrack * track
MovieTrackingMarker * marker
struct MovieTracking tracking
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
struct RenderData r
float xmax
float xmin
float ymax
float ymin
int mval[2]
Definition WM_types.hh:763
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4237
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void WM_operator_properties_confirm_or_exec(wmOperatorType *ot)
void WM_operator_properties_border_to_rctf(wmOperator *op, rctf *r_rect)
void WM_operator_properties_gesture_box_select(wmOperatorType *ot)
void WM_operator_properties_select_all(wmOperatorType *ot)
wmOperatorStatus WM_operator_confirm_ex(bContext *C, wmOperator *op, const char *title, const char *message, const char *confirm_text, int icon, bool cancel_default)
uint8_t flag
Definition wm_window.cc:145