From b7d7bbfc488c37c110c00baf51d58eb12f8b2efb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 6 May 2018 11:48:32 +0200 Subject: [PATCH] Fix extrude glitch where undo state was visible --- .../blender/editors/mesh/editmesh_extrude.c | 11 +++- source/blender/editors/transform/transform.c | 54 +++++++++---------- .../blender/editors/transform/transform_ops.c | 9 ++++ 3 files changed, 45 insertions(+), 29 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_extrude.c b/source/blender/editors/mesh/editmesh_extrude.c index 85472b7a0aa..3d19ee8c241 100644 --- a/source/blender/editors/mesh/editmesh_extrude.c +++ b/source/blender/editors/mesh/editmesh_extrude.c @@ -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(¯optr, "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(¯optr, "constraint_axis", constraint_axis); +#endif } } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 0f1abe00eb4..6b36e738cc0 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -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; diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index eba03087711..870c0e36a3b 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -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; } }