Blender V4.3
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
9#include "DNA_scene_types.h"
10
11#include "BLI_math_geom.h"
12#include "BLI_math_vector.h"
13#include "BLI_rect.h"
14#include "BLI_utildefines.h"
15
16#include "BLT_translation.hh"
17
18#include "BKE_context.hh"
19#include "BKE_tracking.h"
20
21#include "DEG_depsgraph.hh"
22
23#include "UI_interface_icons.hh"
24
25#include "WM_api.hh"
26#include "WM_types.hh"
27
28#include "ED_clip.hh"
29#include "ED_screen.hh"
30#include "ED_select_utils.hh"
31
32#include "RNA_access.hh"
33#include "RNA_define.hh"
34
35#include "UI_view2d.hh"
36
37#include "clip_intern.hh" /* own include */
38
39/******************** common graph-editing utilities ********************/
40
42{
45
46 return sc->view == SC_VIEW_GRAPH;
47 }
48
49 return false;
50}
51
53{
56
58 }
59 return false;
60}
61
63 int action;
64};
65
66static void toggle_selection_cb(void *userdata, MovieTrackingMarker *marker)
67{
68 SelectUserData *data = (SelectUserData *)userdata;
69
70 switch (data->action) {
71 case SEL_SELECT:
72 marker->flag |= MARKER_GRAPH_SEL;
73 break;
74 case SEL_DESELECT:
75 marker->flag &= ~MARKER_GRAPH_SEL;
76 break;
77 case SEL_INVERT:
78 marker->flag ^= MARKER_GRAPH_SEL;
79 break;
80 }
81}
82
83/******************** mouse select operator ********************/
84
88 bool has_prev; /* if there's valid coordinate of previous point of curve segment */
89
90 float min_dist_sq; /* minimal distance between mouse and currently found entity */
91 float mouse_co[2]; /* mouse coordinate */
92 float prev_co[2]; /* coordinate of previous point of segment */
93 float min_co[2]; /* coordinate of entity with minimal distance */
94
95 MovieTrackingTrack *track; /* nearest found track */
96 MovieTrackingMarker *marker; /* nearest found marker */
97};
98
99static void find_nearest_tracking_segment_cb(void *userdata,
100 MovieTrackingTrack *track,
101 MovieTrackingMarker * /*marker*/,
102 eClipCurveValueSource value_source,
103 int scene_framenr,
104 float val)
105{
106 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
107 const float co[2] = {float(scene_framenr), val};
108
109 if (!clip_graph_value_visible(data->sc, value_source)) {
110 return;
111 }
112
113 if (data->has_prev) {
114 float dist_sq = dist_squared_to_line_segment_v2(data->mouse_co, data->prev_co, co);
115
116 if (data->track == nullptr || dist_sq < data->min_dist_sq) {
117 data->track = track;
118 data->min_dist_sq = dist_sq;
119 data->value_source = value_source;
120 copy_v2_v2(data->min_co, co);
121 }
122 }
123
124 data->has_prev = true;
125 copy_v2_v2(data->prev_co, co);
126}
127
128static void find_nearest_tracking_segment_end_cb(void *userdata,
129 eClipCurveValueSource /*source_value*/)
130{
131 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
132
133 data->has_prev = false;
134}
135
136static void find_nearest_tracking_knot_cb(void *userdata,
137 MovieTrackingTrack *track,
138 MovieTrackingMarker *marker,
139 eClipCurveValueSource value_source,
140 int scene_framenr,
141 float val)
142{
143 MouseSelectUserData *data = static_cast<MouseSelectUserData *>(userdata);
144 const float mdiff[2] = {scene_framenr - data->mouse_co[0], val - data->mouse_co[1]};
145 float dist_sq = len_squared_v2(mdiff);
146
147 if (!clip_graph_value_visible(data->sc, value_source)) {
148 return;
149 }
150
151 if (data->marker == nullptr || dist_sq < data->min_dist_sq) {
152 const float co[2] = {float(scene_framenr), val};
153
154 data->track = track;
155 data->marker = marker;
156 data->min_dist_sq = dist_sq;
157 data->value_source = value_source;
158 copy_v2_v2(data->min_co, co);
159 }
160}
161
162static void mouse_select_init_data(bContext *C, MouseSelectUserData *userdata, const float co[2])
163{
165 memset(userdata, 0, sizeof(MouseSelectUserData));
166 userdata->sc = sc;
167 userdata->min_dist_sq = FLT_MAX;
168 copy_v2_v2(userdata->mouse_co, co);
169}
170
171static bool mouse_select_knot(bContext *C, const float co[2], bool extend)
172{
175 ARegion *region = CTX_wm_region(C);
176 View2D *v2d = &region->v2d;
177 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
178 MovieTrackingTrack *active_track = tracking_object->active_track;
179 static const int delta = 6;
180
181 if (active_track) {
182 MouseSelectUserData userdata;
183
184 mouse_select_init_data(C, &userdata, co);
186 sc, active_track, &userdata, find_nearest_tracking_knot_cb, nullptr, nullptr);
187
188 if (userdata.marker) {
189 int x1, y1, x2, y2;
190
191 if (UI_view2d_view_to_region_clip(v2d, co[0], co[1], &x1, &y1) &&
192 UI_view2d_view_to_region_clip(v2d, userdata.min_co[0], userdata.min_co[1], &x2, &y2) &&
193 (abs(x2 - x1) <= delta && abs(y2 - y1) <= delta))
194 {
195 if (!extend) {
196 SelectUserData selectdata = {SEL_DESELECT};
197
199 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
200 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
201 &selectdata,
203 }
204
205 if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_X) {
206 if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_X) != 0) {
207 userdata.marker->flag &= ~MARKER_GRAPH_SEL_X;
208 }
209 else {
210 userdata.marker->flag |= MARKER_GRAPH_SEL_X;
211 }
212 }
213 else if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
214 if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_Y) != 0) {
215 userdata.marker->flag &= ~MARKER_GRAPH_SEL_Y;
216 }
217 else {
218 userdata.marker->flag |= MARKER_GRAPH_SEL_Y;
219 }
220 }
221
222 return true;
223 }
224 }
225 }
226
227 return false;
228}
229
230static bool mouse_select_curve(bContext *C, const float co[2], bool extend)
231{
234 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
235 MovieTrackingTrack *active_track = tracking_object->active_track;
236 MouseSelectUserData userdata;
237
238 mouse_select_init_data(C, &userdata, co);
240 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
241 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
242 &userdata,
244 nullptr,
246
247 if (userdata.track) {
248 if (extend) {
249 if (active_track == userdata.track) {
250 /* currently only single curve can be selected
251 * (selected curve represents active track) */
252 active_track = nullptr;
253 }
254 }
255 else if (active_track != userdata.track) {
256 SelectUserData selectdata = {SEL_DESELECT};
257
258 tracking_object->active_track = userdata.track;
259 if ((sc->flag & SC_SHOW_GRAPH_SEL_ONLY) == 0) {
260 BKE_tracking_track_select(&tracking_object->tracks, userdata.track, TRACK_AREA_ALL, false);
261 }
262
263 /* deselect all knots on newly selected curve */
265 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
266 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
267 &selectdata,
269 }
270
271 return true;
272 }
273
274 return false;
275}
276
277static int mouse_select(bContext *C, float co[2], bool extend)
278{
279 bool sel = false;
280
281 /* first try to select knot on selected curves */
282 sel = mouse_select_knot(C, co, extend);
283
284 if (!sel) {
285 /* if there's no close enough knot to mouse position, select nearest curve */
286 sel = mouse_select_curve(C, co, extend);
287 }
288
289 if (sel) {
291 }
292
293 return OPERATOR_FINISHED;
294}
295
296static int select_exec(bContext *C, wmOperator *op)
297{
298 float co[2];
299 bool extend = RNA_boolean_get(op->ptr, "extend");
300
301 RNA_float_get_array(op->ptr, "location", co);
302
303 return mouse_select(C, co, extend);
304}
305
306static int select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
307{
308 ARegion *region = CTX_wm_region(C);
309 float co[2];
310
311 UI_view2d_region_to_view(&region->v2d, event->mval[0], event->mval[1], &co[0], &co[1]);
312 RNA_float_set_array(op->ptr, "location", co);
313
314 return select_exec(C, op);
315}
316
318{
319 PropertyRNA *prop;
320
321 /* identifiers */
322 ot->name = "Select";
323 ot->description = "Select graph curves";
324 ot->idname = "CLIP_OT_graph_select";
325
326 /* api callbacks */
330
331 /* flags */
333
334 /* properties */
336 "location",
337 2,
338 nullptr,
339 -FLT_MAX,
340 FLT_MAX,
341 "Location",
342 "Mouse location to select nearest entity",
343 -100.0f,
344 100.0f);
345 prop = RNA_def_boolean(ot->srna,
346 "extend",
347 false,
348 "Extend",
349 "Extend selection rather than clearing the existing selection");
351}
352
353/********************** box select operator *********************/
354
359
360static void box_select_cb(void *userdata,
361 MovieTrackingTrack * /*track*/,
362 MovieTrackingMarker *marker,
363 eClipCurveValueSource value_source,
364 int scene_framenr,
365 float val)
366{
367 BoxSelectuserData *data = (BoxSelectuserData *)userdata;
369 return;
370 }
371
372 if (BLI_rctf_isect_pt(&data->rect, scene_framenr, val)) {
373 int flag = 0;
374
375 if (value_source == CLIP_VALUE_SOURCE_SPEED_X) {
377 }
378 else {
380 }
381
382 if (data->select) {
383 marker->flag |= flag;
384 }
385 else {
386 marker->flag &= ~flag;
387 }
388 data->changed = true;
389 }
390 else if (!data->extend) {
391 marker->flag &= ~MARKER_GRAPH_SEL;
392 }
393}
394
396{
398 ARegion *region = CTX_wm_region(C);
399
401 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
402 MovieTrackingTrack *active_track = tracking_object->active_track;
403 BoxSelectuserData userdata;
404 rctf rect;
405
406 if (active_track == nullptr) {
407 return OPERATOR_CANCELLED;
408 }
409
410 /* get rectangle from operator */
412 UI_view2d_region_to_view_rctf(&region->v2d, &rect, &userdata.rect);
413
414 userdata.changed = false;
415 userdata.select = !RNA_boolean_get(op->ptr, "deselect");
416 userdata.extend = RNA_boolean_get(op->ptr, "extend");
417
419 sc, active_track, &userdata, box_select_cb, nullptr, nullptr);
420
421 if (userdata.changed) {
423
424 return OPERATOR_FINISHED;
425 }
426
427 return OPERATOR_CANCELLED;
428}
429
431{
432 /* identifiers */
433 ot->name = "Box Select";
434 ot->description = "Select curve points using box selection";
435 ot->idname = "CLIP_OT_graph_select_box";
436
437 /* api callbacks */
442
443 /* flags */
445
446 /* properties */
448}
449
450/********************** select all operator *********************/
451
453{
456 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
457 MovieTrackingTrack *active_track = tracking_object->active_track;
458 int action = RNA_enum_get(op->ptr, "action");
459
460 if (!active_track) {
461 return OPERATOR_CANCELLED;
462 }
463
464 if (action == SEL_TOGGLE) {
465 action = SEL_SELECT;
466
467 for (int a = 0; a < active_track->markersnr; a++) {
468 MovieTrackingMarker *marker = &active_track->markers[a];
469
470 if (marker->flag & MARKER_GRAPH_SEL) {
471 action = SEL_DESELECT;
472 break;
473 }
474 }
475 }
476
477 for (int a = 0; a < active_track->markersnr; a++) {
478 MovieTrackingMarker *marker = &active_track->markers[a];
479
480 switch (action) {
481 case SEL_SELECT:
482 marker->flag |= MARKER_GRAPH_SEL;
483 break;
484 case SEL_DESELECT:
485 marker->flag &= ~MARKER_GRAPH_SEL;
486 break;
487 case SEL_INVERT:
488 marker->flag ^= MARKER_GRAPH_SEL;
489 break;
490 }
491 }
492
494
495 return OPERATOR_FINISHED;
496}
497
499{
500 /* identifiers */
501 ot->name = "(De)select All Markers";
502 ot->description = "Change selection of all markers of active track";
503 ot->idname = "CLIP_OT_graph_select_all_markers";
504
505 /* api callbacks */
508
509 /* flags */
511
513}
514
515/******************** delete curve operator ********************/
516
517static int delete_curve_exec(bContext *C, wmOperator * /*op*/)
518{
521 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
522 MovieTrackingTrack *active_track = tracking_object->active_track;
523
524 if (!active_track) {
525 return OPERATOR_CANCELLED;
526 }
527
528 clip_delete_track(C, clip, active_track);
529
530 return OPERATOR_FINISHED;
531}
532
533static int delete_curve_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
534{
535 if (RNA_boolean_get(op->ptr, "confirm")) {
536 return WM_operator_confirm_ex(C,
537 op,
538 IFACE_("Delete track corresponding to the selected curve?"),
539 nullptr,
540 IFACE_("Delete"),
542 false);
543 }
544 return delete_curve_exec(C, op);
545}
546
548{
549 /* identifiers */
550 ot->name = "Delete Curve";
551 ot->description = "Delete track corresponding to the selected curve";
552 ot->idname = "CLIP_OT_graph_delete_curve";
553
554 /* api callbacks */
558
559 /* flags */
562}
563
564/******************** delete knot operator ********************/
565
566static int delete_knot_exec(bContext *C, wmOperator * /*op*/)
567{
570 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
571 MovieTrackingTrack *active_track = tracking_object->active_track;
572
573 if (active_track) {
574 int a = 0;
575
576 while (a < active_track->markersnr) {
577 MovieTrackingMarker *marker = &active_track->markers[a];
578
579 if (marker->flag & MARKER_GRAPH_SEL) {
580 clip_delete_marker(C, clip, active_track, marker);
581 }
582 else {
583 a++;
584 }
585 }
586 }
587
588 return OPERATOR_FINISHED;
589}
590
592{
593 /* identifiers */
594 ot->name = "Delete Knot";
595 ot->description = "Delete curve knots";
596 ot->idname = "CLIP_OT_graph_delete_knot";
597
598 /* api callbacks */
601
602 /* flags */
604}
605
606/******************** view all operator ********************/
607
609 float min, max;
610};
611
612static void view_all_cb(void *userdata,
613 MovieTrackingTrack * /*track*/,
614 MovieTrackingMarker * /*marker*/,
615 eClipCurveValueSource /*value_source*/,
616 int /*scene_framenr*/,
617 float val)
618{
619 ViewAllUserData *data = (ViewAllUserData *)userdata;
620
621 if (val < data->min) {
622 data->min = val;
623 }
624
625 if (val > data->max) {
626 data->max = val;
627 }
628}
629
630static int view_all_exec(bContext *C, wmOperator * /*op*/)
631{
632 Scene *scene = CTX_data_scene(C);
633 ARegion *region = CTX_wm_region(C);
635 View2D *v2d = &region->v2d;
636 ViewAllUserData userdata;
637 float extra;
638
639 userdata.max = -FLT_MAX;
640 userdata.min = FLT_MAX;
641
643 (sc->flag & SC_SHOW_GRAPH_SEL_ONLY) != 0,
644 (sc->flag & SC_SHOW_GRAPH_HIDDEN) != 0,
645 &userdata,
647 nullptr,
648 nullptr);
649
650 /* set extents of view to start/end frames */
651 v2d->cur.xmin = float(scene->r.sfra);
652 v2d->cur.xmax = float(scene->r.efra);
653
654 if (userdata.min < userdata.max) {
655 v2d->cur.ymin = userdata.min;
656 v2d->cur.ymax = userdata.max;
657 }
658 else {
659 v2d->cur.ymin = -10;
660 v2d->cur.ymax = 10;
661 }
662
663 /* we need an extra "buffer" factor on either side so that the endpoints are visible */
664 extra = 0.01f * BLI_rctf_size_x(&v2d->cur);
665 v2d->cur.xmin -= extra;
666 v2d->cur.xmax += extra;
667
668 extra = 0.01f * BLI_rctf_size_y(&v2d->cur);
669 v2d->cur.ymin -= extra;
670 v2d->cur.ymax += extra;
671
672 ED_region_tag_redraw(region);
673
674 return OPERATOR_FINISHED;
675}
676
678{
679 /* identifiers */
680 ot->name = "Frame All";
681 ot->description = "View all curves in editor";
682 ot->idname = "CLIP_OT_graph_view_all";
683
684 /* api callbacks */
687}
688
689/******************** jump to current frame operator ********************/
690
692{
693 View2D *v2d = &region->v2d;
694 float extra = BLI_rctf_size_x(&v2d->cur) / 2.0f;
695
696 /* set extents of view to start/end frames */
697 v2d->cur.xmin = float(scene->r.cfra) - extra;
698 v2d->cur.xmax = float(scene->r.cfra) + extra;
699}
700
702{
703 Scene *scene = CTX_data_scene(C);
704 ARegion *region = CTX_wm_region(C);
705
707
708 ED_region_tag_redraw(region);
709
710 return OPERATOR_FINISHED;
711}
712
714{
715 /* identifiers */
716 ot->name = "Center Current Frame";
717 ot->description = "Scroll view so current frame would be centered";
718 ot->idname = "CLIP_OT_graph_center_current_frame";
719
720 /* api callbacks */
723}
724
725/********************** disable markers operator *********************/
726
728{
731 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
732 MovieTrackingTrack *active_track = tracking_object->active_track;
733 const int action = RNA_enum_get(op->ptr, "action");
734
735 if (!active_track || (active_track->flag & TRACK_LOCKED)) {
736 return OPERATOR_CANCELLED;
737 }
738
739 for (int a = 0; a < active_track->markersnr; a++) {
740 MovieTrackingMarker *marker = &active_track->markers[a];
741
742 if (marker->flag & MARKER_GRAPH_SEL) {
743 if (action == 0) {
744 marker->flag |= MARKER_DISABLED;
745 }
746 else if (action == 1) {
747 marker->flag &= ~MARKER_DISABLED;
748 }
749 else {
750 marker->flag ^= MARKER_DISABLED;
751 }
752 }
753 }
754
755 DEG_id_tag_update(&clip->id, 0);
756
758
759 return OPERATOR_FINISHED;
760}
761
763{
764 static const EnumPropertyItem actions_items[] = {
765 {0, "DISABLE", 0, "Disable", "Disable selected markers"},
766 {1, "ENABLE", 0, "Enable", "Enable selected markers"},
767 {2, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"},
768 {0, nullptr, 0, nullptr, nullptr},
769 };
770
771 /* identifiers */
772 ot->name = "Disable Markers";
773 ot->description = "Disable/enable selected markers";
774 ot->idname = "CLIP_OT_graph_disable_markers";
775
776 /* api callbacks */
779
780 /* flags */
782
783 /* properties */
784 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute");
785}
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:289
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:197
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:201
#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
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:634
@ SEL_SELECT
@ SEL_INVERT
@ SEL_DESELECT
@ SEL_TOGGLE
@ PROP_SKIP_SAVE
Definition RNA_types.hh:245
@ 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:1697
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:1663
void UI_view2d_region_to_view_rctf(const View2D *v2d, const rctf *rect_src, rctf *rect_dst) ATTR_NONNULL()
Definition view2d.cc:1670
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NC_GEOM
Definition WM_types.hh:360
#define NA_EVALUATED
Definition WM_types.hh:551
#define NC_MOVIECLIP
Definition WM_types.hh:364
#define ND_SELECT
Definition WM_types.hh:474
static int select_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void find_nearest_tracking_segment_cb(void *userdata, MovieTrackingTrack *track, MovieTrackingMarker *, eClipCurveValueSource value_source, int scene_framenr, float val)
static int select_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 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 bool ED_space_clip_graph_poll(bContext *C)
void CLIP_OT_graph_center_current_frame(wmOperatorType *ot)
static int box_select_graph_exec(bContext *C, wmOperator *op)
static int center_current_frame_exec(bContext *C, wmOperator *)
static int mouse_select(bContext *C, float co[2], bool extend)
void CLIP_OT_graph_delete_curve(wmOperatorType *ot)
static int delete_curve_exec(bContext *C, wmOperator *)
void CLIP_OT_graph_select_all_markers(wmOperatorType *ot)
static int graph_disable_markers_exec(bContext *C, wmOperator *op)
static int view_all_exec(bContext *C, wmOperator *)
static int delete_knot_exec(bContext *C, wmOperator *)
static void box_select_cb(void *userdata, MovieTrackingTrack *, MovieTrackingMarker *marker, eClipCurveValueSource value_source, int scene_framenr, float val)
void ED_clip_graph_center_current_frame(Scene *scene, ARegion *region)
static int delete_curve_invoke(bContext *C, wmOperator *op, const wmEvent *)
static void find_nearest_tracking_segment_end_cb(void *userdata, eClipCurveValueSource)
void CLIP_OT_graph_select(wmOperatorType *ot)
static int graph_select_all_markers_exec(bContext *C, wmOperator *op)
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)
void CLIP_OT_graph_disable_markers(wmOperatorType *ot)
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
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)
draw_view in_light_buf[] float
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 min(a, b)
Definition sort.c:32
#define FLT_MAX
Definition stdcycles.h:14
eClipCurveValueSource value_source
MovieTrackingTrack * track
MovieTrackingMarker * marker
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
float xmax
float xmin
float ymax
float ymin
int mval[2]
Definition WM_types.hh:728
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1036
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
StructRNA * srna
Definition WM_types.hh:1080
struct PointerRNA * ptr
ccl_device_inline int abs(int x)
Definition util/math.h:120
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4125
int WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
int WM_gesture_box_modal(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)
int 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:138