Tech ENABLE_WORLD_COORDINATE_SCALE_REVISITED - Detection of required transformation baking done on mouse dragging event in place of mouse up event for gizmo scale
This commit is contained in:
parent
98a9dd2cec
commit
4ad05d17d3
@ -1272,16 +1272,15 @@ void ObjectManipulation::set_uniform_scaling(const bool use_uniform_scale)
|
||||
const Selection &selection = wxGetApp().plater()->canvas3D()->get_selection();
|
||||
#if ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
if (!use_uniform_scale) {
|
||||
int res = selection.bake_transform_if_needed(false);
|
||||
int res = selection.bake_transform_if_needed();
|
||||
if (res == -1) {
|
||||
// Enforce uniform scaling.
|
||||
m_lock_bnt->SetLock(true);
|
||||
return;
|
||||
}
|
||||
else if (res == 0) {
|
||||
else if (res == 0)
|
||||
// Recalculate cached values at this panel, refresh the screen.
|
||||
this->UpdateAndShow(true);
|
||||
}
|
||||
}
|
||||
|
||||
m_uniform_scale = use_uniform_scale;
|
||||
|
@ -576,30 +576,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
||||
else if (is_dragging()) {
|
||||
switch (m_current) {
|
||||
case Move: { m_parent.do_move(L("Gizmo-Move")); break; }
|
||||
#if ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
case Scale: {
|
||||
const Vec3d scale = get_scale();
|
||||
const Vec3d starting_scale = get_starting_scale();
|
||||
wxGetApp().CallAfter([this, &selection, scale, starting_scale]() {
|
||||
int res = 1;
|
||||
if (scale.x() != scale.y() || scale.x() != scale.z())
|
||||
res = selection.bake_transform_if_needed(L("Gizmo-Scale"));
|
||||
|
||||
if (res == 1)
|
||||
m_parent.do_scale(L("Gizmo-Scale"));
|
||||
else if (res == -1) {
|
||||
TransformationType transformation_type;
|
||||
if (!wxGetApp().obj_manipul()->is_world_coordinates())
|
||||
transformation_type.set_local();
|
||||
selection.scale(starting_scale, transformation_type);
|
||||
}
|
||||
}
|
||||
);
|
||||
break;
|
||||
}
|
||||
#else
|
||||
case Scale: { m_parent.do_scale(L("Gizmo-Scale")); break; }
|
||||
#endif // ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
case Rotate: { m_parent.do_rotate(L("Gizmo-Rotate")); break; }
|
||||
default: break;
|
||||
}
|
||||
@ -668,24 +645,51 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
|
||||
}
|
||||
case Scale:
|
||||
{
|
||||
// Apply new temporary scale factors
|
||||
#if ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
const Vec3d scale = get_scale();
|
||||
int res = 1;
|
||||
if (scale.x() != scale.y() || scale.x() != scale.z()) {
|
||||
// we need to release the mouse or, if the modal dialog is shown by the
|
||||
// following call to bake_transform_if_needed(), the focus gets messed up
|
||||
if (m_parent.get_wxglcanvas()->HasCapture())
|
||||
m_parent.get_wxglcanvas()->ReleaseMouse();
|
||||
|
||||
res = selection.bake_transform_if_needed();
|
||||
|
||||
// re-capture the mouse
|
||||
if (!m_parent.get_wxglcanvas()->HasCapture())
|
||||
m_parent.get_wxglcanvas()->CaptureMouse();
|
||||
}
|
||||
|
||||
if (res != 1) {
|
||||
// the modal dialog has been disposed, fake mouse up
|
||||
stop_dragging();
|
||||
update_data();
|
||||
m_parent.mouse_up_cleanup();
|
||||
}
|
||||
else {
|
||||
#endif // ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
// Apply new temporary scale factors
|
||||
#if ENABLE_WORLD_COORDINATE
|
||||
TransformationType transformation_type;
|
||||
if (!wxGetApp().obj_manipul()->is_world_coordinates())
|
||||
transformation_type.set_local();
|
||||
TransformationType transformation_type;
|
||||
if (!wxGetApp().obj_manipul()->is_world_coordinates())
|
||||
transformation_type.set_local();
|
||||
#else
|
||||
TransformationType transformation_type(TransformationType::Local_Absolute_Joint);
|
||||
TransformationType transformation_type(TransformationType::Local_Absolute_Joint);
|
||||
#endif // ENABLE_WORLD_COORDINATE
|
||||
if (evt.AltDown())
|
||||
transformation_type.set_independent();
|
||||
selection.scale(get_scale(), transformation_type);
|
||||
if (control_down)
|
||||
if (evt.AltDown())
|
||||
transformation_type.set_independent();
|
||||
selection.scale(get_scale(), transformation_type);
|
||||
if (control_down)
|
||||
#if ENABLE_WORLD_COORDINATE
|
||||
selection.translate(get_scale_offset(), wxGetApp().obj_manipul()->get_coordinates_type());
|
||||
selection.translate(get_scale_offset(), wxGetApp().obj_manipul()->get_coordinates_type());
|
||||
#else
|
||||
selection.translate(get_scale_offset(), true);
|
||||
selection.translate(get_scale_offset(), true);
|
||||
#endif // ENABLE_WORLD_COORDINATE
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
wxGetApp().obj_manipul()->set_dirty();
|
||||
#if ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
}
|
||||
#endif // ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
break;
|
||||
}
|
||||
case Rotate:
|
||||
|
@ -1309,7 +1309,7 @@ void Selection::translate(unsigned int object_idx, unsigned int instance_idx, co
|
||||
}
|
||||
|
||||
#if ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
int Selection::bake_transform_if_needed(bool apply_scale) const
|
||||
int Selection::bake_transform_if_needed() const
|
||||
{
|
||||
if ((is_single_full_instance() && wxGetApp().obj_manipul()->is_world_coordinates()) ||
|
||||
(is_single_volume_or_modifier() && !wxGetApp().obj_manipul()->is_local_coordinates())) {
|
||||
@ -1347,13 +1347,7 @@ int Selection::bake_transform_if_needed(bool apply_scale) const
|
||||
if (dlg.ShowModal() != wxID_YES)
|
||||
return -1;
|
||||
|
||||
if (apply_scale) {
|
||||
wxGetApp().plater()->get_current_canvas3D()->do_scale(L("Scale + Bake transform"));
|
||||
Plater::SuppressSnapshots suppress(wxGetApp().plater());
|
||||
wxGetApp().plater()->take_snapshot(_("Bake transform"));
|
||||
}
|
||||
else
|
||||
wxGetApp().plater()->take_snapshot(_("Bake transform"));
|
||||
wxGetApp().plater()->take_snapshot(_("Bake transform"));
|
||||
|
||||
// Bake the rotation into the meshes of the object.
|
||||
wxGetApp().model().objects[volume.composite_id.object_id]->bake_xy_rotation_into_meshes(volume.composite_id.instance_id);
|
||||
|
@ -374,8 +374,7 @@ public:
|
||||
// -1 if the user refused to proceed with baking when asked
|
||||
// 0 if the baking was performed
|
||||
// 1 if no baking was needed
|
||||
// if apply_scale == true the scaling of the current selection is applied
|
||||
int bake_transform_if_needed(bool apply_scale) const;
|
||||
int bake_transform_if_needed() const;
|
||||
#endif // ENABLE_WORLD_COORDINATE_SCALE_REVISITED
|
||||
|
||||
void erase();
|
||||
|
Loading…
Reference in New Issue
Block a user