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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2021-01-04 13:09:35 +0300
committerCampbell Barton <ideasman42@gmail.com>2021-01-04 13:15:00 +0300
commitc7085be6c6ba2f7415b5b69f451287456296a3b6 (patch)
tree49b0422e88f655bf2b3e230056f8e72c16dd603c /source
parentd11a87b88c4d76aff77912313752d23fffc8e65d (diff)
Fix T84345: Transforming the cursor fails with absolute grid-snap
Absolute grid snapping was using the pivot, which doesn't make sense when transforming the cursor.
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/transform/transform_convert.c4
-rw-r--r--source/blender/editors/transform/transform_snap.c19
2 files changed, 19 insertions, 4 deletions
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index c81c954bd0a..dd35d67e1fa 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -993,6 +993,10 @@ void createTransData(bContext *C, TransInfo *t)
else {
convert_type = TC_CURSOR_VIEW3D;
}
+
+ /* Since we're transforming the cursor, initialize this value before it's modified.
+ * Needed for #snap_grid_apply to access the cursor location. */
+ transformCenter_from_type(t, V3D_AROUND_CURSOR);
}
else if (!(t->options & CTX_PAINT_CURVE) && (t->spacetype == SPACE_VIEW3D) && ob &&
(ob->mode == OB_MODE_SCULPT) && ob->sculpt) {
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index d407cea0033..e5b16d0ef6e 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -1424,10 +1424,21 @@ static void snap_grid_apply(
const float *center_global = t->center_global;
const float *asp = t->aspect;
- /* use a fallback for cursor selection,
- * this isn't useful as a global center for absolute grid snapping
- * since its not based on the position of the selection. */
- if (t->around == V3D_AROUND_CURSOR) {
+ if (t->options & CTX_CURSOR) {
+ /* Note that we must already have called #transformCenter_from_type, otherwise
+ * we would be lazy-initializing data which is being transformed,
+ * causing the transformed cursor location to be used instead of it's initial location. */
+ BLI_assert(t->center_cache[V3D_AROUND_CURSOR].is_set);
+
+ /* Use a fallback when transforming the cursor.
+ * In this case the center is _not_ derived from the cursor which is being transformed. */
+ const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CURSOR);
+ center_global = cd->global;
+ }
+ else if (t->around == V3D_AROUND_CURSOR) {
+ /* Use a fallback for cursor selection,
+ * this isn't useful as a global center for absolute grid snapping
+ * since its not based on the position of the selection. */
const TransCenterData *cd = transformCenter_from_type(t, V3D_AROUND_CENTER_MEDIAN);
center_global = cd->global;
}