184
185
return sqrtf(min_ffff(d1, d2, d3, d4));
187
static MovieTrackingTrack *find_nearest_track(SpaceClip *sc, ListBase *tracksbase, float co[2])
188
/* Same as above, but all the coordinates are absolute */
189
static float dist_to_crns_abs(float co[2], float corners[4][2])
191
float d1, d2, d3, d4;
192
float *v1 = corners[0], *v2 = corners[1];
193
float *v3 = corners[2], *v4 = corners[3];
195
d1 = dist_squared_to_line_segment_v2(co, v1, v2);
196
d2 = dist_squared_to_line_segment_v2(co, v2, v3);
197
d3 = dist_squared_to_line_segment_v2(co, v3, v4);
198
d4 = dist_squared_to_line_segment_v2(co, v4, v1);
200
return sqrtf(min_ffff(d1, d2, d3, d4));
203
static MovieTrackingTrack *find_nearest_track(SpaceClip *sc, ListBase *tracksbase, float co[2], float *distance_r)
189
205
MovieTrackingTrack *track = NULL, *cur;
190
206
float mindist = 0.0f;
240
*distance_r = mindist;
245
static MovieTrackingPlaneTrack *find_nearest_plane_track(SpaceClip *sc, ListBase *plane_tracks_base,
246
float co[2], float *distance_r)
248
MovieTrackingPlaneTrack *plane_track = NULL, *current_plane_track;
249
float min_distance = 0.0f;
250
int framenr = ED_space_clip_get_clip_frame_number(sc);
252
for (current_plane_track = plane_tracks_base->first;
254
current_plane_track = current_plane_track->next)
256
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(current_plane_track, framenr);
258
if ((current_plane_track->flag & TRACK_HIDDEN) == 0) {
259
float distance = dist_to_crns_abs(co, plane_marker->corners);
260
if (plane_track == NULL || distance < min_distance) {
261
plane_track = current_plane_track;
262
min_distance = distance;
267
*distance_r = min_distance;
272
static void delect_all_tracks(ListBase *tracks_base)
274
MovieTrackingTrack *track;
275
for (track = tracks_base->first;
279
BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT);
283
static void delect_all_plane_tracks(ListBase *plane_tracks_base)
285
MovieTrackingPlaneTrack *plane_track;
286
for (plane_track = plane_tracks_base->first;
288
plane_track = plane_track->next)
290
plane_track->flag &= ~SELECT;
227
294
static int mouse_select(bContext *C, float co[2], int extend)
229
296
SpaceClip *sc = CTX_wm_space_clip(C);
230
297
MovieClip *clip = ED_space_clip_get_clip(sc);
231
298
MovieTracking *tracking = &clip->tracking;
232
299
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
300
ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
233
301
MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking);
234
MovieTrackingTrack *track = NULL; /* selected marker */
236
track = find_nearest_track(sc, tracksbase, co);
302
MovieTrackingTrack *track;
303
MovieTrackingPlaneTrack *plane_track;
304
float distance_to_track, distance_to_plane_track;
306
track = find_nearest_track(sc, tracksbase, co, &distance_to_track);
307
plane_track = find_nearest_plane_track(sc, plane_tracks_base, co, &distance_to_plane_track);
309
/* Between track and plane we choose closest to the mouse for selection here. */
310
if (track && plane_track) {
311
if (distance_to_track < distance_to_plane_track) {
320
delect_all_plane_tracks(plane_tracks_base);
239
324
int area = track_mouse_area(C, co, track);
254
342
BKE_tracking_track_select(tracksbase, track, area, extend);
255
343
clip->tracking.act_track = track;
344
clip->tracking.act_plane_track = NULL;
347
else if (plane_track) {
349
delect_all_tracks(tracksbase);
352
if (plane_track->flag & SELECT) {
354
plane_track->flag &= ~SELECT;
358
plane_track->flag |= SELECT;
361
clip->tracking.act_track = NULL;
362
clip->tracking.act_plane_track = plane_track;
350
456
MovieClip *clip = ED_space_clip_get_clip(sc);
351
457
MovieTracking *tracking = &clip->tracking;
352
458
MovieTrackingTrack *track;
459
MovieTrackingPlaneTrack *plane_track;
353
460
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
461
ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
356
int change = FALSE, mode, extend;
357
466
int framenr = ED_space_clip_get_clip_frame_number(sc);
359
468
/* get rectangle from operator */
382
491
BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT);
389
498
track = track->next;
501
for (plane_track = plane_tracks_base->first;
503
plane_track = plane_track->next)
505
if ((plane_track->flag & PLANE_TRACK_HIDDEN) == 0) {
506
MovieTrackingPlaneMarker *plane_marker =
507
BKE_tracking_plane_marker_get(plane_track, framenr);
510
for (i = 0; i < 4; i++) {
511
if (BLI_rctf_isect_pt_v(&rectf, plane_marker->corners[i])) {
512
if (mode == GESTURE_MODAL_SELECT) {
513
plane_track->flag |= SELECT;
516
plane_track->flag &= ~SELECT;
520
plane_track->flag &= ~SELECT;
393
529
BKE_tracking_dopesheet_tag_update(tracking);
430
566
MovieClip *clip = ED_space_clip_get_clip(sc);
431
567
MovieTracking *tracking = &clip->tracking;
432
568
MovieTrackingTrack *track;
569
MovieTrackingPlaneTrack *plane_track;
433
570
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
571
ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
436
574
int framenr = ED_space_clip_get_clip_frame_number(sc);
438
576
/* get rectangle from operator */
459
597
BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT);
466
604
track = track->next;
607
for (plane_track = plane_tracks_base->first;
609
plane_track = plane_track->next)
611
if ((plane_track->flag & PLANE_TRACK_HIDDEN) == 0) {
612
MovieTrackingPlaneMarker *plane_marker =
613
BKE_tracking_plane_marker_get(plane_track, framenr);
616
for (i = 0; i < 4; i++) {
619
/* marker in screen coords */
620
ED_clip_point_stable_pos__reverse(sc, ar, plane_marker->corners[i], screen_co);
622
if (BLI_rcti_isect_pt(&rect, screen_co[0], screen_co[1]) &&
623
BLI_lasso_is_point_inside(mcords, moves, screen_co[0], screen_co[1], V2D_IS_CLIPPED))
626
plane_track->flag |= SELECT;
629
plane_track->flag &= ~SELECT;
470
639
BKE_tracking_dopesheet_tag_update(tracking);
519
688
/********************** circle select operator *********************/
521
static int marker_inside_ellipse(MovieTrackingMarker *marker, float offset[2], float ellipse[2])
690
static int point_inside_ellipse(float point[2], float offset[2], float ellipse[2])
523
692
/* normalized ellipse: ell[0] = scaleX, ell[1] = scaleY */
526
x = (marker->pos[0] - offset[0]) * ellipse[0];
527
y = (marker->pos[1] - offset[1]) * ellipse[1];
695
x = (point[0] - offset[0]) * ellipse[0];
696
y = (point[1] - offset[1]) * ellipse[1];
529
698
return x * x + y * y < 1.0f;
701
static int marker_inside_ellipse(MovieTrackingMarker *marker, float offset[2], float ellipse[2])
703
return point_inside_ellipse(marker->pos, offset, ellipse);
532
706
static int circle_select_exec(bContext *C, wmOperator *op)
534
708
SpaceClip *sc = CTX_wm_space_clip(C);
537
711
MovieClip *clip = ED_space_clip_get_clip(sc);
538
712
MovieTracking *tracking = &clip->tracking;
539
713
MovieTrackingTrack *track;
714
MovieTrackingPlaneTrack *plane_track;
540
715
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
541
int x, y, radius, width, height, mode, change = FALSE;
716
ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
717
int x, y, radius, width, height, mode;
542
719
float zoomx, zoomy, offset[2], ellipse[2];
543
720
int framenr = ED_space_clip_get_clip_frame_number(sc);
571
748
BKE_tracking_track_flag_clear(track, TRACK_AREA_ALL, SELECT);
577
754
track = track->next;
757
for (plane_track = plane_tracks_base->first;
759
plane_track = plane_track->next)
761
if ((plane_track->flag & PLANE_TRACK_HIDDEN) == 0) {
762
MovieTrackingPlaneMarker *plane_marker =
763
BKE_tracking_plane_marker_get(plane_track, framenr);
766
for (i = 0; i < 4; i++) {
767
if (point_inside_ellipse(plane_marker->corners[i], offset, ellipse)) {
768
if (mode == GESTURE_MODAL_SELECT) {
769
plane_track->flag |= SELECT;
772
plane_track->flag &= ~SELECT;
581
782
BKE_tracking_dopesheet_tag_update(tracking);
619
820
MovieClip *clip = ED_space_clip_get_clip(sc);
620
821
MovieTracking *tracking = &clip->tracking;
621
822
MovieTrackingTrack *track = NULL; /* selected track */
823
MovieTrackingPlaneTrack *plane_track = NULL; /* selected plane track */
622
824
MovieTrackingMarker *marker;
623
825
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
826
ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
624
827
int action = RNA_enum_get(op->ptr, "action");
625
828
int framenr = ED_space_clip_get_clip_frame_number(sc);
626
int has_selection = FALSE;
829
bool has_selection = false;
628
831
if (action == SEL_TOGGLE) {
629
832
action = SEL_SELECT;
630
track = tracksbase->first;
834
for (track = tracksbase->first; track; track = track->next) {
632
835
if (TRACK_VIEW_SELECTED(sc, track)) {
633
836
marker = BKE_tracking_marker_get(track, framenr);
845
for (plane_track = plane_tracks_base->first;
847
plane_track = plane_track->next)
849
if (plane_track->flag & SELECT) {
850
action = SEL_DESELECT;
645
track = tracksbase->first;
856
for (track = tracksbase->first; track; track = track->next) {
647
857
if ((track->flag & TRACK_HIDDEN) == 0) {
648
858
marker = BKE_tracking_marker_get(track, framenr);
671
881
if (TRACK_VIEW_SELECTED(sc, track))
672
has_selection = TRUE;
882
has_selection = true;
885
for (plane_track = plane_tracks_base->first;
887
plane_track = plane_track->next)
889
if ((plane_track->flag & PLANE_TRACK_HIDDEN) == 0) {
892
plane_track->flag |= SELECT;
895
plane_track->flag &= ~SELECT;
898
plane_track->flag ^= SELECT;
903
if (plane_track->flag & SELECT) {
904
has_selection = true;
677
908
if (!has_selection)