Blender V5.0
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
8
9#include "MEM_guardedalloc.h"
10
11#include "DNA_screen_types.h"
12#include "DNA_space_types.h"
13
14#include "BLI_listbase.h"
15#include "BLI_math_geom.h"
16#include "BLI_math_vector.h"
17#include "BLI_set.hh"
18#include "BLI_utildefines.h"
19
20#include "BKE_context.hh"
21#include "BKE_image.hh"
22#include "BKE_movieclip.h"
23#include "BKE_report.hh"
24#include "BKE_tracking.h"
25
26#include "DEG_depsgraph.hh"
27
28#include "UI_interface_icons.hh"
29#include "UI_resources.hh"
30
31#include "WM_api.hh"
32#include "WM_types.hh"
33
34#include "ED_clip.hh"
35#include "ED_screen.hh"
36
37#include "RNA_access.hh"
38#include "RNA_define.hh"
39
40#include "BLT_translation.hh"
41
42#include "IMB_imbuf.hh"
43#include "IMB_imbuf_types.hh"
44
45#include "clip_intern.hh"
47
48/* -------------------------------------------------------------------- */
51
52static bool add_marker(const bContext *C, float x, float y)
53{
56 MovieTracking *tracking = &clip->tracking;
57 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
58 MovieTrackingTrack *track;
59 int width, height;
61
62 ED_space_clip_get_size(sc, &width, &height);
63
64 if (width == 0 || height == 0) {
65 return false;
66 }
67
68 track = BKE_tracking_track_add(tracking, &tracking_object->tracks, x, y, framenr, width, height);
69
70 BKE_tracking_track_select(&tracking_object->tracks, track, TRACK_AREA_ALL, false);
72
73 tracking_object->active_track = track;
74 tracking_object->active_plane_track = nullptr;
75
76 return true;
77}
78
80{
83 float pos[2];
84
85 ClipViewLockState lock_state;
86 ED_clip_view_lock_state_store(C, &lock_state);
87
88 RNA_float_get_array(op->ptr, "location", pos);
89
90 if (!add_marker(C, pos[0], pos[1])) {
91 return OPERATOR_CANCELLED;
92 }
93
95
97
98 return OPERATOR_FINISHED;
99}
100
102{
104 ARegion *region = CTX_wm_region(C);
105
106 if (!RNA_struct_property_is_set(op->ptr, "location")) {
107 /* If location is not set, use mouse position as default. */
108 float co[2];
109 ED_clip_mouse_pos(sc, region, event->mval, co);
110 RNA_float_set_array(op->ptr, "location", co);
111 }
112
113 return add_marker_exec(C, op);
114}
115
117{
118 /* identifiers */
119 ot->name = "Add Marker";
120 ot->idname = "CLIP_OT_add_marker";
121 ot->description = "Place new marker at specified location";
122
123 /* API callbacks. */
124 ot->invoke = add_marker_invoke;
125 ot->exec = add_marker_exec;
127
128 /* flags */
130
131 /* properties */
133 "location",
134 2,
135 nullptr,
136 -FLT_MAX,
137 FLT_MAX,
138 "Location",
139 "Location of marker on frame",
140 -1.0f,
141 1.0f);
142}
143
145
146/* -------------------------------------------------------------------- */
149
151 wmOperator *op,
152 const wmEvent * /*event*/)
153{
155 status.item(IFACE_("Cancel"), ICON_EVENT_ESC);
156 status.item(IFACE_("Place Marker"), ICON_MOUSE_LMB);
157
158 /* Add modal handler for ESC. */
160
162}
163
165 wmOperator * /*op*/,
166 const wmEvent *event)
167{
168 switch (event->type) {
169 case MOUSEMOVE:
171
172 case LEFTMOUSE: {
175 ARegion *region = CTX_wm_region(C);
176 float pos[2];
177
178 ED_workspace_status_text(C, nullptr);
179
181 region,
182 event->xy[0] - region->winrct.xmin,
183 event->xy[1] - region->winrct.ymin,
184 &pos[0],
185 &pos[1]);
186
187 if (!add_marker(C, pos[0], pos[1])) {
188 return OPERATOR_CANCELLED;
189 }
190
192 return OPERATOR_FINISHED;
193 }
194
195 case EVT_ESCKEY:
196 ED_workspace_status_text(C, nullptr);
197 return OPERATOR_CANCELLED;
198 default: {
199 break;
200 }
201 }
202
204}
205
207{
208 /* identifiers */
209 ot->name = "Add Marker at Click";
210 ot->idname = "CLIP_OT_add_marker_at_click";
211 ot->description = "Place new marker at the desired (clicked) position";
212
213 /* API callbacks. */
217
218 /* flags */
220}
221
223
224/* -------------------------------------------------------------------- */
227
229{
232 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
233 bool changed = false;
234
235 /* Delete selected plane tracks. */
236 LISTBASE_FOREACH_MUTABLE (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks)
237 {
238 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
239 clip_delete_plane_track(C, clip, plane_track);
240 changed = true;
241 }
242 }
243
244 /* Remove selected point tracks (they'll also be removed from planes which uses them). */
245 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
246 if (TRACK_VIEW_SELECTED(sc, track)) {
247 clip_delete_track(C, clip, track);
248 changed = true;
249 }
250 }
251
252 if (changed) {
254 }
255
256 return OPERATOR_FINISHED;
257}
258
260{
261 if (RNA_boolean_get(op->ptr, "confirm")) {
263 op,
264 IFACE_("Delete selected tracks?"),
265 nullptr,
266 IFACE_("Delete"),
268 false);
269 }
270 return delete_track_exec(C, op);
271}
272
274{
275 /* identifiers */
276 ot->name = "Delete Track";
277 ot->idname = "CLIP_OT_delete_track";
278 ot->description = "Delete selected tracks";
279
280 /* API callbacks. */
281 ot->invoke = delete_track_invoke;
282 ot->exec = delete_track_exec;
284
285 /* flags */
288}
289
291
292/* -------------------------------------------------------------------- */
295
297{
301 const int framenr = ED_space_clip_get_clip_frame_number(sc);
302 bool changed = false;
303
304 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
305 if (TRACK_VIEW_SELECTED(sc, track)) {
306 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
307 if (marker != nullptr) {
308 clip_delete_marker(C, clip, track, marker);
309 changed = true;
310 }
311 }
312 }
313
314 LISTBASE_FOREACH_MUTABLE (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks)
315 {
316 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
318 framenr);
319 if (plane_marker != nullptr) {
320 if (plane_track->markersnr == 1) {
322 BLI_freelinkN(&tracking_object->plane_tracks, plane_track);
323 }
324 else {
325 BKE_tracking_plane_marker_delete(plane_track, framenr);
326 }
327 changed = true;
328 }
329 }
330 }
331
332 if (!changed) {
333 return OPERATOR_CANCELLED;
334 }
335
336 return OPERATOR_FINISHED;
337}
338
340 wmOperator *op,
341 const wmEvent * /*event*/)
342{
343 if (RNA_boolean_get(op->ptr, "confirm")) {
345 op,
346 IFACE_("Delete marker for current frame from selected tracks?"),
347 nullptr,
348 IFACE_("Delete"),
350 false);
351 }
352 return delete_marker_exec(C, op);
353}
354
356{
357 /* identifiers */
358 ot->name = "Delete Marker";
359 ot->idname = "CLIP_OT_delete_marker";
360 ot->description = "Delete marker for current frame from selected tracks";
361
362 /* API callbacks. */
363 ot->invoke = delete_marker_invoke;
364 ot->exec = delete_marker_exec;
366
367 /* flags */
370}
371
373
374/* -------------------------------------------------------------------- */
377
386
388 short area;
392
393 int mval[2];
395 float *min, *max, *pos, (*corners)[2];
396
398
399 /* Data to restore on cancel. */
401 float old_corners[4][2];
403};
404
405static void slide_marker_tilt_slider_relative(const float pattern_corners[4][2], float r_slider[2])
406{
407 add_v2_v2v2(r_slider, pattern_corners[1], pattern_corners[2]);
408}
409
411 MovieTrackingTrack *track,
412 MovieTrackingMarker *marker,
413 const wmEvent *event,
414 int area,
415 int corner,
416 eSlideAction action,
417 int width,
418 int height)
419{
420 SlideMarkerData *data = MEM_callocN<SlideMarkerData>("slide marker data");
421 int framenr = ED_space_clip_get_clip_frame_number(sc);
422
423 marker = BKE_tracking_marker_ensure(track, framenr);
424
425 data->area = area;
426 data->action = action;
427 data->track = track;
428 data->marker = marker;
429
430 if (area == TRACK_AREA_POINT) {
431 data->pos = marker->pos;
432 }
433 else if (area == TRACK_AREA_PAT) {
434 if (action == SLIDE_ACTION_POS) {
435 data->corners = marker->pattern_corners;
436 data->pos = marker->pattern_corners[corner];
437 }
438 else if (action == SLIDE_ACTION_TILT_SIZE) {
439 data->corners = marker->pattern_corners;
440 }
441 }
442 else if (area == TRACK_AREA_SEARCH) {
443 data->min = marker->search_min;
444 data->max = marker->search_max;
445 }
446
447 data->mval[0] = event->mval[0];
448 data->mval[1] = event->mval[1];
449
450 data->width = width;
451 data->height = height;
452
453 if (action == SLIDE_ACTION_SIZE) {
454 data->lock = true;
455 }
456
457 /* Backup marker's settings. */
458 memcpy(data->old_corners, marker->pattern_corners, sizeof(data->old_corners));
459 copy_v2_v2(data->old_search_min, marker->search_min);
460 copy_v2_v2(data->old_search_max, marker->search_max);
461 copy_v2_v2(data->old_pos, marker->pos);
462
463 return data;
464}
465
466static bool slide_check_corners(float (*corners)[2])
467{
468 float cross = 0.0f;
469 const float p[2] = {0.0f, 0.0f};
470
471 if (!isect_point_quad_v2(p, corners[0], corners[1], corners[2], corners[3])) {
472 return false;
473 }
474
475 for (int i = 0; i < 4; i++) {
476 float v1[2], v2[2];
477
478 int next = (i + 1) % 4;
479 int prev = (4 + i - 1) % 4;
480
481 sub_v2_v2v2(v1, corners[i], corners[prev]);
482 sub_v2_v2v2(v2, corners[next], corners[i]);
483
484 float cur_cross = cross_v2v2(v1, v2);
485
486 if (fabsf(cur_cross) > FLT_EPSILON) {
487 if (cross == 0.0f) {
488 cross = cur_cross;
489 }
490 else if (cross * cur_cross < 0.0f) {
491 return false;
492 }
493 }
494 }
495
496 return true;
497}
498
500 bContext *C, const float co[2], int *r_area, eSlideAction *r_action, int *r_corner)
501{
502 SpaceClip *space_clip = CTX_wm_space_clip(C);
503
505 options.selected_only = true;
506 options.unlocked_only = true;
507 options.enabled_only = true;
508 const PointTrackPick track_pick = ed_tracking_pick_point_track(&options, C, co);
509
510 if (ed_tracking_point_track_pick_empty(&track_pick) ||
511 !ed_tracking_point_track_pick_can_slide(space_clip, &track_pick))
512 {
513 return nullptr;
514 }
515
516 const eTrackArea area = track_pick.area;
518 int corner = -1;
519
520 switch (area) {
521 case TRACK_AREA_NONE:
522 case TRACK_AREA_ALL:
523 BLI_assert_msg(0, "Expected single track area");
524 return nullptr;
525
526 case TRACK_AREA_POINT:
527 action = SLIDE_ACTION_POS;
528 break;
529
530 case TRACK_AREA_PAT:
532 action = SLIDE_ACTION_TILT_SIZE;
533 }
534 else if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_POSITION) {
535 action = SLIDE_ACTION_POS;
536 corner = track_pick.corner_index;
537 }
538 else {
539 BLI_assert_msg(0, "Unhandled pattern area");
540 return nullptr;
541 }
542 break;
543
545 if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_SIZE) {
546 action = SLIDE_ACTION_SIZE;
547 }
548 else if (track_pick.area_detail == TRACK_PICK_AREA_DETAIL_OFFSET) {
549 action = SLIDE_ACTION_OFFSET;
550 }
551 else {
552 BLI_assert_msg(0, "Unhandled search area");
553 return nullptr;
554 }
555 break;
556 }
557
558 if (r_area) {
559 *r_area = area;
560 }
561 if (r_action) {
562 *r_action = action;
563 }
564 if (r_corner) {
565 *r_corner = corner;
566 }
567
568 return track_pick.track;
569}
570
572{
573 return tracking_marker_check_slide(C, co, nullptr, nullptr, nullptr);
574}
575
577{
579 ARegion *region = CTX_wm_region(C);
580
581 MovieTrackingTrack *track;
582 int width, height;
583 float co[2];
584 SlideMarkerData *customdata = nullptr;
585 int framenr = ED_space_clip_get_clip_frame_number(sc);
586 eSlideAction action;
587 int area, corner;
588
589 ED_space_clip_get_size(sc, &width, &height);
590
591 if (width == 0 || height == 0) {
592 return nullptr;
593 }
594
595 ED_clip_mouse_pos(sc, region, event->mval, co);
596
597 track = tracking_marker_check_slide(C, co, &area, &action, &corner);
598 if (track != nullptr) {
599 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
600 customdata = create_slide_marker_data(
601 sc, track, marker, event, area, corner, action, width, height);
602 }
603
604 return customdata;
605}
606
608{
609 SlideMarkerData *slidedata = slide_marker_customdata(C, event);
610 if (slidedata != nullptr) {
613 MovieTracking *tracking = &clip->tracking;
614 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
615
616 tracking_object->active_track = slidedata->track;
617 tracking_object->active_plane_track = nullptr;
618
619 op->customdata = slidedata;
620
623
625
627 }
628
630}
631
633{
634 MovieTrackingMarker *marker = data->marker;
635
636 memcpy(marker->pattern_corners, data->old_corners, sizeof(marker->pattern_corners));
637 copy_v2_v2(marker->search_min, data->old_search_min);
638 copy_v2_v2(marker->search_max, data->old_search_max);
639 copy_v2_v2(marker->pos, data->old_pos);
640
641 if (data->old_markers != nullptr) {
642 for (int a = 0; a < data->track->markersnr; a++) {
643 copy_v2_v2(data->track->markers[a].pos, data->old_markers[a]);
644 }
645 }
646}
647
649{
650 if (data->area == TRACK_AREA_POINT) {
653 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
654 const int framenr = ED_space_clip_get_clip_frame_number(sc);
655
656 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
657 if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) {
658 if (BKE_tracking_plane_track_has_point_track(plane_track, data->track)) {
660 }
661 }
662 }
663 }
664}
665
667{
668 if (data->old_markers != nullptr) {
669 MEM_freeN(data->old_markers);
670 }
672}
673
675{
677
679 float dx, dy, mdelta[2];
680
681 switch (event->type) {
682 case EVT_LEFTCTRLKEY:
683 case EVT_RIGHTCTRLKEY:
684 case EVT_LEFTSHIFTKEY:
686 if (data->action == SLIDE_ACTION_SIZE) {
688 data->lock = event->val == KM_RELEASE;
689 }
690 }
691
693 data->accurate = event->val == KM_PRESS;
694 }
696 case MOUSEMOVE:
697 mdelta[0] = event->mval[0] - data->mval[0];
698 mdelta[1] = event->mval[1] - data->mval[1];
699
700 dx = mdelta[0] / data->width / sc->zoom;
701
702 if (data->lock) {
703 dy = -dx / data->height * data->width;
704 }
705 else {
706 dy = mdelta[1] / data->height / sc->zoom;
707 }
708
709 if (data->accurate) {
710 dx /= 5.0f;
711 dy /= 5.0f;
712 }
713
714 if (data->area == TRACK_AREA_POINT) {
715 data->pos[0] += dx;
716 data->pos[1] += dy;
717
719 DEG_id_tag_update(&sc->clip->id, 0);
720 }
721 else if (data->area == TRACK_AREA_PAT) {
722 if (data->action == SLIDE_ACTION_POS) {
723 float prev_pos[2];
724 copy_v2_v2(prev_pos, data->pos);
725
726 data->pos[0] += dx;
727 data->pos[1] += dy;
728
729 if (!slide_check_corners(data->corners)) {
730 copy_v2_v2(data->pos, prev_pos);
731 }
732
733 /* Allow pattern to be arbitrary size and resize search area if needed. */
735 }
736 else if (data->action == SLIDE_ACTION_TILT_SIZE) {
737 const float delta[2] = {dx, dy};
738
739 /* Slider position relative to the marker position using current state of pattern
740 * corners. */
741 float slider[2];
742 slide_marker_tilt_slider_relative(data->corners, slider);
743
744 /* Vector which connects marker position with the slider state at the current corners
745 * state.
746 * The coordinate is in the pixel space. */
747 float start_px[2];
748 copy_v2_v2(start_px, slider);
749 start_px[0] *= data->width;
750 start_px[1] *= data->height;
751
752 /* Vector which connects marker position with the slider state with the new mouse delta
753 * taken into account.
754 * The coordinate is in the pixel space. */
755 float end_px[2];
756 add_v2_v2v2(end_px, slider, delta);
757 end_px[0] *= data->width;
758 end_px[1] *= data->height;
759
760 float scale = 1.0f;
761 if (len_squared_v2(start_px) != 0.0f) {
762 scale = len_v2(end_px) / len_v2(start_px);
763
764 if (scale < 0.0f) {
765 scale = 0.0;
766 }
767 }
768
769 const float angle = -angle_signed_v2v2(start_px, end_px);
770
771 for (int a = 0; a < 4; a++) {
772 float vec[2];
773
774 mul_v2_fl(data->corners[a], scale);
775
776 copy_v2_v2(vec, data->corners[a]);
777 vec[0] *= data->width;
778 vec[1] *= data->height;
779
780 data->corners[a][0] = (vec[0] * cosf(angle) - vec[1] * sinf(angle)) / data->width;
781 data->corners[a][1] = (vec[1] * cosf(angle) + vec[0] * sinf(angle)) / data->height;
782 }
783
785 }
786 }
787 else if (data->area == TRACK_AREA_SEARCH) {
788 if (data->action == SLIDE_ACTION_SIZE) {
789 data->min[0] -= dx;
790 data->min[1] += dy;
791
792 data->max[0] += dx;
793 data->max[1] -= dy;
794
796 }
797 else if (data->action == SLIDE_ACTION_OFFSET) {
798 const float delta[2] = {dx, dy};
799 add_v2_v2(data->min, delta);
800 add_v2_v2(data->max, delta);
801
803 }
804 }
805
806 data->marker->flag &= ~MARKER_TRACKED;
807
808 copy_v2_v2_int(data->mval, event->mval);
809
811
812 break;
813
814 case LEFTMOUSE:
815 if (event->val == KM_RELEASE) {
818
820
821 return OPERATOR_FINISHED;
822 }
823
824 break;
825
826 case EVT_ESCKEY:
828
830
832
834
835 return OPERATOR_CANCELLED;
836 default: {
837 break;
838 }
839 }
840
842}
843
845{
846 /* identifiers */
847 ot->name = "Slide Marker";
848 ot->description = "Slide marker areas";
849 ot->idname = "CLIP_OT_slide_marker";
850
851 /* API callbacks. */
853 ot->invoke = slide_marker_invoke;
854 ot->modal = slide_marker_modal;
855
856 /* flags */
858
859 /* properties */
861 "offset",
862 2,
863 nullptr,
864 -FLT_MAX,
865 FLT_MAX,
866 "Offset",
867 "Offset in floating-point units, 1.0 is the width and height of the image",
868 -FLT_MAX,
869 FLT_MAX);
870}
871
873
874/* -------------------------------------------------------------------- */
877
879{
882 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
883 const eTrackClearAction action = eTrackClearAction(RNA_enum_get(op->ptr, "action"));
884 const bool clear_active = RNA_boolean_get(op->ptr, "clear_active");
885 const int framenr = ED_space_clip_get_clip_frame_number(sc);
886
887 if (clear_active) {
888 if (tracking_object->active_track != nullptr) {
889 BKE_tracking_track_path_clear(tracking_object->active_track, framenr, action);
890 }
891 }
892 else {
893 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
894 if (TRACK_VIEW_SELECTED(sc, track)) {
895 BKE_tracking_track_path_clear(track, framenr, action);
896 }
897 }
898 }
899
902
903 return OPERATOR_FINISHED;
904}
905
907{
908 static const EnumPropertyItem clear_path_actions[] = {
909 {TRACK_CLEAR_UPTO, "UPTO", 0, "Clear Up To", "Clear path up to current frame"},
911 "REMAINED",
912 0,
913 "Clear Remained",
914 "Clear path at remaining frames (after current)"},
915 {TRACK_CLEAR_ALL, "ALL", 0, "Clear All", "Clear the whole path"},
916 {0, nullptr, 0, nullptr, nullptr},
917 };
918
919 /* identifiers */
920 ot->name = "Clear Track Path";
921 ot->description = "Clear tracks after/before current position or clear the whole track";
922 ot->idname = "CLIP_OT_clear_track_path";
923
924 /* API callbacks. */
927
928 /* flags */
930
931 /* properties */
932 RNA_def_enum(ot->srna,
933 "action",
934 clear_path_actions,
936 "Action",
937 "Clear action to execute");
938 RNA_def_boolean(ot->srna,
939 "clear_active",
940 false,
941 "Clear Active",
942 "Clear active track only instead of all selected tracks");
943}
944
946
947/* -------------------------------------------------------------------- */
950
951enum {
955};
956
958{
961 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
962 const int action = RNA_enum_get(op->ptr, "action");
963 const int framenr = ED_space_clip_get_clip_frame_number(sc);
964
965 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
966 if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
967 MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
968 switch (action) {
970 marker->flag |= MARKER_DISABLED;
971 break;
972 case MARKER_OP_ENABLE:
973 marker->flag &= ~MARKER_DISABLED;
974 break;
975 case MARKER_OP_TOGGLE:
976 marker->flag ^= MARKER_DISABLED;
977 break;
978 }
979 }
980 }
981
982 DEG_id_tag_update(&clip->id, 0);
983
985
986 return OPERATOR_FINISHED;
987}
988
990{
991 static const EnumPropertyItem actions_items[] = {
992 {MARKER_OP_DISABLE, "DISABLE", 0, "Disable", "Disable selected markers"},
993 {MARKER_OP_ENABLE, "ENABLE", 0, "Enable", "Enable selected markers"},
994 {MARKER_OP_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"},
995 {0, nullptr, 0, nullptr, nullptr},
996 };
997
998 /* identifiers */
999 ot->name = "Disable Markers";
1000 ot->description = "Disable/enable selected markers";
1001 ot->idname = "CLIP_OT_disable_markers";
1002
1003 /* API callbacks. */
1004 ot->exec = disable_markers_exec;
1006
1007 /* flags */
1008 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1009
1010 /* properties */
1011 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Disable action to execute");
1012}
1013
1015
1016/* -------------------------------------------------------------------- */
1019
1021{
1024 MovieTracking *tracking = &clip->tracking;
1025 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1026 const int unselected = RNA_boolean_get(op->ptr, "unselected");
1027
1028 /* Hide point tracks. */
1029 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1030 if (unselected == 0 && TRACK_VIEW_SELECTED(sc, track)) {
1031 track->flag |= TRACK_HIDDEN;
1032 }
1033 else if (unselected == 1 && !TRACK_VIEW_SELECTED(sc, track)) {
1034 track->flag |= TRACK_HIDDEN;
1035 }
1036 }
1037
1038 const MovieTrackingTrack *active_track = tracking_object->active_track;
1039 if (active_track != nullptr && active_track->flag & TRACK_HIDDEN) {
1040 tracking_object->active_track = nullptr;
1041 }
1042
1043 /* Hide place tracks. */
1044 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1045 if (unselected == 0 && plane_track->flag & SELECT) {
1046 plane_track->flag |= PLANE_TRACK_HIDDEN;
1047 }
1048 else if (unselected == 1 && (plane_track->flag & SELECT) == 0) {
1049 plane_track->flag |= PLANE_TRACK_HIDDEN;
1050 }
1051 }
1052
1053 const MovieTrackingPlaneTrack *active_plane_track = tracking_object->active_plane_track;
1054 if (active_plane_track != nullptr && active_plane_track->flag & TRACK_HIDDEN) {
1055 tracking_object->active_plane_track = nullptr;
1056 }
1057
1060
1061 return OPERATOR_FINISHED;
1062}
1063
1065{
1066 /* identifiers */
1067 ot->name = "Hide Tracks";
1068 ot->description = "Hide selected tracks";
1069 ot->idname = "CLIP_OT_hide_tracks";
1070
1071 /* API callbacks. */
1072 ot->exec = hide_tracks_exec;
1074
1075 /* flags */
1076 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1077
1078 /* properties */
1079 RNA_def_boolean(ot->srna, "unselected", false, "Unselected", "Hide unselected tracks");
1080}
1081
1083
1084/* -------------------------------------------------------------------- */
1087
1089{
1092 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1093
1094 /* Unhide point tracks. */
1095 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1096 track->flag &= ~TRACK_HIDDEN;
1097 }
1098
1099 /* Unhide plane tracks. */
1100 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1101 plane_track->flag &= ~PLANE_TRACK_HIDDEN;
1102 }
1103
1105
1107
1108 return OPERATOR_FINISHED;
1109}
1110
1112{
1113 /* identifiers */
1114 ot->name = "Hide Tracks Clear";
1115 ot->description = "Clear hide selected tracks";
1116 ot->idname = "CLIP_OT_hide_tracks_clear";
1117
1118 /* API callbacks. */
1119 ot->exec = hide_tracks_clear_exec;
1121
1122 /* flags */
1123 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1124}
1125
1127
1128/* -------------------------------------------------------------------- */
1131
1133{
1134 SpaceClip *space_clip = CTX_wm_space_clip(C);
1135 return space_clip != nullptr;
1136}
1137
1139{
1140 Scene *scene = CTX_data_scene(C);
1143 MovieTracking *tracking = &clip->tracking;
1144 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1145 int pos = RNA_enum_get(op->ptr, "position");
1146 int delta;
1147
1148 if (pos <= 1) { /* jump to path */
1149 MovieTrackingTrack *active_track = tracking_object->active_track;
1150 if (active_track == nullptr) {
1151 return OPERATOR_CANCELLED;
1152 }
1153
1154 delta = pos == 1 ? 1 : -1;
1155 while (sc->user.framenr + delta >= scene->r.sfra && sc->user.framenr + delta <= scene->r.efra)
1156 {
1157 int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr + delta);
1158 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(active_track, framenr);
1159
1160 if (marker == nullptr || marker->flag & MARKER_DISABLED) {
1161 break;
1162 }
1163
1164 sc->user.framenr += delta;
1165 }
1166 }
1167 else { /* to failed frame */
1168 if (tracking_object->reconstruction.flag & TRACKING_RECONSTRUCTED) {
1169 int framenr = ED_space_clip_get_clip_frame_number(sc);
1170
1171 delta = pos == 3 ? 1 : -1;
1172 framenr += delta;
1173
1174 while (framenr + delta >= scene->r.sfra && framenr + delta <= scene->r.efra) {
1176 tracking, tracking_object, framenr);
1177
1178 if (cam == nullptr) {
1180 break;
1181 }
1182
1183 framenr += delta;
1184 }
1185 }
1186 }
1187
1188 if (scene->r.cfra != sc->user.framenr) {
1189 scene->r.cfra = sc->user.framenr;
1191
1193 }
1194
1196
1197 return OPERATOR_FINISHED;
1198}
1199
1201{
1202 static const EnumPropertyItem position_items[] = {
1203 {0, "PATHSTART", 0, "Path Start", "Jump to start of current path"},
1204 {1, "PATHEND", 0, "Path End", "Jump to end of current path"},
1205 {2, "FAILEDPREV", 0, "Previous Failed", "Jump to previous failed frame"},
1206 {2, "FAILNEXT", 0, "Next Failed", "Jump to next failed frame"},
1207 {0, nullptr, 0, nullptr, nullptr},
1208 };
1209
1210 /* identifiers */
1211 ot->name = "Jump to Frame";
1212 ot->description = "Jump to special frame";
1213 ot->idname = "CLIP_OT_frame_jump";
1214
1215 /* API callbacks. */
1216 ot->exec = frame_jump_exec;
1217 ot->poll = frame_jump_poll;
1218
1219 /* flags */
1220 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1221
1222 /* properties */
1223 RNA_def_enum(ot->srna, "position", position_items, 0, "Position", "Position to jump to");
1224}
1225
1227
1228/* -------------------------------------------------------------------- */
1231
1233{
1236 MovieTracking *tracking = &clip->tracking;
1237 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1238 MovieTrackingStabilization *stabilization = &tracking->stabilization;
1239 bool update_stabilization = false;
1240
1241 MovieTrackingTrack *active_track = tracking_object->active_track;
1242 if (active_track == nullptr) {
1243 BKE_report(op->reports, RPT_ERROR, "No active track to join to");
1244 return OPERATOR_CANCELLED;
1245 }
1246
1248
1249 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
1250 if (TRACK_VIEW_SELECTED(sc, track) && track != active_track) {
1251 BKE_tracking_tracks_join(tracking, active_track, track);
1252
1253 if (track->flag & TRACK_USE_2D_STAB) {
1254 update_stabilization = true;
1255 if ((active_track->flag & TRACK_USE_2D_STAB) == 0) {
1256 active_track->flag |= TRACK_USE_2D_STAB;
1257 }
1258 else {
1259 stabilization->tot_track--;
1260 }
1261 BLI_assert(0 <= stabilization->tot_track);
1262 }
1263 if (track->flag & TRACK_USE_2D_STAB_ROT) {
1264 update_stabilization = true;
1265 if ((active_track->flag & TRACK_USE_2D_STAB_ROT) == 0) {
1266 active_track->flag |= TRACK_USE_2D_STAB_ROT;
1267 }
1268 else {
1269 stabilization->tot_rot_track--;
1270 }
1271 BLI_assert(0 <= stabilization->tot_rot_track);
1272 }
1273
1274 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
1275 if (BKE_tracking_plane_track_has_point_track(plane_track, track)) {
1276 BKE_tracking_plane_track_replace_point_track(plane_track, track, active_track);
1277 if ((plane_track->flag & PLANE_TRACK_AUTOKEY) == 0) {
1278 point_tracks.add(plane_track);
1279 }
1280 }
1281 }
1282
1284 BLI_freelinkN(&tracking_object->tracks, track);
1285 }
1286 }
1287
1288 if (update_stabilization) {
1290 }
1291
1292 int framenr = ED_space_clip_get_clip_frame_number(sc);
1293 for (MovieTrackingPlaneTrack *plane_track : point_tracks) {
1295 }
1296
1297 DEG_id_tag_update(&clip->id, 0);
1298
1300
1301 return OPERATOR_FINISHED;
1302}
1303
1305{
1306 /* identifiers */
1307 ot->name = "Join Tracks";
1308 ot->description = "Join selected tracks";
1309 ot->idname = "CLIP_OT_join_tracks";
1310
1311 /* API callbacks. */
1312 ot->exec = join_tracks_exec;
1314
1315 /* flags */
1316 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1317}
1318
1320
1321/* -------------------------------------------------------------------- */
1324
1326{
1327 SpaceClip *space_clip = CTX_wm_space_clip(C);
1328 MovieClip *clip = ED_space_clip_get_clip(space_clip);
1329 MovieTracking *tracking = &clip->tracking;
1330 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1331
1332 /* Collect source tracks. */
1333 int num_source_tracks;
1335 tracking, &num_source_tracks);
1336 if (num_source_tracks == 0) {
1337 return OPERATOR_CANCELLED;
1338 }
1339
1340 /* Create new empty track, which will be the averaged result.
1341 * Makes it simple to average all selection to it. */
1342 MovieTrackingTrack *result_track = BKE_tracking_track_add_empty(tracking,
1343 &tracking_object->tracks);
1344
1345 /* Perform averaging. */
1346 BKE_tracking_tracks_average(result_track, source_tracks, num_source_tracks);
1347
1348 const bool keep_original = RNA_boolean_get(op->ptr, "keep_original");
1349 if (!keep_original) {
1350 for (int i = 0; i < num_source_tracks; i++) {
1351 clip_delete_track(C, clip, source_tracks[i]);
1352 }
1353 }
1354
1355 /* Update selection, making the result track active and selected. */
1356 /* TODO(sergey): Should become some sort of utility function available for all operators. */
1357
1358 BKE_tracking_track_select(&tracking_object->tracks, result_track, TRACK_AREA_ALL, false);
1360
1361 tracking_object->active_track = result_track;
1362 tracking_object->active_plane_track = nullptr;
1363
1364 /* Inform the dependency graph and interface about changes. */
1365 DEG_id_tag_update(&clip->id, 0);
1367
1368 /* Free memory. */
1369 MEM_freeN(source_tracks);
1370
1371 return OPERATOR_FINISHED;
1372}
1373
1375 wmOperator *op,
1376 const wmEvent * /*event*/)
1377{
1378 PropertyRNA *prop_keep_original = RNA_struct_find_property(op->ptr, "keep_original");
1379 if (!RNA_property_is_set(op->ptr, prop_keep_original)) {
1380 SpaceClip *space_clip = CTX_wm_space_clip(C);
1381 MovieClip *clip = ED_space_clip_get_clip(space_clip);
1382 MovieTracking *tracking = &clip->tracking;
1383
1384 const int num_selected_tracks = BKE_tracking_count_selected_tracks_in_active_object(tracking);
1385
1386 if (num_selected_tracks == 1) {
1387 RNA_property_boolean_set(op->ptr, prop_keep_original, false);
1388 }
1389 }
1390
1391 return average_tracks_exec(C, op);
1392}
1393
1395{
1396 /* Identifiers. */
1397 ot->name = "Average Tracks";
1398 ot->description = "Average selected tracks into active";
1399 ot->idname = "CLIP_OT_average_tracks";
1400
1401 /* API callbacks. */
1402 ot->exec = average_tracks_exec;
1403 ot->invoke = average_tracks_invoke;
1405
1406 /* Flags. */
1407 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1408
1409 /* Properties. */
1410 PropertyRNA *prop;
1411
1412 prop = RNA_def_boolean(ot->srna, "keep_original", true, "Keep Original", "Keep original tracks");
1415}
1416
1418
1419/* -------------------------------------------------------------------- */
1422
1423enum {
1427};
1428
1430{
1433 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1434 const int action = RNA_enum_get(op->ptr, "action");
1435
1436 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1437 if (TRACK_VIEW_SELECTED(sc, track)) {
1438 switch (action) {
1439 case TRACK_ACTION_LOCK:
1440 track->flag |= TRACK_LOCKED;
1441 break;
1443 track->flag &= ~TRACK_LOCKED;
1444 break;
1446 track->flag ^= TRACK_LOCKED;
1447 break;
1448 }
1449 }
1450 }
1451
1453
1454 return OPERATOR_FINISHED;
1455}
1456
1458{
1459 static const EnumPropertyItem actions_items[] = {
1460 {TRACK_ACTION_LOCK, "LOCK", 0, "Lock", "Lock selected tracks"},
1461 {TRACK_ACTION_UNLOCK, "UNLOCK", 0, "Unlock", "Unlock selected tracks"},
1462 {TRACK_ACTION_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle locked flag for selected tracks"},
1463 {0, nullptr, 0, nullptr, nullptr},
1464 };
1465
1466 /* identifiers */
1467 ot->name = "Lock Tracks";
1468 ot->description = "Lock/unlock selected tracks";
1469 ot->idname = "CLIP_OT_lock_tracks";
1470
1471 /* API callbacks. */
1472 ot->exec = lock_tracks_exec;
1474
1475 /* flags */
1476 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1477
1478 /* properties */
1479 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Lock action to execute");
1480}
1481
1483
1484/* -------------------------------------------------------------------- */
1487
1488enum {
1491};
1492
1494{
1497 MovieTracking *tracking = &clip->tracking;
1498 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1499 const int keyframe = RNA_enum_get(op->ptr, "keyframe");
1500 const int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, sc->user.framenr);
1501
1502 if (keyframe == SOLVER_KEYFRAME_A) {
1503 tracking_object->keyframe1 = framenr;
1504 }
1505 else {
1506 tracking_object->keyframe2 = framenr;
1507 }
1508
1510
1511 return OPERATOR_FINISHED;
1512}
1513
1515{
1516 static const EnumPropertyItem keyframe_items[] = {
1517 {SOLVER_KEYFRAME_A, "KEYFRAME_A", 0, "Keyframe A", ""},
1518 {SOLVER_KEYFRAME_B, "KEYFRAME_B", 0, "Keyframe B", ""},
1519 {0, nullptr, 0, nullptr, nullptr},
1520 };
1521
1522 /* identifiers */
1523 ot->name = "Set Solver Keyframe";
1524 ot->description = "Set keyframe used by solver";
1525 ot->idname = "CLIP_OT_set_solver_keyframe";
1526
1527 /* API callbacks. */
1530
1531 /* flags */
1532 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1533
1534 /* properties */
1535 RNA_def_enum(ot->srna, "keyframe", keyframe_items, 0, "Keyframe", "Keyframe to set");
1536}
1537
1539
1540/* -------------------------------------------------------------------- */
1543
1545{
1548 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1549
1550 MovieTrackingTrack *active_track = tracking_object->active_track;
1551 if (active_track == nullptr) {
1552 return OPERATOR_CANCELLED;
1553 }
1554
1555 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1556 if (TRACK_VIEW_SELECTED(sc, track) && track != active_track) {
1557 track->flag &= ~TRACK_CUSTOMCOLOR;
1558 if (active_track->flag & TRACK_CUSTOMCOLOR) {
1559 copy_v3_v3(track->color, active_track->color);
1560 track->flag |= TRACK_CUSTOMCOLOR;
1561 }
1562 }
1563 }
1564
1565 DEG_id_tag_update(&clip->id, 0);
1567
1568 return OPERATOR_FINISHED;
1569}
1570
1572{
1573 /* identifiers */
1574 ot->name = "Copy Color";
1575 ot->description = "Copy color to all selected tracks";
1576 ot->idname = "CLIP_OT_track_copy_color";
1577
1578 /* API callbacks. */
1579 ot->exec = track_copy_color_exec;
1581
1582 /* flags */
1583 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1584}
1585
1587
1588/* -------------------------------------------------------------------- */
1591
1592static bool is_track_clean(MovieTrackingTrack *track, int frames, int del)
1593{
1594 bool ok = true;
1595 int prev = -1, count = 0;
1596 MovieTrackingMarker *markers = track->markers, *new_markers = nullptr;
1597 int start_disabled = 0;
1598 int markersnr = track->markersnr;
1599
1600 if (del) {
1601 new_markers = MEM_calloc_arrayN<MovieTrackingMarker>(markersnr, "track cleaned markers");
1602 }
1603
1604 for (int a = 0; a < markersnr; a++) {
1605 int end = 0;
1606
1607 if (prev == -1) {
1608 if ((markers[a].flag & MARKER_DISABLED) == 0) {
1609 prev = a;
1610 }
1611 else {
1612 start_disabled = 1;
1613 }
1614 }
1615
1616 if (prev >= 0) {
1617 end = a == markersnr - 1;
1618 end |= (a < markersnr - 1) && (markers[a].framenr != markers[a + 1].framenr - 1 ||
1619 markers[a].flag & MARKER_DISABLED);
1620 }
1621
1622 if (end) {
1623 int segok = 1, len = 0;
1624
1625 if (a != prev && markers[a].framenr != markers[a - 1].framenr + 1) {
1626 len = a - prev;
1627 }
1628 else if (markers[a].flag & MARKER_DISABLED) {
1629 len = a - prev;
1630 }
1631 else {
1632 len = a - prev + 1;
1633 }
1634
1635 if (frames) {
1636 if (len < frames) {
1637 segok = 0;
1638 ok = false;
1639
1640 if (!del) {
1641 break;
1642 }
1643 }
1644 }
1645
1646 if (del) {
1647 if (segok) {
1648 int t = len;
1649
1650 if (markers[a].flag & MARKER_DISABLED) {
1651 t++;
1652 }
1653
1654 /* Place disabled marker in front of current segment. */
1655 if (start_disabled) {
1656 memcpy(new_markers + count, markers + prev, sizeof(MovieTrackingMarker));
1657 new_markers[count].framenr--;
1658 new_markers[count].flag |= MARKER_DISABLED;
1659
1660 count++;
1661 start_disabled = 0;
1662 }
1663
1664 memcpy(new_markers + count, markers + prev, t * sizeof(MovieTrackingMarker));
1665 count += t;
1666 }
1667 else if (markers[a].flag & MARKER_DISABLED) {
1668 /* Current segment which would be deleted was finished by
1669 * disabled marker, so next segment should be started from
1670 * disabled marker.
1671 */
1672 start_disabled = 1;
1673 }
1674 }
1675
1676 prev = -1;
1677 }
1678 }
1679
1680 if (del && count == 0) {
1681 ok = false;
1682 }
1683
1684 if (del) {
1685 MEM_freeN(track->markers);
1686
1687 if (count) {
1688 track->markers = new_markers;
1689 }
1690 else {
1691 track->markers = nullptr;
1692 MEM_freeN(new_markers);
1693 }
1694
1695 track->markersnr = count;
1696 }
1697
1698 return ok;
1699}
1700
1702{
1705 MovieTracking *tracking = &clip->tracking;
1706 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1707 int frames = RNA_int_get(op->ptr, "frames");
1708 int action = RNA_enum_get(op->ptr, "action");
1709 float error = RNA_float_get(op->ptr, "error");
1710
1711 if (error && action == TRACKING_CLEAN_DELETE_SEGMENT) {
1713 }
1714
1715 LISTBASE_FOREACH_MUTABLE (MovieTrackingTrack *, track, &tracking_object->tracks) {
1716 if ((track->flag & TRACK_HIDDEN) == 0 && (track->flag & TRACK_LOCKED) == 0) {
1717 bool ok;
1718
1719 ok = is_track_clean(track, frames, action == TRACKING_CLEAN_DELETE_SEGMENT) &&
1720 ((error == 0.0f) || (track->flag & TRACK_HAS_BUNDLE) == 0 || (track->error < error));
1721
1722 if (!ok) {
1723 if (action == TRACKING_CLEAN_SELECT) {
1725 }
1726 else if (action == TRACKING_CLEAN_DELETE_TRACK) {
1727 if (track == tracking_object->active_track) {
1728 tracking_object->active_track = nullptr;
1729 }
1731 BLI_freelinkN(&tracking_object->tracks, track);
1732 track = nullptr;
1733 }
1734
1735 /* Happens when all tracking segments are not long enough. */
1736 if (track && track->markersnr == 0) {
1737 if (track == tracking_object->active_track) {
1738 tracking_object->active_track = nullptr;
1739 }
1741 BLI_freelinkN(&tracking_object->tracks, track);
1742 }
1743 }
1744 }
1745 }
1746
1747 DEG_id_tag_update(&clip->id, 0);
1749
1751
1752 return OPERATOR_FINISHED;
1753}
1754
1756{
1759
1760 if (!RNA_struct_property_is_set(op->ptr, "frames")) {
1761 RNA_int_set(op->ptr, "frames", clip->tracking.settings.clean_frames);
1762 }
1763
1764 if (!RNA_struct_property_is_set(op->ptr, "error")) {
1765 RNA_float_set(op->ptr, "error", clip->tracking.settings.clean_error);
1766 }
1767
1768 if (!RNA_struct_property_is_set(op->ptr, "action")) {
1769 RNA_enum_set(op->ptr, "action", clip->tracking.settings.clean_action);
1770 }
1771
1772 return clean_tracks_exec(C, op);
1773}
1774
1776{
1777 static const EnumPropertyItem actions_items[] = {
1778 {TRACKING_CLEAN_SELECT, "SELECT", 0, "Select", "Select unclean tracks"},
1779 {TRACKING_CLEAN_DELETE_TRACK, "DELETE_TRACK", 0, "Delete Track", "Delete unclean tracks"},
1781 "DELETE_SEGMENTS",
1782 0,
1783 "Delete Segments",
1784 "Delete unclean segments of tracks"},
1785 {0, nullptr, 0, nullptr, nullptr},
1786 };
1787
1788 /* identifiers */
1789 ot->name = "Clean Tracks";
1790 ot->description = "Clean tracks with high error values or few frames";
1791 ot->idname = "CLIP_OT_clean_tracks";
1792
1793 /* API callbacks. */
1794 ot->exec = clean_tracks_exec;
1795 ot->invoke = clean_tracks_invoke;
1797
1798 /* flags */
1799 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1800
1801 /* properties */
1802 RNA_def_int(ot->srna,
1803 "frames",
1804 0,
1805 0,
1806 INT_MAX,
1807 "Tracked Frames",
1808 "Affect tracks which are tracked less than the "
1809 "specified number of frames",
1810 0,
1811 INT_MAX);
1812 RNA_def_float(ot->srna,
1813 "error",
1814 0.0f,
1815 0.0f,
1816 FLT_MAX,
1817 "Reprojection Error",
1818 "Affect tracks which have a larger reprojection error",
1819 0.0f,
1820 100.0f);
1821 RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute");
1822}
1823
1825
1826/* -------------------------------------------------------------------- */
1829
1831{
1834 MovieTracking *tracking = &clip->tracking;
1835
1836 BKE_tracking_object_add(tracking, "Object");
1837
1840
1841 return OPERATOR_FINISHED;
1842}
1843
1845{
1846 /* identifiers */
1847 ot->name = "Add Tracking Object";
1848 ot->description = "Add new object for tracking";
1849 ot->idname = "CLIP_OT_tracking_object_new";
1850
1851 /* API callbacks. */
1854
1855 /* flags */
1856 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1857}
1858
1860
1861/* -------------------------------------------------------------------- */
1864
1866{
1869 MovieTracking *tracking = &clip->tracking;
1870 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1871
1872 if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
1873 BKE_report(op->reports, RPT_WARNING, "Object used for camera tracking cannot be deleted");
1874 return OPERATOR_CANCELLED;
1875 }
1876
1877 BKE_tracking_object_delete(tracking, tracking_object);
1878
1881
1882 return OPERATOR_FINISHED;
1883}
1884
1886{
1887 /* identifiers */
1888 ot->name = "Remove Tracking Object";
1889 ot->description = "Remove object for tracking";
1890 ot->idname = "CLIP_OT_tracking_object_remove";
1891
1892 /* API callbacks. */
1895
1896 /* flags */
1897 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1898}
1899
1901
1902/* -------------------------------------------------------------------- */
1905
1907{
1910 MovieTracking *tracking = &clip->tracking;
1911 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1912
1914
1915 BKE_tracking_clipboard_copy_tracks(tracking, tracking_object);
1916
1917 return OPERATOR_FINISHED;
1918}
1919
1921{
1922 /* identifiers */
1923 ot->name = "Copy Tracks";
1924 ot->description = "Copy the selected tracks to the internal clipboard";
1925 ot->idname = "CLIP_OT_copy_tracks";
1926
1927 /* API callbacks. */
1928 ot->exec = copy_tracks_exec;
1930
1931 /* flags */
1932 ot->flag = OPTYPE_REGISTER;
1933}
1934
1936
1937/* -------------------------------------------------------------------- */
1940
1942{
1945 }
1946
1947 return false;
1948}
1949
1951{
1954 MovieTracking *tracking = &clip->tracking;
1955 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
1956
1957 BKE_tracking_tracks_deselect_all(&tracking_object->tracks);
1958 BKE_tracking_clipboard_paste_tracks(tracking, tracking_object);
1959
1961
1962 return OPERATOR_FINISHED;
1963}
1964
1966{
1967 /* identifiers */
1968 ot->name = "Paste Tracks";
1969 ot->description = "Paste tracks from the internal clipboard";
1970 ot->idname = "CLIP_OT_paste_tracks";
1971
1972 /* API callbacks. */
1973 ot->exec = paste_tracks_exec;
1974 ot->poll = paste_tracks_poll;
1975
1976 /* flags */
1977 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1978}
1979
1981
1982/* -------------------------------------------------------------------- */
1985
1986static void keyframe_set_flag(bContext *C, bool set)
1987{
1990 const MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(&clip->tracking);
1991 const int framenr = ED_space_clip_get_clip_frame_number(sc);
1992
1993 LISTBASE_FOREACH (MovieTrackingTrack *, track, &tracking_object->tracks) {
1994 if (TRACK_VIEW_SELECTED(sc, track)) {
1995 if (set) {
1996 MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
1997 marker->flag &= ~MARKER_TRACKED;
1998 }
1999 else {
2000 MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, framenr);
2001 if (marker != nullptr) {
2002 marker->flag |= MARKER_TRACKED;
2003 }
2004 }
2005 }
2006 }
2007
2008 LISTBASE_FOREACH (MovieTrackingPlaneTrack *, plane_track, &tracking_object->plane_tracks) {
2009 if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
2010 if (set) {
2012 framenr);
2013 if (plane_marker->flag & PLANE_MARKER_TRACKED) {
2014 plane_marker->flag &= ~PLANE_MARKER_TRACKED;
2015 BKE_tracking_track_plane_from_existing_motion(plane_track, plane_marker->framenr);
2016 }
2017 }
2018 else {
2020 framenr);
2021 if (plane_marker) {
2022 if ((plane_marker->flag & PLANE_MARKER_TRACKED) == 0) {
2023 plane_marker->flag |= PLANE_MARKER_TRACKED;
2025 plane_marker->framenr);
2026 }
2027 }
2028 }
2029 }
2030 }
2031
2033}
2034
2036{
2037 keyframe_set_flag(C, true);
2038 return OPERATOR_FINISHED;
2039}
2040
2042{
2043 /* identifiers */
2044 ot->name = "Insert Keyframe";
2045 ot->description = "Insert a keyframe to selected tracks at current frame";
2046 ot->idname = "CLIP_OT_keyframe_insert";
2047
2048 /* API callbacks. */
2050 ot->exec = keyframe_insert_exec;
2051
2052 /* flags */
2053 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2054}
2055
2057
2058/* -------------------------------------------------------------------- */
2061
2063{
2064 keyframe_set_flag(C, false);
2065 return OPERATOR_FINISHED;
2066}
2067
2069{
2070 /* identifiers */
2071 ot->name = "Delete Keyframe";
2072 ot->description = "Delete a keyframe from selected tracks at current frame";
2073 ot->idname = "CLIP_OT_keyframe_delete";
2074
2075 /* API callbacks. */
2077 ot->exec = keyframe_delete_exec;
2078
2079 /* flags */
2080 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2081}
2082
2084
2085/* -------------------------------------------------------------------- */
2088
2090{
2091 SpaceClip *space_clip = CTX_wm_space_clip(C);
2092 const int clip_frame_number = ED_space_clip_get_clip_frame_number(space_clip);
2093
2094 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2095
2096 MovieTracking *tracking = &clip->tracking;
2097 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2099 tracking_object->active_plane_track, clip_frame_number);
2100
2101 ImBuf *frame_ibuf = ED_space_clip_get_buffer(space_clip);
2102 if (frame_ibuf == nullptr) {
2103 return nullptr;
2104 }
2105
2106 ImBuf *plane_ibuf = BKE_tracking_get_plane_imbuf(frame_ibuf, plane_marker);
2107
2108 IMB_freeImBuf(frame_ibuf);
2109
2110 return plane_ibuf;
2111}
2112
2114{
2116 return false;
2117 }
2118
2119 SpaceClip *space_clip = CTX_wm_space_clip(C);
2120 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2121 const MovieTracking *tracking = &clip->tracking;
2122 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2123
2124 if (tracking_object->active_plane_track == nullptr) {
2125 return false;
2126 }
2127
2128 return true;
2129}
2130
2132{
2133 SpaceClip *space_clip = CTX_wm_space_clip(C);
2134 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2135 MovieTracking *tracking = &clip->tracking;
2136 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2137 MovieTrackingPlaneTrack *plane_track = tracking_object->active_plane_track;
2138
2140 if (plane_ibuf == nullptr) {
2141 return OPERATOR_CANCELLED;
2142 }
2143
2144 plane_track->image = BKE_image_add_from_imbuf(CTX_data_main(C), plane_ibuf, plane_track->name);
2145
2146 IMB_freeImBuf(plane_ibuf);
2147
2149
2150 return OPERATOR_FINISHED;
2151}
2152
2154{
2155 /* identifiers */
2156 ot->name = "New Image from Plane Marker";
2157 ot->description = "Create new image from the content of the plane marker";
2158 ot->idname = "CLIP_OT_new_image_from_plane_marker";
2159
2160 /* API callbacks. */
2163
2164 /* flags */
2165 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2166}
2167
2169{
2171 return false;
2172 }
2173
2174 SpaceClip *space_clip = CTX_wm_space_clip(C);
2175 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2176 const MovieTracking *tracking = &clip->tracking;
2177 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2178
2179 if (tracking_object->active_plane_track == nullptr ||
2180 tracking_object->active_plane_track->image == nullptr)
2181 {
2182 return false;
2183 }
2184
2185 const Image *image = tracking_object->active_plane_track->image;
2186 return image->type == IMA_TYPE_IMAGE && ELEM(image->source, IMA_SRC_FILE, IMA_SRC_GENERATED);
2187}
2188
2190{
2191 SpaceClip *space_clip = CTX_wm_space_clip(C);
2192 MovieClip *clip = ED_space_clip_get_clip(space_clip);
2193 MovieTracking *tracking = &clip->tracking;
2194 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
2195 MovieTrackingPlaneTrack *plane_track = tracking_object->active_plane_track;
2196
2198 if (plane_ibuf == nullptr) {
2199 return OPERATOR_CANCELLED;
2200 }
2201
2202 BKE_image_replace_imbuf(plane_track->image, plane_ibuf);
2203
2204 IMB_freeImBuf(plane_ibuf);
2205
2208
2210
2211 return OPERATOR_FINISHED;
2212}
2213
2215{
2216 /* identifiers */
2217 ot->name = "Update Image from Plane Marker";
2218 ot->description =
2219 "Update current image used by plane marker from the content of the plane marker";
2220 ot->idname = "CLIP_OT_update_image_from_plane_marker";
2221
2222 /* API callbacks. */
2225
2226 /* flags */
2227 ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
2228}
2229
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)
@ RPT_ERROR
Definition BKE_report.hh:39
@ RPT_WARNING
Definition BKE_report.hh:38
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:153
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:461
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:502
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:482
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:3439
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:526
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:477
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:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
#define ATTR_FALLTHROUGH
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition listbase.cc:270
#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:1125
@ ID_RECALC_SYNC_TO_EVAL
Definition DNA_ID.h:1118
@ 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
@ TRACKING_RECONSTRUCTED
@ MARKER_TRACKED
@ MARKER_DISABLED
@ PLANE_MARKER_TRACKED
@ PLANE_TRACK_HIDDEN
@ PLANE_TRACK_AUTOKEY
@ TRACKING_OBJECT_CAMERA
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ 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:1024
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Definition IK_Math.h:117
void IMB_freeImBuf(ImBuf *ibuf)
Read Guarded memory(de)allocation.
@ PROP_SKIP_SAVE
Definition RNA_types.hh:344
#define C
Definition RandGen.cpp:29
@ ALERT_ICON_NONE
#define NC_GEOM
Definition WM_types.hh:393
#define NA_EVALUATED
Definition WM_types.hh:585
@ KM_PRESS
Definition WM_types.hh:311
@ KM_RELEASE
Definition WM_types.hh:312
#define ND_DISPLAY
Definition WM_types.hh:491
#define NC_MOVIECLIP
Definition WM_types.hh:397
#define NC_SCENE
Definition WM_types.hh:378
@ OPTYPE_BLOCKING
Definition WM_types.hh:184
@ OPTYPE_UNDO
Definition WM_types.hh:182
@ OPTYPE_GRAB_CURSOR_XY
Definition WM_types.hh:188
@ OPTYPE_REGISTER
Definition WM_types.hh:180
#define NA_EDITED
Definition WM_types.hh:584
#define NC_IMAGE
Definition WM_types.hh:384
#define ND_FRAME
Definition WM_types.hh:434
#define ND_SELECT
Definition WM_types.hh:508
#define ND_TRANSFORM
Definition WM_types.hh:456
#define NC_OBJECT
Definition WM_types.hh:379
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v2
bool add(const Key &key)
Definition BLI_set.hh:248
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)
nullptr float
#define SELECT
CCL_NAMESPACE_BEGIN struct Options options
uint pos
VecBase< float, 3 > cross(VecOp< float, 3 >, VecOp< float, 3 >) RET
int count
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
@ SLIDE_ACTION_NONE
Definition mask_ops.cc:200
static ulong * next
static void error(const char *str)
const int status
#define fabsf
#define sinf
#define cosf
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)
static wmOperatorStatus frame_jump_exec(bContext *C, wmOperator *op)
#define FLT_MAX
Definition stdcycles.h:14
short source
struct MovieTracking tracking
MovieTrackingPlaneTrack * active_plane_track
MovieTrackingReconstruction reconstruction
MovieTrackingTrack * active_track
MovieTrackingMarker * markers
MovieTrackingStabilization stabilization
MovieTrackingSettings settings
eTrackPickAreaDetail area_detail
MovieTrackingTrack * track
struct RenderData r
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
int ymin
int xmin
wmEventType type
Definition WM_types.hh:757
short val
Definition WM_types.hh:759
int xy[2]
Definition WM_types.hh:761
int mval[2]
Definition WM_types.hh:763
struct ReportList * reports
struct PointerRNA * ptr
i
Definition text_draw.cc:230
void CLIP_OT_paste_tracks(wmOperatorType *ot)
static wmOperatorStatus hide_tracks_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 wmOperatorStatus slide_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus add_marker_exec(bContext *C, wmOperator *op)
static bool add_marker(const bContext *C, float x, float y)
static wmOperatorStatus delete_track_exec(bContext *C, wmOperator *)
static bool slide_check_corners(float(*corners)[2])
void CLIP_OT_track_copy_color(wmOperatorType *ot)
static wmOperatorStatus clear_track_path_exec(bContext *C, wmOperator *op)
void CLIP_OT_hide_tracks_clear(wmOperatorType *ot)
void CLIP_OT_keyframe_delete(wmOperatorType *ot)
static wmOperatorStatus add_marker_at_click_modal(bContext *C, wmOperator *, const wmEvent *event)
static wmOperatorStatus delete_track_invoke(bContext *C, wmOperator *op, const wmEvent *)
static SlideMarkerData * slide_marker_customdata(bContext *C, const wmEvent *event)
static wmOperatorStatus clean_tracks_exec(bContext *C, wmOperator *op)
static bool frame_jump_poll(bContext *C)
static bool new_image_from_plane_marker_poll(bContext *C)
static wmOperatorStatus clean_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *)
void CLIP_OT_hide_tracks(wmOperatorType *ot)
@ SOLVER_KEYFRAME_B
@ SOLVER_KEYFRAME_A
static void free_slide_data(SlideMarkerData *data)
static wmOperatorStatus tracking_object_remove_exec(bContext *C, wmOperator *op)
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 wmOperatorStatus copy_tracks_exec(bContext *C, wmOperator *)
static wmOperatorStatus paste_tracks_exec(bContext *C, wmOperator *)
static wmOperatorStatus keyframe_delete_exec(bContext *C, wmOperator *)
@ MARKER_OP_TOGGLE
@ MARKER_OP_DISABLE
@ MARKER_OP_ENABLE
static wmOperatorStatus update_image_from_plane_marker_exec(bContext *C, wmOperator *)
static wmOperatorStatus join_tracks_exec(bContext *C, wmOperator *op)
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)
static wmOperatorStatus delete_marker_invoke(bContext *C, wmOperator *op, const wmEvent *)
static wmOperatorStatus frame_jump_exec(bContext *C, wmOperator *op)
void CLIP_OT_copy_tracks(wmOperatorType *ot)
static void apply_mouse_slide(bContext *C, SlideMarkerData *data)
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 wmOperatorStatus delete_marker_exec(bContext *C, wmOperator *)
void CLIP_OT_add_marker_at_click(wmOperatorType *ot)
void CLIP_OT_clean_tracks(wmOperatorType *ot)
void CLIP_OT_join_tracks(wmOperatorType *ot)
static wmOperatorStatus add_marker_at_click_invoke(bContext *C, wmOperator *op, const wmEvent *)
static wmOperatorStatus add_marker_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus average_tracks_invoke(bContext *C, wmOperator *op, const wmEvent *)
@ TRACK_ACTION_TOGGLE
@ TRACK_ACTION_UNLOCK
@ TRACK_ACTION_LOCK
static wmOperatorStatus keyframe_insert_exec(bContext *C, wmOperator *)
void CLIP_OT_delete_track(wmOperatorType *ot)
void CLIP_OT_add_marker(wmOperatorType *ot)
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 wmOperatorStatus track_copy_color_exec(bContext *C, wmOperator *)
static wmOperatorStatus average_tracks_exec(bContext *C, wmOperator *op)
static bool paste_tracks_poll(bContext *C)
static wmOperatorStatus slide_marker_modal(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus new_image_from_plane_marker_exec(bContext *C, wmOperator *)
void CLIP_OT_update_image_from_plane_marker(wmOperatorType *ot)
static wmOperatorStatus lock_tracks_exec(bContext *C, wmOperator *op)
static wmOperatorStatus tracking_object_new_exec(bContext *C, wmOperator *)
void CLIP_OT_tracking_object_remove(wmOperatorType *ot)
void CLIP_OT_disable_markers(wmOperatorType *ot)
static wmOperatorStatus set_solver_keyframe_exec(bContext *C, wmOperator *op)
eSlideAction
@ 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 wmOperatorStatus disable_markers_exec(bContext *C, wmOperator *op)
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])
void CLIP_OT_frame_jump(wmOperatorType *ot)
static wmOperatorStatus hide_tracks_clear_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)
uint len
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:4237
void WM_operator_properties_confirm_or_exec(wmOperatorType *ot)
wmOperatorStatus WM_operator_confirm_ex(bContext *C, wmOperator *op, const char *title, const char *message, const char *confirm_text, int icon, bool cancel_default)
uint8_t flag
Definition wm_window.cc:145