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:
enricoturri1966 2022-02-18 14:40:43 +01:00
parent 98a9dd2cec
commit 4ad05d17d3
4 changed files with 44 additions and 48 deletions

View File

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

View File

@ -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:

View File

@ -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);

View File

@ -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();