Fix extrude glitch where undo state was visible

This commit is contained in:
2018-05-06 11:48:32 +02:00
parent 466125f3d6
commit b7d7bbfc48
3 changed files with 45 additions and 29 deletions

View 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
}
}

View 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;

View 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;
}
}