[Bf-blender-cvs] [73e499fd5f9] tracking_tools: Tracking: Re-write selection and tweak tool logic

Sergey Sharybin noreply at git.blender.org
Tue May 17 12:28:19 CEST 2022


Commit: 73e499fd5f9beccfabf216909273615b627b97d4
Author: Sergey Sharybin
Date:   Tue May 17 11:56:57 2022 +0200
Branches: tracking_tools
https://developer.blender.org/rB73e499fd5f9beccfabf216909273615b627b97d4

Tracking: Re-write selection and tweak tool logic

The goal is to have the Add Marker and Tweak tool work the way how
VFX artists expects it to.

Share as much of code as possible, avoiding duplicated closest track
lookup, and sharing the same distance tolerance for selection and
marker slide operators.

===================================================================

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	source/blender/editors/space_clip/tracking_ops.c
M	source/blender/editors/space_clip/tracking_ops_intern.h
M	source/blender/editors/space_clip/tracking_ops_plane.c
M	source/blender/editors/space_clip/tracking_select.c

===================================================================

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index d08786e6ba8..d489f9bf5fd 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -3188,10 +3188,6 @@ def km_clip_editor(params):
         ("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True, "repeat": True},
          {"properties": [("position", 'PATHSTART')]}),
         ("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
-        ("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
-         {"properties": [("deselect_all", not params.legacy)]}),
-        ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
-         {"properties": [("extend", True)]}),
         *_template_items_select_actions(params, "clip.select_all"),
         ("clip.select_box", {"type": 'B', "value": 'PRESS'}, None),
         ("clip.select_circle", {"type": 'C', "value": 'PRESS'}, None),
@@ -6615,14 +6611,22 @@ def km_image_editor_tool_uv_scale(params):
 # ------------------------------------------------------------------------------
 # Tool System (Clip Editor)
 
-def _template_items_clip_tool_tweak_selection(params):
-    items = [
-        ("clip.select", {"type": params.select_mouse, "value": 'PRESS'},
+def _template_items_clip_tool_mouse_selection(params, use_release = False):
+    return (
+        ("clip.select", {"type": params.select_mouse, "value": 'RELEASE' if use_release else 'PRESS'},
             {"properties": [
                 ("extend", False),
                 ("deselect_all", True),
                 ("activate_selected", params.select_mouse == 'LEFTMOUSE')]}
          ),
+        ("clip.select", {"type": params.select_mouse, "value": 'PRESS', "shift": True},
+            {"properties": [("extend", True)]}),
+    )
+
+
+def _template_items_clip_tool_tweak_selection(params):
+    items = [
+        *_template_items_clip_tool_mouse_selection(params),
     ]
 
     if params.select_mouse == 'RIGHTMOUSE':
@@ -6659,9 +6663,12 @@ def km_clip_editor_tool_select_box(params):
     return (
         "Clip Editor: Select Box",
         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
-        {"items": _template_items_tool_select_actions_simple(
-            "clip.select_box", type=params.tool_mouse, value='CLICK_DRAG',
-        )},
+        {"items": (
+            *_template_items_clip_tool_mouse_selection(params, params.select_mouse == 'LEFTMOUSE'),
+            *_template_items_tool_select_actions_simple(
+                "clip.select_box", type=params.tool_mouse, value='CLICK_DRAG'),
+        )
+        },
     )
 
 
@@ -6669,9 +6676,12 @@ def km_clip_editor_tool_select_lasso(params):
     return (
         "Clip Editor: Select Lasso",
         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
-        {"items": _template_items_tool_select_actions_simple(
-            "clip.select_lasso", type=params.tool_mouse, value='PRESS',
-        )},
+        {"items": (
+            *_template_items_clip_tool_mouse_selection(params, params.select_mouse == 'LEFTMOUSE'),
+            *_template_items_tool_select_actions_simple(
+                "clip.select_lasso", type=params.tool_mouse, value='PRESS'),
+        )
+        },
     )
 
 
@@ -6679,9 +6689,12 @@ def km_clip_editor_tool_select_circle(params):
     return (
         "Clip Editor: Select Circle",
         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
-        {"items": _template_items_tool_select_actions_simple(
-            "clip.select_circle", type=params.tool_mouse, value='PRESS',
-            properties=[("wait_for_input", False)],
+        {"items": (
+            *_template_items_clip_tool_mouse_selection(params, params.select_mouse == 'LEFTMOUSE'),
+            *_template_items_tool_select_actions_simple(
+                "clip.select_circle", type=params.tool_mouse, value='PRESS',
+                properties=[("wait_for_input", False)],
+            )
         )},
     )
 
@@ -6690,10 +6703,10 @@ def km_clip_editor_tool_add_marker_tweak(params):
     return (
         "Clip Editor: Add Marker and Tweak",
         {"space_type": 'CLIP_EDITOR', "region_type": 'WINDOW'},
-        {"items": [
+        {"items": (
             *_template_items_clip_tool_tweak(params),
             ("clip.add_marker_slide", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
-        ]},
+        )},
     )
 
 
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index ca224b04da5..37177f5b227 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -368,14 +368,6 @@ static void slide_marker_tilt_slider_relative(const float pattern_corners[4][2],
   add_v2_v2v2(r_slider, pattern_corners[1], pattern_corners[2]);
 }
 
-static void slide_marker_tilt_slider(const float marker_pos[2],
-                                     const float pattern_corners[4][2],
-                                     float r_slider[2])
-{
-  slide_marker_tilt_slider_relative(pattern_corners, r_slider);
-  add_v2_v2(r_slider, marker_pos);
-}
-
 static SlideMarkerData *create_slide_marker_data(SpaceClip *sc,
                                                  MovieTrackingTrack *track,
                                                  MovieTrackingMarker *marker,
@@ -432,68 +424,6 @@ static SlideMarkerData *create_slide_marker_data(SpaceClip *sc,
   return data;
 }
 
-static float mouse_to_slide_zone_distance_squared(const float co[2],
-                                                  const float slide_zone[2],
-                                                  int width,
-                                                  int height)
-{
-  const float pixel_co[2] = {co[0] * width, co[1] * height},
-              pixel_slide_zone[2] = {slide_zone[0] * width, slide_zone[1] * height};
-  return square_f(pixel_co[0] - pixel_slide_zone[0]) + square_f(pixel_co[1] - pixel_slide_zone[1]);
-}
-
-static float mouse_to_search_corner_distance_squared(
-    const MovieTrackingMarker *marker, const float co[2], int corner, int width, int height)
-{
-  float side_zone[2];
-  if (corner == 0) {
-    side_zone[0] = marker->pos[0] + marker->search_max[0];
-    side_zone[1] = marker->pos[1] + marker->search_min[1];
-  }
-  else {
-    side_zone[0] = marker->pos[0] + marker->search_min[0];
-    side_zone[1] = marker->pos[1] + marker->search_max[1];
-  }
-  return mouse_to_slide_zone_distance_squared(co, side_zone, width, height);
-}
-
-static float mouse_to_closest_pattern_corner_distance_squared(
-    const MovieTrackingMarker *marker, const float co[2], int width, int height, int *r_corner)
-{
-  float min_distance_squared = FLT_MAX;
-  for (int i = 0; i < 4; i++) {
-    float corner_co[2];
-    add_v2_v2v2(corner_co, marker->pattern_corners[i], marker->pos);
-    float distance_squared = mouse_to_slide_zone_distance_squared(co, corner_co, width, height);
-    if (distance_squared < min_distance_squared) {
-      min_distance_squared = distance_squared;
-      *r_corner = i;
-    }
-  }
-  return min_distance_squared;
-}
-
-static float mouse_to_offset_distance_squared(const MovieTrackingTrack *track,
-                                              const MovieTrackingMarker *marker,
-                                              const float co[2],
-                                              int width,
-                                              int height)
-{
-  float pos[2];
-  add_v2_v2v2(pos, marker->pos, track->offset);
-  return mouse_to_slide_zone_distance_squared(co, pos, width, height);
-}
-
-static int mouse_to_tilt_distance_squared(const MovieTrackingMarker *marker,
-                                          const float co[2],
-                                          int width,
-                                          int height)
-{
-  float slider[2];
-  slide_marker_tilt_slider(marker->pos, marker->pattern_corners, slider);
-  return mouse_to_slide_zone_distance_squared(co, slider, width, height);
-}
-
 static bool slide_check_corners(float (*corners)[2])
 {
   float cross = 0.0f;
@@ -530,109 +460,72 @@ static bool slide_check_corners(float (*corners)[2])
 static MovieTrackingTrack *tracking_marker_check_slide(
     bContext *C, const float co[2], int *r_area, eSlideAction *r_action, int *r_corner)
 {
-  const float distance_clip_squared = 12.0f * 12.0f;
-  SpaceClip *sc = CTX_wm_space_clip(C);
-  MovieClip *clip = ED_space_clip_get_clip(sc);
-  ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
-  const int framenr = ED_space_clip_get_clip_frame_number(sc);
-  float global_min_distance_squared = FLT_MAX;
+  SpaceClip *space_clip = CTX_wm_space_clip(C);
 
-  /* Sliding zone designator which is the closest to the mouse across all the tracks. */
-  eSlideAction min_action;
-  int min_area = 0, min_corner = -1;
-  MovieTrackingTrack *min_track = NULL;
+  TrackPickOptions options = ed_tracking_pick_options_defaults();
+  options.selected_only = true;
+  options.unlocked_only = true;
+  options.enabled_only = true;
+  const PointTrackPick track_pick = ed_tracking_pick_point_track(&options, C, co);
 
-  int width, height;
-  ED_space_clip_get_size(sc, &width, &height);
-  if (width == 0 || height == 0) {
+  if (ed_tracking_point_track_pick_empty(&track_pick) ||
+      !ed_tracking_point_track_pick_can_slide(space_clip, &track_pick)) {
     return NULL;
   }
 
-  LISTBASE_FOREACH (MovieTrackingTrack *, track, tracksbase) {
-    if (!TRACK_VIEW_SELECTED(sc, track) || (track->flag & TRACK_LOCKED)) {
-      continue;
-    }
+  const eTrackArea area = track_pick.area;
+  eSlideAction action = SLIDE_ACTION_NONE;
+  int corner = -1;
 
-    const MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
-    if (marker->flag & MARKER_DISABLED) {
-      continue;
-    }
+  switch (area) {
+    case TRACK_AREA_NONE:
+    case TRACK_AREA_ALL:
+      BLI_assert_msg(0, "Expected single track area");
+      return NULL;
 
-    /* We start checking with whether th

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list