Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-01-15 13:37:46 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-01-15 13:37:46 +0300
commit2414832bf1ef45f487777ae09d721bd1e7e8c840 (patch)
treeb59cf7277affbd6a3f80338a36da7e46e7293c60
parent585574dc301904d0a3672b1956d50c8455a0e3e6 (diff)
Tracking: Make plane track sliding aware of closest mouse
Also made threshold aware of zoom, so now it's always 12px threshold regardless of how much you're zoomed in.
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c2
-rw-r--r--source/blender/editors/space_clip/tracking_ops_plane.c63
2 files changed, 32 insertions, 33 deletions
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index af1a5404ee3..79f90a48c33 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -723,7 +723,7 @@ MovieTrackingTrack *tracking_marker_check_slide(bContext *C,
track = track->next;
}
- if (global_min_distance_squared < distance_clip_squared) {
+ if (global_min_distance_squared < distance_clip_squared / sc->zoom) {
if (area_r) {
*area_r = min_area;
}
diff --git a/source/blender/editors/space_clip/tracking_ops_plane.c b/source/blender/editors/space_clip/tracking_ops_plane.c
index c5dc1c14dea..4332f3ea765 100644
--- a/source/blender/editors/space_clip/tracking_ops_plane.c
+++ b/source/blender/editors/space_clip/tracking_ops_plane.c
@@ -119,21 +119,16 @@ typedef struct SlidePlaneMarkerData {
bool accurate;
} SlidePlaneMarkerData;
-/* TODO(sergey): Use closest sliding zone semantic here. */
-static bool mouse_on_plane_slide_zone(SpaceClip *sc,
- float co[2],
- float slide_zone[2],
- int width,
- int height)
+static float mouse_to_plane_slide_zone_distance_squared(
+ const float co[2],
+ const float slide_zone[2],
+ int width,
+ int height)
{
- const float size = 12.0f;
- float dx, dy;
-
- dx = size / width / sc->zoom;
- dy = size / height / sc->zoom;
-
- return IN_RANGE_INCL(co[0], slide_zone[0] - dx, slide_zone[0] + dx) &&
- IN_RANGE_INCL(co[1], slide_zone[1] - dy, slide_zone[1] + dy);
+ float pixel_co[2] = {co[0] * width, co[1] * height},
+ pixel_slide_zone[2] = {slide_zone[0] * width, slide_zone[1] * height};
+ return SQUARE(pixel_co[0] - pixel_slide_zone[0]) +
+ SQUARE(pixel_co[1] - pixel_slide_zone[1]);
}
static MovieTrackingPlaneTrack *tracking_plane_marker_check_slide(
@@ -141,6 +136,7 @@ static MovieTrackingPlaneTrack *tracking_plane_marker_check_slide(
const wmEvent *event,
int *corner_r)
{
+ const float distance_clip_squared = 12.0f * 12.0f;
SpaceClip *sc = CTX_wm_space_clip(C);
ARegion *ar = CTX_wm_region(C);
MovieClip *clip = ED_space_clip_get_clip(sc);
@@ -157,6 +153,9 @@ static MovieTrackingPlaneTrack *tracking_plane_marker_check_slide(
ED_clip_mouse_pos(sc, ar, event->mval, co);
+ float min_distance_squared = FLT_MAX;
+ int min_corner = -1;
+ MovieTrackingPlaneTrack *min_plane_track = NULL;
for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first;
plane_track != NULL;
plane_track = plane_track->next)
@@ -164,28 +163,28 @@ static MovieTrackingPlaneTrack *tracking_plane_marker_check_slide(
if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
MovieTrackingPlaneMarker *plane_marker =
BKE_tracking_plane_marker_get(plane_track, framenr);
- bool ok = false;
- int i;
-
- for (i = 0; i < 4; i++) {
- if (mouse_on_plane_slide_zone(sc,
- co,
- plane_marker->corners[i],
- width,
- height))
- {
- if (corner_r) {
- *corner_r = i;
- }
- ok = true;
- break;
+ for (int i = 0; i < 4; i++) {
+ float distance_squared =
+ mouse_to_plane_slide_zone_distance_squared(
+ co,
+ plane_marker->corners[i],
+ width,
+ height);
+
+ if (distance_squared < min_distance_squared) {
+ min_distance_squared = distance_squared;
+ min_corner = i;
+ min_plane_track = plane_track;
}
}
+ }
+ }
- if (ok) {
- return plane_track;
- }
+ if (min_distance_squared < distance_clip_squared / sc->zoom) {
+ if (corner_r != NULL) {
+ *corner_r = min_corner;
}
+ return min_plane_track;
}
return NULL;