Fix extrude glitch where undo state was visible
authorCampbell Barton <ideasman42@gmail.com>
Sun, 6 May 2018 09:48:32 +0000 (11:48 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 6 May 2018 09:50:56 +0000 (11:50 +0200)
source/blender/editors/mesh/editmesh_extrude.c
source/blender/editors/transform/transform.c
source/blender/editors/transform/transform_ops.c

index 85472b7a0aa987c1050a39385ddec003a0be1359..3d19ee8c241a22f2059962724b570cbacd34e1d3 100644 (file)
@@ -451,11 +451,18 @@ static void manipulator_mesh_extrude_refresh(const bContext *C, wmManipulatorGro
                wmOperator *op_transform = op->macro.last;
                wmManipulatorOpElem *mpop = WM_manipulator_operator_get(man->axis_redo, 0);
 
+               PointerRNA macroptr = RNA_pointer_get(&mpop->ptr, "TRANSFORM_OT_translate");
+
                float value[4];
                RNA_float_get_array(op_transform->ptr, "value", value);
-
-               PointerRNA macroptr = RNA_pointer_get(&mpop->ptr, "TRANSFORM_OT_translate");
                RNA_float_set_array(&macroptr, "value", value);
+
+               /* Currently has glitch in re-applying. */
+#if 0
+               int constraint_axis[3];
+               RNA_boolean_get_array(op_transform->ptr, "constraint_axis", constraint_axis);
+               RNA_boolean_set_array(&macroptr, "constraint_axis", constraint_axis);
+#endif
        }
 }
 
index 0f1abe00eb4cfc03f496387cfd06d3d17cf3c145..6b36e738cc086086da51e295a31a5d1bca7f14c4 100644 (file)
@@ -2230,6 +2230,33 @@ bool initTransform(bContext *C, TransInfo *t, wmOperator *op, const wmEvent *eve
        calculatePropRatio(t);
        calculateCenter(t);
 
+       /* Overwrite initial values if operator supplied a non-null vector.
+        *
+        * Run before init functions so 'values_modal_offset' can be applied on mouse input.
+        */
+       BLI_assert(is_zero_v4(t->values_modal_offset));
+       if ((prop = RNA_struct_find_property(op->ptr, "value")) && RNA_property_is_set(op->ptr, prop)) {
+               float values[4] = {0}; /* in case value isn't length 4, avoid uninitialized memory  */
+
+               if (RNA_property_array_check(prop)) {
+                       RNA_float_get_array(op->ptr, "value", values);
+               }
+               else {
+                       values[0] = RNA_float_get(op->ptr, "value");
+               }
+
+               copy_v4_v4(t->values, values);
+
+               if (t->flag & T_MODAL) {
+                       copy_v4_v4(t->values_modal_offset, values);
+                       t->redraw = TREDRAW_HARD;
+               }
+               else {
+                       copy_v4_v4(t->auto_values, values);
+                       t->flag |= T_AUTOVALUES;
+               }
+       }
+
        if (event) {
                /* Initialize accurate transform to settings requested by keymap. */
                bool use_accurate = false;
@@ -2408,33 +2435,6 @@ 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.
-        */
-       if ((prop = RNA_struct_find_property(op->ptr, "value")) && RNA_property_is_set(op->ptr, prop)) {
-               float values[4] = {0}; /* in case value isn't length 4, avoid uninitialized memory  */
-
-               if (RNA_property_array_check(prop)) {
-                       RNA_float_get_array(op->ptr, "value", values);
-               }
-               else {
-                       values[0] = RNA_float_get(op->ptr, "value");
-               }
-
-               copy_v4_v4(t->values, values);
-
-               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;
 
        return 1;
index eba0308771152c55776f48fa1599754375c257b5..870c0e36a3bbb2f8af4d4de95132513de9a283d9 100644 (file)
@@ -490,6 +490,15 @@ static int transform_invoke(bContext *C, wmOperator *op, const wmEvent *event)
                WM_event_add_modal_handler(C, op);
 
                op->flag |= OP_IS_MODAL_GRAB_CURSOR; // XXX maybe we want this with the manipulator only?
+
+               /* Use when modal input has some transformation to begin with. */
+               {
+                       TransInfo *t = op->customdata;
+                       if (UNLIKELY(!is_zero_v4(t->values_modal_offset))) {
+                               transformApply(C, t);
+                       }
+               }
+
                return OPERATOR_RUNNING_MODAL;
        }
 }