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 /source/blender/editors/space_clip
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.
Diffstat (limited to 'source/blender/editors/space_clip')
-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;