[Bf-blender-cvs] [6c079d528d1] tracking_proportional_editing: Tracking: Implement proportional editing

Sergey Sharybin noreply at git.blender.org
Tue Jan 5 09:50:02 CET 2021


Commit: 6c079d528d1fa03abbe31a1fd5e225e24682d0cd
Author: Sergey Sharybin
Date:   Thu Dec 31 15:13:50 2020 +0100
Branches: tracking_proportional_editing
https://developer.blender.org/rB6c079d528d1fa03abbe31a1fd5e225e24682d0cd

Tracking: Implement proportional editing

Disclaimer: the user interface and interaction is not final. There
are known sharp corners, which are planned to be addressed while
the patch is being tested by people.

The idea is to avoid sudden jumps of track path when artists detects
track got slid away from the feature and one re-positions track back.
The implementation is based on a proportional editing, which allows
to control whether to transform single marker or whether to propagate
transform to markers from neighbour frames. The proportional editing
also allows to control propagation curve. The propagation will stop
at the end of tracked segment.

To test the new functionality:

1. Enable proportional editing
2. Enable "Connected Only". This is essential, as otherwise the new
   functionality is not enabled.
3. Grab marker.

Open topics:
- Make the functionality more discoverable.
- Make visualization of how far propagation goes more clear.
- Make defaults more usable.

Technical TODO:
- Most likely CANCEL of the transform does not properly restore the
  full state prior to the transform. This needs to be solved.

Differential Revision: https://developer.blender.org/D2771

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

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	release/scripts/startup/bl_ui/space_clip.py
M	source/blender/editors/transform/transform_constraints.c
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert_tracking.c

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

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index d3990851e2c..2ea6eb5786a 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -2830,6 +2830,7 @@ def km_clip_editor(params):
         ("clip.copy_tracks", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
         ("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
         *_template_items_context_menu("CLIP_MT_tracking_context_menu", params.context_menu_event),
+        *_template_items_proportional_editing(connected=False),
     ])
 
     if params.legacy:
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 35fd7333cf4..a0a67ba084d 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -125,6 +125,24 @@ class CLIP_PT_clip_display(Panel):
             col.prop(clip, "display_aspect", text="Display Aspect Ratio")
 
 
+class CLIP_PT_proportional_edit(Panel):
+    bl_space_type = 'CLIP_EDITOR'
+    bl_region_type = 'HEADER'
+    bl_label = "Proportional Editing"
+    bl_ui_units_x = 8
+
+    def draw(self, context):
+        layout = self.layout
+        tool_settings = context.tool_settings
+        col = layout.column()
+        col.active = tool_settings.use_proportional_edit
+
+        col.prop(tool_settings, "use_proportional_connected")
+        col.separator()
+
+        col.prop(tool_settings, "proportional_edit_falloff", expand=True)
+
+
 class CLIP_HT_header(Header):
     bl_space_type = 'CLIP_EDITOR'
 
@@ -181,6 +199,7 @@ class CLIP_HT_header(Header):
 
             if sc.view == 'CLIP':
                 r = active_object.reconstruction
+                tool_settings = context.tool_settings
 
                 if r.is_valid and sc.view == 'CLIP':
                     layout.label(text="Solve error: %.2f px" %
@@ -193,6 +212,24 @@ class CLIP_HT_header(Header):
                 row.prop(sc, "lock_selection", icon=icon, text="")
                 row.popover(panel='CLIP_PT_display')
 
+                # Proportional Editing
+                row = layout.row(align=True)
+                row.prop(
+                    tool_settings,
+                    "use_proportional_edit",
+                    icon_only=True,
+                    icon='PROP_CON' if tool_settings.use_proportional_connected else 'PROP_ON',
+                )
+                sub = row.row(align=True)
+                sub.active = tool_settings.use_proportional_edit
+                sub.prop_with_popover(
+                    tool_settings,
+                    "proportional_edit_falloff",
+                    text="",
+                    icon_only=True,
+                    panel="CLIP_PT_proportional_edit",
+                )
+
             elif sc.view == 'GRAPH':
                 row = layout.row(align=True)
                 row.prop(sc, "show_graph_only_selected", text="")
@@ -1781,6 +1818,7 @@ classes = (
     CLIP_PT_tools_scenesetup,
     CLIP_PT_annotation,
     CLIP_PT_tools_grease_pencil_draw,
+    CLIP_PT_proportional_edit,
     CLIP_MT_view_zoom,
     CLIP_MT_view,
     CLIP_MT_clip,
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 54533bf43e5..91235e1011e 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -833,6 +833,9 @@ void drawPropCircle(const struct bContext *C, TransInfo *t)
     else if (t->spacetype == SPACE_IMAGE) {
       GPU_matrix_scale_2f(1.0f / t->aspect[0], 1.0f / t->aspect[1]);
     }
+    else if (t->spacetype == SPACE_CLIP) {
+      GPU_matrix_scale_2f(1.0f / t->aspect[0], 1.0f / t->aspect[1]);
+    }
     else if (ELEM(t->spacetype, SPACE_GRAPH, SPACE_ACTION)) {
       /* only scale y */
       rcti *mask = &t->region->v2d.mask;
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index fb365da6b43..e606e737a80 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -1258,7 +1258,6 @@ void createTransData(bContext *C, TransInfo *t)
       break;
     case TC_TRACKING_DATA:
       createTransTrackingData(C, t);
-      init_prop_edit = false;
       break;
     case TC_NONE:
     default:
@@ -1295,6 +1294,9 @@ void createTransData(bContext *C, TransInfo *t)
     else if (convert_type == TC_CURVE_VERTS && t->obedit_type == OB_CURVE) {
       set_prop_dist(t, false);
     }
+    else if (convert_type == TC_TRACKING_DATA) {
+      set_prop_dist(t, false);
+    }
     else {
       set_prop_dist(t, true);
     }
diff --git a/source/blender/editors/transform/transform_convert_tracking.c b/source/blender/editors/transform/transform_convert_tracking.c
index be4ffa5dfce..1abdb8d5cc1 100644
--- a/source/blender/editors/transform/transform_convert_tracking.c
+++ b/source/blender/editors/transform/transform_convert_tracking.c
@@ -52,6 +52,7 @@ typedef struct TransDataTracking {
 
   float (*smarkers)[2];
   int markersnr;
+  int framenr;
   MovieTrackingMarker *markers;
 
   /* marker transformation from curves editor */
@@ -75,9 +76,11 @@ enum transDataTracking_Mode {
 
 typedef struct TransformInitContext {
   SpaceClip *space_clip;
+
+  TransInfo *t;
   TransDataContainer *tc;
 
-  /* MOTE: There popinters will be nullptr during counting step.
+  /* NOTE: There pointers will be nullptr during counting step.
    * This means, that the transformation data initialization functions are to increment
    * `tc->data_len` instead of filling in the transformation data when these pointers are nullptr.
    * For simplicitly, check the `current.td` against nullptr.
@@ -93,6 +96,7 @@ typedef struct TransformInitContext {
 static void markerToTransDataInit(TransformInitContext *init_context,
                                   MovieTrackingTrack *track,
                                   MovieTrackingMarker *marker,
+                                  const int framenr,
                                   int area,
                                   float loc[2],
                                   const float rel[2],
@@ -111,6 +115,7 @@ static void markerToTransDataInit(TransformInitContext *init_context,
   int anchor = area == TRACK_AREA_POINT && off;
 
   tdt->flag = marker->flag;
+  tdt->framenr = marker->framenr;
   tdt->mode = transDataTracking_ModeTracks;
 
   if (anchor) {
@@ -163,8 +168,11 @@ static void markerToTransDataInit(TransformInitContext *init_context,
   td->ext = NULL;
   td->val = NULL;
 
-  td->flag |= TD_SELECTED;
-  td->dist = 0.0;
+  if (marker->framenr == framenr) {
+    td->flag |= TD_SELECTED;
+    marker->flag &= ~(MARKER_DISABLED | MARKER_TRACKED);
+  }
+  td->dist = abs(framenr - marker->framenr);
 
   unit_m3(td->mtx);
   unit_m3(td->smtx);
@@ -174,16 +182,16 @@ static void markerToTransDataInit(TransformInitContext *init_context,
   init_context->current.tdt++;
 }
 
-static void trackToTransData(TransformInitContext *init_context,
-                             const int framenr,
-                             MovieTrackingTrack *track,
-                             const float aspect[2])
+static void markerAreasToTransData(TransformInitContext *init_context,
+                                   MovieTrackingTrack *track,
+                                   MovieTrackingMarker *marker,
+                                   const int framenr,
+                                   const float aspect[2])
 {
-  MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr);
-
   markerToTransDataInit(init_context,
                         track,
                         marker,
+                        framenr,
                         TRACK_AREA_POINT,
                         track->offset,
                         marker->pos,
@@ -192,7 +200,7 @@ static void trackToTransData(TransformInitContext *init_context,
 
   if (track->flag & SELECT) {
     markerToTransDataInit(
-        init_context, track, marker, TRACK_AREA_POINT, marker->pos, NULL, NULL, aspect);
+        init_context, track, marker, framenr, TRACK_AREA_POINT, marker->pos, NULL, NULL, aspect);
   }
 
   if (track->pat_flag & SELECT) {
@@ -202,6 +210,7 @@ static void trackToTransData(TransformInitContext *init_context,
       markerToTransDataInit(init_context,
                             track,
                             marker,
+                            framenr,
                             TRACK_AREA_PAT,
                             marker->pattern_corners[a],
                             marker->pos,
@@ -214,6 +223,7 @@ static void trackToTransData(TransformInitContext *init_context,
     markerToTransDataInit(init_context,
                           track,
                           marker,
+                          framenr,
                           TRACK_AREA_SEARCH,
                           marker->search_min,
                           marker->pos,
@@ -223,14 +233,57 @@ static void trackToTransData(TransformInitContext *init_context,
     markerToTransDataInit(init_context,
                           track,
                           marker,
+                          framenr,
                           TRACK_AREA_SEARCH,
                           marker->search_max,
                           marker->pos,
                           NULL,
                           aspect);
   }
+}
+
+static void trackToTransData(TransformInitContext *init_context,
+                             const int framenr,
+                             MovieTrackingTrack *track,
+                             const float aspect[2])
+{
+  TransInfo *t = init_context->t;
+
+  MovieTrackingMarker *marker_at_frame = BKE_tracking_marker_ensure(track, framenr);
+  markerAreasToTransData(init_context, track, marker_at_frame, framenr, aspect);
+
+  if ((t->flag & (T_PROP_EDIT | T_PROP_CONNECTED)) != (T_PROP_EDIT | T_PROP_CONNECTED)) {
+    return;
+  }
+  const int marker_at_frame_index = marker_a

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list