Blender V4.3
tracking_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 "MEM_guardedalloc.h"
10
11#include "DNA_screen_types.h"
12#include "DNA_space_types.h"
13
14#include "BLI_ghash.h"
15#include "BLI_math_geom.h"
16#include "BLI_math_vector.h"
17#include "BLI_utildefines.h"
18
19#include "BKE_context.hh"
20#include "BKE_image.hh"
21#include "BKE_movieclip.h"
22#include "BKE_report.hh"
23#include "BKE_tracking.h"
24
25#include "DEG_depsgraph.hh"
26
27#include "UI_interface_icons.hh"
28
29#include "WM_api.hh"
30#include "WM_types.hh"
31
32#include "ED_clip.hh"
33#include "ED_screen.hh"
34
35#include "RNA_access.hh"
36#include "RNA_define.hh"
37
38#include "BLT_translation.hh"
39
40#include "IMB_imbuf.hh"
41#include "IMB_imbuf_types.hh"
42
43#include "clip_intern.hh"
45
46/* -------------------------------------------------------------------- */
50static bool add_marker(const bContext *C, float x, float y)
51{
54 MovieTracking *tracking = &clip->tracking;
55 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
56 MovieTrackingTrack *track;
57 int width, height;
59
60 ED_space_clip_get_size(sc, &width, &height);
61
62 if (width == 0 || height == 0) {
63 return false;
64 }
65
66 track = BKE_tracking_track_add(tracking, &tracking_object->tracks, x, y, framenr, width, height);
67
68 BKE_tracking_track_select(&tracking_object->tracks, track, TRACK_AREA_ALL, false);
70
71 tracking_object->active_track = track;
72 tracking_object->active_plane_track = nullptr;
73
74 return true;
75}
76
78{
81 float pos[2];
82
83 ClipViewLockState lock_state;
84 ED_clip_view_lock_state_store(C, &lock_state);
85
86 RNA_float_get_array(op->ptr, "location", pos);
87
88 if (!add_marker(C, pos[0], pos[1])) {
89 return OPERATOR_CANCELLED;
90 }
91
93
95
96 return OPERATOR_FINISHED;
97}
98
99static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
100{
102 ARegion *region = CTX_wm_region(C);
103
104 if (!RNA_struct_property_is_set(op->ptr, "location")) {
105 /* If location is not set, use mouse position as default. */
106 float co[2];
107 ED_clip_mouse_pos(sc, region, event->mval, co);
108 RNA_float_set_array(op->ptr, "location", co);
109 }
110
111 return add_marker_exec(C, op);
112}
113
115{
116 /* identifiers */
117 ot->name = "Add Marker";
118 ot->idname = "CLIP_OT_add_marker";
119 ot->description = "Place new marker at specified location";
120
121 /* api callbacks */
125
126 /* flags */
128
129 /* properties */
131 "location",
132 2,
133 nullptr,
134 -FLT_MAX,
135 FLT_MAX,
136 "Location",
137 "Location of marker on frame",
138 -1.0f,
139 1.0f);
140}
141
144/* -------------------------------------------------------------------- */
148static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
149{
150 ED_workspace_status_text(C, IFACE_("Use LMB click to define location where place the marker"));
151
152 /* Add modal handler for ESC. */
154
156}
157
158static int add_marker_at_click_modal(bContext *C, wmOperator * /*op*/, const wmEvent *event)
159{
160 switch (event->type) {
161 case MOUSEMOVE:
163
164 case LEFTMOUSE: {
167 ARegion *region = CTX_wm_region(C);
168 float pos[2];
169
170 ED_workspace_status_text(C, nullptr);
171
173 region,
174 event->xy[0] - region->winrct.xmin,
175 event->xy[1] - region->winrct.ymin,
176 &pos[0],
177 &pos[1]);
178
179 if (!add_marker(C, pos[0], pos[1])) {
180 return OPERATOR_CANCELLED;
181 }
182
184 return OPERATOR_FINISHED;
185 }
186
187 case EVT_ESCKEY:
188 ED_workspace_status_text(C, nullptr);
189 return OPERATOR_CANCELLED;
190 }
191
193}
194
196{
197 /* identifiers */
198 ot->name = "Add Marker at Click";
199 ot->idname = "CLIP_OT_add_marker_at_click";
200 ot->description = "Place new marker at the desired (clicked) position";
201
202 /* api callbacks */
206
207 /* flags */
209}
210
213/* -------------------------------------------------------------------- */
217static int delete_track_exec(bContext *C, wmOperator * /*op*/)
218{
221 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
222 bool changed = false;
223
224 /* Delete selected plane tracks. */
225 LISTBASE_FOREACH_MUTABLE (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks)
226 {
227 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
228 clip_delete_plane_track(C, clip, plane_track);
229 changed = true;
230 }
231 }
232
233 /* Remove selected point tracks (they'll also be removed from planes which uses them). */
234 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
235 if (TRACK_VIEW_SELECTED(sc, track)) {
236 clip_delete_track(C, clip, track);
237 changed = true;
238 }
239 }
240
241 if (changed) {
243 }
244
245 return OPERATOR_FINISHED;
246}
247
248static int delete_track_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
249{
250 if (RNA_boolean_get(op->ptr, "confirm")) {
251 return WM_operator_confirm_ex(C,
252 op,
253 IFACE_("Delete selected tracks?"),
254 nullptr,
255 IFACE_("Delete"),
257 false);
258 }
259 return delete_track_exec(C, op);
260}
261
263{
264 /* identifiers */
265 ot->name = "Delete Track";
266 ot->idname = "CLIP_OT_delete_track";
267 ot->description = "Delete selected tracks";
268
269 /* api callbacks */
273
274 /* flags */
277}
278
281/* -------------------------------------------------------------------- */
285static int delete_marker_exec(bContext *C, wmOperator * /*op*/)
286{
289 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
290 const int framenr = ED_space_clip_get_clip_frame_number(sc);
291 bool changed = false;
292
293 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
294 if (TRACK_VIEW_SELECTED(sc, track)) {
295 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
296 if (marker != nullptr) {
297 clip_delete_marker(C, clip, track, marker);
298 changed = true;
299 }
300 }
301 }
302
303 LISTBASE_FOREACH_MUTABLE (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks)
304 {
305 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
307 framenr);
308 if (plane_marker != nullptr) {
309 if (plane_track->markersnr == 1) {
311 BLI_freelinkN(&tracking_object->plane_tracks, plane_track);
312 }
313 else {
314 BKE_tracking_plane_marker_delete(plane_track, framenr);
315 }
316 changed = true;
317 }
318 }
319 }
320
321 if (!changed) {
322 return OPERATOR_CANCELLED;
323 }
324
325 return OPERATOR_FINISHED;
326}
327
328static int delete_marker_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
329{
330 if (RNA_boolean_get(op->ptr, "confirm")) {
331 return WM_operator_confirm_ex(C,
332 op,
333 IFACE_("Delete marker for current frame from selected tracks?"),
334 nullptr,
335 IFACE_("Delete"),
337 false);
338 }
339 return delete_marker_exec(C, op);
340}
341
343{
344 /* identifiers */
345 ot->name = "Delete Marker";
346 ot->idname = "CLIP_OT_delete_marker";
347 ot->description = "Delete marker for current frame from selected tracks";
348
349 /* api callbacks */
353
354 /* flags */
357}
358
361/* -------------------------------------------------------------------- */
373
375 short area;
379
380 int mval[2];
382 float *min, *max, *pos, (*corners)[2];
383
385
386 /* Data to restore on cancel. */
388 float old_corners[4][2];
390};
391
392static void slide_marker_tilt_slider_relative(const float pattern_corners[4][2], float r_slider[2])
393{
394 add_v2_v2v2(r_slider, pattern_corners[1], pattern_corners[2]);
395}
396
398 MovieTrackingTrack *track,
399 MovieTrackingMarker *marker,
400 const wmEvent *event,
401 int area,
402 int corner,
403 eSlideAction action,
404 int width,
405 int height)
406{
407 SlideMarkerData *data = MEM_cnew<SlideMarkerData>("slide marker data");
408 int framenr = ED_space_clip_get_clip_frame_number(sc);
409
410 marker = BKE_tracking_marker_ensure(track, framenr);
411
412 data->area = area;
413 data->action = action;
414 data->track = track;
415 data->marker = marker;
416
417 if (area == TRACK_AREA_POINT) {
418 data->pos = marker->pos;
419 }
420 else if (area == TRACK_AREA_PAT) {
421 if (action == SLIDE_ACTION_POS) {
422 data->corners = marker->pattern_corners;
423 data->pos = marker->pattern_corners[corner];
424 }
425 else if (action == SLIDE_ACTION_TILT_SIZE) {
426 data->corners = marker->pattern_corners;
427 }
428 }
429 else if (area == TRACK_AREA_SEARCH) {
430 data->min = marker->search_min;
431 data->max = marker->search_max;
432 }
433
434 data->mval[0] = event->mval[0];
435 data->mval[1] = event->mval[1];
436
437 data->width = width;
438 data->height = height;
439
440 if (action == SLIDE_ACTION_SIZE) {
441 data->lock = true;
442 }
443
444 /* Backup marker's settings. */
445 memcpy(data->old_corners, marker->pattern_corners, sizeof(data->old_corners));
446 copy_v2_v2(data->old_search_min, marker->search_min);
447 copy_v2_v2(data->old_search_max, marker->search_max);
448 copy_v2_v2(data->old_pos, marker->pos);
449
450 return data;
451}
452
453static bool slide_check_corners(float (*corners)[2])
454{
455 float cross = 0.0f;
456 const float p[2] = {0.0f, 0.0f};
457
458 if (!isect_point_quad_v2(p, corners[0], corners[1], corners[2], corners[3])) {
459 return false;
460 }
461
462 for (int i = 0; i < 4; i++) {
463 float v1[2], v2[2];
464
465 int next = (i + 1) % 4;
466 int prev = (4 + i - 1) % 4;
467
468 sub_v2_v2v2(v1, corners[i], corners[prev]);
469 sub_v2_v2v2(v2, corners[next], corners[i]);
470
471 float cur_cross = cross_v2v2(v1, v2);
472
473 if (fabsf(cur_cross) > FLT_EPSILON) {
474 if (cross == 0.0f) {
475 cross = cur_cross;
476 }
477 else if (cross * cur_cross < 0.0f) {
478 return false;
479 }
480 }
481 }
482
483 return true;
484}
485
487 bContext *C, const float co[2], int *r_area, eSlideAction *r_action, int *r_corner)
488{
489 SpaceClip *space_clip = CTX_wm_space_clip(C);
490
492 options.selected_only = true;
493 options.unlocked_only = true;
494 options.enabled_only = true;
495 const PointTrackPick track_pick = ed_tracking_pick_point_track(&options, C, co);
496
497 if (ed_tracking_point_track_pick_empty(&track_pick) ||
498 !ed_tracking_point_track_pick_can_slide(space_clip, &track_pick))
499 {
500 return nullptr;
501 }
502
503 const eTrackArea area = track_pick.area;
505 int corner = -1;
506
507 switch (area) {
508 case TRACK_AREA_NONE:
509 case TRACK_AREA_ALL:
510 BLI_assert_msg(0, "Expected single track area");
511 return nullptr;
512
513 case TRACK_AREA_POINT:
514 action = SLIDE_ACTION_POS;
515 break;
516
517 case TRACK_AREA_PAT:
519 action = SLIDE_ACTION_TILT_SIZE;
520 }
521 else if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_POSITION) {
522 action = SLIDE_ACTION_POS;
523 corner = track_pick.corner_index;
524 }
525 else {
526 BLI_assert_msg(0, "Unhandled pattern area");
527 return nullptr;
528 }
529 break;
530
532 if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_SIZE) {
533 action = SLIDE_ACTION_SIZE;
534 }
535 else if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_OFFSET) {
536 action = SLIDE_ACTION_OFFSET;
537 }
538 else {
539 BLI_assert_msg(0, "Unhandled search area");
540 return nullptr;
541 }
542 break;
543 }
544
545 if (r_area) {
546 *r_area = area;
547 }
548 if (r_action) {
549 *r_action = action;
550 }
551 if (r_corner) {
552 *r_corner = corner;
553 }
554
555 return track_pick.track;
556}
557
559{
560 return tracking_marker_check_slide(C, co, nullptr, nullptr, nullptr);
561}
562
564{
566 ARegion *region = CTX_wm_region(C);
567
568 MovieTrackingTrack *track;
569 int width, height;
570 float co[2];
571 SlideMarkerData *customdata = nullptr;
572 int framenr = ED_space_clip_get_clip_frame_number(sc);
573 eSlideAction action;
574 int area, corner;
575
576 ED_space_clip_get_size(sc, &width, &height);
577
578 if (width == 0 || height == 0) {
579 return nullptr;
580 }
581
582 ED_clip_mouse_pos(sc, region, event->mval, co);
583
584 track = tracking_marker_check_slide(C, co, &area, &action, &corner);
585 if (track != nullptr) {
586 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
587 customdata = create_slide_marker_data(
588 sc, track, marker, event, area, corner, action, width, height);
589 }
590
591 return customdata;
592}
593
594static int slide_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
595{
596 SlideMarkerData *slidedata = slide_marker_customdata(C, event);
597 if (slidedata != nullptr) {
600 MovieTracking *tracking = &clip->tracking;
601 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
602
603 tracking_object->active_track = slidedata->track;
604 tracking_object->active_plane_track = nullptr;
605
606 op->customdata = slidedata;
607
610
612
614 }
615
617}
618
620{
621 MovieTrackingMarker *marker = data->marker;
622
623 memcpy(marker->pattern_corners, data->old_corners, sizeof(marker->pattern_corners));
624 copy_v2_v2(marker->search_min, data->old_search_min);
625 copy_v2_v2(marker->search_max, data->old_search_max);
626 copy_v2_v2(marker->pos, data->old_pos);
627
628 if (data->old_markers != nullptr) {
629 for (int a = 0; a < data->track->markersnr; a++) {
630 copy_v2_v2(data->track->markers[a].pos, data->old_markers[a]);
631 }
632 }
633}
634
636{
637 if (data->area == TRACK_AREA_POINT) {
640 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
641 const int framenr = ED_space_clip_get_clip_frame_number(sc);
642
643 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
644 if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) {
645 if (BKE_tracking_plane_track_has_point_track(plane_track, data->track)) {
647 }
648 }
649 }
650 }
651}
652
654{
655 if (data->old_markers != nullptr) {
656 MEM_freeN(data->old_markers);
657 }
658 MEM_freeN(data);
659}
660
661static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
662{
664
666 float dx, dy, mdelta[2];
667
668 switch (event->type) {
669 case EVT_LEFTCTRLKEY:
670 case EVT_RIGHTCTRLKEY:
671 case EVT_LEFTSHIFTKEY:
673 if (data->action == SLIDE_ACTION_SIZE) {
675 data->lock = event->val == KM_RELEASE;
676 }
677 }
678
680 data->accurate = event->val == KM_PRESS;
681 }
683 case MOUSEMOVE:
684 mdelta[0] = event->mval[0] - data->mval[0];
685 mdelta[1] = event->mval[1] - data->mval[1];
686
687 dx = mdelta[0] / data->width / sc->zoom;
688
689 if (data->lock) {
690 dy = -dx / data->height * data->width;
691 }
692 else {
693 dy = mdelta[1] / data->height / sc->zoom;
694 }
695
696 if (data->accurate) {
697 dx /= 5.0f;
698 dy /= 5.0f;
699 }
700
701 if (data->area == TRACK_AREA_POINT) {
702 data->pos[0] += dx;
703 data->pos[1] += dy;
704
706 DEG_id_tag_update(&sc->clip->id, 0);
707 }
708 else if (data->area == TRACK_AREA_PAT) {
709 if (data->action == SLIDE_ACTION_POS) {
710 float prev_pos[2];
711 copy_v2_v2(prev_pos, data->pos);
712
713 data->pos[0] += dx;
714 data->pos[1] += dy;
715
716 if (!slide_check_corners(data->corners)) {
717 copy_v2_v2(data->pos, prev_pos);
718 }
719
720 /* Allow pattern to be arbitrary size and resize search area if needed. */
722 }
723 else if (data->action == SLIDE_ACTION_TILT_SIZE) {
724 const float delta[2] = {dx, dy};
725
726 /* Slider position relative to the marker position using current state of pattern
727 * corners. */
728 float slider[2];
729 slide_marker_tilt_slider_relative(data->corners, slider);
730
731 /* Vector which connects marker position with the slider state at the current corners
732 * state.
733 * The coordinate is in the pixel space. */
734 float start_px[2];
735 copy_v2_v2(start_px, slider);
736 start_px[0] *= data->width;
737 start_px[1] *= data->height;
738
739 /* Vector which connects marker position with the slider state with the new mouse delta
740 * taken into account.
741 * The coordinate is in the pixel space. */
742 float end_px[2];
743 add_v2_v2v2(end_px, slider, delta);
744 end_px[0] *= data->width;
745 end_px[1] *= data->height;
746
747 float scale = 1.0f;
748 if (len_squared_v2(start_px) != 0.0f) {
749 scale = len_v2(end_px) / len_v2(start_px);
750
751 if (scale < 0.0f) {
752 scale = 0.0;
753 }
754 }
755
756 const float angle = -angle_signed_v2v2(start_px, end_px);
757
758 for (int a = 0; a < 4; a++) {
759 float vec[2];
760
761 mul_v2_fl(data->corners[a], scale);
762
763 copy_v2_v2(vec, data->corners[a]);
764 vec[0] *= data->width;
765 vec[1] *= data->height;
766
767 data->corners[a][0] = (vec[0] * cosf(angle) - vec[1] * sinf(angle)) / data->width;
768 data->corners[a][1] = (vec[1] * cosf(angle) + vec[0] * sinf(angle)) / data->height;
769 }
770
772 }
773 }
774 else if (data->area == TRACK_AREA_SEARCH) {
775 if (data->action == SLIDE_ACTION_SIZE) {
776 data->min[0] -= dx;
777 data->min[1] += dy;
778
779 data->max[0] += dx;
780 data->max[1] -= dy;
781
783 }
784 else if (data->action == SLIDE_ACTION_OFFSET) {
785 const float delta[2] = {dx, dy};
786 add_v2_v2(data->min, delta);
787 add_v2_v2(data->max, delta);
788
790 }
791 }
792
793 data->marker->flag &= ~MARKER_TRACKED;
794
795 copy_v2_v2_int(data->mval, event->mval);
796
798
799 break;
800
801 case LEFTMOUSE:
802 if (event->val == KM_RELEASE) {
803 apply_mouse_slide(C, data);
804 free_slide_data(data);
805
807
808 return OPERATOR_FINISHED;
809 }
810
811 break;
812
813 case EVT_ESCKEY:
814 cancel_mouse_slide(data);
815
816 free_slide_data(data);
817
819
821
822 return OPERATOR_CANCELLED;
823 }
824
826}
827
829{
830 /* identifiers */
831 ot->name = "Slide Marker";
832 ot->description = "Slide marker areas";
833 ot->idname = "CLIP_OT_slide_marker";
834
835 /* api callbacks */
839
840 /* flags */
842
843 /* properties */
845 "offset",
846 2,
847 nullptr,
848 -FLT_MAX,
849 FLT_MAX,
850 "Offset",
851 "Offset in floating-point units, 1.0 is the width and height of the image",
852 -FLT_MAX,
853 FLT_MAX);
854}
855
858/* -------------------------------------------------------------------- */
863{
866 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
867 const eTrackClearAction action = eTrackClearAction(RNA_enum_get(op->ptr, "action"));
868 const bool clear_active = RNA_boolean_get(op->ptr, "clear_active");
869 const int framenr = ED_space_clip_get_clip_frame_number(sc);
870
871 if (clear_active) {
872 if (tracking_object->active_track != nullptr) {
873 BKE_tracking_track_path_clear(tracking_object->active_track, framenr, action);
874 }
875 }
876 else {
877 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
878 if (TRACK_VIEW_SELECTED(sc, track)) {
879 BKE_tracking_track_path_clear(track, framenr, action);
880 }
881 }
882 }
883
884 BKE_tracking_dopesheet_tag_update(&clip->tracking);
886
887 return OPERATOR_FINISHED;
888}
889
891{
892 static const EnumPropertyItem clear_path_actions[] = {
893 {TRACK_CLEAR_UPTO, "UPTO", 0, "Clear Up To", "Clear path up to current frame"},
895 "REMAINED",
896 0,
897 "Clear Remained",
898 "Clear path at remaining frames (after current)"},
899 {TRACK_CLEAR_ALL, "ALL", 0, "Clear All", "Clear the whole path"},
900 {0, nullptr, 0, nullptr, nullptr},
901 };
902
903 /* identifiers */
904 ot->name = "Clear Track Path";
905 ot->description = "Clear tracks after/before current position or clear the whole track";
906 ot->idname = "CLIP_OT_clear_track_path";
907
908 /* api callbacks */
911
912 /* flags */
914
915 /* properties */
917 "action",
918 clear_path_actions,
920 "Action",
921 "Clear action to execute");
923 "clear_active",
924 false,
925 "Clear Active",
926 "Clear active track only instead of all selected tracks");
927}
928
931/* -------------------------------------------------------------------- */
935enum {
939};
940
942{
945 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
946 const int action = RNA_enum_get(op->ptr, "action");
947 const int framenr = ED_space_clip_get_clip_frame_number(sc);
948
949 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
950 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
951 MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
952 switch (action) {
954 marker->flag |= MARKER_DISABLED;
955 break;
956 case MARKER_OP_ENABLE:
957 marker->flag &= ~MARKER_DISABLED;
958 break;
959 case MARKER_OP_TOGGLE:
960 marker->flag ^= MARKER_DISABLED;
961 break;
962 }
963 }
964 }
965
966 DEG_id_tag_update(&clip->id, 0);
967
969
970 return OPERATOR_FINISHED;
971}
972
974{
975 static const EnumPropertyItem actions_items[] = {
976 {MARKER_OP_DISABLE, "DISABLE", 0, "Disable", "Disable selected markers"},
977 {MARKER_OP_ENABLE, "ENABLE", 0, "Enable", "Enable selected markers"},
978 {MARKER_OP_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"},
979 {0, nullptr, 0, nullptr, nullptr},
980 };
981
982 /* identifiers */
983 ot->name = "Disable Markers";
984 ot->description = "Disable/enable selected markers";
985 ot->idname = "CLIP_OT_disable_markers";
986
987 /* api callbacks */
990
991 /* flags */
993
994 /* properties */
995 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute");
996}
997
1000/* -------------------------------------------------------------------- */
1005{
1008 MovieTracking *tracking = &clip->tracking;
1009 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1010 const int unselected = RNA_boolean_get(op->ptr, "unselected");
1011
1012 /* Hide point tracks. */
1013 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1014 if (unselected == 0 && TRACK_VIEW_SELECTED(sc, track)) {
1015 track->flag |= TRACK_HIDDEN;
1016 }
1017 else if (unselected == 1 && !TRACK_VIEW_SELECTED(sc, track)) {
1018 track->flag |= TRACK_HIDDEN;
1019 }
1020 }
1021
1022 const MovieTrackingTrack *active_track = tracking_object->active_track;
1023 if (active_track != nullptr && active_track->flag & TRACK_HIDDEN) {
1024 tracking_object->active_track = nullptr;
1025 }
1026
1027 /* Hide place tracks. */
1028 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1029 if (unselected == 0 && plane_track->flag & SELECT) {
1030 plane_track->flag |= PLANE_TRACK_HIDDEN;
1031 }
1032 else if (unselected == 1 && (plane_track->flag & SELECT) == 0) {
1033 plane_track->flag |= PLANE_TRACK_HIDDEN;
1034 }
1035 }
1036
1037 const MovieTrackingPlaneTrack *active_plane_track = tracking_object->active_plane_track;
1038 if (active_plane_track != nullptr && active_plane_track->flag & TRACK_HIDDEN) {
1039 tracking_object->active_plane_track = nullptr;
1040 }
1041
1044
1045 return OPERATOR_FINISHED;
1046}
1047
1049{
1050 /* identifiers */
1051 ot->name = "Hide Tracks";
1052 ot->description = "Hide selected tracks";
1053 ot->idname = "CLIP_OT_hide_tracks";
1054
1055 /* api callbacks */
1058
1059 /* flags */
1061
1062 /* properties */
1063 RNA_def_boolean(ot->srna, "unselected", false, "Unselected", "Hide unselected tracks");
1064}
1065
1068/* -------------------------------------------------------------------- */
1073{
1076 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1077
1078 /* Unhide point tracks. */
1079 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1080 track->flag &= ~TRACK_HIDDEN;
1081 }
1082
1083 /* Unhide plane tracks. */
1084 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1085 plane_track->flag &= ~PLANE_TRACK_HIDDEN;
1086 }
1087
1088 BKE_tracking_dopesheet_tag_update(&clip->tracking);
1089
1091
1092 return OPERATOR_FINISHED;
1093}
1094
1096{
1097 /* identifiers */
1098 ot->name = "Hide Tracks Clear";
1099 ot->description = "Clear hide selected tracks";
1100 ot->idname = "CLIP_OT_hide_tracks_clear";
1101
1102 /* api callbacks */
1105
1106 /* flags */
1108}
1109
1112/* -------------------------------------------------------------------- */
1117{
1118 SpaceClip *space_clip = CTX_wm_space_clip(C);
1119 return space_clip != nullptr;
1120}
1121
1123{
1124 Scene *scene = CTX_data_scene(C);
1127 MovieTracking *tracking = &clip->tracking;
1128 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1129 int pos = RNA_enum_get(op->ptr, "position");
1130 int delta;
1131
1132 if (pos <= 1) { /* jump to path */
1133 MovieTrackingTrack *active_track = tracking_object->active_track;
1134 if (active_track == nullptr) {
1135 return OPERATOR_CANCELLED;
1136 }
1137
1138 delta = pos == 1 ? 1 : -1;
1139 while (sc->user.framenr + delta >= scene->r.sfra && sc->user.framenr + delta <= scene->r.efra)
1140 {
1141 int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr + delta);
1142 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(active_track, framenr);
1143
1144 if (marker == nullptr || marker->flag & MARKER_DISABLED) {
1145 break;
1146 }
1147
1148 sc->user.framenr += delta;
1149 }
1150 }
1151 else { /* to failed frame */
1152 if (tracking_object->reconstruction.flag & TRACKING_RECONSTRUCTED) {
1153 int framenr = ED_space_clip_get_clip_frame_number(sc);
1154
1155 delta = pos == 3 ? 1 : -1;
1156 framenr += delta;
1157
1158 while (framenr + delta >= scene->r.sfra && framenr + delta <= scene->r.efra) {
1160 tracking, tracking_object, framenr);
1161
1162 if (cam == nullptr) {
1164 break;
1165 }
1166
1167 framenr += delta;
1168 }
1169 }
1170 }
1171
1172 if (scene->r.cfra != sc->user.framenr) {
1173 scene->r.cfra = sc->user.framenr;
1175
1177 }
1178
1180
1181 return OPERATOR_FINISHED;
1182}
1183
1185{
1186 static const EnumPropertyItem position_items[] = {
1187 {0, "PATHSTART", 0, "Path Start", "Jump to start of current path"},
1188 {1, "PATHEND", 0, "Path End", "Jump to end of current path"},
1189 {2, "FAILEDPREV", 0, "Previous Failed", "Jump to previous failed frame"},
1190 {2, "FAILNEXT", 0, "Next Failed", "Jump to next failed frame"},
1191 {0, nullptr, 0, nullptr, nullptr},
1192 };
1193
1194 /* identifiers */
1195 ot->name = "Jump to Frame";
1196 ot->description = "Jump to special frame";
1197 ot->idname = "CLIP_OT_frame_jump";
1198
1199 /* api callbacks */
1202
1203 /* flags */
1205
1206 /* properties */
1207 RNA_def_enum(ot->srna, "position", position_items, 0, "Position", "Position to jump to");
1208}
1209
1212/* -------------------------------------------------------------------- */
1217{
1220 MovieTracking *tracking = &clip->tracking;
1221 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1222 MovieTrackingStabilization *stabilization = &tracking->stabilization;
1223 bool update_stabilization = false;
1224
1225 MovieTrackingTrack *active_track = tracking_object->active_track;
1226 if (active_track == nullptr) {
1227 BKE_report(op->reports, RPT_ERROR, "No active track to join to");
1228 return OPERATOR_CANCELLED;
1229 }
1230
1231 GSet *point_tracks = BLI_gset_ptr_new(__func__);
1232
1233 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
1234 if (TRACK_VIEW_SELECTED(sc, track) && track != active_track) {
1235 BKE_tracking_tracks_join(tracking, active_track, track);
1236
1237 if (track->flag & TRACK_USE_2D_STAB) {
1238 update_stabilization = true;
1239 if ((active_track->flag & TRACK_USE_2D_STAB) == 0) {
1240 active_track->flag |= TRACK_USE_2D_STAB;
1241 }
1242 else {
1243 stabilization->tot_track--;
1244 }
1245 BLI_assert(0 <= stabilization->tot_track);
1246 }
1247 if (track->flag & TRACK_USE_2D_STAB_ROT) {
1248 update_stabilization = true;
1249 if ((active_track->flag & TRACK_USE_2D_STAB_ROT) == 0) {
1250 active_track->flag |= TRACK_USE_2D_STAB_ROT;
1251 }
1252 else {
1253 stabilization->tot_rot_track--;
1254 }
1255 BLI_assert(0 <= stabilization->tot_rot_track);
1256 }
1257
1258 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1259 if (BKE_tracking_plane_track_has_point_track(plane_track, track)) {
1260 BKE_tracking_plane_track_replace_point_track(plane_track, track, active_track);
1261 if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) {
1262 BLI_gset_insert(point_tracks, plane_track);
1263 }
1264 }
1265 }
1266
1268 BLI_freelinkN(&tracking_object->tracks, track);
1269 }
1270 }
1271
1272 if (update_stabilization) {
1274 }
1275
1276 GSetIterator gs_iter;
1277 int framenr = ED_space_clip_get_clip_frame_number(sc);
1278 GSET_ITER (gs_iter, point_tracks) {
1279 MovieTrackingPlaneTrack *plane_track = static_cast<MovieTrackingPlaneTrack *>(
1280 BLI_gsetIterator_getKey(&gs_iter));
1282 }
1283
1284 BLI_gset_free(point_tracks, nullptr);
1285 DEG_id_tag_update(&clip->id, 0);
1286
1288
1289 return OPERATOR_FINISHED;
1290}
1291
1293{
1294 /* identifiers */
1295 ot->name = "Join Tracks";
1296 ot->description = "Join selected tracks";
1297 ot->idname = "CLIP_OT_join_tracks";
1298
1299 /* api callbacks */
1302
1303 /* flags */
1305}
1306
1309/* -------------------------------------------------------------------- */
1314{
1315 SpaceClip *space_clip = CTX_wm_space_clip(C);
1316 MovieClip *clip = ED_space_clip_get_clip(space_clip);
1317 MovieTracking *tracking = &clip->tracking;
1318 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1319
1320 /* Collect source tracks. */
1321 int num_source_tracks;
1323 tracking, &num_source_tracks);
1324 if (num_source_tracks == 0) {
1325 return OPERATOR_CANCELLED;
1326 }
1327
1328 /* Create new empty track, which will be the averaged result.
1329 * Makes it simple to average all selection to it. */
1330 MovieTrackingTrack *result_track = BKE_tracking_track_add_empty(tracking,
1331 &tracking_object->tracks);
1332
1333 /* Perform averaging. */
1334 BKE_tracking_tracks_average(result_track, source_tracks, num_source_tracks);
1335
1336 const bool keep_original = RNA_boolean_get(op->ptr, "keep_original");
1337 if (!keep_original) {
1338 for (int i = 0; i < num_source_tracks; i++) {
1339 clip_delete_track(C, clip, source_tracks[i]);
1340 }
1341 }
1342
1343 /* Update selection, making the result track active and selected. */
1344 /* TODO(sergey): Should become some sort of utility function available for all operators. */
1345
1346 BKE_tracking_track_select(&tracking_object->tracks, result_track, TRACK_AREA_ALL, false);
1348
1349 tracking_object->active_track = result_track;
1350 tracking_object->active_plane_track = nullptr;
1351
1352 /* Inform the dependency graph and interface about changes. */
1353 DEG_id_tag_update(&clip->id, 0);
1355
1356 /* Free memory. */
1357 MEM_freeN(source_tracks);
1358
1359 return OPERATOR_FINISHED;
1360}
1361
1362static int average_tracks_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
1363{
1364 PropertyRNA *prop_keep_original = RNA_struct_find_property(op->ptr, "keep_original");
1365 if (!RNA_property_is_set(op->ptr, prop_keep_original)) {
1366 SpaceClip *space_clip = CTX_wm_space_clip(C);
1367 MovieClip *clip = ED_space_clip_get_clip(space_clip);
1368 MovieTracking *tracking = &clip->tracking;
1369
1370 const int num_selected_tracks = BKE_tracking_count_selected_tracks_in_active_object(tracking);
1371
1372 if (num_selected_tracks == 1) {
1373 RNA_property_boolean_set(op->ptr, prop_keep_original, false);
1374 }
1375 }
1376
1377 return average_tracks_exec(C, op);
1378}
1379
1381{
1382 /* Identifiers. */
1383 ot->name = "Average Tracks";
1384 ot->description = "Average selected tracks into active";
1385 ot->idname = "CLIP_OT_average_tracks";
1386
1387 /* API callbacks. */
1391
1392 /* Flags. */
1394
1395 /* Properties. */
1396 PropertyRNA *prop;
1397
1398 prop = RNA_def_boolean(ot->srna, "keep_original", true, "Keep Original", "Keep original tracks");
1401}
1402
1405/* -------------------------------------------------------------------- */
1409enum {
1413};
1414
1416{
1419 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1420 const int action = RNA_enum_get(op->ptr, "action");
1421
1422 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1423 if (TRACK_VIEW_SELECTED(sc, track)) {
1424 switch (action) {
1425 case TRACK_ACTION_LOCK:
1426 track->flag |= TRACK_LOCKED;
1427 break;
1429 track->flag &= ~TRACK_LOCKED;
1430 break;
1432 track->flag ^= TRACK_LOCKED;
1433 break;
1434 }
1435 }
1436 }
1437
1439
1440 return OPERATOR_FINISHED;
1441}
1442
1444{
1445 static const EnumPropertyItem actions_items[] = {
1446 {TRACK_ACTION_LOCK, "LOCK", 0, "Lock", "Lock selected tracks"},
1447 {TRACK_ACTION_UNLOCK, "UNLOCK", 0, "Unlock", "Unlock selected tracks"},
1448 {TRACK_ACTION_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle locked flag for selected tracks"},
1449 {0, nullptr, 0, nullptr, nullptr},
1450 };
1451
1452 /* identifiers */
1453 ot->name = "Lock Tracks";
1454 ot->description = "Lock/unlock selected tracks";
1455 ot->idname = "CLIP_OT_lock_tracks";
1456
1457 /* api callbacks */
1460
1461 /* flags */
1463
1464 /* properties */
1465 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Lock action to execute");
1466}
1467
1470/* -------------------------------------------------------------------- */
1474enum {
1477};
1478
1480{
1483 MovieTracking *tracking = &clip->tracking;
1484 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1485 const int keyframe = RNA_enum_get(op->ptr, "keyframe");
1486 const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
1487
1488 if (keyframe == SOLVER_KEYFRAME_A) {
1489 tracking_object->keyframe1 = framenr;
1490 }
1491 else {
1492 tracking_object->keyframe2 = framenr;
1493 }
1494
1496
1497 return OPERATOR_FINISHED;
1498}
1499
1501{
1502 static const EnumPropertyItem keyframe_items[] = {
1503 {SOLVER_KEYFRAME_A, "KEYFRAME_A", 0, "Keyframe A", ""},
1504 {SOLVER_KEYFRAME_B, "KEYFRAME_B", 0, "Keyframe B", ""},
1505 {0, nullptr, 0, nullptr, nullptr},
1506 };
1507
1508 /* identifiers */
1509 ot->name = "Set Solver Keyframe";
1510 ot->description = "Set keyframe used by solver";
1511 ot->idname = "CLIP_OT_set_solver_keyframe";
1512
1513 /* api callbacks */
1516
1517 /* flags */
1519
1520 /* properties */
1521 RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", "Keyframe to set");
1522}
1523
1526/* -------------------------------------------------------------------- */
1531{
1534 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1535
1536 MovieTrackingTrack *active_track = tracking_object->active_track;
1537 if (active_track == nullptr) {
1538 return OPERATOR_CANCELLED;
1539 }
1540
1541 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1542 if (TRACK_VIEW_SELECTED(sc, track) && track != active_track) {
1543 track->flag &= ~TRACK_CUSTOMCOLOR;
1544 if (active_track->flag & TRACK_CUSTOMCOLOR) {
1545 copy_v3_v3(track->color, active_track->color);
1546 track->flag |= TRACK_CUSTOMCOLOR;
1547 }
1548 }
1549 }
1550
1551 DEG_id_tag_update(&clip->id, 0);
1553
1554 return OPERATOR_FINISHED;
1555}
1556
1558{
1559 /* identifiers */
1560 ot->name = "Copy Color";
1561 ot->description = "Copy color to all selected tracks";
1562 ot->idname = "CLIP_OT_track_copy_color";
1563
1564 /* api callbacks */
1567
1568 /* flags */
1570}
1571
1574/* -------------------------------------------------------------------- */
1578static bool is_track_clean(MovieTrackingTrack *track, int frames, int del)
1579{
1580 bool ok = true;
1581 int prev = -1, count = 0;
1582 MovieTrackingMarker *markers = track->markers, *new_markers = nullptr;
1583 int start_disabled = 0;
1584 int markersnr = track->markersnr;
1585
1586 if (del) {
1587 new_markers = MEM_cnew_array<MovieTrackingMarker>(markersnr, "track cleaned markers");
1588 }
1589
1590 for (int a = 0; a < markersnr; a++) {
1591 int end = 0;
1592
1593 if (prev == -1) {
1594 if ((markers[a].flag & MARKER_DISABLED) == 0) {
1595 prev = a;
1596 }
1597 else {
1598 start_disabled = 1;
1599 }
1600 }
1601
1602 if (prev >= 0) {
1603 end = a == markersnr - 1;
1604 end |= (a < markersnr - 1) && (markers[a].framenr != markers[a + 1].framenr - 1 ||
1606 }
1607
1608 if (end) {
1609 int segok = 1, len = 0;
1610
1611 if (a != prev && markers[a].framenr != markers[a - 1].framenr + 1) {
1612 len = a - prev;
1613 }
1614 else if (markers[a].flag & MARKER_DISABLED) {
1615 len = a - prev;
1616 }
1617 else {
1618 len = a - prev + 1;
1619 }
1620
1621 if (frames) {
1622 if (len < frames) {
1623 segok = 0;
1624 ok = false;
1625
1626 if (!del) {
1627 break;
1628 }
1629 }
1630 }
1631
1632 if (del) {
1633 if (segok) {
1634 int t = len;
1635
1636 if (markers[a].flag & MARKER_DISABLED) {
1637 t++;
1638 }
1639
1640 /* Place disabled marker in front of current segment. */
1641 if (start_disabled) {
1642 memcpy(new_markers + count, markers + prev, sizeof(MovieTrackingMarker));
1643 new_markers[count].framenr--;
1644 new_markers[count].flag |= MARKER_DISABLED;
1645
1646 count++;
1647 start_disabled = 0;
1648 }
1649
1650 memcpy(new_markers + count, markers + prev, t * sizeof(MovieTrackingMarker));
1651 count += t;
1652 }
1653 else if (markers[a].flag & MARKER_DISABLED) {
1654 /* Current segment which would be deleted was finished by
1655 * disabled marker, so next segment should be started from
1656 * disabled marker.
1657 */
1658 start_disabled = 1;
1659 }
1660 }
1661
1662 prev = -1;
1663 }
1664 }
1665
1666 if (del && count == 0) {
1667 ok = false;
1668 }
1669
1670 if (del) {
1671 MEM_freeN(track->markers);
1672
1673 if (count) {
1674 track->markers = new_markers;
1675 }
1676 else {
1677 track->markers = nullptr;
1678 MEM_freeN(new_markers);
1679 }
1680
1681 track->markersnr = count;
1682 }
1683
1684 return ok;
1685}
1686
1688{
1691 MovieTracking *tracking = &clip->tracking;
1692 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1693 int frames = RNA_int_get(op->ptr, "frames");
1694 int action = RNA_enum_get(op->ptr, "action");
1695 float error = RNA_float_get(op->ptr, "error");
1696
1697 if (error && action == TRACKING_CLEAN_DELETE_SEGMENT) {
1699 }
1700
1701 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
1702 if ((track->flag & TRACK_HIDDEN) == 0 && (track->flag & TRACK_LOCKED) == 0) {
1703 bool ok;
1704
1705 ok = is_track_clean(track, frames, action == TRACKING_CLEAN_DELETE_SEGMENT) &&
1706 ((error == 0.0f) || (track->flag & TRACK_HAS_BUNDLE) == 0 || (track->error < error));
1707
1708 if (!ok) {
1709 if (action == TRACKING_CLEAN_SELECT) {
1711 }
1712 else if (action == TRACKING_CLEAN_DELETE_TRACK) {
1713 if (track == tracking_object->active_track) {
1714 tracking_object->active_track = nullptr;
1715 }
1717 BLI_freelinkN(&tracking_object->tracks, track);
1718 track = nullptr;
1719 }
1720
1721 /* Happens when all tracking segments are not long enough. */
1722 if (track && track->markersnr == 0) {
1723 if (track == tracking_object->active_track) {
1724 tracking_object->active_track = nullptr;
1725 }
1727 BLI_freelinkN(&tracking_object->tracks, track);
1728 }
1729 }
1730 }
1731 }
1732
1733 DEG_id_tag_update(&clip->id, 0);
1735
1737
1738 return OPERATOR_FINISHED;
1739}
1740
1741static int clean_tracks_invoke(bContext *C, wmOperator *op, const wmEvent * /*event*/)
1742{
1745
1746 if (!RNA_struct_property_is_set(op->ptr, "frames")) {
1747 RNA_int_set(op->ptr, "frames", clip->tracking.settings.clean_frames);
1748 }
1749
1750 if (!RNA_struct_property_is_set(op->ptr, "error")) {
1751 RNA_float_set(op->ptr, "error", clip->tracking.settings.clean_error);
1752 }
1753
1754 if (!RNA_struct_property_is_set(op->ptr, "action")) {
1755 RNA_enum_set(op->ptr, "action", clip->tracking.settings.clean_action);
1756 }
1757
1758 return clean_tracks_exec(C, op);
1759}
1760
1762{
1763 static const EnumPropertyItem actions_items[] = {
1764 {TRACKING_CLEAN_SELECT, "SELECT", 0, "Select", "Select unclean tracks"},
1765 {TRACKING_CLEAN_DELETE_TRACK, "DELETE_TRACK", 0, "Delete Track", "Delete unclean tracks"},
1767 "DELETE_SEGMENTS",
1768 0,
1769 "Delete Segments",
1770 "Delete unclean segments of tracks"},
1771 {0, nullptr, 0, nullptr, nullptr},
1772 };
1773
1774 /* identifiers */
1775 ot->name = "Clean Tracks";
1776 ot->description = "Clean tracks with high error values or few frames";
1777 ot->idname = "CLIP_OT_clean_tracks";
1778
1779 /* api callbacks */
1783
1784 /* flags */
1786
1787 /* properties */
1789 "frames",
1790 0,
1791 0,
1792 INT_MAX,
1793 "Tracked Frames",
1794 "Affect tracks which are tracked less than the "
1795 "specified number of frames",
1796 0,
1797 INT_MAX);
1799 "error",
1800 0.0f,
1801 0.0f,
1802 FLT_MAX,
1803 "Reprojection Error",
1804 "Affect tracks which have a larger reprojection error",
1805 0.0f,
1806 100.0f);
1807 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute");
1808}
1809
1812/* -------------------------------------------------------------------- */
1817{
1820 MovieTracking *tracking = &clip->tracking;
1821
1822 BKE_tracking_object_add(tracking, "Object");
1823
1826
1827 return OPERATOR_FINISHED;
1828}
1829
1831{
1832 /* identifiers */
1833 ot->name = "Add Tracking Object";
1834 ot->description = "Add new object for tracking";
1835 ot->idname = "CLIP_OT_tracking_object_new";
1836
1837 /* api callbacks */
1840
1841 /* flags */
1843}
1844
1847/* -------------------------------------------------------------------- */
1852{
1855 MovieTracking *tracking = &clip->tracking;
1856 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1857
1858 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
1859 BKE_report(op->reports, RPT_WARNING, "Object used for camera tracking cannot be deleted");
1860 return OPERATOR_CANCELLED;
1861 }
1862
1863 BKE_tracking_object_delete(tracking, tracking_object);
1864
1867
1868 return OPERATOR_FINISHED;
1869}
1870
1872{
1873 /* identifiers */
1874 ot->name = "Remove Tracking Object";
1875 ot->description = "Remove object for tracking";
1876 ot->idname = "CLIP_OT_tracking_object_remove";
1877
1878 /* api callbacks */
1881
1882 /* flags */
1884}
1885
1888/* -------------------------------------------------------------------- */
1892static int copy_tracks_exec(bContext *C, wmOperator * /*op*/)
1893{
1896 MovieTracking *tracking = &clip->tracking;
1897 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1898
1900
1901 BKE_tracking_clipboard_copy_tracks(tracking, tracking_object);
1902
1903 return OPERATOR_FINISHED;
1904}
1905
1907{
1908 /* identifiers */
1909 ot->name = "Copy Tracks";
1910 ot->description = "Copy the selected tracks to the internal clipboard";
1911 ot->idname = "CLIP_OT_copy_tracks";
1912
1913 /* api callbacks */
1916
1917 /* flags */
1919}
1920
1923/* -------------------------------------------------------------------- */
1928{
1931 }
1932
1933 return false;
1934}
1935
1936static int paste_tracks_exec(bContext *C, wmOperator * /*op*/)
1937{
1940 MovieTracking *tracking = &clip->tracking;
1941 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1942
1943 BKE_tracking_tracks_deselect_all(&tracking_object->tracks);
1944 BKE_tracking_clipboard_paste_tracks(tracking, tracking_object);
1945
1947
1948 return OPERATOR_FINISHED;
1949}
1950
1952{
1953 /* identifiers */
1954 ot->name = "Paste Tracks";
1955 ot->description = "Paste tracks from the internal clipboard";
1956 ot->idname = "CLIP_OT_paste_tracks";
1957
1958 /* api callbacks */
1961
1962 /* flags */
1964}
1965
1968/* -------------------------------------------------------------------- */
1972static void keyframe_set_flag(bContext *C, bool set)
1973{
1976 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1977 const int framenr = ED_space_clip_get_clip_frame_number(sc);
1978
1979 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1980 if (TRACK_VIEW_SELECTED(sc, track)) {
1981 if (set) {
1982 MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
1983 marker->flag &= ~MARKER_TRACKED;
1984 }
1985 else {
1986 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
1987 if (marker != nullptr) {
1988 marker->flag |= MARKER_TRACKED;
1989 }
1990 }
1991 }
1992 }
1993
1994 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1995 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
1996 if (set) {
1998 framenr);
1999 if (plane_marker->flag & PLANE_MARKER_TRACKED) {
2000 plane_marker->flag &= ~PLANE_MARKER_TRACKED;
2001 BKE_tracking_track_plane_from_existing_motion(plane_track, plane_marker->framenr);
2002 }
2003 }
2004 else {
2006 framenr);
2007 if (plane_marker) {
2008 if ((plane_marker->flag & PLANE_MARKER_TRACKED) == 0) {
2009 plane_marker->flag |= PLANE_MARKER_TRACKED;
2011 plane_marker->framenr);
2012 }
2013 }
2014 }
2015 }
2016 }
2017
2019}
2020
2022{
2023 keyframe_set_flag(C, true);
2024 return OPERATOR_FINISHED;
2025}
2026
2028{
2029 /* identifiers */
2030 ot->name = "Insert Keyframe";
2031 ot->description = "Insert a keyframe to selected tracks at current frame";
2032 ot->idname = "CLIP_OT_keyframe_insert";
2033
2034 /* api callbacks */
2037
2038 /* flags */
2040}
2041
2044/* -------------------------------------------------------------------- */
2049{
2050 keyframe_set_flag(C, false);
2051 return OPERATOR_FINISHED;
2052}
2053
2055{
2056 /* identifiers */
2057 ot->name = "Delete Keyframe";
2058 ot->description = "Delete a keyframe from selected tracks at current frame";
2059 ot->idname = "CLIP_OT_keyframe_delete";
2060
2061 /* api callbacks */
2064
2065 /* flags */
2067}
2068
2071/* -------------------------------------------------------------------- */
2076{
2077 SpaceClip *space_clip = CTX_wm_space_clip(C);
2078 const int clip_frame_number = ED_space_clip_get_clip_frame_number(space_clip);
2079
2080 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2081
2082 MovieTracking *tracking = &clip->tracking;
2083 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2085 tracking_object->active_plane_track, clip_frame_number);
2086
2087 ImBuf *frame_ibuf = ED_space_clip_get_buffer(space_clip);
2088 if (frame_ibuf == nullptr) {
2089 return nullptr;
2090 }
2091
2092 ImBuf *plane_ibuf = BKE_tracking_get_plane_imbuf(frame_ibuf, plane_marker);
2093
2094 IMB_freeImBuf(frame_ibuf);
2095
2096 return plane_ibuf;
2097}
2098
2100{
2102 return false;
2103 }
2104
2105 SpaceClip *space_clip = CTX_wm_space_clip(C);
2106 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2107 const MovieTracking *tracking = &clip->tracking;
2108 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2109
2110 if (tracking_object->active_plane_track == nullptr) {
2111 return false;
2112 }
2113
2114 return true;
2115}
2116
2118{
2119 SpaceClip *space_clip = CTX_wm_space_clip(C);
2120 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2121 MovieTracking *tracking = &clip->tracking;
2122 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2123 MovieTrackingPlaneTrack *plane_track = tracking_object->active_plane_track;
2124
2126 if (plane_ibuf == nullptr) {
2127 return OPERATOR_CANCELLED;
2128 }
2129
2130 plane_track->image = BKE_image_add_from_imbuf(CTX_data_main(C), plane_ibuf, plane_track->name);
2131
2132 IMB_freeImBuf(plane_ibuf);
2133
2135
2136 return OPERATOR_FINISHED;
2137}
2138
2140{
2141 /* identifiers */
2142 ot->name = "New Image from Plane Marker";
2143 ot->description = "Create new image from the content of the plane marker";
2144 ot->idname = "CLIP_OT_new_image_from_plane_marker";
2145
2146 /* api callbacks */
2149
2150 /* flags */
2152}
2153
2155{
2157 return false;
2158 }
2159
2160 SpaceClip *space_clip = CTX_wm_space_clip(C);
2161 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2162 const MovieTracking *tracking = &clip->tracking;
2163 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2164
2165 if (tracking_object->active_plane_track == nullptr ||
2166 tracking_object->active_plane_track->image == nullptr)
2167 {
2168 return false;
2169 }
2170
2171 const Image *image = tracking_object->active_plane_track->image;
2172 return image->type == IMA_TYPE_IMAGE && ELEM(image->source, IMA_SRC_FILE, IMA_SRC_GENERATED);
2173}
2174
2176{
2177 SpaceClip *space_clip = CTX_wm_space_clip(C);
2178 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2179 MovieTracking *tracking = &clip->tracking;
2180 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2181 MovieTrackingPlaneTrack *plane_track = tracking_object->active_plane_track;
2182
2184 if (plane_ibuf == nullptr) {
2185 return OPERATOR_CANCELLED;
2186 }
2187
2188 BKE_image_replace_imbuf(plane_track->image, plane_ibuf);
2189
2190 IMB_freeImBuf(plane_ibuf);
2191
2193 WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, plane_track->image);
2194
2196
2197 return OPERATOR_FINISHED;
2198}
2199
2201{
2202 /* identifiers */
2203 ot->name = "Update Image from Plane Marker";
2204 ot->description =
2205 "Update current image used by plane marker from the content of the plane marker";
2206 ot->idname = "CLIP_OT_update_image_from_plane_marker";
2207
2208 /* api callbacks */
2211
2212 /* flags */
2214}
2215
Scene * CTX_data_scene(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)
Image * BKE_image_add_from_imbuf(Main *bmain, ImBuf *ibuf, const char *name)
void BKE_image_replace_imbuf(Image *image, ImBuf *ibuf)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
float BKE_movieclip_remap_scene_to_clip_frame(const struct MovieClip *clip, float framenr)
float BKE_movieclip_remap_clip_to_scene_frame(const struct MovieClip *clip, float framenr)
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
void BKE_tracking_track_path_clear(struct MovieTrackingTrack *track, int ref_frame, eTrackClearAction action)
Definition tracking.cc:776
void BKE_tracking_plane_track_free(struct MovieTrackingPlaneTrack *plane_track)
Definition tracking.cc:1625
void BKE_tracking_plane_track_replace_point_track(struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingTrack *old_track, struct MovieTrackingTrack *new_track)
Definition tracking.cc:1691
void BKE_tracking_clipboard_copy_tracks(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object)
Definition tracking.cc:460
void BKE_tracking_plane_marker_delete(struct MovieTrackingPlaneTrack *plane_track, int framenr)
Definition tracking.cc:1760
struct MovieTrackingPlaneMarker * BKE_tracking_plane_marker_get_exact(struct MovieTrackingPlaneTrack *plane_track, int framenr)
Definition tracking.cc:1837
void BKE_tracking_retrack_plane_from_existing_motion_at_segment(struct MovieTrackingPlaneTrack *plane_track, int start_frame)
struct MovieTrackingMarker * BKE_tracking_marker_ensure(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1402
#define PLANE_TRACK_VIEW_SELECTED(plane_track)
void BKE_tracking_tracks_average(struct MovieTrackingTrack *dst_track, struct MovieTrackingTrack **src_tracks, int num_src_tracks)
Definition tracking.cc:1013
struct MovieTrackingTrack * BKE_tracking_track_add_empty(struct MovieTracking *tracking, struct ListBase *tracks_list)
Definition tracking.cc:501
void BKE_tracking_plane_tracks_deselect_all(struct ListBase *plane_tracks_base)
Definition tracking.cc:1634
eTrackArea
@ TRACK_AREA_POINT
@ TRACK_AREA_ALL
@ TRACK_AREA_PAT
@ TRACK_AREA_SEARCH
@ TRACK_AREA_NONE
void BKE_tracking_track_flag_set(struct MovieTrackingTrack *track, int area, int flag)
Definition tracking.cc:675
void BKE_tracking_clipboard_paste_tracks(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object)
Definition tracking.cc:481
void BKE_tracking_tracks_join(struct MovieTracking *tracking, struct MovieTrackingTrack *dst_track, struct MovieTrackingTrack *src_track)
Definition tracking.cc:793
struct MovieTrackingMarker * BKE_tracking_marker_get(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1358
void BKE_tracking_marker_clamp_search_position(struct MovieTrackingMarker *marker)
Definition tracking.cc:1338
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
bool BKE_tracking_object_delete(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object)
Definition tracking.cc:1926
void BKE_tracking_dopesheet_tag_update(struct MovieTracking *tracking)
Definition tracking.cc:3411
struct MovieTrackingMarker * BKE_tracking_marker_get_exact(struct MovieTrackingTrack *track, int framenr)
Definition tracking.cc:1391
void BKE_tracking_track_free(struct MovieTrackingTrack *track)
Definition tracking.cc:596
void BKE_tracking_track_plane_from_existing_motion(struct MovieTrackingPlaneTrack *plane_track, int start_frame)
void BKE_tracking_tracks_deselect_all(struct ListBase *tracksbase)
Definition tracking.cc:1222
void BKE_tracking_track_select(struct ListBase *tracksbase, struct MovieTrackingTrack *track, int area, bool extend)
Definition tracking.cc:1190
eTrackClearAction
@ TRACK_CLEAR_ALL
@ TRACK_CLEAR_REMAINED
@ TRACK_CLEAR_UPTO
struct MovieTrackingTrack * BKE_tracking_track_add(struct MovieTracking *tracking, struct ListBase *tracksbase, float x, float y, int framenr, int width, int height)
Definition tracking.cc:525
struct MovieTrackingPlaneMarker * BKE_tracking_plane_marker_ensure(struct MovieTrackingPlaneTrack *plane_track, int framenr)
Definition tracking.cc:1849
struct ImBuf * BKE_tracking_get_plane_imbuf(const struct ImBuf *frame_ibuf, const struct MovieTrackingPlaneMarker *plane_marker)
struct MovieTrackingObject * BKE_tracking_object_add(struct MovieTracking *tracking, const char *name)
Definition tracking.cc:1897
struct MovieTrackingTrack ** BKE_tracking_selected_tracks_in_active_object(struct MovieTracking *tracking, int *r_num_tracks)
Definition tracking.cc:646
void BKE_tracking_marker_clamp_search_size(struct MovieTrackingMarker *marker)
Definition tracking.cc:1327
#define TRACK_VIEW_SELECTED(sc, track)
int BKE_tracking_count_selected_tracks_in_active_object(struct MovieTracking *tracking)
Definition tracking.cc:640
bool BKE_tracking_clipboard_has_tracks(void)
Definition tracking.cc:476
bool BKE_tracking_plane_track_has_point_track(struct MovieTrackingPlaneTrack *plane_track, struct MovieTrackingTrack *track)
Definition tracking.cc:1641
struct MovieTrackingPlaneMarker * BKE_tracking_plane_marker_get(struct MovieTrackingPlaneTrack *plane_track, int framenr)
Definition tracking.cc:1791
struct MovieReconstructedCamera * BKE_tracking_camera_get_reconstructed(struct MovieTracking *tracking, struct MovieTrackingObject *tracking_object, int framenr)
Definition tracking.cc:2133
#define BLI_assert(a)
Definition BLI_assert.h:50
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
#define ATTR_FALLTHROUGH
struct GSet GSet
Definition BLI_ghash.h:341
GSet * BLI_gset_ptr_new(const char *info)
void BLI_gset_insert(GSet *gs, void *key)
Definition BLI_ghash.c:959
BLI_INLINE void * BLI_gsetIterator_getKey(GSetIterator *gsi)
Definition BLI_ghash.h:459
#define GSET_ITER(gs_iter_, gset_)
Definition BLI_ghash.h:472
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
Definition BLI_ghash.c:1034
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:269
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
int isect_point_quad_v2(const float p[2], const float v1[2], const float v2[2], const float v3[2], const float v4[2])
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
float angle_signed_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float cross_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
#define ELEM(...)
#define IFACE_(msgid)
#define BLT_I18NCONTEXT_ID_MOVIECLIP
void DEG_id_tag_update(ID *id, unsigned int flags)
@ ID_RECALC_FRAME_CHANGE
Definition DNA_ID.h:1092
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1085
@ IMA_SRC_FILE
@ IMA_SRC_GENERATED
@ IMA_TYPE_IMAGE
@ TRACKING_CLEAN_DELETE_SEGMENT
@ TRACKING_CLEAN_SELECT
@ TRACKING_CLEAN_DELETE_TRACK
@ TRACK_CUSTOMCOLOR
@ TRACK_HIDDEN
@ TRACK_LOCKED
@ TRACK_USE_2D_STAB
@ TRACK_HAS_BUNDLE
@ TRACK_USE_2D_STAB_ROT
@ PLANE_MARKER_TRACKED
@ TRACKING_RECONSTRUCTED
@ PLANE_TRACK_HIDDEN
@ PLANE_TRACK_AUTOKEY
@ MARKER_TRACKED
@ MARKER_DISABLED
@ TRACKING_OBJECT_CAMERA
@ OPERATOR_RUNNING_MODAL
@ OPERATOR_PASS_THROUGH
void ED_clip_view_lock_state_restore_no_jump(const bContext *C, const ClipViewLockState *state)
void ED_clip_point_stable_pos(const SpaceClip *sc, const ARegion *region, float x, float y, float *xr, float *yr)
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
void ED_clip_mouse_pos(const SpaceClip *sc, const ARegion *region, const int mval[2], float r_co[2])
void ED_space_clip_get_size(const SpaceClip *sc, int *r_width, int *r_height)
int ED_space_clip_get_clip_frame_number(const SpaceClip *sc)
void ED_clip_view_lock_state_store(const bContext *C, ClipViewLockState *state)
ImBuf * ED_space_clip_get_buffer(const SpaceClip *sc)
bool ED_space_clip_tracking_poll(bContext *C)
void ED_workspace_status_text(bContext *C, const char *str)
Definition area.cc:966
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
@ PROP_SKIP_SAVE
Definition RNA_types.hh:245
@ ALERT_ICON_NONE
@ OPTYPE_BLOCKING
Definition WM_types.hh:164
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_GRAB_CURSOR_XY
Definition WM_types.hh:168
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NC_GEOM
Definition WM_types.hh:360
#define NA_EVALUATED
Definition WM_types.hh:551
@ KM_PRESS
Definition WM_types.hh:284
@ KM_RELEASE
Definition WM_types.hh:285
#define ND_DISPLAY
Definition WM_types.hh:458
#define NC_MOVIECLIP
Definition WM_types.hh:364
#define NC_SCENE
Definition WM_types.hh:345
#define NA_EDITED
Definition WM_types.hh:550
#define NC_IMAGE
Definition WM_types.hh:351
#define ND_FRAME
Definition WM_types.hh:401
#define ND_SELECT
Definition WM_types.hh:474
#define ND_TRANSFORM
Definition WM_types.hh:423
#define NC_OBJECT
Definition WM_types.hh:346
ATTR_WARN_UNUSED_RESULT const BMVert * v2
void clip_delete_marker(bContext *C, MovieClip *clip, MovieTrackingTrack *track, MovieTrackingMarker *marker)
void clip_delete_plane_track(bContext *C, MovieClip *clip, MovieTrackingPlaneTrack *plane_track)
void clip_delete_track(bContext *C, MovieClip *clip, MovieTrackingTrack *track)
#define SELECT
CCL_NAMESPACE_BEGIN struct Options options
#define sinf(x)
#define cosf(x)
#define fabsf(x)
int len
draw_view in_light_buf[] float
void IMB_freeImBuf(ImBuf *)
const vector< Marker > & markers
int count
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
ccl_device_inline float cross(const float2 a, const float2 b)
static ulong * next
static void error(const char *str)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
void RNA_int_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
int RNA_int_get(PointerRNA *ptr, const char *name)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
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(StructOrFunctionRNA *cont_, const char *identifier, 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_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_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
#define FLT_MAX
Definition stdcycles.h:14
MovieTrackingPlaneTrack * active_plane_track
MovieTrackingReconstruction reconstruction
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
eTrackPickAreaDetail area_detail
MovieTrackingTrack * track
float(* old_markers)[2]
MovieTrackingTrack * track
MovieTrackingMarker * marker
eSlideAction action
float old_corners[4][2]
float old_search_min[2]
float old_search_max[2]
struct MovieClipUser user
struct MovieClip * clip
short val
Definition WM_types.hh:724
int xy[2]
Definition WM_types.hh:726
int mval[2]
Definition WM_types.hh:728
short type
Definition WM_types.hh:722
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 ReportList * reports
struct PointerRNA * ptr
void CLIP_OT_paste_tracks(wmOperatorType *ot)
static int delete_marker_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int disable_markers_exec(bContext *C, wmOperator *op)
MovieTrackingTrack * tracking_find_slidable_track_in_proximity(bContext *C, const float co[2])
void CLIP_OT_delete_marker(wmOperatorType *ot)
static bool update_image_from_plane_marker_poll(bContext *C)
static int frame_jump_exec(bContext *C, wmOperator *op)
static int tracking_object_remove_exec(bContext *C, wmOperator *op)
static bool add_marker(const bContext *C, float x, float y)
static bool slide_check_corners(float(*corners)[2])
static int new_image_from_plane_marker_exec(bContext *C, wmOperator *)
static int hide_tracks_exec(bContext *C, wmOperator *op)
void CLIP_OT_track_copy_color(wmOperatorType *ot)
void CLIP_OT_hide_tracks_clear(wmOperatorType *ot)
void CLIP_OT_keyframe_delete(wmOperatorType *ot)
static int hide_tracks_clear_exec(bContext *C, wmOperator *)
static int keyframe_delete_exec(bContext *C, wmOperator *)
static SlideMarkerData * slide_marker_customdata(bContext *C, const wmEvent *event)
static int join_tracks_exec(bContext *C, wmOperator *op)
static bool frame_jump_poll(bContext *C)
static int delete_track_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int slide_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int track_copy_color_exec(bContext *C, wmOperator *)
static bool new_image_from_plane_marker_poll(bContext *C)
static int copy_tracks_exec(bContext *C, wmOperator *)
static int tracking_object_new_exec(bContext *C, wmOperator *)
void CLIP_OT_hide_tracks(wmOperatorType *ot)
static void free_slide_data(SlideMarkerData *data)
void CLIP_OT_set_solver_keyframe(wmOperatorType *ot)
void CLIP_OT_lock_tracks(wmOperatorType *ot)
static void keyframe_set_flag(bContext *C, bool set)
void CLIP_OT_average_tracks(wmOperatorType *ot)
static int update_image_from_plane_marker_exec(bContext *C, wmOperator *)
@ MARKER_OP_TOGGLE
@ MARKER_OP_DISABLE
@ MARKER_OP_ENABLE
static ImBuf * sample_plane_marker_image_for_operator(bContext *C)
void CLIP_OT_tracking_object_new(wmOperatorType *ot)
void CLIP_OT_keyframe_insert(wmOperatorType *ot)
void CLIP_OT_copy_tracks(wmOperatorType *ot)
static void apply_mouse_slide(bContext *C, SlideMarkerData *data)
static int average_tracks_exec(bContext *C, wmOperator *op)
static void cancel_mouse_slide(SlideMarkerData *data)
static MovieTrackingTrack * tracking_marker_check_slide(bContext *C, const float co[2], int *r_area, eSlideAction *r_action, int *r_corner)
void CLIP_OT_slide_marker(wmOperatorType *ot)
static int keyframe_insert_exec(bContext *C, wmOperator *)
static int add_marker_exec(bContext *C, wmOperator *op)
void CLIP_OT_add_marker_at_click(wmOperatorType *ot)
static int clear_track_path_exec(bContext *C, wmOperator *op)
static int delete_track_exec(bContext *C, wmOperator *)
void CLIP_OT_clean_tracks(wmOperatorType *ot)
void CLIP_OT_join_tracks(wmOperatorType *ot)
static int add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int lock_tracks_exec(bContext *C, wmOperator *op)
void CLIP_OT_delete_track(wmOperatorType *ot)
void CLIP_OT_add_marker(wmOperatorType *ot)
static int set_solver_keyframe_exec(bContext *C, wmOperator *op)
static SlideMarkerData * create_slide_marker_data(SpaceClip *sc, MovieTrackingTrack *track, MovieTrackingMarker *marker, const wmEvent *event, int area, int corner, eSlideAction action, int width, int height)
static bool paste_tracks_poll(bContext *C)
static int average_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *)
@ TRACK_ACTION_TOGGLE
@ TRACK_ACTION_UNLOCK
@ TRACK_ACTION_LOCK
static int add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void CLIP_OT_update_image_from_plane_marker(wmOperatorType *ot)
static int clean_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int clean_tracks_exec(bContext *C, wmOperator *op)
@ SOLVER_KEYFRAME_B
@ SOLVER_KEYFRAME_A
void CLIP_OT_tracking_object_remove(wmOperatorType *ot)
void CLIP_OT_disable_markers(wmOperatorType *ot)
eSlideAction
@ SLIDE_ACTION_NONE
@ SLIDE_ACTION_TILT_SIZE
@ SLIDE_ACTION_POS
@ SLIDE_ACTION_OFFSET
@ SLIDE_ACTION_SIZE
static bool is_track_clean(MovieTrackingTrack *track, int frames, int del)
void CLIP_OT_new_image_from_plane_marker(wmOperatorType *ot)
static int add_marker_at_click_modal(bContext *C, wmOperator *, const wmEvent *event)
void CLIP_OT_clear_track_path(wmOperatorType *ot)
static void slide_marker_tilt_slider_relative(const float pattern_corners[4][2], float r_slider[2])
static int paste_tracks_exec(bContext *C, wmOperator *)
void CLIP_OT_frame_jump(wmOperatorType *ot)
static int delete_marker_exec(bContext *C, wmOperator *)
@ TRACK_PICK_AREA_DETAIL_POSITION
@ TRACK_PICK_AREA_DETAIL_TILT_SIZE
@ TRACK_PICK_AREA_DETAIL_SIZE
@ TRACK_PICK_AREA_DETAIL_OFFSET
void clip_tracking_clear_invisible_track_selection(SpaceClip *sc, MovieClip *clip)
void clip_tracking_hide_cursor(bContext *C)
void clip_tracking_show_cursor(bContext *C)
BLI_INLINE bool ed_tracking_point_track_pick_empty(const PointTrackPick *pick)
BLI_INLINE TrackPickOptions ed_tracking_pick_options_defaults()
PointTrackPick ed_tracking_pick_point_track(const TrackPickOptions *options, bContext *C, const float co[2])
bool ed_tracking_point_track_pick_can_slide(const SpaceClip *space_clip, const PointTrackPick *pick)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
@ EVT_RIGHTCTRLKEY
@ EVT_LEFTCTRLKEY
@ MOUSEMOVE
@ LEFTMOUSE
@ EVT_ESCKEY
@ EVT_RIGHTSHIFTKEY
@ EVT_LEFTSHIFTKEY
wmOperatorType * ot
Definition wm_files.cc:4125
void WM_operator_properties_confirm_or_exec(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