diff options
10 files changed, 211 insertions, 50 deletions
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index 287322e9a29..86c9efb5851 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -2897,6 +2897,8 @@ 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( + params, connected=False, toggle_data_path='tool_settings.use_proportional_edit'), ]) if not params.legacy: diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index 96920af1c7e..3e40eab519d 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -125,6 +125,21 @@ 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, "proportional_edit_falloff", expand=True) + + class CLIP_HT_header(Header): bl_space_type = 'CLIP_EDITOR' @@ -181,6 +196,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" % @@ -188,6 +204,25 @@ class CLIP_HT_header(Header): row = layout.row() row.prop(sc, "pivot_point", text="", icon_only=True) + + # Proportional Editing + row = layout.row(align=True) + row.prop( + tool_settings, + "use_proportional_edit", + icon_only=True, + icon='PROP_CON' + ) + 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", + ) + row = layout.row(align=True) icon = 'LOCKED' if sc.lock_selection else 'UNLOCKED' row.prop(sc, "lock_selection", icon=icon, text="") @@ -1869,6 +1904,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.c b/source/blender/editors/transform/transform.c index 2a7c247ff2b..1afd97545d3 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -984,7 +984,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) break; case TFM_MODAL_PROPSIZE: /* MOUSEPAN usage... */ - if (t->flag & T_PROP_EDIT) { + if ((t->flag & T_PROP_EDIT) && ((t->flag & T_PROP_FIXED_DISTANCE) == 0)) { float fac = 1.0f + 0.005f * (event->y - event->prevy); t->prop_size *= fac; if (t->spacetype == SPACE_VIEW3D && t->persp != RV3D_ORTHO) { @@ -1000,7 +1000,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) } break; case TFM_MODAL_PROPSIZE_UP: - if (t->flag & T_PROP_EDIT) { + if ((t->flag & T_PROP_EDIT) && ((t->flag & T_PROP_FIXED_DISTANCE) == 0)) { t->prop_size *= (t->modifiers & MOD_PRECISION) ? 1.01f : 1.1f; if (t->spacetype == SPACE_VIEW3D && t->persp != RV3D_ORTHO) { t->prop_size = min_ff(t->prop_size, ((View3D *)t->view)->clip_end); @@ -1014,7 +1014,7 @@ int transformEvent(TransInfo *t, const wmEvent *event) } break; case TFM_MODAL_PROPSIZE_DOWN: - if (t->flag & T_PROP_EDIT) { + if ((t->flag & T_PROP_EDIT) && ((t->flag & T_PROP_FIXED_DISTANCE) == 0)) { t->prop_size /= (t->modifiers & MOD_PRECISION) ? 1.01f : 1.1f; t->prop_size = max_ff(t->prop_size, T_PROP_SIZE_MIN); calculatePropRatio(t); diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 91bf2bf8aac..8c8f8e3413d 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -455,45 +455,46 @@ enum { T_PROP_EDIT = 1 << 10, T_PROP_CONNECTED = 1 << 11, T_PROP_PROJECTED = 1 << 12, - T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED, + T_PROP_FIXED_DISTANCE = (1 << 13), + T_PROP_EDIT_ALL = T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED | T_PROP_FIXED_DISTANCE, - T_V3D_ALIGN = 1 << 13, + T_V3D_ALIGN = 1 << 14, /** For 2D views such as UV or f-curve. */ - T_2D_EDIT = 1 << 14, - T_CLIP_UV = 1 << 15, + T_2D_EDIT = 1 << 15, + T_CLIP_UV = 1 << 16, /** Auto-IK is on. */ - T_AUTOIK = 1 << 16, + T_AUTOIK = 1 << 17, /** Don't use mirror even if the data-block option is set. */ - T_NO_MIRROR = 1 << 17, + T_NO_MIRROR = 1 << 18, /** To indicate that the value set in the `value` parameter is the final * value of the transformation, modified only by the constrain. */ - T_INPUT_IS_VALUES_FINAL = 1 << 18, + T_INPUT_IS_VALUES_FINAL = 1 << 19, /** To specify if we save back settings at the end. */ - T_MODAL = 1 << 19, + T_MODAL = 1 << 20, /** No re-topology (projection). */ - T_NO_PROJECT = 1 << 20, + T_NO_PROJECT = 1 << 21, - T_RELEASE_CONFIRM = 1 << 21, + T_RELEASE_CONFIRM = 1 << 22, /** Alternative transformation. used to add offset to tracking markers. */ - T_ALT_TRANSFORM = 1 << 22, + T_ALT_TRANSFORM = 1 << 23, /** #TransInfo.center has been set, don't change it. */ - T_OVERRIDE_CENTER = 1 << 23, + T_OVERRIDE_CENTER = 1 << 24, - T_MODAL_CURSOR_SET = 1 << 24, + T_MODAL_CURSOR_SET = 1 << 25, - T_CLNOR_REBUILD = 1 << 25, + T_CLNOR_REBUILD = 1 << 26, /** Merges unselected into selected after transforming (runs after transforming). */ - T_AUTOMERGE = 1 << 26, + T_AUTOMERGE = 1 << 27, /** Runs auto-merge & splits. */ - T_AUTOSPLIT = 1 << 27, + T_AUTOSPLIT = 1 << 28, }; /** #TransInfo.modifiers */ diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index 5abe92b385a..f5d67425728 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -824,6 +824,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 be8c2aa5ae3..30a341d5e16 100644 --- a/source/blender/editors/transform/transform_convert_tracking.c +++ b/source/blender/editors/transform/transform_convert_tracking.c @@ -95,11 +95,13 @@ 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], const float off[2], - const float aspect[2]) + const float aspect[2], + float distance) { TransData *td = init_context->current.td; TransData2D *td2d = init_context->current.td2d; @@ -166,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 = distance; unit_m3(td->mtx); unit_m3(td->smtx); @@ -177,25 +182,35 @@ 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], + float distance) { - MovieTrackingMarker *marker = BKE_tracking_marker_ensure(track, framenr); - markerToTransDataInit(init_context, track, marker, + framenr, TRACK_AREA_POINT, track->offset, marker->pos, track->offset, - aspect); + aspect, + distance); if (track->flag & SELECT) { - markerToTransDataInit( - init_context, track, marker, TRACK_AREA_POINT, marker->pos, NULL, NULL, aspect); + markerToTransDataInit(init_context, + track, + marker, + framenr, + TRACK_AREA_POINT, + marker->pos, + NULL, + NULL, + aspect, + distance); } if (track->pat_flag & SELECT) { @@ -205,11 +220,13 @@ static void trackToTransData(TransformInitContext *init_context, markerToTransDataInit(init_context, track, marker, + framenr, TRACK_AREA_PAT, marker->pattern_corners[a], marker->pos, NULL, - aspect); + aspect, + distance); } } @@ -217,24 +234,110 @@ static void trackToTransData(TransformInitContext *init_context, markerToTransDataInit(init_context, track, marker, + framenr, TRACK_AREA_SEARCH, marker->search_min, marker->pos, NULL, - aspect); + aspect, + distance); markerToTransDataInit(init_context, track, marker, + framenr, TRACK_AREA_SEARCH, marker->search_max, marker->pos, NULL, - aspect); + aspect, + distance); } +} - if (init_context->current.td != NULL) { - marker->flag &= ~(MARKER_DISABLED | MARKER_TRACKED); +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, 0.0f); + + if ((t->flag & (T_PROP_EDIT)) == 0) { + return; + } + const int marker_at_frame_index = marker_at_frame - track->markers; + + /* TODO(sergey): De-duplicate traversal and counting logic. in both forard and backward + * directions. */ + /* TODO(sergey): De-duplicate logic around which markers are considered stoppers. */ + + /* When doing proportional editing with topology enabled, add all markers from the tracked + * segment to the transform data, The order of markers is not important, but it is important to + * stay within the current segment. This is done as two loops going backward and formward, + * starting from the next to the marker which corresponds to the active frame. */ + + /* Traverse markers backwards, adding them to the transform data. + * Stop when tracked segment is over, or when all markers to the left side of the + * `marker_at_frame` has been added. */ + { + int num_markers = 0; + for (int marker_index = marker_at_frame_index - 1; marker_index >= 0; marker_index--) { + MovieTrackingMarker *marker = &track->markers[marker_index]; + if (marker->flag & MARKER_DISABLED) { + break; + } + if ((marker->flag & MARKER_TRACKED) == 0) { + break; + } + num_markers++; + } + + for (int i = 0, marker_index = marker_at_frame_index - 1; marker_index >= 0; + i++, marker_index--) { + MovieTrackingMarker *marker = &track->markers[marker_index]; + if (marker->flag & MARKER_DISABLED) { + break; + } + if ((marker->flag & MARKER_TRACKED) == 0) { + break; + } + const float distance = (float)(i + 1) / (num_markers + 1); + markerAreasToTransData(init_context, track, marker, framenr, aspect, distance); + } + } + + /* Traverse markers forward, adding them to the transform data. + * Stop when tracked segment is over, or when all markers to the left side of the + * `marker_at_frame` has been added. */ + { + int num_markers = 0; + for (int marker_index = marker_at_frame_index + 1; marker_index < track->markersnr; + marker_index++) { + MovieTrackingMarker *marker = &track->markers[marker_index]; + if (marker->flag & MARKER_DISABLED) { + break; + } + if ((marker->flag & MARKER_TRACKED) == 0) { + break; + } + num_markers++; + } + + for (int i = 0, marker_index = marker_at_frame_index + 1; marker_index < track->markersnr; + i++, marker_index++) { + MovieTrackingMarker *marker = &track->markers[marker_index]; + if (marker->flag & MARKER_DISABLED) { + break; + } + if ((marker->flag & MARKER_TRACKED) == 0) { + break; + } + const float distance = (float)(i + 1) / (num_markers + 1); + markerAreasToTransData(init_context, track, marker, framenr, aspect, distance); + } } } @@ -358,6 +461,10 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t) init_context.t = t; init_context.tc = tc; + if ((t->flag & T_PROP_EDIT) == T_PROP_EDIT) { + t->flag |= T_PROP_FIXED_DISTANCE | T_PROP_CONNECTED; + } + /* Count required tranformation data. */ tc->data_len = 0; @@ -584,7 +691,6 @@ static void cancelTransTracking(TransInfo *t) MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, tdt->framenr); BLI_assert(marker != NULL); - marker->flag = tdt->flag; if (track->flag & SELECT) { @@ -623,7 +729,6 @@ static void cancelTransTracking(TransInfo *t) tdt->framenr); BLI_assert(plane_marker != NULL); - plane_marker->flag = tdt->flag; i += 3; } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 5b41f6b51bf..1f23be0cad6 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1285,18 +1285,24 @@ void calculatePropRatio(TransInfo *t) if (td->flag & TD_SELECTED) { td->factor = 1.0f; } - else if ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || - (connected == 0 && td->rdist > t->prop_size)) { + else if (((t->flag & T_PROP_FIXED_DISTANCE) == 0) && + ((connected && (td->flag & TD_NOTCONNECTED || td->dist > t->prop_size)) || + (connected == 0 && td->rdist > t->prop_size))) { td->factor = 0.0f; restoreElement(td); } else { /* Use rdist for falloff calculations, it is the real distance */ - if (connected) { - dist = (t->prop_size - td->dist) / t->prop_size; + if ((t->flag & T_PROP_FIXED_DISTANCE) == 0) { + if (connected) { + dist = (t->prop_size - td->dist) / t->prop_size; + } + else { + dist = (t->prop_size - td->rdist) / t->prop_size; + } } else { - dist = (t->prop_size - td->rdist) / t->prop_size; + dist = 1.0f - td->dist; } /* diff --git a/source/blender/editors/transform/transform_mode.c b/source/blender/editors/transform/transform_mode.c index a4d999b868d..5de2f44f4f4 100644 --- a/source/blender/editors/transform/transform_mode.c +++ b/source/blender/editors/transform/transform_mode.c @@ -549,8 +549,10 @@ void headerRotation(TransInfo *t, char str[UI_MAX_DRAW_STR], float final) } if (t->flag & T_PROP_EDIT_ALL) { - ofs += BLI_snprintf( - str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + if ((t->flag & T_PROP_FIXED_DISTANCE) == 0) { + ofs += BLI_snprintf( + str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + } } } @@ -886,8 +888,10 @@ void headerResize(TransInfo *t, const float vec[3], char str[UI_MAX_DRAW_STR]) } if (t->flag & T_PROP_EDIT_ALL) { - ofs += BLI_snprintf( - str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + if ((t->flag & T_PROP_FIXED_DISTANCE) == 0) { + ofs += BLI_snprintf( + str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + } } } diff --git a/source/blender/editors/transform/transform_mode_translate.c b/source/blender/editors/transform/transform_mode_translate.c index 851e0feb5f5..0545bf4f906 100644 --- a/source/blender/editors/transform/transform_mode_translate.c +++ b/source/blender/editors/transform/transform_mode_translate.c @@ -201,8 +201,10 @@ static void headerTranslation(TransInfo *t, const float vec[3], char str[UI_MAX_ } if (t->flag & T_PROP_EDIT_ALL) { - ofs += BLI_snprintf( - str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + if ((t->flag & T_PROP_FIXED_DISTANCE) == 0) { + ofs += BLI_snprintf( + str + ofs, UI_MAX_DRAW_STR - ofs, TIP_(" Proportional size: %.2f"), t->prop_size); + } } if (t->spacetype == SPACE_NODE) { |