diff --git a/source/blender/editors/transform/transform_convert_nla.cc b/source/blender/editors/transform/transform_convert_nla.cc index b7ffc637021..3a35e84cebf 100644 --- a/source/blender/editors/transform/transform_convert_nla.cc +++ b/source/blender/editors/transform/transform_convert_nla.cc @@ -660,9 +660,28 @@ static void snap_transform_data(TransInfo *t, TransDataContainer *tc) if (t->modifiers & MOD_SNAP_INVERT) { invert_snap(snap_mode); } - TransData *td = tc->data; - for (int i = 0; i < tc->data_len; i++, td++) { - transform_snap_anim_flush_data(t, td, snap_mode, td->loc); + + float offset = 0; + float smallest_snap_delta = FLT_MAX; + + /* In order to move the strip in a block and not each end individually, + * find the minimal snap offset first and then shift the whole strip by that amount. */ + for (int i = 0; i < tc->data_len; i++) { + TransData td = tc->data[i]; + float snap_value; + transform_snap_anim_flush_data(t, &td, snap_mode, &snap_value); + + /* The snap_delta measures how far from the unsnapped position the value has moved. */ + const float snap_delta = *td.loc - snap_value; + if (fabs(snap_delta) < fabs(smallest_snap_delta)) { + offset = snap_value - td.iloc[0]; + smallest_snap_delta = snap_delta; + } + } + + for (int i = 0; i < tc->data_len; i++) { + TransData td = tc->data[i]; + *td.loc = td.iloc[0] + offset; } }