Transform: support initial offset option
authorCampbell Barton <ideasman42@gmail.com>
Sun, 6 May 2018 07:52:12 +0000 (09:52 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 6 May 2018 08:14:16 +0000 (10:14 +0200)
Needed to redo extrude+transform macro w/o resetting the translation.

source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_input.c
source/blender/editors/transform/transform_ops.c

index 69f48292b71f0e57bf15f7063190e36818e470f9..0f1abe00eb4cfc03f496387cfd06d3d17cf3c145 100644 (file)
@@ -2408,6 +2408,8 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
                }
        }
 
+       BLI_assert(is_zero_v4(t->values_modal_offset));
+
        /* overwrite initial values if operator supplied a non-null vector
         *
         * keep last so we can apply the constraints space.
@@ -2423,8 +2425,14 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
                }
 
                copy_v4_v4(t->values, values);
-               copy_v4_v4(t->auto_values, values);
-               t->flag |= T_AUTOVALUES;
+
+               if (t->flag & T_MODAL) {
+                       copy_v4_v4(t->values_modal_offset, values);
+               }
+               else {
+                       copy_v4_v4(t->auto_values, values);
+                       t->flag |= T_AUTOVALUES;
+               }
        }
 
        t->context = NULL;
index 358be8f9e2982f1491165a39d3390bf29a0909ab..7686431d808e61fdb331f5db11a78473ee7f4702 100644 (file)
@@ -511,6 +511,7 @@ typedef struct TransInfo {
        short           mirror;
 
        float           values[4];
+       float           values_modal_offset[4];  /* Offset applied ontop of modal input. */
        float           auto_values[4];
        float           axis[3];
        float           axis_orig[3];   /* TransCon can change 'axis', store the original value here */
index db761e5e23a05a9bfbcd8a2fc0dde7291377a50f..799d2acb91894b8d917fb09fe84e72c2c5d9bd66 100644 (file)
@@ -417,6 +417,12 @@ void applyMouseInput(TransInfo *t, MouseInput *mi, const int mval[2], float outp
                mi->apply(t, mi, mval_db, output);
        }
 
+       if (!is_zero_v3(t->values_modal_offset)) {
+               float values_ofs[3];
+               mul_v3_m3v3(values_ofs, t->spacemtx, t->values_modal_offset);
+               add_v3_v3(t->values, values_ofs);
+       }
+
        if (mi->post) {
                mi->post(t, output);
        }
index 6f31f5311bc1728377148329a3480c1444471015..eba0308771152c55776f48fa1599754375c257b5 100644 (file)
@@ -479,7 +479,10 @@ static int transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
                return OPERATOR_CANCELLED;
        }
 
-       if (RNA_struct_property_is_set(op->ptr, "value")) {
+       /* When modal, allow 'value' to set initial offset. */
+       if ((event == NULL) &&
+           RNA_struct_property_is_set(op->ptr, "value"))
+       {
                return transform_exec(C, op);
        }
        else {