From b32e9366606dce7d4f8de8db84fd902113bdbe28 Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Tue, 7 Mar 2023 14:32:18 +0100 Subject: [PATCH 1/5] Rework of constrained scaling --- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 168 +++++++++++-------------- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 5 +- src/slic3r/GUI/Selection.cpp | 30 ++--- src/slic3r/GUI/Selection.hpp | 2 +- 4 files changed, 87 insertions(+), 118 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 9e5191f65..9a56abf13 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -21,7 +21,6 @@ const double GLGizmoScale3D::Offset = 5.0; GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) , m_scale(Vec3d::Ones()) - , m_offset(Vec3d::Zero()) , m_snap_step(0.05) , m_base_color(DEFAULT_BASE_COLOR) , m_drag_color(DEFAULT_DRAG_COLOR) @@ -68,6 +67,12 @@ std::string GLGizmoScale3D::get_tooltip() const return ""; } +static int constraint_id(int grabber_id) +{ + static const std::vector<int> id_map = { 1, 0, 3, 2, 5, 4, 8, 9, 6, 7 }; + return (0 <= grabber_id && grabber_id < id_map.size()) ? id_map[grabber_id] : -1; +} + bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) { if (mouse_event.Dragging()) { @@ -89,7 +94,18 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) transformation_type.set_independent(); #if ENABLE_WORLD_COORDINATE - m_parent.get_selection().scale_and_translate(m_scale, m_offset, transformation_type); + Selection& selection = m_parent.get_selection(); + selection.scale(m_scale, transformation_type); + if (m_starting.ctrl_down) { + // constrained scale: + // uses the performed scale to calculate the new position of the constrained grabber + // and from that calculates the offset (in world coordinates) to be applied to fullfill the constraint + update_render_data(); + const Vec3d constraint_position = m_grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; + // re-apply the scale because the selection always applies the transformations with respect to the initial state + // set into on_start_dragging() with the call to selection.setup_cache() + m_parent.get_selection().scale_and_translate(m_scale, m_starting.constraint_position - constraint_position, transformation_type); + } #else Selection& selection = m_parent.get_selection(); selection.scale(m_scale, transformation_type); @@ -176,6 +192,7 @@ void GLGizmoScale3D::on_start_dragging() m_starting.box = m_bounding_box; m_starting.center = m_center; m_starting.instance_center = m_instance_center; + m_starting.constraint_position = m_grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; #else m_starting.drag_position = m_grabbers[m_hover_id].center; m_starting.box = (m_starting.ctrl_down && m_hover_id < 6) ? m_bounding_box : m_parent.get_selection().get_bounding_box(); @@ -190,8 +207,10 @@ void GLGizmoScale3D::on_start_dragging() #endif // ENABLE_WORLD_COORDINATE } -void GLGizmoScale3D::on_stop_dragging() { +void GLGizmoScale3D::on_stop_dragging() +{ m_parent.do_scale(L("Gizmo-Scale")); + m_starting.ctrl_down = false; } void GLGizmoScale3D::on_dragging(const UpdateData& data) @@ -214,52 +233,13 @@ void GLGizmoScale3D::on_render() glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); - const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); - m_bounding_box = box; - m_center = box_trafo.translation(); - m_grabbers_transform = box_trafo; - m_instance_center = (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) ? selection.get_first_volume()->get_instance_offset() : m_center; - - // x axis - const Vec3d box_half_size = 0.5 * m_bounding_box.size(); - bool use_constrain = wxGetKeyState(WXK_CONTROL) && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()); - - m_grabbers[0].center = { -(box_half_size.x() + Offset), 0.0, 0.0 }; - m_grabbers[0].color = (use_constrain && m_hover_id == 1) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - m_grabbers[1].center = { box_half_size.x() + Offset, 0.0, 0.0 }; - m_grabbers[1].color = (use_constrain && m_hover_id == 0) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - - // y axis - m_grabbers[2].center = { 0.0, -(box_half_size.y() + Offset), 0.0 }; - m_grabbers[2].color = (use_constrain && m_hover_id == 3) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - m_grabbers[3].center = { 0.0, box_half_size.y() + Offset, 0.0 }; - m_grabbers[3].color = (use_constrain && m_hover_id == 2) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - - // z axis - m_grabbers[4].center = { 0.0, 0.0, -(box_half_size.z() + Offset) }; - m_grabbers[4].color = (use_constrain && m_hover_id == 5) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - m_grabbers[5].center = { 0.0, 0.0, box_half_size.z() + Offset }; - m_grabbers[5].color = (use_constrain && m_hover_id == 4) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - - // uniform - m_grabbers[6].center = { -(box_half_size.x() + Offset), -(box_half_size.y() + Offset), 0.0 }; - m_grabbers[6].color = (use_constrain && m_hover_id == 8) ? CONSTRAINED_COLOR : m_highlight_color; - m_grabbers[7].center = { box_half_size.x() + Offset, -(box_half_size.y() + Offset), 0.0 }; - m_grabbers[7].color = (use_constrain && m_hover_id == 9) ? CONSTRAINED_COLOR : m_highlight_color; - m_grabbers[8].center = { box_half_size.x() + Offset, box_half_size.y() + Offset, 0.0 }; - m_grabbers[8].color = (use_constrain && m_hover_id == 6) ? CONSTRAINED_COLOR : m_highlight_color; - m_grabbers[9].center = { -(box_half_size.x() + Offset), box_half_size.y() + Offset, 0.0 }; - m_grabbers[9].color = (use_constrain && m_hover_id == 7) ? CONSTRAINED_COLOR : m_highlight_color; + update_render_data(); #if ENABLE_GL_CORE_PROFILE if (!OpenGLManager::get_gl_info().is_core_profile()) #endif // ENABLE_GL_CORE_PROFILE glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - for (int i = 0; i < 10; ++i) { - m_grabbers[i].matrix = m_grabbers_transform; - } - const float grabber_mean_size = (float)((m_bounding_box.size().x() + m_bounding_box.size().y() + m_bounding_box.size().z()) / 3.0); if (m_hover_id == -1) { @@ -743,38 +723,8 @@ void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) double ratio = calc_ratio(data); if (ratio > 0.0) { Vec3d curr_scale = m_scale; - const Vec3d starting_scale = m_starting.scale; - const Selection& selection = m_parent.get_selection(); - const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); - - curr_scale(axis) = starting_scale(axis) * ratio; + curr_scale(axis) = m_starting.scale(axis) * ratio; m_scale = curr_scale; - - if (m_starting.ctrl_down && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier())) { - double local_offset = 0.5 * (ratio - 1.0) * m_starting.box.size()(axis); - - if (m_hover_id == 2 * axis) - local_offset *= -1.0; - - switch (axis) - { - case X: { m_offset = local_offset * Vec3d::UnitX(); break; } - case Y: { m_offset = local_offset * Vec3d::UnitY(); break; } - case Z: { m_offset = local_offset * Vec3d::UnitZ(); break; } - default: { m_offset = Vec3d::Zero(); break; } - } - - if (selection.is_single_volume_or_modifier()) { - if (coordinates_type == ECoordinatesType::Instance) - m_offset = selection.get_first_volume()->get_instance_transformation().get_scaling_factor_matrix().inverse() * m_offset; - else if (coordinates_type == ECoordinatesType::Local) { - m_offset = selection.get_first_volume()->get_instance_transformation().get_scaling_factor_matrix().inverse() * - selection.get_first_volume()->get_volume_transformation().get_rotation_matrix() * m_offset; - } - } - } - else - m_offset = Vec3d::Zero(); } } #else @@ -811,31 +761,8 @@ void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) void GLGizmoScale3D::do_scale_uniform(const UpdateData & data) { const double ratio = calc_ratio(data); - if (ratio > 0.0) { + if (ratio > 0.0) m_scale = m_starting.scale * ratio; - - const Selection& selection = m_parent.get_selection(); - const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); - if (m_starting.ctrl_down && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier())) { - m_offset = 0.5 * (ratio - 1.0) * m_starting.box.size(); - - if (m_hover_id == 6 || m_hover_id == 9) - m_offset.x() *= -1.0; - if (m_hover_id == 6 || m_hover_id == 7) - m_offset.y() *= -1.0; - - if (selection.is_single_volume_or_modifier()) { - if (coordinates_type == ECoordinatesType::Instance) - m_offset = selection.get_first_volume()->get_instance_transformation().get_scaling_factor_matrix().inverse() * m_offset; - else if (coordinates_type == ECoordinatesType::Local) { - m_offset = selection.get_first_volume()->get_instance_transformation().get_scaling_factor_matrix().inverse() * - selection.get_first_volume()->get_volume_transformation().get_rotation_matrix() * m_offset; - } - } - } - else - m_offset = Vec3d::Zero(); - } } #else void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) @@ -883,5 +810,50 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const return ratio; } +void GLGizmoScale3D::update_render_data() +{ + const Selection& selection = m_parent.get_selection(); + const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + m_center = box_trafo.translation(); + m_grabbers_transform = box_trafo; + m_instance_center = (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()) ? selection.get_first_volume()->get_instance_offset() : m_center; + + const Vec3d box_half_size = 0.5 * m_bounding_box.size(); + bool use_constrain = wxGetKeyState(WXK_CONTROL); + + // x axis + m_grabbers[0].center = { -(box_half_size.x() + Offset), 0.0, 0.0 }; + m_grabbers[0].color = (use_constrain && m_hover_id == 1) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + m_grabbers[1].center = { box_half_size.x() + Offset, 0.0, 0.0 }; + m_grabbers[1].color = (use_constrain && m_hover_id == 0) ? CONSTRAINED_COLOR : AXES_COLOR[0]; + + // y axis + m_grabbers[2].center = { 0.0, -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[2].color = (use_constrain && m_hover_id == 3) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + m_grabbers[3].center = { 0.0, box_half_size.y() + Offset, 0.0 }; + m_grabbers[3].color = (use_constrain && m_hover_id == 2) ? CONSTRAINED_COLOR : AXES_COLOR[1]; + + // z axis + m_grabbers[4].center = { 0.0, 0.0, -(box_half_size.z() + Offset) }; + m_grabbers[4].color = (use_constrain && m_hover_id == 5) ? CONSTRAINED_COLOR : AXES_COLOR[2]; + m_grabbers[5].center = { 0.0, 0.0, box_half_size.z() + Offset }; + m_grabbers[5].color = (use_constrain && m_hover_id == 4) ? CONSTRAINED_COLOR : AXES_COLOR[2]; + + // uniform + m_grabbers[6].center = { -(box_half_size.x() + Offset), -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[6].color = (use_constrain && m_hover_id == 8) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[7].center = { box_half_size.x() + Offset, -(box_half_size.y() + Offset), 0.0 }; + m_grabbers[7].color = (use_constrain && m_hover_id == 9) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[8].center = { box_half_size.x() + Offset, box_half_size.y() + Offset, 0.0 }; + m_grabbers[8].color = (use_constrain && m_hover_id == 6) ? CONSTRAINED_COLOR : m_highlight_color; + m_grabbers[9].center = { -(box_half_size.x() + Offset), box_half_size.y() + Offset, 0.0 }; + m_grabbers[9].color = (use_constrain && m_hover_id == 7) ? CONSTRAINED_COLOR : m_highlight_color; + + for (int i = 0; i < 10; ++i) { + m_grabbers[i].matrix = m_grabbers_transform; + } +} + } // namespace GUI } // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index fe6ab4972..c2ad916bb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -26,6 +26,7 @@ class GLGizmoScale3D : public GLGizmoBase #if ENABLE_WORLD_COORDINATE Vec3d center{ Vec3d::Zero() }; Vec3d instance_center{ Vec3d::Zero() }; + Vec3d constraint_position{ Vec3d::Zero() }; #endif // ENABLE_WORLD_COORDINATE BoundingBoxf3 box; #if !ENABLE_WORLD_COORDINATE @@ -44,7 +45,6 @@ class GLGizmoScale3D : public GLGizmoBase Transform3d m_offsets_transform; #endif // ENABLE_WORLD_COORDINATE Vec3d m_scale{ Vec3d::Ones() }; - Vec3d m_offset{ Vec3d::Zero() }; double m_snap_step{ 0.05 }; StartingData m_starting; @@ -68,7 +68,7 @@ public: const Vec3d& get_scale() const { return m_scale; } #if ENABLE_WORLD_COORDINATE - void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; m_offset = Vec3d::Zero(); } + void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } #else void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } #endif // ENABLE_WORLD_COORDINATE @@ -102,6 +102,7 @@ private: void do_scale_uniform(const UpdateData& data); double calc_ratio(const UpdateData& data) const; + void update_render_data(); }; diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 0841d61a1..d1296e40a 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1455,7 +1455,7 @@ void Selection::mirror(Axis axis) #endif // ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE -void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& translation, TransformationType transformation_type) +void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type) { if (!m_valid) return; @@ -1489,32 +1489,28 @@ void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& translation const Vec3d local_inst_pivot = inst_trafo.get_matrix_no_offset().inverse() * world_inst_pivot; Matrix3d inst_rotation, inst_scale; inst_trafo.get_matrix().computeRotationScaling(&inst_rotation, &inst_scale); - const Transform3d offset_trafo = Geometry::translation_transform(inst_trafo.get_offset() + inst_rotation * translation); + const Transform3d offset_trafo = Geometry::translation_transform(inst_trafo.get_offset() + world_translation); const Transform3d scale_trafo = Transform3d(inst_scale) * Geometry::scale_transform(relative_scale); v.set_instance_transformation(Geometry::translation_transform(world_inst_pivot) * offset_trafo * Transform3d(inst_rotation) * scale_trafo * Geometry::translation_transform(-local_inst_pivot)); } else - transform_instance_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(relative_scale), m_cache.dragging_center); + transform_instance_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(relative_scale), m_cache.dragging_center); } else { if (!is_single_volume_or_modifier()) { assert(transformation_type.world()); - transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(scale), m_cache.dragging_center); + transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(world_translation) * Geometry::scale_transform(scale), m_cache.dragging_center); } else { - if (transformation_type.local() && transformation_type.absolute()) { - const Geometry::Transformation& vol_trafo = volume_data.get_volume_transform(); - Matrix3d vol_rotation, vol_scale; - vol_trafo.get_matrix().computeRotationScaling(&vol_rotation, &vol_scale); - const Transform3d offset_trafo = Geometry::translation_transform(vol_trafo.get_offset() + vol_rotation * translation); - const Transform3d scale_trafo = Transform3d(vol_scale) * Geometry::scale_transform(scale); - v.set_volume_transformation(offset_trafo * Transform3d(vol_rotation) * scale_trafo); - } - else { - transformation_type.set_independent(); - transformation_type.set_relative(); - transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(scale), m_cache.dragging_center); - } + transformation_type.set_independent(); + Vec3d translation; + if (transformation_type.local()) + translation = volume_data.get_volume_transform().get_matrix_no_offset().inverse() * inst_trafo.get_matrix_no_offset().inverse() * world_translation; + else if (transformation_type.instance()) + translation = inst_trafo.get_matrix_no_offset().inverse() * world_translation; + else + translation = world_translation; + transform_volume_relative(v, volume_data, transformation_type, Geometry::translation_transform(translation) * Geometry::scale_transform(scale), m_cache.dragging_center); } } } diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index eb69d4491..b50e8acdb 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -411,7 +411,7 @@ public: void scale(const Vec3d& scale, TransformationType transformation_type); void scale_to_fit_print_volume(const BuildVolume& volume); #if ENABLE_WORLD_COORDINATE - void scale_and_translate(const Vec3d& scale, const Vec3d& translation, TransformationType transformation_type); + void scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type); void mirror(Axis axis, TransformationType transformation_type); void reset_skew(); #else From 373ae1e19d09a45f29f157f0ad11a4f2c4aae0c5 Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Wed, 8 Mar 2023 11:52:17 +0100 Subject: [PATCH 2/5] Tech ENABLE_WORLD_COORDINATE set as default --- src/libslic3r/Geometry.cpp | 210 -------- src/libslic3r/Geometry.hpp | 87 +--- src/libslic3r/Model.cpp | 62 +-- src/libslic3r/Model.hpp | 40 +- src/libslic3r/Print.cpp | 10 - src/libslic3r/PrintApply.cpp | 9 - src/libslic3r/SLA/Rotfinder.cpp | 10 - src/libslic3r/Technologies.hpp | 6 +- src/slic3r/GUI/3DBed.cpp | 56 --- src/slic3r/GUI/3DBed.hpp | 34 -- src/slic3r/GUI/3DScene.hpp | 28 -- src/slic3r/GUI/CoordAxes.cpp | 4 - src/slic3r/GUI/CoordAxes.hpp | 3 - src/slic3r/GUI/GLCanvas3D.cpp | 88 +--- src/slic3r/GUI/GLCanvas3D.hpp | 8 - src/slic3r/GUI/GUI_Geometry.hpp | 3 - src/slic3r/GUI/GUI_ObjectList.cpp | 28 -- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 423 +--------------- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 55 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 27 - src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp | 4 - src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 4 - src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 - src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 80 +-- src/slic3r/GUI/Gizmos/GLGizmoMove.hpp | 6 - src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 24 - src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 79 +-- src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp | 8 - src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 379 -------------- src/slic3r/GUI/Gizmos/GLGizmoScale.hpp | 21 - src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 - src/slic3r/GUI/MeshUtils.cpp | 4 - src/slic3r/GUI/Plater.cpp | 25 - src/slic3r/GUI/Selection.cpp | 504 +------------------ src/slic3r/GUI/Selection.hpp | 108 +--- src/slic3r/GUI/wxExtensions.cpp | 6 - 37 files changed, 41 insertions(+), 2412 deletions(-) diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 2cc34be0e..5542d73ee 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -395,7 +395,6 @@ Vec3d extract_rotation(const Transform3d& transform) return extract_rotation(m); } -#if ENABLE_WORLD_COORDINATE Transform3d Transformation::get_offset_matrix() const { return translation_transform(get_offset()); @@ -461,57 +460,12 @@ Transform3d Transformation::get_rotation_matrix() const { return extract_rotation_matrix(m_matrix); } -#else -bool Transformation::Flags::needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const -{ - return (this->dont_translate != dont_translate) || (this->dont_rotate != dont_rotate) || (this->dont_scale != dont_scale) || (this->dont_mirror != dont_mirror); -} - -void Transformation::Flags::set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) -{ - this->dont_translate = dont_translate; - this->dont_rotate = dont_rotate; - this->dont_scale = dont_scale; - this->dont_mirror = dont_mirror; -} - -Transformation::Transformation() -{ - reset(); -} - -Transformation::Transformation(const Transform3d& transform) -{ - set_from_transform(transform); -} - -void Transformation::set_offset(const Vec3d& offset) -{ - set_offset(X, offset.x()); - set_offset(Y, offset.y()); - set_offset(Z, offset.z()); -} - -void Transformation::set_offset(Axis axis, double offset) -{ - if (m_offset(axis) != offset) { - m_offset(axis) = offset; - m_dirty = true; - } -} -#endif // ENABLE_WORLD_COORDINATE void Transformation::set_rotation(const Vec3d& rotation) { -#if ENABLE_WORLD_COORDINATE const Vec3d offset = get_offset(); m_matrix = rotation_transform(rotation) * extract_scale(m_matrix); m_matrix.translation() = offset; -#else - set_rotation(X, rotation.x()); - set_rotation(Y, rotation.y()); - set_rotation(Z, rotation.z()); -#endif // ENABLE_WORLD_COORDINATE } void Transformation::set_rotation(Axis axis, double rotation) @@ -520,7 +474,6 @@ void Transformation::set_rotation(Axis axis, double rotation) if (is_approx(std::abs(rotation), 2.0 * double(PI))) rotation = 0.0; -#if ENABLE_WORLD_COORDINATE auto [curr_rotation, scale] = extract_rotation_scale(m_matrix); Vec3d angles = extract_rotation(curr_rotation); angles[axis] = rotation; @@ -528,15 +481,8 @@ void Transformation::set_rotation(Axis axis, double rotation) const Vec3d offset = get_offset(); m_matrix = rotation_transform(angles) * scale; m_matrix.translation() = offset; -#else - if (m_rotation(axis) != rotation) { - m_rotation(axis) = rotation; - m_dirty = true; - } -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE Vec3d Transformation::get_scaling_factor() const { const Transform3d scale = extract_scale(m_matrix); @@ -551,26 +497,18 @@ Transform3d Transformation::get_scaling_factor_matrix() const scale(2, 2) = std::abs(scale(2, 2)); return scale; } -#endif // ENABLE_WORLD_COORDINATE void Transformation::set_scaling_factor(const Vec3d& scaling_factor) { -#if ENABLE_WORLD_COORDINATE assert(scaling_factor.x() > 0.0 && scaling_factor.y() > 0.0 && scaling_factor.z() > 0.0); const Vec3d offset = get_offset(); m_matrix = extract_rotation_matrix(m_matrix) * scale_transform(scaling_factor); m_matrix.translation() = offset; -#else - set_scaling_factor(X, scaling_factor.x()); - set_scaling_factor(Y, scaling_factor.y()); - set_scaling_factor(Z, scaling_factor.z()); -#endif // ENABLE_WORLD_COORDINATE } void Transformation::set_scaling_factor(Axis axis, double scaling_factor) { -#if ENABLE_WORLD_COORDINATE assert(scaling_factor > 0.0); auto [rotation, scale] = extract_rotation_scale(m_matrix); @@ -579,15 +517,8 @@ void Transformation::set_scaling_factor(Axis axis, double scaling_factor) const Vec3d offset = get_offset(); m_matrix = rotation * scale; m_matrix.translation() = offset; -#else - if (m_scaling_factor(axis) != std::abs(scaling_factor)) { - m_scaling_factor(axis) = std::abs(scaling_factor); - m_dirty = true; - } -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE Vec3d Transformation::get_mirror() const { const Transform3d scale = extract_scale(m_matrix); @@ -602,11 +533,9 @@ Transform3d Transformation::get_mirror_matrix() const scale(2, 2) = scale(2, 2) / std::abs(scale(2, 2)); return scale; } -#endif // ENABLE_WORLD_COORDINATE void Transformation::set_mirror(const Vec3d& mirror) { -#if ENABLE_WORLD_COORDINATE Vec3d copy(mirror); const Vec3d abs_mirror = copy.cwiseAbs(); for (int i = 0; i < 3; ++i) { @@ -627,11 +556,6 @@ void Transformation::set_mirror(const Vec3d& mirror) const Vec3d offset = get_offset(); m_matrix = rotation * scale; m_matrix.translation() = offset; -#else - set_mirror(X, mirror.x()); - set_mirror(Y, mirror.y()); - set_mirror(Z, mirror.z()); -#endif // ENABLE_WORLD_COORDINATE } void Transformation::set_mirror(Axis axis, double mirror) @@ -642,7 +566,6 @@ void Transformation::set_mirror(Axis axis, double mirror) else if (abs_mirror != 1.0) mirror /= abs_mirror; -#if ENABLE_WORLD_COORDINATE auto [rotation, scale] = extract_rotation_scale(m_matrix); const double curr_scale = scale(axis, axis); const double sign = curr_scale * mirror; @@ -652,74 +575,18 @@ void Transformation::set_mirror(Axis axis, double mirror) const Vec3d offset = get_offset(); m_matrix = rotation * scale; m_matrix.translation() = offset; -#else - if (m_mirror(axis) != mirror) { - m_mirror(axis) = mirror; - m_dirty = true; - } -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE bool Transformation::has_skew() const { return contains_skew(m_matrix); } -#else -void Transformation::set_from_transform(const Transform3d& transform) -{ - // offset - set_offset(transform.matrix().block(0, 3, 3, 1)); - - Eigen::Matrix<double, 3, 3, Eigen::DontAlign> m3x3 = transform.matrix().block(0, 0, 3, 3); - - // mirror - // it is impossible to reconstruct the original mirroring factors from a matrix, - // we can only detect if the matrix contains a left handed reference system - // in which case we reorient it back to right handed by mirroring the x axis - Vec3d mirror = Vec3d::Ones(); - if (m3x3.col(0).dot(m3x3.col(1).cross(m3x3.col(2))) < 0.0) { - mirror.x() = -1.0; - // remove mirror - m3x3.col(0) *= -1.0; - } - set_mirror(mirror); - - // scale - set_scaling_factor(Vec3d(m3x3.col(0).norm(), m3x3.col(1).norm(), m3x3.col(2).norm())); - - // remove scale - m3x3.col(0).normalize(); - m3x3.col(1).normalize(); - m3x3.col(2).normalize(); - - // rotation - set_rotation(extract_rotation(m3x3)); - - // forces matrix recalculation matrix - m_matrix = get_matrix(); - -// // debug check -// if (!m_matrix.isApprox(transform)) -// std::cout << "something went wrong in extracting data from matrix" << std::endl; -} -#endif // ENABLE_WORLD_COORDINATE void Transformation::reset() { -#if !ENABLE_WORLD_COORDINATE - m_offset = Vec3d::Zero(); - m_rotation = Vec3d::Zero(); - m_scaling_factor = Vec3d::Ones(); - m_mirror = Vec3d::Ones(); -#endif // !ENABLE_WORLD_COORDINATE m_matrix = Transform3d::Identity(); -#if !ENABLE_WORLD_COORDINATE - m_dirty = false; -#endif // !ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE void Transformation::reset_rotation() { const Geometry::TransformationSVD svd(*this); @@ -755,88 +622,12 @@ Transform3d Transformation::get_matrix_no_scaling_factor() const copy.reset_scaling_factor(); return copy.get_matrix(); } -#else -const Transform3d& Transformation::get_matrix(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const -{ - if (m_dirty || m_flags.needs_update(dont_translate, dont_rotate, dont_scale, dont_mirror)) { - m_matrix = Geometry::assemble_transform( - dont_translate ? Vec3d::Zero() : m_offset, - dont_rotate ? Vec3d::Zero() : m_rotation, - dont_scale ? Vec3d::Ones() : m_scaling_factor, - dont_mirror ? Vec3d::Ones() : m_mirror - ); - - m_flags.set(dont_translate, dont_rotate, dont_scale, dont_mirror); - m_dirty = false; - } - - return m_matrix; -} -#endif // ENABLE_WORLD_COORDINATE Transformation Transformation::operator * (const Transformation& other) const { return Transformation(get_matrix() * other.get_matrix()); } -#if !ENABLE_WORLD_COORDINATE -Transformation Transformation::volume_to_bed_transformation(const Transformation& instance_transformation, const BoundingBoxf3& bbox) -{ - Transformation out; - - if (instance_transformation.is_scaling_uniform()) { - // No need to run the non-linear least squares fitting for uniform scaling. - // Just set the inverse. - out.set_from_transform(instance_transformation.get_matrix(true).inverse()); - } - else if (is_rotation_ninety_degrees(instance_transformation.get_rotation())) { - // Anisotropic scaling, rotation by multiples of ninety degrees. - Eigen::Matrix3d instance_rotation_trafo = - (Eigen::AngleAxisd(instance_transformation.get_rotation().z(), Vec3d::UnitZ()) * - Eigen::AngleAxisd(instance_transformation.get_rotation().y(), Vec3d::UnitY()) * - Eigen::AngleAxisd(instance_transformation.get_rotation().x(), Vec3d::UnitX())).toRotationMatrix(); - Eigen::Matrix3d volume_rotation_trafo = - (Eigen::AngleAxisd(-instance_transformation.get_rotation().x(), Vec3d::UnitX()) * - Eigen::AngleAxisd(-instance_transformation.get_rotation().y(), Vec3d::UnitY()) * - Eigen::AngleAxisd(-instance_transformation.get_rotation().z(), Vec3d::UnitZ())).toRotationMatrix(); - - // 8 corners of the bounding box. - auto pts = Eigen::MatrixXd(8, 3); - pts(0, 0) = bbox.min.x(); pts(0, 1) = bbox.min.y(); pts(0, 2) = bbox.min.z(); - pts(1, 0) = bbox.min.x(); pts(1, 1) = bbox.min.y(); pts(1, 2) = bbox.max.z(); - pts(2, 0) = bbox.min.x(); pts(2, 1) = bbox.max.y(); pts(2, 2) = bbox.min.z(); - pts(3, 0) = bbox.min.x(); pts(3, 1) = bbox.max.y(); pts(3, 2) = bbox.max.z(); - pts(4, 0) = bbox.max.x(); pts(4, 1) = bbox.min.y(); pts(4, 2) = bbox.min.z(); - pts(5, 0) = bbox.max.x(); pts(5, 1) = bbox.min.y(); pts(5, 2) = bbox.max.z(); - pts(6, 0) = bbox.max.x(); pts(6, 1) = bbox.max.y(); pts(6, 2) = bbox.min.z(); - pts(7, 0) = bbox.max.x(); pts(7, 1) = bbox.max.y(); pts(7, 2) = bbox.max.z(); - - // Corners of the bounding box transformed into the modifier mesh coordinate space, with inverse rotation applied to the modifier. - auto qs = pts * - (instance_rotation_trafo * - Eigen::Scaling(instance_transformation.get_scaling_factor().cwiseProduct(instance_transformation.get_mirror())) * - volume_rotation_trafo).inverse().transpose(); - // Fill in scaling based on least squares fitting of the bounding box corners. - Vec3d scale; - for (int i = 0; i < 3; ++i) - scale(i) = pts.col(i).dot(qs.col(i)) / pts.col(i).dot(pts.col(i)); - - out.set_rotation(Geometry::extract_rotation(volume_rotation_trafo)); - out.set_scaling_factor(Vec3d(std::abs(scale.x()), std::abs(scale.y()), std::abs(scale.z()))); - out.set_mirror(Vec3d(scale.x() > 0 ? 1. : -1, scale.y() > 0 ? 1. : -1, scale.z() > 0 ? 1. : -1)); - } - else { - // General anisotropic scaling, general rotation. - // Keep the modifier mesh in the instance coordinate system, so the modifier mesh will not be aligned with the world. - // Scale it to get the required size. - out.set_scaling_factor(instance_transformation.get_scaling_factor().cwiseInverse()); - } - - return out; -} -#endif // !ENABLE_WORLD_COORDINATE - -#if ENABLE_WORLD_COORDINATE TransformationSVD::TransformationSVD(const Transform3d& trafo) { const auto &m0 = trafo.matrix().block<3, 3>(0, 0); @@ -883,7 +674,6 @@ TransformationSVD::TransformationSVD(const Transform3d& trafo) } else skew = false; } -#endif // ENABLE_WORLD_COORDINATE // For parsing a transformation matrix from 3MF / AMF. Transform3d transform3d_from_string(const std::string& transform_str) diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index ba7e7a4b2..c410a57f2 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -383,32 +383,9 @@ Vec3d extract_rotation(const Transform3d& transform); class Transformation { -#if ENABLE_WORLD_COORDINATE Transform3d m_matrix{ Transform3d::Identity() }; -#else - struct Flags - { - bool dont_translate{ true }; - bool dont_rotate{ true }; - bool dont_scale{ true }; - bool dont_mirror{ true }; - - bool needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const; - void set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror); - }; - - Vec3d m_offset{ Vec3d::Zero() }; // In unscaled coordinates - Vec3d m_rotation{ Vec3d::Zero() }; // Rotation around the three axes, in radians around mesh center point - Vec3d m_scaling_factor{ Vec3d::Ones() }; // Scaling factors along the three axes - Vec3d m_mirror{ Vec3d::Ones() }; // Mirroring along the three axes - - mutable Transform3d m_matrix{ Transform3d::Identity() }; - mutable Flags m_flags; - mutable bool m_dirty{ false }; -#endif // ENABLE_WORLD_COORDINATE public: -#if ENABLE_WORLD_COORDINATE Transformation() = default; explicit Transformation(const Transform3d& transform) : m_matrix(transform) {} @@ -424,26 +401,10 @@ public: double get_rotation(Axis axis) const { return get_rotation()[axis]; } Transform3d get_rotation_matrix() const; -#else - Transformation(); - explicit Transformation(const Transform3d& transform); - - const Vec3d& get_offset() const { return m_offset; } - double get_offset(Axis axis) const { return m_offset(axis); } - - void set_offset(const Vec3d& offset); - void set_offset(Axis axis, double offset); - - const Vec3d& get_rotation() const { return m_rotation; } - double get_rotation(Axis axis) const { return m_rotation(axis); } - - Transform3d get_rotation_matrix() const { return rotation_transform(get_rotation()); } -#endif // ENABLE_WORLD_COORDINATE void set_rotation(const Vec3d& rotation); void set_rotation(Axis axis, double rotation); -#if ENABLE_WORLD_COORDINATE Vec3d get_scaling_factor() const; double get_scaling_factor(Axis axis) const { return get_scaling_factor()[axis]; } @@ -453,17 +414,10 @@ public: const Vec3d scale = get_scaling_factor(); return std::abs(scale.x() - scale.y()) < 1e-8 && std::abs(scale.x() - scale.z()) < 1e-8; } -#else - const Vec3d& get_scaling_factor() const { return m_scaling_factor; } - double get_scaling_factor(Axis axis) const { return m_scaling_factor(axis); } - - Transform3d get_scaling_factor_matrix() const { return scale_transform(get_scaling_factor()); } -#endif // ENABLE_WORLD_COORDINATE void set_scaling_factor(const Vec3d& scaling_factor); void set_scaling_factor(Axis axis, double scaling_factor); -#if ENABLE_WORLD_COORDINATE Vec3d get_mirror() const; double get_mirror(Axis axis) const { return get_mirror()[axis]; } @@ -472,25 +426,13 @@ public: bool is_left_handed() const { return m_matrix.linear().determinant() < 0; } -#else - bool is_scaling_uniform() const { return std::abs(m_scaling_factor.x() - m_scaling_factor.y()) < 1e-8 && std::abs(m_scaling_factor.x() - m_scaling_factor.z()) < 1e-8; } - - const Vec3d& get_mirror() const { return m_mirror; } - double get_mirror(Axis axis) const { return m_mirror(axis); } - bool is_left_handed() const { return m_mirror.x() * m_mirror.y() * m_mirror.z() < 0.; } -#endif // ENABLE_WORLD_COORDINATE void set_mirror(const Vec3d& mirror); void set_mirror(Axis axis, double mirror); -#if ENABLE_WORLD_COORDINATE bool has_skew() const; -#else - void set_from_transform(const Transform3d& transform); -#endif // ENABLE_WORLD_COORDINATE void reset(); -#if ENABLE_WORLD_COORDINATE void reset_offset() { set_offset(Vec3d::Zero()); } void reset_rotation(); void reset_scaling_factor(); @@ -502,22 +444,11 @@ public: Transform3d get_matrix_no_scaling_factor() const; void set_matrix(const Transform3d& transform) { m_matrix = transform; } -#else - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; -#endif // ENABLE_WORLD_COORDINATE Transformation operator * (const Transformation& other) const; -#if !ENABLE_WORLD_COORDINATE - // Find volume transformation, so that the chained (instance_trafo * volume_trafo) will be as close to identity - // as possible in least squares norm in regard to the 8 corners of bbox. - // Bounding box is expected to be centered around zero in all axes. - static Transformation volume_to_bed_transformation(const Transformation& instance_transformation, const BoundingBoxf3& bbox); -#endif // !ENABLE_WORLD_COORDINATE - private: friend class cereal::access; -#if ENABLE_WORLD_COORDINATE template<class Archive> void serialize(Archive& ar) { ar(m_matrix); } explicit Transformation(int) {} template <class Archive> static void load_and_construct(Archive& ar, cereal::construct<Transformation>& construct) @@ -526,24 +457,13 @@ private: construct(1); ar(construct.ptr()->m_matrix); } -#else - template<class Archive> void serialize(Archive& ar) { ar(m_offset, m_rotation, m_scaling_factor, m_mirror); } - explicit Transformation(int) : m_dirty(true) {} - template <class Archive> static void load_and_construct(Archive& ar, cereal::construct<Transformation>& construct) - { - // Calling a private constructor with special "int" parameter to indicate that no construction is necessary. - construct(1); - ar(construct.ptr()->m_offset, construct.ptr()->m_rotation, construct.ptr()->m_scaling_factor, construct.ptr()->m_mirror); - } -#endif // ENABLE_WORLD_COORDINATE }; -#if ENABLE_WORLD_COORDINATE struct TransformationSVD { - Matrix3d u = Matrix3d::Identity(); - Matrix3d s = Matrix3d::Identity(); - Matrix3d v = Matrix3d::Identity(); + Matrix3d u{ Matrix3d::Identity() }; + Matrix3d s{ Matrix3d::Identity() }; + Matrix3d v{ Matrix3d::Identity() }; bool mirror{ false }; bool scale{ false }; @@ -557,7 +477,6 @@ struct TransformationSVD Eigen::DiagonalMatrix<double, 3, 3> mirror_matrix() const { return Eigen::DiagonalMatrix<double, 3, 3>(this->mirror ? -1. : 1., 1., 1.); } }; -#endif // ENABLE_WORLD_COORDINATE // For parsing a transformation matrix from 3MF / AMF. extern Transform3d transform3d_from_string(const std::string& transform_str); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 6024cd775..231824382 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1031,11 +1031,7 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const if (this->instances.empty()) throw Slic3r::InvalidArgument("Can't call raw_bounding_box() with no instances"); -#if ENABLE_WORLD_COORDINATE const Transform3d inst_matrix = this->instances.front()->get_transformation().get_matrix_no_offset(); -#else - const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE for (const ModelVolume *v : this->volumes) if (v->is_model_part()) m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); @@ -1047,14 +1043,10 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_translate) const { BoundingBoxf3 bb; -#if ENABLE_WORLD_COORDINATE const Transform3d inst_matrix = dont_translate ? this->instances[instance_idx]->get_transformation().get_matrix_no_offset() : this->instances[instance_idx]->get_transformation().get_matrix(); -#else - const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate); -#endif // ENABLE_WORLD_COORDINATE for (ModelVolume *v : this->volumes) { if (v->is_model_part()) bb.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); @@ -1670,17 +1662,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, const Transform3d& cut_matrix, // in the transformation matrix and not applied to the mesh transform. // const auto instance_matrix = instances[instance]->get_matrix(true); -#if ENABLE_WORLD_COORDINATE const auto instance_matrix = instances[instance]->get_transformation().get_matrix_no_offset(); -#else - const auto instance_matrix = assemble_transform( - Vec3d::Zero(), // don't apply offset - instances[instance]->get_rotation(), - instances[instance]->get_scaling_factor(), - instances[instance]->get_mirror() - ); -#endif // ENABLE_WORLD_COORDINATE - const Transformation cut_transformation = Transformation(cut_matrix); const Transform3d inverse_cut_matrix = cut_transformation.get_rotation_matrix().inverse() * translation_transform(-1. * cut_transformation.get_offset()); @@ -1822,11 +1804,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects) new_vol->config.set_key_value("extruder", new ConfigOptionInt(0)); for (ModelInstance* model_instance : new_object->instances) { -#if ENABLE_WORLD_COORDINATE - Vec3d shift = model_instance->get_transformation().get_matrix_no_offset() * new_vol->get_offset(); -#else - Vec3d shift = model_instance->get_transformation().get_matrix(true) * new_vol->get_offset(); -#endif // ENABLE_WORLD_COORDINATE + const Vec3d shift = model_instance->get_transformation().get_matrix_no_offset() * new_vol->get_offset(); model_instance->set_offset(model_instance->get_offset() + shift); } @@ -1867,13 +1845,7 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) { assert(instance_idx < this->instances.size()); - const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation(); -#if !ENABLE_WORLD_COORDINATE - if (Geometry::is_rotation_ninety_degrees(reference_trafo.get_rotation())) - // nothing to do, scaling in the world coordinate space is possible in the representation of Geometry::Transformation. - return; -#endif // !ENABLE_WORLD_COORDINATE - + const Geometry::Transformation reference_trafo = this->instances[instance_idx]->get_transformation(); bool left_handed = reference_trafo.is_left_handed(); bool has_mirrorring = ! reference_trafo.get_mirror().isApprox(Vec3d(1., 1., 1.)); bool uniform_scaling = std::abs(reference_trafo.get_scaling_factor().x() - reference_trafo.get_scaling_factor().y()) < EPSILON && @@ -1890,7 +1862,6 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) // Adjust the meshes. // Transformation to be applied to the meshes. -#if ENABLE_WORLD_COORDINATE Geometry::Transformation reference_trafo_mod = reference_trafo; reference_trafo_mod.reset_offset(); if (uniform_scaling) @@ -1898,9 +1869,6 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) if (!has_mirrorring) reference_trafo_mod.reset_mirror(); Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); -#else - Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo.get_matrix(true, false, uniform_scaling, ! has_mirrorring).matrix().block<3, 3>(0, 0); -#endif // ENABLE_WORLD_COORDINATE Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix(); for (ModelVolume *model_volume : this->volumes) { const Geometry::Transformation volume_trafo = model_volume->get_transformation(); @@ -1910,7 +1878,6 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().z()) < EPSILON; double volume_new_scaling_factor = volume_uniform_scaling ? volume_trafo.get_scaling_factor().x() : 1.; // Transform the mesh. -#if ENABLE_WORLD_COORDINATE Geometry::Transformation volume_trafo_mod = volume_trafo; volume_trafo_mod.reset_offset(); if (volume_uniform_scaling) @@ -1918,11 +1885,8 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) if (!volume_has_mirrorring) volume_trafo_mod.reset_mirror(); Eigen::Matrix3d volume_trafo_3x3 = volume_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); -#else - Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0); -#endif // ENABLE_WORLD_COORDINATE // Following method creates a new shared_ptr<TriangleMesh> - model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); + model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); // Reset the rotation, scaling and mirroring. model_volume->set_rotation(Vec3d(0., 0., 0.)); model_volume->set_scaling_factor(Vec3d(volume_new_scaling_factor, volume_new_scaling_factor, volume_new_scaling_factor)); @@ -1941,11 +1905,7 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const double min_z = DBL_MAX; const ModelInstance* inst = instances[instance_idx]; -#if ENABLE_WORLD_COORDINATE const Transform3d mi = inst->get_matrix_no_offset(); -#else - const Transform3d& mi = inst->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -1966,11 +1926,7 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const double max_z = -DBL_MAX; const ModelInstance* inst = instances[instance_idx]; -#if ENABLE_WORLD_COORDINATE const Transform3d mi = inst->get_matrix_no_offset(); -#else - const Transform3d& mi = inst->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -2410,29 +2366,17 @@ void ModelVolume::convert_from_meters() void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const { -#if ENABLE_WORLD_COORDINATE mesh->transform(dont_translate ? get_matrix_no_offset() : get_matrix()); -#else - mesh->transform(get_matrix(dont_translate)); -#endif // ENABLE_WORLD_COORDINATE } BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const { -#if ENABLE_WORLD_COORDINATE return bbox.transformed(dont_translate ? get_matrix_no_offset() : get_matrix()); -#else - return bbox.transformed(get_matrix(dont_translate)); -#endif // ENABLE_WORLD_COORDINATE } Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const { -#if ENABLE_WORLD_COORDINATE return dont_translate ? get_matrix_no_offset() * v : get_matrix() * v; -#else - return get_matrix(dont_translate) * v; -#endif // ENABLE_WORLD_COORDINATE } void ModelInstance::transform_polygon(Polygon* polygon) const diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 08fa79481..6aa91454e 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -880,26 +880,16 @@ public: const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } -#if ENABLE_WORLD_COORDINATE void set_transformation(const Transform3d& trafo) { m_transformation.set_matrix(trafo); } Vec3d get_offset() const { return m_transformation.get_offset(); } -#else - void set_transformation(const Transform3d &trafo) { m_transformation.set_from_transform(trafo); } - - const Vec3d& get_offset() const { return m_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } -#if ENABLE_WORLD_COORDINATE Vec3d get_rotation() const { return m_transformation.get_rotation(); } -#else - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } @@ -911,11 +901,7 @@ public: void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } -#if ENABLE_WORLD_COORDINATE Vec3d get_mirror() const { return m_transformation.get_mirror(); } -#else - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } bool is_left_handed() const { return m_transformation.is_left_handed(); } @@ -924,12 +910,8 @@ public: void convert_from_imperial_units(); void convert_from_meters(); -#if ENABLE_WORLD_COORDINATE const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } -#else - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } -#endif // ENABLE_WORLD_COORDINATE void set_new_unique_id() { ObjectBase::set_new_unique_id(); @@ -1141,43 +1123,27 @@ public: const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } -#if ENABLE_WORLD_COORDINATE Vec3d get_offset() const { return m_transformation.get_offset(); } -#else - const Vec3d& get_offset() const { return m_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } -#if ENABLE_WORLD_COORDINATE Vec3d get_rotation() const { return m_transformation.get_rotation(); } -#else - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } void set_rotation(Axis axis, double rotation) { m_transformation.set_rotation(axis, rotation); } -#if ENABLE_WORLD_COORDINATE Vec3d get_scaling_factor() const { return m_transformation.get_scaling_factor(); } -#else - const Vec3d& get_scaling_factor() const { return m_transformation.get_scaling_factor(); } -#endif // ENABLE_WORLD_COORDINATE double get_scaling_factor(Axis axis) const { return m_transformation.get_scaling_factor(axis); } void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } -#if ENABLE_WORLD_COORDINATE Vec3d get_mirror() const { return m_transformation.get_mirror(); } -#else - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } - bool is_left_handed() const { return m_transformation.is_left_handed(); } + bool is_left_handed() const { return m_transformation.is_left_handed(); } void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); } void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); } @@ -1191,12 +1157,8 @@ public: // To be called on an external polygon. It does not translate the polygon, only rotates and scales. void transform_polygon(Polygon* polygon) const; -#if ENABLE_WORLD_COORDINATE const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } -#else - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } -#endif // ENABLE_WORLD_COORDINATE bool is_printable() const { return object->printable && printable && (print_volume_state == ModelInstancePVS_Inside); } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index a3eba0148..c6a064972 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -392,7 +392,6 @@ bool Print::sequential_print_horizontal_clearance_valid(const Print& print, Poly // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) // which causes that the warning will be showed after arrangement with the // appropriate object distance. Even if I set this to jtMiter the warning still shows up. -#if ENABLE_WORLD_COORDINATE Geometry::Transformation trafo = model_instance0->get_transformation(); trafo.set_offset({ 0.0, 0.0, model_instance0->get_offset().z() }); it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, @@ -401,15 +400,6 @@ bool Print::sequential_print_horizontal_clearance_valid(const Print& print, Poly // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. float(scale_(0.5 * print.config().extruder_clearance_radius.value - BuildVolume::BedEpsilon)), jtRound, scale_(0.1)).front()); -#else - it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, - offset(print_object->model_object()->convex_hull_2d( - Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects - // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. - float(scale_(0.5 * print.config().extruder_clearance_radius.value - BuildVolume::BedEpsilon)), - jtRound, scale_(0.1)).front()); -#endif // ENABLE_WORLD_COORDINATE } // Make a copy, so it may be rotated for instances. Polygon convex_hull0 = it_convex_hull->second; diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index ae5f18fcb..1cd91a33a 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -791,13 +791,8 @@ void update_volume_bboxes( if (it != volumes_old.end() && it->volume_id == model_volume->id()) layer_range.volumes.emplace_back(*it); } else -#if ENABLE_WORLD_COORDINATE layer_range.volumes.push_back({ model_volume->id(), transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), offset) }); -#else - layer_range.volumes.push_back({ model_volume->id(), - transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), offset) }); -#endif // ENABLE_WORLD_COORDINATE } } else { std::vector<std::vector<PrintObjectRegions::VolumeExtents>> volumes_old; @@ -829,11 +824,7 @@ void update_volume_bboxes( layer_range.volumes.emplace_back(*it); } } else { -#if ENABLE_WORLD_COORDINATE transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), ranges, bboxes, offset); -#else - transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), ranges, bboxes, offset); -#endif // ENABLE_WORLD_COORDINATE for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) if (auto &bbox = bboxes[&layer_range - layer_ranges.data()]; bbox.second) layer_range.volumes.push_back({ model_volume->id(), bbox.first }); diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp index ab98f3e93..5f25d5b60 100644 --- a/src/libslic3r/SLA/Rotfinder.cpp +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -300,18 +300,8 @@ struct RotfinderBoilerplate { TriangleMesh mesh = mo.raw_mesh(); ModelInstance *mi = mo.instances[0]; -#if ENABLE_WORLD_COORDINATE const Geometry::Transformation trafo = mi->get_transformation(); Transform3d trafo_instance = trafo.get_scaling_factor_matrix() * trafo.get_mirror_matrix(); -#else - auto rotation = Vec3d::Zero(); - auto offset = Vec3d::Zero(); - Transform3d trafo_instance = - Geometry::assemble_transform(offset, rotation, - mi->get_scaling_factor(), - mi->get_mirror()); -#endif // ENABLE_WORLD_COORDINATE - mesh.transform(trafo_instance); return mesh; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 791230d4e..793585a67 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -32,6 +32,8 @@ #define ENABLE_RAYCAST_PICKING_DEBUG 0 // Shows an imgui dialog with GLModel statistics data #define ENABLE_GLMODEL_STATISTICS 0 +// Shows an imgui dialog containing the matrices of the selected volumes +#define ENABLE_MATRICES_DEBUG 0 // Enable rendering of objects using environment map @@ -51,10 +53,6 @@ #define ENABLE_GL_CORE_PROFILE (1 && !ENABLE_OPENGL_ES) // Enable OpenGL debug messages using debug context #define ENABLE_OPENGL_DEBUG_OPTION (1 && ENABLE_GL_CORE_PROFILE) -// Enable editing volumes transformation in world coordinates and instances in local coordinates -#define ENABLE_WORLD_COORDINATE (1 && ENABLE_2_6_0_ALPHA1) -// Shows an imgui dialog containing the matrices of the selected volumes -#define ENABLE_WORLD_COORDINATE_DEBUG (0 && ENABLE_WORLD_COORDINATE) // Enable alternative version of file_wildcards() #define ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR (1 && ENABLE_2_6_0_ALPHA1) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index bef4c0d89..81284ce5d 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -29,54 +29,6 @@ static const Slic3r::ColorRGBA DEFAULT_TRANSPARENT_GRID_COLOR = { 0.9f, 0.9f, 0 namespace Slic3r { namespace GUI { -#if !ENABLE_WORLD_COORDINATE -const float Bed3D::Axes::DefaultStemRadius = 0.5f; -const float Bed3D::Axes::DefaultStemLength = 25.0f; -const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius; -const float Bed3D::Axes::DefaultTipLength = 5.0f; - -void Bed3D::Axes::render() -{ - auto render_axis = [this](GLShaderProgram* shader, const Transform3d& transform) { - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("view_model_matrix", view_matrix * transform); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * transform.matrix().block(0, 0, 3, 3).inverse().transpose(); - shader->set_uniform("view_normal_matrix", view_normal_matrix); - m_arrow.render(); - }; - - if (!m_arrow.is_initialized()) - m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length)); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - glsafe(::glEnable(GL_DEPTH_TEST)); - - shader->start_using(); - shader->set_uniform("emission_factor", 0.0f); - - // x axis - m_arrow.set_color(ColorRGBA::X()); - render_axis(shader, Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); - - // y axis - m_arrow.set_color(ColorRGBA::Y()); - render_axis(shader, Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); - - // z axis - m_arrow.set_color(ColorRGBA::Z()); - render_axis(shader, Geometry::assemble_transform(m_origin)); - - shader->stop_using(); - - glsafe(::glDisable(GL_DEPTH_TEST)); -} -#endif // !ENABLE_WORLD_COORDINATE - bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom) { auto check_texture = [](const std::string& texture) { @@ -204,11 +156,7 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const out.merge(m_axes.get_origin()); // extend to contain axes out.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones()); -#if ENABLE_WORLD_COORDINATE out.merge(out.min + Vec3d(-m_axes.get_tip_radius(), -m_axes.get_tip_radius(), out.max.z())); -#else - out.merge(out.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, out.max.z())); -#endif // ENABLE_WORLD_COORDINATE // extend to contain model, if any BoundingBoxf3 model_bb = m_model.model.get_bounding_box(); if (model_bb.defined) { @@ -370,11 +318,7 @@ void Bed3D::render_axes() return; if (m_build_volume.valid()) -#if ENABLE_WORLD_COORDINATE m_axes.render(Transform3d::Identity(), 0.25f); -#else - m_axes.render(); -#endif // ENABLE_WORLD_COORDINATE } void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture) diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 36aefef79..6198955e2 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -3,11 +3,7 @@ #include "GLTexture.hpp" #include "3DScene.hpp" -#if ENABLE_WORLD_COORDINATE #include "CoordAxes.hpp" -#else -#include "GLModel.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "MeshUtils.hpp" #include "libslic3r/BuildVolume.hpp" @@ -23,32 +19,6 @@ class GLCanvas3D; class Bed3D { -#if !ENABLE_WORLD_COORDINATE - class Axes - { - public: - static const float DefaultStemRadius; - static const float DefaultStemLength; - static const float DefaultTipRadius; - static const float DefaultTipLength; - - private: - Vec3d m_origin{ Vec3d::Zero() }; - float m_stem_length{ DefaultStemLength }; - GLModel m_arrow; - - public: - const Vec3d& get_origin() const { return m_origin; } - void set_origin(const Vec3d& origin) { m_origin = origin; } - void set_stem_length(float length) { - m_stem_length = length; - m_arrow.reset(); - } - float get_total_length() const { return m_stem_length + DefaultTipLength; } - void render(); - }; -#endif // !ENABLE_WORLD_COORDINATE - public: enum class Type : unsigned char { @@ -77,11 +47,7 @@ private: GLTexture m_temp_texture; PickingModel m_model; Vec3d m_model_offset{ Vec3d::Zero() }; -#if ENABLE_WORLD_COORDINATE CoordAxes m_axes; -#else - Axes m_axes; -#endif // ENABLE_WORLD_COORDINATE float m_scale_factor{ 1.0f }; bool m_show_axes{ true }; diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 9791a0faf..635c5b044 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -212,23 +212,15 @@ public: const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; } void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); } -#else - const Vec3d& get_instance_offset() const { return m_instance_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); } void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); } -#else - const Vec3d& get_instance_rotation() const { return m_instance_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); } void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } @@ -240,11 +232,7 @@ public: void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); } -#else - const Vec3d& get_instance_mirror() const { return m_instance_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); } void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } @@ -252,43 +240,27 @@ public: const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; } void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); } -#else - const Vec3d& get_volume_offset() const { return m_volume_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); } void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); } -#else - const Vec3d& get_volume_rotation() const { return m_volume_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); } void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } -#else - const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } -#endif // ENABLE_WORLD_COORDINATE double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); } void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); } -#else - const Vec3d& get_volume_mirror() const { return m_volume_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); } void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } diff --git a/src/slic3r/GUI/CoordAxes.cpp b/src/slic3r/GUI/CoordAxes.cpp index 277c8ad30..233e5449f 100644 --- a/src/slic3r/GUI/CoordAxes.cpp +++ b/src/slic3r/GUI/CoordAxes.cpp @@ -8,8 +8,6 @@ #include <GL/glew.h> -#if ENABLE_WORLD_COORDINATE - namespace Slic3r { namespace GUI { @@ -63,5 +61,3 @@ void CoordAxes::render(const Transform3d& trafo, float emission_factor) } // GUI } // Slic3r - -#endif // ENABLE_WORLD_COORDINATE diff --git a/src/slic3r/GUI/CoordAxes.hpp b/src/slic3r/GUI/CoordAxes.hpp index 2679608a3..1d934751f 100644 --- a/src/slic3r/GUI/CoordAxes.hpp +++ b/src/slic3r/GUI/CoordAxes.hpp @@ -1,7 +1,6 @@ #ifndef slic3r_CoordAxes_hpp_ #define slic3r_CoordAxes_hpp_ -#if ENABLE_WORLD_COORDINATE #include "GLModel.hpp" namespace Slic3r { @@ -55,6 +54,4 @@ public: } // GUI } // Slic3r -#endif // ENABLE_WORLD_COORDINATE - #endif // slic3r_CoordAxes_hpp_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 05cff51fa..cfc944888 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -954,9 +954,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_QUESTION_MARK, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event<int>); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); -#if ENABLE_WORLD_COORDINATE wxDEFINE_EVENT(EVT_GLCANVAS_RESET_SKEW, SimpleEvent); -#endif // ENABLE_WORLD_COORDINATE wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); @@ -1811,7 +1809,6 @@ std::vector<int> GLCanvas3D::load_object(const Model& model, int obj_idx) void GLCanvas3D::mirror_selection(Axis axis) { -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; if (wxGetApp().obj_manipul()->is_local_coordinates()) transformation_type.set_local(); @@ -1822,9 +1819,7 @@ void GLCanvas3D::mirror_selection(Axis axis) m_selection.setup_cache(); m_selection.mirror(axis, transformation_type); -#else - m_selection.mirror(axis); -#endif // ENABLE_WORLD_COORDINATE + do_mirror(L("Mirror Object")); wxGetApp().obj_manipul()->set_dirty(); } @@ -2618,13 +2613,9 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) else displacement = multiplier * direction; -#if ENABLE_WORLD_COORDINATE TransformationType trafo_type; trafo_type.set_relative(); m_selection.translate(displacement, trafo_type); -#else - m_selection.translate(displacement); -#endif // ENABLE_WORLD_COORDINATE m_dirty = true; } ); @@ -3231,14 +3222,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } -#if ENABLE_WORLD_COORDINATE m_moving = true; TransformationType trafo_type; trafo_type.set_relative(); m_selection.translate(cur_pos - m_mouse.drag.start_position_3D, trafo_type); -#else - m_selection.translate(cur_pos - m_mouse.drag.start_position_3D); -#endif // ENABLE_WORLD_COORDINATE if (current_printer_technology() == ptFFF && fff_print()->config().complete_objects) update_sequential_clearance(); wxGetApp().obj_manipul()->set_dirty(); @@ -3503,17 +3490,9 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { if (selection_mode == Selection::Instance) -#if ENABLE_WORLD_COORDINATE model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); -#else - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); -#endif // ENABLE_WORLD_COORDINATE else if (volume_idx >= 0 && selection_mode == Selection::Volume) -#if ENABLE_WORLD_COORDINATE model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); -#else - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); -#endif // ENABLE_WORLD_COORDINATE object_moved = true; model_object->invalidate_bounding_box(); @@ -3584,13 +3563,9 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) for (const GLVolume* v : m_volumes.volumes) { if (v->is_wipe_tower) { const Vec3d offset = v->get_volume_offset(); -#if ENABLE_WORLD_COORDINATE Vec3d rot_unit_x = v->get_volume_transformation().get_matrix().linear() * Vec3d::UnitX(); double z_rot = std::atan2(rot_unit_x.y(), rot_unit_x.x()); post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3d(offset.x(), offset.y(), z_rot))); -#else - post_event(Vec3dEvent(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3d(offset.x(), offset.y(), v->get_volume_rotation().z()))); -#endif // ENABLE_WORLD_COORDINATE } const int object_idx = v->object_idx(); if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) @@ -3604,22 +3579,10 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) // Rotate instances/volumes. ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { -#if ENABLE_WORLD_COORDINATE + if (selection_mode == Selection::Instance) model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); -#else - model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); -#endif // ENABLE_WORLD_COORDINATE - } - else if (selection_mode == Selection::Volume) { -#if ENABLE_WORLD_COORDINATE + else if (selection_mode == Selection::Volume) model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); -#else - model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); -#endif // ENABLE_WORLD_COORDINATE - } model_object->invalidate_bounding_box(); } } @@ -3680,23 +3643,11 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) // Rotate instances/volumes ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { -#if ENABLE_WORLD_COORDINATE + if (selection_mode == Selection::Instance) model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); -#else - model_object->instances[instance_idx]->set_scaling_factor(v->get_instance_scaling_factor()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); -#endif // ENABLE_WORLD_COORDINATE - } else if (selection_mode == Selection::Volume && volume_idx >= 0) { -#if ENABLE_WORLD_COORDINATE model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); -#else - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - model_object->volumes[volume_idx]->set_scaling_factor(v->get_volume_scaling_factor()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); -#endif // ENABLE_WORLD_COORDINATE } model_object->invalidate_bounding_box(); } @@ -3758,18 +3709,9 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { if (selection_mode == Selection::Instance) -#if ENABLE_WORLD_COORDINATE model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); -#else - model_object->instances[instance_idx]->set_mirror(v->get_instance_mirror()); -#endif // ENABLE_WORLD_COORDINATE else if (selection_mode == Selection::Volume) -#if ENABLE_WORLD_COORDINATE model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); -#else - model_object->volumes[volume_idx]->set_mirror(v->get_volume_mirror()); -#endif // ENABLE_WORLD_COORDINATE - model_object->invalidate_bounding_box(); } } @@ -3792,7 +3734,6 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) m_dirty = true; } -#if ENABLE_WORLD_COORDINATE void GLCanvas3D::do_reset_skew(const std::string& snapshot_type) { if (m_model == nullptr) @@ -3854,7 +3795,6 @@ void GLCanvas3D::do_reset_skew(const std::string& snapshot_type) m_dirty = true; } -#endif // ENABLE_WORLD_COORDINATE void GLCanvas3D::update_gizmos_on_off_state() { @@ -4033,7 +3973,6 @@ void GLCanvas3D::update_sequential_clearance() for (size_t i = 0; i < m_model->objects.size(); ++i) { ModelObject* model_object = m_model->objects[i]; ModelInstance* model_instance0 = model_object->instances.front(); -#if ENABLE_WORLD_COORDINATE Geometry::Transformation trafo = model_instance0->get_transformation(); trafo.set_offset({ 0.0, 0.0, model_instance0->get_offset().z() }); const Polygon hull_2d = offset(model_object->convex_hull_2d(trafo.get_matrix()), @@ -4041,14 +3980,6 @@ void GLCanvas3D::update_sequential_clearance() // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. shrink_factor, jtRound, mitter_limit).front(); -#else - Polygon hull_2d = offset(model_object->convex_hull_2d(Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), - model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects - // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. - shrink_factor, - jtRound, mitter_limit).front(); -#endif // ENABLE_WORLD_COORDINATE Pointf3s& cache_hull_2d = m_sequential_print_clearance.m_hull_2d_cache.emplace_back(Pointf3s()); cache_hull_2d.reserve(hull_2d.points.size()); @@ -5630,9 +5561,9 @@ void GLCanvas3D::_render_selection() if (!m_gizmos.is_running()) m_selection.render(scale_factor); -#if ENABLE_WORLD_COORDINATE_DEBUG +#if ENABLE_MATRICES_DEBUG m_selection.render_debug_window(); -#endif // ENABLE_WORLD_COORDINATE_DEBUG +#endif // ENABLE_MATRICES_DEBUG } void GLCanvas3D::_render_sequential_clearance() @@ -6048,18 +5979,11 @@ void GLCanvas3D::_render_sla_slices() for (const SLAPrintObject::Instance& inst : obj->instances()) { const Camera& camera = wxGetApp().plater()->get_camera(); -#if ENABLE_WORLD_COORDINATE Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::translation_transform({ unscale<double>(inst.shift.x()), unscale<double>(inst.shift.y()), 0.0 }) * Geometry::rotation_transform(inst.rotation * Vec3d::UnitZ()); if (obj->is_left_handed()) view_model_matrix = view_model_matrix * Geometry::scale_transform({ -1.0f, 1.0f, 1.0f }); -#else - const Transform3d view_model_matrix = camera.get_view_matrix() * - Geometry::assemble_transform(Vec3d(unscale<double>(inst.shift.x()), unscale<double>(inst.shift.y()), 0.0), - inst.rotation * Vec3d::UnitZ(), Vec3d::Ones(), - obj->is_left_handed() ? /* The polygons are mirrored by X */ Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); -#endif // ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index e91a727c5..757a90389 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -157,9 +157,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); -#if ENABLE_WORLD_COORDINATE wxDECLARE_EVENT(EVT_GLCANVAS_RESET_SKEW, SimpleEvent); -#endif // ENABLE_WORLD_COORDINATE wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event<bool>); @@ -771,11 +769,7 @@ public: void update_volumes_colors_by_extruder(); -#if ENABLE_WORLD_COORDINATE bool is_dragging() const { return m_gizmos.is_dragging() || (m_moving && !m_mouse.scene_position.isApprox(m_mouse.drag.start_position_3D)); } -#else - bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; } -#endif // ENABLE_WORLD_COORDINATE void render(); // printable_only == false -> render also non printable volumes as grayed @@ -845,9 +839,7 @@ public: void do_rotate(const std::string& snapshot_type); void do_scale(const std::string& snapshot_type); void do_mirror(const std::string& snapshot_type); -#if ENABLE_WORLD_COORDINATE void do_reset_skew(const std::string& snapshot_type); -#endif // ENABLE_WORLD_COORDINATE void update_gizmos_on_off_state(); void reset_all_gizmos() { m_gizmos.reset_all_states(); } diff --git a/src/slic3r/GUI/GUI_Geometry.hpp b/src/slic3r/GUI/GUI_Geometry.hpp index 0d6cf7f4b..b18e4ae5a 100644 --- a/src/slic3r/GUI/GUI_Geometry.hpp +++ b/src/slic3r/GUI/GUI_Geometry.hpp @@ -4,7 +4,6 @@ namespace Slic3r { namespace GUI { -#if ENABLE_WORLD_COORDINATE enum class ECoordinatesType : unsigned char { World, @@ -73,8 +72,6 @@ private: Enum m_value; }; -#endif // ENABLE_WORLD_COORDINATE - } // namespace Slic3r } // namespace GUI diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index ae0e54b45..0731be1f8 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1603,11 +1603,7 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo // First (any) GLVolume of the selected instance. They all share the same instance matrix. const GLVolume* v = selection.get_first_volume(); const Geometry::Transformation inst_transform = v->get_instance_transformation(); -#if ENABLE_WORLD_COORDINATE const Transform3d inv_inst_transform = inst_transform.get_matrix_no_offset().inverse(); -#else - const Transform3d inv_inst_transform = inst_transform.get_matrix(true).inverse(); -#endif // ENABLE_WORLD_COORDINATE const Vec3d instance_offset = v->get_instance_offset(); for (size_t i = 0; i < input_files.size(); ++i) { @@ -1655,15 +1651,9 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo new_volume->source.mesh_offset = model.objects.front()->volumes.front()->source.mesh_offset; if (from_galery) { -#if ENABLE_WORLD_COORDINATE // Transform the new modifier to be aligned with the print bed. new_volume->set_transformation(v->get_instance_transformation().get_matrix_no_offset().inverse()); const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); -#else - // Transform the new modifier to be aligned with the print bed. - const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); - new_volume->set_transformation(Geometry::Transformation::volume_to_bed_transformation(inst_transform, mesh_bb)); -#endif // ENABLE_WORLD_COORDINATE // Set the modifier position. // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. const Vec3d offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - instance_offset; @@ -1732,15 +1722,9 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode // First (any) GLVolume of the selected instance. They all share the same instance matrix. const GLVolume* v = selection.get_first_volume(); -#if ENABLE_WORLD_COORDINATE // Transform the new modifier to be aligned with the print bed. new_volume->set_transformation(v->get_instance_transformation().get_matrix_no_offset().inverse()); const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); -#else - // Transform the new modifier to be aligned with the print bed. - const BoundingBoxf3 mesh_bb = new_volume->mesh().bounding_box(); - new_volume->set_transformation(Geometry::Transformation::volume_to_bed_transformation(v->get_instance_transformation(), mesh_bb)); -#endif // ENABLE_WORLD_COORDINATE // Set the modifier position. Vec3d offset; if (type_name == "Slab") { @@ -1752,11 +1736,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. offset = Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - v->get_instance_offset(); } -#if ENABLE_WORLD_COORDINATE new_volume->set_offset(v->get_instance_transformation().get_matrix_no_offset().inverse() * offset); -#else - new_volume->set_offset(v->get_instance_transformation().get_matrix(true).inverse() * offset); -#endif // ENABLE_WORLD_COORDINATE const wxString name = _L("Generic") + "-" + _(type_name); new_volume->name = into_u8(name); @@ -2876,7 +2856,6 @@ void ObjectList::part_selection_changed() Sidebar& panel = wxGetApp().sidebar(); panel.Freeze(); -#if ENABLE_WORLD_COORDINATE std::string opt_key; if (m_selected_object_id >= 0) { const ManipulationEditor* const editor = wxGetApp().obj_manipul()->get_focused_editor(); @@ -2884,9 +2863,6 @@ void ObjectList::part_selection_changed() opt_key = editor->get_full_opt_name(); } wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event(opt_key, !opt_key.empty()); -#else - wxGetApp().plater()->canvas3D()->handle_sidebar_focus_event("", false); -#endif // ENABLE_WORLD_COORDINATE wxGetApp().plater()->canvas3D()->enable_moving(enable_manipulation); // ysFIXME wxGetApp().obj_manipul() ->UpdateAndShow(update_and_show_manipulations); wxGetApp().obj_settings()->UpdateAndShow(update_and_show_settings); @@ -3705,11 +3681,7 @@ void ObjectList::update_selections() return; sels.Add(m_objects_model->GetItemById(selection.get_object_idx())); } -#if ENABLE_WORLD_COORDINATE else if (selection.is_single_volume_or_modifier()) { -#else - else if (selection.is_single_volume() || selection.is_any_modifier()) { -#endif // ENABLE_WORLD_COORDINATE const auto gl_vol = selection.get_first_volume(); if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx()) return; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index c16d77751..9314a0d06 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -52,17 +52,10 @@ static choice_ctrl* create_word_local_combo(wxWindow *parent) temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); -#if ENABLE_WORLD_COORDINATE temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); temp->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); temp->Select((int)ECoordinatesType::World); -#else - temp->Append(_L("World coordinates")); - temp->Append(_L("Local coordinates")); - temp->SetSelection(0); - temp->SetValue(temp->GetString(0)); -#endif // ENABLE_WORLD_COORDINATE temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed.")); return temp; @@ -88,14 +81,9 @@ void msw_rescale_word_local_combo(choice_ctrl* combo) // Set rescaled size combo->SetSize(size); -#if ENABLE_WORLD_COORDINATE combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::World)); combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Instance)); combo->Append(ObjectManipulation::coordinate_type_str(ECoordinatesType::Local)); -#else - combo->Append(_L("World coordinates")); - combo->Append(_L("Local coordinates")); -#endif // ENABLE_WORLD_COORDINATE combo->SetValue(selection); #else @@ -125,10 +113,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // Load bitmaps to be used for the mirroring buttons: m_mirror_bitmap_on = ScalableBitmap(parent, "mirroring_on"); -#if !ENABLE_WORLD_COORDINATE - m_mirror_bitmap_off = ScalableBitmap(parent, "mirroring_off"); - m_mirror_bitmap_hidden = ScalableBitmap(parent, "mirroring_transparent"); -#endif // !ENABLE_WORLD_COORDINATE const int border = wxOSX ? 0 : 4; const int em = wxGetApp().em_unit(); @@ -172,13 +156,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // Add world local combobox m_word_local_combo = create_word_local_combo(parent); - m_word_local_combo->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent& evt) { -#if ENABLE_WORLD_COORDINATE - this->set_coordinates_type(evt.GetString()); -#else - this->set_world_coordinates(evt.GetSelection() != 1); -#endif // ENABLE_WORLD_COORDINATE - }), m_word_local_combo->GetId()); + m_word_local_combo->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent& evt) { this->set_coordinates_type(evt.GetString()); }), m_word_local_combo->GetId()); // Small trick to correct layouting in different view_mode : // Show empty string of a same height as a m_word_local_combo, when m_word_local_combo is hidden @@ -235,11 +213,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : add_label(&m_scale_Label, L("Scale"), v_sizer); wxStaticText* size_Label {nullptr}; -#if ENABLE_WORLD_COORDINATE add_label(&size_Label, L("Size [World]"), v_sizer); -#else - add_label(&size_Label, L("Size"), v_sizer); -#endif // ENABLE_WORLD_COORDINATE if (wxOSX) set_font_and_background_style(size_Label, wxGetApp().normal_font()); sizer->Add(v_sizer, 0, wxLEFT, border); @@ -271,32 +245,16 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // We will add a button to toggle mirroring to each axis: auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_off", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); -#if ENABLE_WORLD_COORDINATE btn->SetToolTip(_L("Mirror along") + wxString::Format(_L(" %c "), (int)label) + _L("axis")); m_mirror_buttons[axis_idx] = btn; -#else - btn->SetToolTip(wxString::Format(_L("Toggle %c axis mirroring"), (int)label)); - btn->SetBitmapDisabled_(m_mirror_bitmap_hidden); - - m_mirror_buttons[axis_idx].first = btn; - m_mirror_buttons[axis_idx].second = mbShown; -#endif // ENABLE_WORLD_COORDINATE sizer->AddStretchSpacer(2); sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); btn->Bind(wxEVT_BUTTON, [this, axis_idx](wxCommandEvent&) { -#if !ENABLE_WORLD_COORDINATE - Axis axis = (Axis)(axis_idx + X); - if (m_mirror_buttons[axis_idx].second == mbHidden) - return; -#endif // !ENABLE_WORLD_COORDINATE - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); - -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; if (is_local_coordinates()) transformation_type.set_local(); @@ -307,24 +265,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : selection.setup_cache(); selection.mirror((Axis)axis_idx, transformation_type); -#else - if (selection.is_single_volume() || selection.is_single_modifier()) { - GLVolume* volume = const_cast<GLVolume*>(selection.get_first_volume()); - volume->set_volume_mirror(axis, -volume->get_volume_mirror(axis)); - } - else if (selection.is_single_full_instance()) { - for (unsigned int idx : selection.get_volume_idxs()) { - GLVolume* volume = const_cast<GLVolume*>(selection.get_volume(idx)); - volume->set_instance_mirror(axis, -volume->get_instance_mirror(axis)); - } - } - else - return; - // Update mirroring at the GLVolumes. - selection.synchronize_unselected_instances(Selection::SyncRotationType::GENERAL); - selection.synchronize_unselected_volumes(); -#endif // ENABLE_WORLD_COORDINATE // Copy mirroring values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. canvas->do_mirror(L("Set Mirror")); UpdateAndShow(true); @@ -333,12 +274,8 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : editors_grid_sizer->Add(sizer, 0, wxALIGN_CENTER_HORIZONTAL); } -#if ENABLE_WORLD_COORDINATE m_mirror_warning_bitmap = new wxStaticBitmap(parent, wxID_ANY, wxNullBitmap); editors_grid_sizer->Add(m_mirror_warning_bitmap, 0, wxALIGN_CENTER_VERTICAL); -#else - editors_grid_sizer->AddStretchSpacer(1); -#endif // ENABLE_WORLD_COORDINATE editors_grid_sizer->AddStretchSpacer(1); // add EditBoxes @@ -377,7 +314,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); -#if ENABLE_WORLD_COORDINATE if (selection.is_single_volume_or_modifier()) { const GLVolume* volume = selection.get_first_volume(); const double min_z = get_volume_min_z(*volume); @@ -393,19 +329,8 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); change_position_value(2, m_cache.position.z() - min_z); } -#else - if (selection.is_single_volume() || selection.is_single_modifier()) { - const GLVolume* volume = selection.get_first_volume(); - const Vec3d diff = m_cache.position - volume->get_instance_transformation().get_matrix(true).inverse() * (get_volume_min_z(*volume) * Vec3d::UnitZ()); - - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); - change_position_value(0, diff.x()); - change_position_value(1, diff.y()); - change_position_value(2, diff.z()); -#endif // ENABLE_WORLD_COORDINATE } else if (selection.is_single_full_instance()) { -#if ENABLE_WORLD_COORDINATE const double min_z = selection.get_scaled_instance_bounding_box().min.z(); if (!is_world_coordinates()) { const GLVolume* volume = selection.get_first_volume(); @@ -417,20 +342,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : change_position_value(2, diff.z()); } else { -#else - const ModelObjectPtrs& objects = wxGetApp().model().objects; - const int idx = selection.get_object_idx(); - if (0 <= idx && idx < static_cast<int>(objects.size())) { - const ModelObject* mo = wxGetApp().model().objects[idx]; - const double min_z = mo->bounding_box().min.z(); - if (std::abs(min_z) > SINKING_Z_THRESHOLD) { -#endif // ENABLE_WORLD_COORDINATE - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); - change_position_value(2, m_cache.position.z() - min_z); - } -#if !ENABLE_WORLD_COORDINATE + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed")); + change_position_value(2, m_cache.position.z() - min_z); } -#endif // !ENABLE_WORLD_COORDINATE } }); editors_grid_sizer->Add(m_drop_to_bed_button); @@ -447,17 +361,12 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); selection.setup_cache(); -#if ENABLE_WORLD_COORDINATE if (selection.is_single_volume_or_modifier()) { GLVolume* vol = const_cast<GLVolume*>(selection.get_first_volume()); Geometry::Transformation trafo = vol->get_volume_transformation(); trafo.reset_rotation(); vol->set_volume_transformation(trafo); } -#else - if (selection.is_single_volume() || selection.is_single_modifier()) - const_cast<GLVolume*>(selection.get_first_volume())->set_volume_rotation(Vec3d::Zero()); -#endif // ENABLE_WORLD_COORDINATE else if (selection.is_single_full_instance()) { Geometry::Transformation trafo = selection.get_first_volume()->get_instance_transformation(); trafo.reset_rotation(); @@ -489,7 +398,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_reset_scale_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); m_reset_scale_button->SetToolTip(_L("Reset scale")); m_reset_scale_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { -#if ENABLE_WORLD_COORDINATE GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); selection.setup_cache(); @@ -515,12 +423,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : canvas->do_scale(L("Reset scale")); UpdateAndShow(true); -#else - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Reset scale")); - change_scale_value(0, 100.); - change_scale_value(1, 100.); - change_scale_value(2, 100.); -#endif // ENABLE_WORLD_COORDINATE }); editors_grid_sizer->Add(m_reset_scale_button); @@ -531,7 +433,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_main_grid_sizer->Add(editors_grid_sizer, 1, wxEXPAND); -#if ENABLE_WORLD_COORDINATE m_skew_label = new wxStaticText(parent, wxID_ANY, _L("Skew")); m_main_grid_sizer->Add(m_skew_label, 1, wxEXPAND); @@ -548,7 +449,6 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : } }); m_main_grid_sizer->Add(m_reset_skew_button); -#endif // ENABLE_WORLD_COORDINATE m_check_inch = new wxCheckBox(parent, wxID_ANY, _L("Inches")); m_check_inch->SetFont(wxGetApp().normal_font()); @@ -568,9 +468,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : void ObjectManipulation::Show(const bool show) { - if (show != IsShown()) { - // Show all lines of the panel. Some of these lines will be hidden in the lines below. - m_og->Show(show); + if (show != IsShown()) { + // Show all lines of the panel. Some of these lines will be hidden in the lines below. + m_og->Show(show); if (show && wxGetApp().get_mode() != comSimple) { // Show the label and the name of the STL in simple mode only. @@ -581,9 +481,8 @@ void ObjectManipulation::Show(const bool show) } } - if (show) { - // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. -#if ENABLE_WORLD_COORDINATE + if (show) { + // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); bool show_world_local_combo = wxGetApp().get_mode() != comSimple && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()); if (selection.is_single_volume_or_modifier() && m_word_local_combo->GetCount() < 3) { @@ -600,12 +499,10 @@ void ObjectManipulation::Show(const bool show) m_word_local_combo->Select((int)ECoordinatesType::World); this->set_coordinates_type(m_word_local_combo->GetString(m_word_local_combo->GetSelection())); } -#else - bool show_world_local_combo = wxGetApp().plater()->canvas3D()->get_selection().is_single_full_instance() && wxGetApp().get_mode() != comSimple; -#endif // ENABLE_WORLD_COORDINATE + m_word_local_combo->Show(show_world_local_combo); m_empty_str->Show(!show_world_local_combo); - } + } } bool ObjectManipulation::IsShown() @@ -628,10 +525,7 @@ void ObjectManipulation::Enable(const bool enadle) for (auto editor : m_editors) editor->Enable(enadle); for (wxWindow* win : std::initializer_list<wxWindow*>{ m_reset_scale_button, m_reset_rotation_button, m_drop_to_bed_button, m_check_inch, m_lock_bnt -#if ENABLE_WORLD_COORDINATE - ,m_reset_skew_button -#endif // ENABLE_WORLD_COORDINATE - }) + , m_reset_skew_button }) win->Enable(enadle); } @@ -639,11 +533,7 @@ void ObjectManipulation::DisableScale() { for (auto editor : m_editors) editor->Enable(editor->has_opt_key("scale") || editor->has_opt_key("size") ? false : true); - for (wxWindow* win : std::initializer_list<wxWindow*>{ m_reset_scale_button, m_lock_bnt -#if ENABLE_WORLD_COORDINATE - ,m_reset_skew_button -#endif // ENABLE_WORLD_COORDINATE - }) + for (wxWindow* win : std::initializer_list<wxWindow*>{ m_reset_scale_button, m_lock_bnt, m_reset_skew_button }) win->Enable(false); } @@ -711,52 +601,24 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_rotate_label_string = L("Rotation"); m_new_scale_label_string = L("Scale factors"); -#if !ENABLE_WORLD_COORDINATE - if (wxGetApp().get_mode() == comSimple) - m_world_coordinates = true; -#endif // !ENABLE_WORLD_COORDINATE - ObjectList* obj_list = wxGetApp().obj_list(); if (selection.is_single_full_instance()) { // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one const GLVolume* volume = selection.get_first_volume(); -#if !ENABLE_WORLD_COORDINATE - m_new_position = volume->get_instance_offset(); - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - if (m_world_coordinates && ! m_uniform_scale && - ! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Manipulating an instance in the world coordinate system, rotation is not multiples of ninety degrees, therefore enforce uniform scaling. - m_uniform_scale = true; - m_lock_bnt->SetLock(true); - } -#endif // !ENABLE_WORLD_COORDINATE - -#if ENABLE_WORLD_COORDINATE if (is_world_coordinates()) { m_new_position = volume->get_instance_offset(); m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); m_new_scale = m_new_size.cwiseQuotient(selection.get_unscaled_instance_bounding_box().size()) * 100.0; m_new_rotate_label_string = L("Rotate (relative)"); -#else - if (m_world_coordinates) { - m_new_scale = m_new_size.cwiseQuotient(selection.get_unscaled_instance_bounding_box().size()) * 100.0; - m_new_size = selection.get_scaled_instance_bounding_box().size(); - m_new_rotate_label_string = L("Rotate"); -#endif // ENABLE_WORLD_COORDINATE m_new_rotation = Vec3d::Zero(); } else { -#if ENABLE_WORLD_COORDINATE m_new_move_label_string = L("Translate (relative) [World]"); m_new_rotate_label_string = L("Rotate (relative)"); m_new_position = Vec3d::Zero(); m_new_rotation = Vec3d::Zero(); m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); -#else - m_new_rotation = volume->get_instance_rotation() * (180.0 / M_PI); - m_new_size = volume->get_instance_scaling_factor().cwiseProduct(wxGetApp().model().objects[volume->object_idx()]->raw_mesh_bounding_box().size()); -#endif // ENABLE_WORLD_COORDINATE m_new_scale = m_new_size.cwiseQuotient(selection.get_full_unscaled_instance_local_bounding_box().size()) * 100.0; } @@ -767,23 +629,14 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_position = box.center(); m_new_rotation = Vec3d::Zero(); m_new_scale = Vec3d(100.0, 100.0, 100.0); -#if ENABLE_WORLD_COORDINATE m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); -#else - m_new_size = box.size(); -#endif // ENABLE_WORLD_COORDINATE m_new_rotate_label_string = L("Rotate"); m_new_scale_label_string = L("Scale"); m_new_enabled = true; } -#if ENABLE_WORLD_COORDINATE else if (selection.is_single_volume_or_modifier()) { -#else - else if (selection.is_single_modifier() || selection.is_single_volume()) { -#endif // ENABLE_WORLD_COORDINATE // the selection contains a single volume const GLVolume* volume = selection.get_first_volume(); -#if ENABLE_WORLD_COORDINATE if (is_world_coordinates()) { const Geometry::Transformation trafo(volume->world_matrix()); @@ -805,23 +658,13 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); } else { -#endif // ENABLE_WORLD_COORDINATE m_new_position = volume->get_volume_offset(); -#if ENABLE_WORLD_COORDINATE m_new_rotate_label_string = L("Rotate (relative)"); -#else - m_new_rotate_label_string = L("Rotate"); -#endif // ENABLE_WORLD_COORDINATE m_new_rotation = Vec3d::Zero(); -#if ENABLE_WORLD_COORDINATE m_new_scale_label_string = L("Scale"); m_new_scale = Vec3d(100.0, 100.0, 100.0); m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); } -#else - m_new_scale = volume->get_volume_scaling_factor() * 100.0; - m_new_size = volume->get_instance_scaling_factor().cwiseProduct(volume->get_volume_scaling_factor().cwiseProduct(volume->bounding_box().size())); -#endif // ENABLE_WORLD_COORDINATE m_new_enabled = true; } else if (obj_list->is_connectors_item_selected() || obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) { @@ -829,11 +672,7 @@ void ObjectManipulation::update_settings_value(const Selection& selection) m_new_move_label_string = L("Translate"); m_new_rotate_label_string = L("Rotate"); m_new_scale_label_string = L("Scale"); -#if ENABLE_WORLD_COORDINATE m_new_size = selection.get_bounding_box_in_current_reference_system().first.size(); -#else - m_new_size = selection.get_bounding_box().size(); -#endif // ENABLE_WORLD_COORDINATE m_new_enabled = true; } else { @@ -899,29 +738,12 @@ void ObjectManipulation::update_if_dirty() update(m_cache.rotation, m_cache.rotation_rounded, meRotation, m_new_rotation); } -#if !ENABLE_WORLD_COORDINATE - if (selection.requires_uniform_scale()) { - m_lock_bnt->SetLock(true); - m_lock_bnt->SetToolTip(_L("You cannot use non-uniform scaling mode for multiple objects/parts selection")); - m_lock_bnt->disable(); - } - else { -#endif // !ENABLE_WORLD_COORDINATE - m_lock_bnt->SetLock(m_uniform_scale); - m_lock_bnt->SetToolTip(wxEmptyString); - m_lock_bnt->enable(); -#if ENABLE_WORLD_COORDINATE - if (m_word_local_combo->GetSelection() != (int)m_coordinates_type) - m_word_local_combo->SetSelection((int)m_coordinates_type); -#else - } + m_lock_bnt->SetLock(m_uniform_scale); + m_lock_bnt->SetToolTip(wxEmptyString); + m_lock_bnt->enable(); - { - int new_selection = m_world_coordinates ? 0 : 1; - if (m_word_local_combo->GetSelection() != new_selection) - m_word_local_combo->SetSelection(new_selection); - } -#endif // ENABLE_WORLD_COORDINATE + if (m_word_local_combo->GetSelection() != (int)m_coordinates_type) + m_word_local_combo->SetSelection((int)m_coordinates_type); if (m_new_enabled) m_og->enable(); @@ -936,9 +758,6 @@ void ObjectManipulation::update_if_dirty() m_dirty = false; } - - -#if ENABLE_WORLD_COORDINATE void ObjectManipulation::update_reset_buttons_visibility() { GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); @@ -990,109 +809,13 @@ void ObjectManipulation::update_reset_buttons_visibility() } }); } -#else -void ObjectManipulation::update_reset_buttons_visibility() -{ - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - if (!canvas) - return; - const Selection& selection = canvas->get_selection(); - - bool show_rotation = false; - bool show_scale = false; - bool show_drop_to_bed = false; - if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume* volume = selection.get_first_volume(); - Vec3d rotation; - Vec3d scale; - double min_z = 0.0; - - if (selection.is_single_full_instance()) { - rotation = volume->get_instance_rotation(); - scale = volume->get_instance_scaling_factor(); - min_z = selection.get_scaled_instance_bounding_box().min.z(); - } - else { - rotation = volume->get_volume_rotation(); - scale = volume->get_volume_scaling_factor(); - min_z = get_volume_min_z(*volume); - } - show_rotation = !rotation.isApprox(Vec3d::Zero()); - show_scale = !scale.isApprox(Vec3d::Ones()); - show_drop_to_bed = std::abs(min_z) > SINKING_Z_THRESHOLD; - } - - wxGetApp().CallAfter([this, show_rotation, show_scale, show_drop_to_bed] { - // There is a case (under OSX), when this function is called after the Manipulation panel is hidden - // So, let check if Manipulation panel is still shown for this moment - if (!this->IsShown()) - return; - m_reset_rotation_button->Show(show_rotation); - m_reset_scale_button->Show(show_scale); - m_drop_to_bed_button->Show(show_drop_to_bed); - - // Because of CallAfter we need to layout sidebar after Show/hide of reset buttons one more time - Sidebar& panel = wxGetApp().sidebar(); - if (!panel.IsFrozen()) { - panel.Freeze(); - panel.Layout(); - panel.Thaw(); - } - }); -} -#endif // ENABLE_WORLD_COORDINATE - - void ObjectManipulation::update_mirror_buttons_visibility() { -#if ENABLE_WORLD_COORDINATE const bool can_mirror = wxGetApp().plater()->can_mirror(); for (ScalableButton* button : m_mirror_buttons) { button->Enable(can_mirror); } -#else - GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); - Selection& selection = canvas->get_selection(); - - std::array<MirrorButtonState, 3> new_states = { mbHidden, mbHidden, mbHidden }; - - if (!m_world_coordinates) { - if (selection.is_single_full_instance() || selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume* volume = selection.get_first_volume(); - Vec3d mirror; - - if (selection.is_single_full_instance()) - mirror = volume->get_instance_mirror(); - else - mirror = volume->get_volume_mirror(); - - for (unsigned char i=0; i<3; ++i) - new_states[i] = (mirror[i] < 0. ? mbActive : mbShown); - } - } - else { - // the mirroring buttons should be hidden in world coordinates, - // unless we make it actually mirror in world coords. - } - - // Hiding the buttons through Hide() always messed up the sizers. As a workaround, the button - // is assigned a transparent bitmap. We must of course remember the actual state. - wxGetApp().CallAfter([this, new_states]{ - for (int i=0; i<3; ++i) { - if (new_states[i] != m_mirror_buttons[i].second) { - const ScalableBitmap* bmp = nullptr; - switch (new_states[i]) { - case mbHidden : bmp = &m_mirror_bitmap_hidden; m_mirror_buttons[i].first->Enable(false); break; - case mbShown : bmp = &m_mirror_bitmap_off; m_mirror_buttons[i].first->Enable(true); break; - case mbActive : bmp = &m_mirror_bitmap_on; m_mirror_buttons[i].first->Enable(true); break; - } - m_mirror_buttons[i].first->SetBitmap_(*bmp); - m_mirror_buttons[i].second = new_states[i]; - } - } - }); -#endif // ENABLE_WORLD_COORDINATE } @@ -1124,7 +847,6 @@ void ObjectManipulation::update_warning_icon_state(const MeshErrorsInfo& warning m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } -#if ENABLE_WORLD_COORDINATE wxString ObjectManipulation::coordinate_type_str(ECoordinatesType type) { switch (type) @@ -1135,7 +857,6 @@ wxString ObjectManipulation::coordinate_type_str(ECoordinatesType type) default: { assert(false); return _L("Unknown"); } } } -#endif // ENABLE_WORLD_COORDINATE void ObjectManipulation::reset_settings_value() { @@ -1160,7 +881,6 @@ void ObjectManipulation::change_position_value(int axis, double value) auto canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); selection.setup_cache(); -#if ENABLE_WORLD_COORDINATE TransformationType trafo_type; trafo_type.set_relative(); switch (get_coordinates_type()) @@ -1170,9 +890,6 @@ void ObjectManipulation::change_position_value(int axis, double value) default: { break; } } selection.translate(position - m_cache.position, trafo_type); -#else - selection.translate(position - m_cache.position, selection.requires_local_axes()); -#endif // ENABLE_WORLD_COORDINATE canvas->do_move(L("Set Position")); m_cache.position = position; @@ -1191,7 +908,6 @@ void ObjectManipulation::change_rotation_value(int axis, double value) GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); Selection& selection = canvas->get_selection(); -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; transformation_type.set_relative(); if (selection.is_single_full_instance()) @@ -1202,16 +918,6 @@ void ObjectManipulation::change_rotation_value(int axis, double value) if (is_instance_coordinates()) transformation_type.set_instance(); -#else - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance() || selection.requires_local_axes()) - transformation_type.set_independent(); - if (selection.is_single_full_instance() && ! m_world_coordinates) { - //FIXME Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. - // transformation_type.set_absolute(); - transformation_type.set_local(); - } -#endif // ENABLE_WORLD_COORDINATE selection.setup_cache(); selection.rotate( @@ -1235,7 +941,6 @@ void ObjectManipulation::change_scale_value(int axis, double value) Vec3d scale = m_cache.scale; scale(axis) = value; -#if ENABLE_WORLD_COORDINATE const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); Vec3d ref_scale = m_cache.scale; if (selection.is_single_volume_or_modifier()) { @@ -1246,9 +951,6 @@ void ObjectManipulation::change_scale_value(int axis, double value) ref_scale = 100.0 * Vec3d::Ones(); this->do_scale(axis, scale.cwiseQuotient(ref_scale)); -#else - this->do_scale(axis, 0.01 * scale); -#endif // ENABLE_WORLD_COORDINATE m_cache.scale = scale; m_cache.scale_rounded(axis) = DBL_MAX; @@ -1277,39 +979,18 @@ void ObjectManipulation::change_size_value(int axis, double value) const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); Vec3d ref_size = m_cache.size; -#if ENABLE_WORLD_COORDINATE if (selection.is_single_volume_or_modifier()) { size = size.cwiseQuotient(ref_size); ref_size = Vec3d::Ones(); -#else - if (selection.is_single_volume() || selection.is_single_modifier()) { - const GLVolume* v = selection.get_first_volume(); - const Vec3d local_size = size.cwiseQuotient(v->get_instance_scaling_factor()); - const Vec3d local_ref_size = v->bounding_box().size().cwiseProduct(v->get_volume_scaling_factor()); - const Vec3d local_change = local_size.cwiseQuotient(local_ref_size); - - size = local_change.cwiseProduct(v->get_volume_scaling_factor()); - ref_size = Vec3d::Ones(); -#endif // ENABLE_WORLD_COORDINATE } else if (selection.is_single_full_instance()) { -#if ENABLE_WORLD_COORDINATE if (is_world_coordinates()) ref_size = selection.get_full_unscaled_instance_bounding_box().size(); else ref_size = selection.get_full_unscaled_instance_local_bounding_box().size(); -#else - ref_size = m_world_coordinates ? - selection.get_unscaled_instance_bounding_box().size() : - wxGetApp().model().objects[selection.get_first_volume()->object_idx()]->raw_mesh_bounding_box().size(); -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE this->do_size(axis, size.cwiseQuotient(ref_size)); -#else - this->do_scale(axis, size.cwiseQuotient(ref_size)); -#endif // ENABLE_WORLD_COORDINATE m_cache.size = size; m_cache.size_rounded(axis) = DBL_MAX; @@ -1318,40 +999,22 @@ void ObjectManipulation::change_size_value(int axis, double value) void ObjectManipulation::do_scale(int axis, const Vec3d &scale) const { - Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); -#if !ENABLE_WORLD_COORDINATE - Vec3d scaling_factor = scale; -#endif // !ENABLE_WORLD_COORDINATE - -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; if (is_local_coordinates()) transformation_type.set_local(); else if (is_instance_coordinates()) transformation_type.set_instance(); + Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); if (selection.is_single_volume_or_modifier() && !is_local_coordinates()) transformation_type.set_relative(); const Vec3d scaling_factor = m_uniform_scale ? scale(axis) * Vec3d::Ones() : scale; -#else - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance()) { - transformation_type.set_absolute(); - if (! m_world_coordinates) - transformation_type.set_local(); - } - - if (m_uniform_scale || selection.requires_uniform_scale()) - scaling_factor = scale(axis) * Vec3d::Ones(); -#endif // ENABLE_WORLD_COORDINATE - selection.setup_cache(); selection.scale(scaling_factor, transformation_type); wxGetApp().plater()->canvas3D()->do_scale(L("Set Scale")); } -#if ENABLE_WORLD_COORDINATE void ObjectManipulation::do_size(int axis, const Vec3d& scale) const { Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); @@ -1367,7 +1030,6 @@ void ObjectManipulation::do_size(int axis, const Vec3d& scale) const selection.scale(scaling_factor, transformation_type); wxGetApp().plater()->canvas3D()->do_scale(L("Set Size")); } -#endif // ENABLE_WORLD_COORDINATE void ObjectManipulation::on_change(const std::string& opt_key, int axis, double new_value) { @@ -1405,51 +1067,14 @@ void ObjectManipulation::on_change(const std::string& opt_key, int axis, double void ObjectManipulation::set_uniform_scaling(const bool use_uniform_scale) { -#if ENABLE_WORLD_COORDINATE if (!use_uniform_scale) // Recalculate cached values at this panel, refresh the screen. this->UpdateAndShow(true); m_uniform_scale = use_uniform_scale; - set_dirty(); -#else - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); - if (selection.is_single_full_instance() && m_world_coordinates && !use_uniform_scale) { - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one - const GLVolume* volume = selection.get_first_volume(); - // Is the angle close to a multiple of 90 degrees? - if (!Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Cannot apply scaling in the world coordinate system. - //wxMessageDialog dlg(GUI::wxGetApp().mainframe, - MessageDialog dlg(GUI::wxGetApp().mainframe, - _L("The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" - "Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" - "once the rotation is embedded into the object coordinates.") + "\n" + - _L("This operation is irreversible.\n" - "Do you want to proceed?"), - SLIC3R_APP_NAME, - wxYES_NO | wxCANCEL | wxCANCEL_DEFAULT | wxICON_QUESTION); - if (dlg.ShowModal() != wxID_YES) { - // Enforce uniform scaling. - m_lock_bnt->SetLock(true); - return; - } - // 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); - // Update the 3D scene, selections etc. - wxGetApp().plater()->update(); - // Recalculate cached values at this panel, refresh the screen. - this->UpdateAndShow(true); - } - } - - m_uniform_scale = use_uniform_scale; -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE void ObjectManipulation::set_coordinates_type(ECoordinatesType type) { if (wxGetApp().get_mode() == comSimple) @@ -1474,7 +1099,6 @@ ECoordinatesType ObjectManipulation::get_coordinates_type() const return m_coordinates_type; } -#endif // ENABLE_WORLD_COORDINATE void ObjectManipulation::msw_rescale() { @@ -1515,26 +1139,16 @@ void ObjectManipulation::sys_color_changed() editor->sys_color_changed(this); m_mirror_bitmap_on.sys_color_changed(); -#if !ENABLE_WORLD_COORDINATE - m_mirror_bitmap_off.sys_color_changed(); - m_mirror_bitmap_hidden.sys_color_changed(); -#endif // !ENABLE_WORLD_COORDINATE m_reset_scale_button->sys_color_changed(); m_reset_rotation_button->sys_color_changed(); m_drop_to_bed_button->sys_color_changed(); m_lock_bnt->sys_color_changed(); -#if ENABLE_WORLD_COORDINATE for (int id = 0; id < 3; ++id) { m_mirror_buttons[id]->sys_color_changed(); } -#else - for (int id = 0; id < 3; ++id) - m_mirror_buttons[id].first->sys_color_changed(); -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE void ObjectManipulation::set_coordinates_type(const wxString& type_string) { ECoordinatesType type = ECoordinatesType::World; @@ -1545,7 +1159,6 @@ void ObjectManipulation::set_coordinates_type(const wxString& type_string) this->set_coordinates_type(type); } -#endif // ENABLE_WORLD_COORDINATE static const char axes[] = { 'x', 'y', 'z' }; ManipulationEditor::ManipulationEditor(ObjectManipulation* parent, diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 69022dde7..1523ad1fa 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -5,9 +5,7 @@ #include "GUI_ObjectSettings.hpp" #include "GUI_ObjectList.hpp" -#if ENABLE_WORLD_COORDINATE #include "GUI_Geometry.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "libslic3r/Point.hpp" #include <float.h> @@ -60,9 +58,7 @@ public: void set_value(const wxString& new_value); void kill_focus(ObjectManipulation *parent); -#if ENABLE_WORLD_COORDINATE const std::string& get_full_opt_name() const { return m_full_opt_name; } -#endif // ENABLE_WORLD_COORDINATE bool has_opt_key(const std::string& key) { return m_opt_key == key; } @@ -125,31 +121,15 @@ private: // Non-owning pointers to the reset buttons, so we can hide and show them. ScalableButton* m_reset_scale_button{ nullptr }; ScalableButton* m_reset_rotation_button{ nullptr }; -#if ENABLE_WORLD_COORDINATE ScalableButton* m_reset_skew_button{ nullptr }; -#endif // ENABLE_WORLD_COORDINATE ScalableButton* m_drop_to_bed_button{ nullptr }; wxCheckBox* m_check_inch {nullptr}; -#if ENABLE_WORLD_COORDINATE std::array<ScalableButton*, 3> m_mirror_buttons; -#else - // Mirroring buttons and their current state - enum MirrorButtonState { - mbHidden, - mbShown, - mbActive - }; - std::array<std::pair<ScalableButton*, MirrorButtonState>, 3> m_mirror_buttons; -#endif // ENABLE_WORLD_COORDINATE // Bitmaps for the mirroring buttons. ScalableBitmap m_mirror_bitmap_on; -#if !ENABLE_WORLD_COORDINATE - ScalableBitmap m_mirror_bitmap_off; - ScalableBitmap m_mirror_bitmap_hidden; -#endif // !ENABLE_WORLD_COORDINATE // Needs to be updated from OnIdle? bool m_dirty = false; @@ -163,37 +143,21 @@ private: Vec3d m_new_size; bool m_new_enabled {true}; bool m_uniform_scale {true}; -#if ENABLE_WORLD_COORDINATE ECoordinatesType m_coordinates_type{ ECoordinatesType::World }; -#else - // Does the object manipulation panel work in World or Local coordinates? - bool m_world_coordinates = true; -#endif // ENABLE_WORLD_COORDINATE LockButton* m_lock_bnt{ nullptr }; choice_ctrl* m_word_local_combo { nullptr }; ScalableBitmap m_manifold_warning_bmp; wxStaticBitmap* m_fix_throught_netfab_bitmap{ nullptr }; -#if ENABLE_WORLD_COORDINATE wxStaticBitmap* m_mirror_warning_bitmap{ nullptr }; -#endif // ENABLE_WORLD_COORDINATE -#if ENABLE_WORLD_COORDINATE // Currently focused editor (nullptr if none) ManipulationEditor* m_focused_editor{ nullptr }; -#else -#ifndef __APPLE__ - // Currently focused editor (nullptr if none) - ManipulationEditor* m_focused_editor {nullptr}; -#endif // __APPLE__ -#endif // ENABLE_WORLD_COORDINATE wxFlexGridSizer* m_main_grid_sizer; wxFlexGridSizer* m_labels_grid_sizer; -#if ENABLE_WORLD_COORDINATE wxStaticText* m_skew_label{ nullptr }; -#endif // ENABLE_WORLD_COORDINATE // sizers, used for msw_rescale wxBoxSizer* m_word_local_combo_sizer; @@ -221,17 +185,12 @@ public: void set_uniform_scaling(const bool use_uniform_scale); bool get_uniform_scaling() const { return m_uniform_scale; } -#if ENABLE_WORLD_COORDINATE + void set_coordinates_type(ECoordinatesType type); ECoordinatesType get_coordinates_type() const; bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } -#else - // Does the object manipulation panel work in World or Local coordinates? - void set_world_coordinates(const bool world_coordinates) { m_world_coordinates = world_coordinates; this->UpdateAndShow(true); } - bool get_world_coordinates() const { return m_world_coordinates; } -#endif // ENABLE_WORLD_COORDINATE void reset_cache() { m_cache.reset(); } #ifndef __APPLE__ @@ -247,22 +206,12 @@ public: void sys_color_changed(); void on_change(const std::string& opt_key, int axis, double new_value); void set_focused_editor(ManipulationEditor* focused_editor) { -#if ENABLE_WORLD_COORDINATE m_focused_editor = focused_editor; -#else -#ifndef __APPLE__ - m_focused_editor = focused_editor; -#endif // __APPLE__ -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE ManipulationEditor* get_focused_editor() { return m_focused_editor; } -#endif // ENABLE_WORLD_COORDINATE -#if ENABLE_WORLD_COORDINATE static wxString coordinate_type_str(ECoordinatesType type); -#endif // ENABLE_WORLD_COORDINATE private: void reset_settings_value(); @@ -279,11 +228,9 @@ private: void change_scale_value(int axis, double value); void change_size_value(int axis, double value); void do_scale(int axis, const Vec3d &scale) const; -#if ENABLE_WORLD_COORDINATE void do_size(int axis, const Vec3d& scale) const; void set_coordinates_type(const wxString& type_string); -#endif // ENABLE_WORLD_COORDINATE }; }} diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index a884a0589..1f1c72be7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -262,39 +262,13 @@ bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { return true; } else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) { -#if ENABLE_WORLD_COORDINATE do_stop_dragging(is_leaving); -#else - for (auto &grabber : m_grabbers) grabber.dragging = false; - m_dragging = false; - - // NOTE: This should be part of GLCanvas3D - // Reset hover_id when leave window - if (is_leaving) m_parent.mouse_up_cleanup(); - - on_stop_dragging(); - - // There is prediction that after draggign, data are changed - // Data are updated twice also by canvas3D::reload_scene. - // Should be fixed. - m_parent.get_gizmos_manager().update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - - // Let the plater know that the dragging finished, so a delayed - // refresh of the scene with the background processing data should - // be performed. - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - m_parent.refresh_camera_scene_box(); -#endif // ENABLE_WORLD_COORDINATE return true; } } return false; } -#if ENABLE_WORLD_COORDINATE void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup) { for (auto& grabber : m_grabbers) grabber.dragging = false; @@ -320,7 +294,6 @@ void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup) // updates camera target constraints m_parent.refresh_camera_scene_box(); } -#endif // ENABLE_WORLD_COORDINATE std::string GLGizmoBase::format(float value, unsigned int decimals) const { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 108b869da..165248ec1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -235,9 +235,7 @@ protected: /// <returns>same as on_mouse</returns> bool use_grabbers(const wxMouseEvent &mouse_event); -#if ENABLE_WORLD_COORDINATE void do_stop_dragging(bool perform_mouse_cleanup); -#endif // ENABLE_WORLD_COORDINATE private: // Flag for dirty visible state of Gizmo diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 0c89d7620..22cd35c7a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -357,11 +357,7 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) ++mesh_id; -#if ENABLE_WORLD_COORDINATE const Transform3d trafo_matrix = mi->get_matrix_no_offset() * mv->get_matrix_no_offset(); -#else - const Transform3d trafo_matrix = mi->get_matrix(true) * mv->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE Vec3f down = (trafo_matrix.inverse() * (-Vec3d::UnitZ())).cast<float>().normalized(); Vec3f limit = (trafo_matrix.inverse() * Vec3d(std::sin(threshold), 0, -std::cos(threshold))).cast<float>().normalized(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index 947ef2df8..34faa288a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -179,11 +179,7 @@ void GLGizmoFlatten::update_planes() ch = ch.convex_hull_3d(); m_planes.clear(); on_unregister_raycasters_for_picking(); -#if ENABLE_WORLD_COORDINATE const Transform3d inst_matrix = mo->instances.front()->get_matrix_no_offset(); -#else - const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE // Following constants are used for discarding too small polygons. const float minimal_area = 5.f; // in square mm (world coordinates) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index d04a9cf2f..807a91e35 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -135,11 +135,7 @@ void GLGizmoHollow::render_points(const Selection& selection) trafo.translation()(2) += shift_z; const Geometry::Transformation transformation{trafo}; -#if ENABLE_WORLD_COORDINATE const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); -#else - const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 98f183b74..d456f4d7a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -2,9 +2,7 @@ #include "GLGizmoMove.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" -#if ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "slic3r/GUI/Plater.hpp" #include "libslic3r/Model.hpp" @@ -23,8 +21,7 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filenam std::string GLGizmoMove3D::get_tooltip() const { -#if ENABLE_WORLD_COORDINATE - if (m_hover_id == 0) + if (m_hover_id == 0) return "X: " + format(m_displacement.x(), 2); else if (m_hover_id == 1) return "Y: " + format(m_displacement.y(), 2); @@ -32,20 +29,6 @@ std::string GLGizmoMove3D::get_tooltip() const return "Z: " + format(m_displacement.z(), 2); else return ""; -#else - const Selection& selection = m_parent.get_selection(); - const bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - if (m_hover_id == 0 || m_grabbers[0].dragging) - return "X: " + format(show_position ? position.x() : m_displacement.x(), 2); - else if (m_hover_id == 1 || m_grabbers[1].dragging) - return "Y: " + format(show_position ? position.y() : m_displacement.y(), 2); - else if (m_hover_id == 2 || m_grabbers[2].dragging) - return "Z: " + format(show_position ? position.z() : m_displacement.z(), 2); - else - return ""; -#endif // ENABLE_WORLD_COORDINATE } bool GLGizmoMove3D::on_mouse(const wxMouseEvent &mouse_event) { @@ -87,7 +70,6 @@ void GLGizmoMove3D::on_start_dragging() assert(m_hover_id != -1); m_displacement = Vec3d::Zero(); -#if ENABLE_WORLD_COORDINATE const Selection& selection = m_parent.get_selection(); const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); if (coordinates_type == ECoordinatesType::World) @@ -103,13 +85,6 @@ void GLGizmoMove3D::on_start_dragging() m_starting_box_center = m_center; m_starting_box_bottom_center = m_center; m_starting_box_bottom_center.z() = m_bounding_box.min.z(); -#else - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_starting_drag_position = m_grabbers[m_hover_id].center; - m_starting_box_center = box.center(); - m_starting_box_bottom_center = box.center(); - m_starting_box_bottom_center.z() = box.min.z(); -#endif // ENABLE_WORLD_COORDINATE } void GLGizmoMove3D::on_stop_dragging() @@ -128,7 +103,6 @@ void GLGizmoMove3D::on_dragging(const UpdateData& data) m_displacement.z() = calc_projection(data); Selection &selection = m_parent.get_selection(); -#if ENABLE_WORLD_COORDINATE TransformationType trafo_type; trafo_type.set_relative(); switch (wxGetApp().obj_manipul()->get_coordinates_type()) @@ -138,9 +112,6 @@ void GLGizmoMove3D::on_dragging(const UpdateData& data) default: { break; } } selection.translate(m_displacement, trafo_type); -#else - selection.translate(m_displacement); -#endif // ENABLE_WORLD_COORDINATE } void GLGizmoMove3D::on_render() @@ -148,7 +119,6 @@ void GLGizmoMove3D::on_render() glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_WORLD_COORDINATE const Selection& selection = m_parent.get_selection(); const auto& [box, box_trafo] = selection.get_bounding_box_in_current_reference_system(); m_bounding_box = box; @@ -172,42 +142,16 @@ void GLGizmoMove3D::on_render() // z axis m_grabbers[2].center = { 0.0, 0.0, half_box_size.z() + Offset }; m_grabbers[2].color = AXES_COLOR[2]; -#else - const Selection& selection = m_parent.get_selection(); - const BoundingBoxf3& box = selection.get_bounding_box(); - const Vec3d& center = box.center(); - - // x axis - m_grabbers[0].center = { box.max.x() + Offset, center.y(), center.z() }; - m_grabbers[0].color = AXES_COLOR[0]; - - // y axis - m_grabbers[1].center = { center.x(), box.max.y() + Offset, center.z() }; - m_grabbers[1].color = AXES_COLOR[1]; - - // z axis - m_grabbers[2].center = { center.x(), center.y(), box.max.z() + Offset }; - m_grabbers[2].color = AXES_COLOR[2]; -#endif // ENABLE_WORLD_COORDINATE #if ENABLE_GL_CORE_PROFILE if (!OpenGLManager::get_gl_info().is_core_profile()) #endif // ENABLE_GL_CORE_PROFILE glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); -#if ENABLE_WORLD_COORDINATE auto render_grabber_connection = [this, &zero](unsigned int id) { -#else - auto render_grabber_connection = [this, ¢er](unsigned int id) { -#endif // ENABLE_WORLD_COORDINATE if (m_grabbers[id].enabled) { -#if ENABLE_WORLD_COORDINATE if (!m_grabber_connections[id].model.is_initialized() || !m_grabber_connections[id].old_center.isApprox(m_grabbers[id].center)) { m_grabber_connections[id].old_center = m_grabbers[id].center; -#else - if (!m_grabber_connections[id].model.is_initialized() || !m_grabber_connections[id].old_center.isApprox(center)) { - m_grabber_connections[id].old_center = center; -#endif // ENABLE_WORLD_COORDINATE m_grabber_connections[id].model.reset(); GLModel::Geometry init_data; @@ -217,11 +161,7 @@ void GLGizmoMove3D::on_render() init_data.indices.reserve(2); // vertices -#if ENABLE_WORLD_COORDINATE init_data.add_vertex((Vec3f)zero.cast<float>()); -#else - init_data.add_vertex((Vec3f)center.cast<float>()); -#endif // ENABLE_WORLD_COORDINATE init_data.add_vertex((Vec3f)m_grabbers[id].center.cast<float>()); // indices @@ -243,11 +183,7 @@ void GLGizmoMove3D::on_render() if (shader != nullptr) { shader->start_using(); const Camera& camera = wxGetApp().plater()->get_camera(); -#if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); -#else - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); -#endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #if ENABLE_GL_CORE_PROFILE const std::array<int, 4>& viewport = camera.get_viewport(); @@ -265,11 +201,7 @@ void GLGizmoMove3D::on_render() } // draw grabbers -#if ENABLE_WORLD_COORDINATE render_grabbers(m_bounding_box); -#else - render_grabbers(box); -#endif // ENABLE_WORLD_COORDINATE } else { // draw axis @@ -282,11 +214,7 @@ void GLGizmoMove3D::on_render() shader->start_using(); const Camera& camera = wxGetApp().plater()->get_camera(); -#if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix()* base_matrix); -#else - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); -#endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #if ENABLE_GL_CORE_PROFILE const std::array<int, 4>& viewport = camera.get_viewport(); @@ -304,11 +232,7 @@ void GLGizmoMove3D::on_render() shader->start_using(); shader->set_uniform("emission_factor", 0.1f); // draw grabber -#if ENABLE_WORLD_COORDINATE const Vec3d box_size = m_bounding_box.size(); -#else - const Vec3d box_size = box.size(); -#endif // ENABLE_WORLD_COORDINATE const float mean_size = (float)((box_size.x() + box_size.y() + box_size.z()) / 3.0); m_grabbers[m_hover_id].render(true, mean_size); shader->stop_using(); @@ -353,7 +277,6 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const return projection; } -#if ENABLE_WORLD_COORDINATE Transform3d GLGizmoMove3D::local_transform(const Selection& selection) const { Transform3d ret = Geometry::translation_transform(m_center); @@ -366,7 +289,6 @@ Transform3d GLGizmoMove3D::local_transform(const Selection& selection) const } return ret; } -#endif // ENABLE_WORLD_COORDINATE } // namespace GUI } // namespace Slic3r \ No newline at end of file diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index cd92d7472..371cda80a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -7,19 +7,15 @@ namespace Slic3r { namespace GUI { -#if ENABLE_WORLD_COORDINATE class Selection; -#endif // ENABLE_WORLD_COORDINATE class GLGizmoMove3D : public GLGizmoBase { static const double Offset; Vec3d m_displacement{ Vec3d::Zero() }; -#if ENABLE_WORLD_COORDINATE Vec3d m_center{ Vec3d::Zero() }; BoundingBoxf3 m_bounding_box; -#endif // ENABLE_WORLD_COORDINATE double m_snap_step{ 1.0 }; Vec3d m_starting_drag_position{ Vec3d::Zero() }; Vec3d m_starting_box_center{ Vec3d::Zero() }; @@ -65,9 +61,7 @@ protected: private: double calc_projection(const UpdateData& data) const; -#if ENABLE_WORLD_COORDINATE Transform3d local_transform(const Selection& selection) const; -#endif // ENABLE_WORLD_COORDINATE }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 3d88ad500..fde4e9478 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -267,11 +267,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const if (shader == nullptr) return; -#if ENABLE_WORLD_COORDINATE const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_scaling_factor_matrix().inverse(); -#else - const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE ColorRGBA render_color = { 0.0f, 0.0f, 0.0f, 0.25f }; if (m_button_down == Button::Left) @@ -466,11 +462,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const Selection &selection = m_parent.get_selection(); const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; -#if ENABLE_WORLD_COORDINATE const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset(); -#else - const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE const Transform3d trafo_matrix = mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix(); m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, this->get_clipping_plane_in_volume_coordinates(trafo_matrix), m_smart_fill_angle, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); @@ -509,11 +501,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; const Transform3d instance_trafo = mi->get_transformation().get_matrix(); -#if ENABLE_WORLD_COORDINATE const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); -#else - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE // Precalculate transformations of individual meshes. std::vector<Transform3d> trafo_matrices; @@ -521,11 +509,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous for (const ModelVolume *mv : mo->volumes) if (mv->is_model_part()) { trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); -#if ENABLE_WORLD_COORDINATE trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); -#else - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); -#endif // ENABLE_WORLD_COORDINATE } std::vector<std::vector<ProjectedMousePosition>> projected_mouse_positions_by_mesh = get_projected_mouse_positions(mouse_position, 1., trafo_matrices); @@ -607,11 +591,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; const Transform3d instance_trafo = mi->get_transformation().get_matrix(); -#if ENABLE_WORLD_COORDINATE const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); -#else - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE // Precalculate transformations of individual meshes. std::vector<Transform3d> trafo_matrices; @@ -619,11 +599,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous for (const ModelVolume *mv : mo->volumes) if (mv->is_model_part()) { trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); -#if ENABLE_WORLD_COORDINATE trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate* mv->get_matrix_no_offset()); -#else - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); -#endif // ENABLE_WORLD_COORDINATE } // Now "click" into all the prepared points and spill paint around them. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 345d733af..49192983a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -2,9 +2,7 @@ #include "GLGizmoRotate.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" -#if ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI.hpp" @@ -101,27 +99,12 @@ bool GLGizmoRotate::on_init() void GLGizmoRotate::on_start_dragging() { -#if ENABLE_WORLD_COORDINATE init_data_from_selection(m_parent.get_selection()); -#else - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; -#endif // ENABLE_WORLD_COORDINATE } void GLGizmoRotate::on_dragging(const UpdateData &data) { -#if ENABLE_WORLD_COORDINATE const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray)); -#else - const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, m_parent.get_selection())); -#endif // ENABLE_WORLD_COORDINATE - const Vec2d orig_dir = Vec2d::UnitX(); const Vec2d new_dir = mouse_pos.normalized(); @@ -156,22 +139,8 @@ void GLGizmoRotate::on_render() return; const Selection& selection = m_parent.get_selection(); -#if !ENABLE_WORLD_COORDINATE - const BoundingBoxf3& box = selection.get_bounding_box(); -#endif // !ENABLE_WORLD_COORDINATE - - if (m_hover_id != 0 && !m_grabbers.front().dragging) { -#if ENABLE_WORLD_COORDINATE + if (m_hover_id != 0 && !m_grabbers.front().dragging) init_data_from_selection(selection); -#else - m_center = box.center(); - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth); -#endif // ENABLE_WORLD_COORDINATE - } const double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); m_grabbers.front().center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); @@ -224,14 +193,9 @@ void GLGizmoRotate::on_render() shader->stop_using(); } -#if ENABLE_WORLD_COORDINATE render_grabber(m_bounding_box); -#else - render_grabber(box); -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE void GLGizmoRotate::init_data_from_selection(const Selection& selection) { const auto [box, box_trafo] = m_force_local_coordinate ? @@ -246,7 +210,6 @@ void GLGizmoRotate::init_data_from_selection(const Selection& selection) m_snap_fine_in_radius = m_radius; m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; } -#endif // ENABLE_WORLD_COORDINATE void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit) { @@ -473,20 +436,12 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const { case X: { -#if ENABLE_WORLD_COORDINATE ret = Geometry::rotation_transform(0.5 * PI * Vec3d::UnitY()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()); -#else - ret = Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()) * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); -#endif // ENABLE_WORLD_COORDINATE break; } case Y: { -#if ENABLE_WORLD_COORDINATE ret = Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitY()); -#else - ret = Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()) * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitY()); -#endif // ENABLE_WORLD_COORDINATE break; } default: @@ -497,21 +452,10 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const } } -#if ENABLE_WORLD_COORDINATE return m_orient_matrix * ret; -#else - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - ret = selection.get_first_volume()->get_instance_transformation().get_matrix(true, false, true, true) * ret; - - return Geometry::assemble_transform(m_center) * ret; -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) const -#else -Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const -#endif // ENABLE_WORLD_COORDINATE { const double half_pi = 0.5 * double(PI); @@ -539,12 +483,7 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons } } -#if ENABLE_WORLD_COORDINATE m = m * Geometry::Transformation(m_orient_matrix).get_matrix_no_offset().inverse(); -#else - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - m = m * selection.get_first_volume()->get_instance_transformation().get_matrix(true, false, true, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE m.translate(-m_center); @@ -578,7 +517,6 @@ bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) { if (mouse_event.Dragging() && m_dragging) { // Apply new temporary rotations -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; if (m_parent.get_selection().is_wipe_tower()) transformation_type = TransformationType::World_Relative_Joint; @@ -591,9 +529,6 @@ bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) case ECoordinatesType::Local: { transformation_type = TransformationType::Local_Relative_Joint; break; } } } -#else - TransformationType transformation_type(TransformationType::World_Relative_Joint); -#endif // ENABLE_WORLD_COORDINATE if (mouse_event.AltDown()) transformation_type.set_independent(); m_parent.get_selection().rotate(get_rotation(), transformation_type); @@ -603,26 +538,14 @@ bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) void GLGizmoRotate3D::data_changed() { if (m_parent.get_selection().is_wipe_tower()) { -#if !ENABLE_WORLD_COORDINATE - const DynamicPrintConfig& config = wxGetApp().preset_bundle->prints.get_edited_preset().config; - const float wipe_tower_rotation_angle = - dynamic_cast<const ConfigOptionFloat*>( - config.option("wipe_tower_rotation_angle"))->value; - set_rotation(Vec3d(0., 0., (M_PI / 180.) * wipe_tower_rotation_angle)); -#endif // !ENABLE_WORLD_COORDINATE m_gizmos[0].disable_grabber(); m_gizmos[1].disable_grabber(); } else { -#if !ENABLE_WORLD_COORDINATE - set_rotation(Vec3d::Zero()); -#endif // !ENABLE_WORLD_COORDINATE m_gizmos[0].enable_grabber(); m_gizmos[1].enable_grabber(); } -#if ENABLE_WORLD_COORDINATE set_rotation(Vec3d::Zero()); -#endif // ENABLE_WORLD_COORDINATE } bool GLGizmoRotate3D::on_init() diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index ebfed1920..a1bb2ee44 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -35,10 +35,8 @@ private: float m_snap_coarse_out_radius{ 0.0f }; float m_snap_fine_in_radius{ 0.0f }; float m_snap_fine_out_radius{ 0.0f }; -#if ENABLE_WORLD_COORDINATE BoundingBoxf3 m_bounding_box; Transform3d m_orient_matrix{ Transform3d::Identity() }; -#endif // ENABLE_WORLD_COORDINATE GLModel m_circle; GLModel m_scale; @@ -109,15 +107,9 @@ private: Transform3d local_transform(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate -#if ENABLE_WORLD_COORDINATE Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray) const; -#else - Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; -#endif // ENABLE_WORLD_COORDINATE -#if ENABLE_WORLD_COORDINATE void init_data_from_selection(const Selection& selection); -#endif // ENABLE_WORLD_COORDINATE }; class GLGizmoRotate3D : public GLGizmoBase diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 9a56abf13..eec764efe 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -2,9 +2,7 @@ #include "GLGizmoScale.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI_App.hpp" -#if ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "slic3r/GUI/Plater.hpp" #include "libslic3r/Model.hpp" @@ -37,17 +35,7 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filen std::string GLGizmoScale3D::get_tooltip() const { -#if ENABLE_WORLD_COORDINATE const Vec3d scale = 100.0 * m_scale; -#else - const Selection& selection = m_parent.get_selection(); - - Vec3d scale = 100.0 * Vec3d::Ones(); - if (selection.is_single_full_instance()) - scale = 100.0 * selection.get_first_volume()->get_instance_scaling_factor(); - else if (selection.is_single_modifier() || selection.is_single_volume()) - scale = 100.0 * selection.get_first_volume()->get_volume_scaling_factor(); -#endif // ENABLE_WORLD_COORDINATE if (m_hover_id == 0 || m_hover_id == 1 || m_grabbers[0].dragging || m_grabbers[1].dragging) return "X: " + format(scale.x(), 4) + "%"; @@ -78,7 +66,6 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) if (mouse_event.Dragging()) { if (m_dragging) { // Apply new temporary scale factors -#if ENABLE_WORLD_COORDINATE TransformationType transformation_type; if (wxGetApp().obj_manipul()->is_local_coordinates()) transformation_type.set_local(); @@ -86,14 +73,10 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) transformation_type.set_instance(); transformation_type.set_relative(); -#else - TransformationType transformation_type(TransformationType::Local_Absolute_Joint); -#endif // ENABLE_WORLD_COORDINATE if (mouse_event.AltDown()) transformation_type.set_independent(); -#if ENABLE_WORLD_COORDINATE Selection& selection = m_parent.get_selection(); selection.scale(m_scale, transformation_type); if (m_starting.ctrl_down) { @@ -106,11 +89,6 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) // set into on_start_dragging() with the call to selection.setup_cache() m_parent.get_selection().scale_and_translate(m_scale, m_starting.constraint_position - constraint_position, transformation_type); } -#else - Selection& selection = m_parent.get_selection(); - selection.scale(m_scale, transformation_type); - if (mouse_event.CmdDown()) selection.translate(m_offset, true); -#endif // ENABLE_WORLD_COORDINATE } } return use_grabbers(mouse_event); @@ -124,29 +102,7 @@ void GLGizmoScale3D::enable_ununiversal_scale(bool enable) void GLGizmoScale3D::data_changed() { -#if ENABLE_WORLD_COORDINATE set_scale(Vec3d::Ones()); -#else - const Selection& selection = m_parent.get_selection(); - bool enable_scale_xyz = selection.is_single_full_instance() || - selection.is_single_volume() || - selection.is_single_modifier(); - - for (unsigned int i = 0; i < 6; ++i) - m_grabbers[i].enabled = enable_scale_xyz; - - if (enable_scale_xyz) { - // all volumes in the selection belongs to the same instance, any of - // them contains the needed data, so we take the first - const GLVolume* volume = selection.get_first_volume(); - if (selection.is_single_full_instance()) - set_scale(volume->get_instance_scaling_factor()); - else if (selection.is_single_volume() || selection.is_single_modifier()) - set_scale(volume->get_volume_scaling_factor()); - } - else - set_scale(Vec3d::Ones()); -#endif // ENABLE_WORLD_COORDINATE } bool GLGizmoScale3D::on_init() @@ -155,20 +111,7 @@ bool GLGizmoScale3D::on_init() m_grabbers.push_back(Grabber()); } -#if !ENABLE_WORLD_COORDINATE - double half_pi = 0.5 * (double)PI; - - // x axis - m_grabbers[0].angles.y() = half_pi; - m_grabbers[1].angles.y() = half_pi; - - // y axis - m_grabbers[2].angles.x() = half_pi; - m_grabbers[3].angles.x() = half_pi; -#endif // !ENABLE_WORLD_COORDINATE - m_shortcut_key = WXK_CONTROL_S; - return true; } @@ -187,24 +130,11 @@ void GLGizmoScale3D::on_start_dragging() { assert(m_hover_id != -1); m_starting.ctrl_down = wxGetKeyState(WXK_CONTROL); -#if ENABLE_WORLD_COORDINATE m_starting.drag_position = m_grabbers_transform * m_grabbers[m_hover_id].center; m_starting.box = m_bounding_box; m_starting.center = m_center; m_starting.instance_center = m_instance_center; m_starting.constraint_position = m_grabbers_transform * m_grabbers[constraint_id(m_hover_id)].center; -#else - m_starting.drag_position = m_grabbers[m_hover_id].center; - m_starting.box = (m_starting.ctrl_down && m_hover_id < 6) ? m_bounding_box : m_parent.get_selection().get_bounding_box(); - - const Vec3d& center = m_starting.box.center(); - m_starting.pivots[0] = m_transform * Vec3d(m_starting.box.max.x(), center.y(), center.z()); - m_starting.pivots[1] = m_transform * Vec3d(m_starting.box.min.x(), center.y(), center.z()); - m_starting.pivots[2] = m_transform * Vec3d(center.x(), m_starting.box.max.y(), center.z()); - m_starting.pivots[3] = m_transform * Vec3d(center.x(), m_starting.box.min.y(), center.z()); - m_starting.pivots[4] = m_transform * Vec3d(center.x(), center.y(), m_starting.box.max.z()); - m_starting.pivots[5] = m_transform * Vec3d(center.x(), center.y(), m_starting.box.min.z()); -#endif // ENABLE_WORLD_COORDINATE } void GLGizmoScale3D::on_stop_dragging() @@ -225,7 +155,6 @@ void GLGizmoScale3D::on_dragging(const UpdateData& data) do_scale_uniform(data); } -#if ENABLE_WORLD_COORDINATE void GLGizmoScale3D::on_render() { const Selection& selection = m_parent.get_selection(); @@ -404,267 +333,6 @@ void GLGizmoScale3D::on_render() } } } -#else -void GLGizmoScale3D::on_render() -{ - const Selection& selection = m_parent.get_selection(); - - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); - glsafe(::glEnable(GL_DEPTH_TEST)); - - m_bounding_box.reset(); - m_transform = Transform3d::Identity(); - // Transforms grabbers' offsets to world refefence system - Transform3d offsets_transform = Transform3d::Identity(); - m_offsets_transform = Transform3d::Identity(); - Vec3d angles = Vec3d::Zero(); - - if (selection.is_single_full_instance()) { - // calculate bounding box in instance local reference system - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - for (unsigned int idx : idxs) { - const GLVolume& v = *selection.get_volume(idx); - m_bounding_box.merge(v.transformed_convex_hull_bounding_box(v.get_volume_transformation().get_matrix())); - } - - // gets transform from first selected volume - const GLVolume& v = *selection.get_first_volume(); - m_transform = v.get_instance_transformation().get_matrix(); - - // gets angles from first selected volume - angles = v.get_instance_rotation(); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v.get_instance_mirror()); - m_offsets_transform = offsets_transform; - } - else if (selection.is_single_modifier() || selection.is_single_volume()) { - const GLVolume& v = *selection.get_first_volume(); - m_bounding_box = v.bounding_box(); - m_transform = v.world_matrix(); - angles = Geometry::extract_rotation(m_transform); - // consider rotation+mirror only components of the transform for offsets - offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), angles, Vec3d::Ones(), v.get_instance_mirror()); - m_offsets_transform = Geometry::assemble_transform(Vec3d::Zero(), v.get_volume_rotation(), Vec3d::Ones(), v.get_volume_mirror()); - } - else - m_bounding_box = selection.get_bounding_box(); - - const Vec3d& center = m_bounding_box.center(); - const Vec3d offset_x = offsets_transform * Vec3d((double)Offset, 0.0, 0.0); - const Vec3d offset_y = offsets_transform * Vec3d(0.0, (double)Offset, 0.0); - const Vec3d offset_z = offsets_transform * Vec3d(0.0, 0.0, (double)Offset); - - const bool ctrl_down = (m_dragging && m_starting.ctrl_down) || (!m_dragging && wxGetKeyState(WXK_CONTROL)); - - // x axis - m_grabbers[0].center = m_transform * Vec3d(m_bounding_box.min.x(), center.y(), center.z()) - offset_x; - m_grabbers[0].color = (ctrl_down && m_hover_id == 1) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - m_grabbers[1].center = m_transform * Vec3d(m_bounding_box.max.x(), center.y(), center.z()) + offset_x; - m_grabbers[1].color = (ctrl_down && m_hover_id == 0) ? CONSTRAINED_COLOR : AXES_COLOR[0]; - - // y axis - m_grabbers[2].center = m_transform * Vec3d(center.x(), m_bounding_box.min.y(), center.z()) - offset_y; - m_grabbers[2].color = (ctrl_down && m_hover_id == 3) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - m_grabbers[3].center = m_transform * Vec3d(center.x(), m_bounding_box.max.y(), center.z()) + offset_y; - m_grabbers[3].color = (ctrl_down && m_hover_id == 2) ? CONSTRAINED_COLOR : AXES_COLOR[1]; - - // z axis - m_grabbers[4].center = m_transform * Vec3d(center.x(), center.y(), m_bounding_box.min.z()) - offset_z; - m_grabbers[4].color = (ctrl_down && m_hover_id == 5) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - m_grabbers[5].center = m_transform * Vec3d(center.x(), center.y(), m_bounding_box.max.z()) + offset_z; - m_grabbers[5].color = (ctrl_down && m_hover_id == 4) ? CONSTRAINED_COLOR : AXES_COLOR[2]; - - // uniform - m_grabbers[6].center = m_transform * Vec3d(m_bounding_box.min.x(), m_bounding_box.min.y(), center.z()) - offset_x - offset_y; - m_grabbers[7].center = m_transform * Vec3d(m_bounding_box.max.x(), m_bounding_box.min.y(), center.z()) + offset_x - offset_y; - m_grabbers[8].center = m_transform * Vec3d(m_bounding_box.max.x(), m_bounding_box.max.y(), center.z()) + offset_x + offset_y; - m_grabbers[9].center = m_transform * Vec3d(m_bounding_box.min.x(), m_bounding_box.max.y(), center.z()) - offset_x + offset_y; - - for (int i = 6; i < 10; ++i) { - m_grabbers[i].color = m_highlight_color; - } - - // sets grabbers orientation - for (int i = 0; i < 10; ++i) { - m_grabbers[i].angles = angles; - } - -#if ENABLE_GL_CORE_PROFILE - if (!OpenGLManager::get_gl_info().is_core_profile()) -#endif // ENABLE_GL_CORE_PROFILE - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); - - const BoundingBoxf3& selection_box = selection.get_bounding_box(); - const float grabber_mean_size = (float)((selection_box.size().x() + selection_box.size().y() + selection_box.size().z()) / 3.0); - - if (m_hover_id == -1) { - // draw connections -#if ENABLE_GL_CORE_PROFILE - GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_CORE_PROFILE - if (shader != nullptr) { - shader->start_using(); - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#if ENABLE_GL_CORE_PROFILE - const std::array<int, 4>& viewport = camera.get_viewport(); - shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); - shader->set_uniform("width", 0.25f); - shader->set_uniform("gap_size", 0.0f); -#endif // ENABLE_GL_CORE_PROFILE - if (m_grabbers[0].enabled && m_grabbers[1].enabled) - render_grabbers_connection(0, 1, m_grabbers[0].color); - if (m_grabbers[2].enabled && m_grabbers[3].enabled) - render_grabbers_connection(2, 3, m_grabbers[2].color); - if (m_grabbers[4].enabled && m_grabbers[5].enabled) - render_grabbers_connection(4, 5, m_grabbers[4].color); - render_grabbers_connection(6, 7, m_base_color); - render_grabbers_connection(7, 8, m_base_color); - render_grabbers_connection(8, 9, m_base_color); - render_grabbers_connection(9, 6, m_base_color); - shader->stop_using(); - } - - // draw grabbers - render_grabbers(grabber_mean_size); - } - else if ((m_hover_id == 0 || m_hover_id == 1) && m_grabbers[0].enabled && m_grabbers[1].enabled) { - // draw connections -#if ENABLE_GL_CORE_PROFILE - GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_CORE_PROFILE - if (shader != nullptr) { - shader->start_using(); - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#if ENABLE_GL_CORE_PROFILE - const std::array<int, 4>& viewport = camera.get_viewport(); - shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); - shader->set_uniform("width", 0.25f); - shader->set_uniform("gap_size", 0.0f); -#endif // ENABLE_GL_CORE_PROFILE - render_grabbers_connection(0, 1, m_grabbers[0].color); - shader->stop_using(); - } - - // draw grabbers - shader = wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - m_grabbers[0].render(true, grabber_mean_size); - m_grabbers[1].render(true, grabber_mean_size); - shader->stop_using(); - } - } - else if ((m_hover_id == 2 || m_hover_id == 3) && m_grabbers[2].enabled && m_grabbers[3].enabled) { - // draw connections -#if ENABLE_GL_CORE_PROFILE - GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_CORE_PROFILE - if (shader != nullptr) { - shader->start_using(); - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#if ENABLE_GL_CORE_PROFILE - const std::array<int, 4>& viewport = camera.get_viewport(); - shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); - shader->set_uniform("width", 0.25f); - shader->set_uniform("gap_size", 0.0f); -#endif // ENABLE_GL_CORE_PROFILE - render_grabbers_connection(2, 3, m_grabbers[2].color); - shader->stop_using(); - } - - // draw grabbers - shader = wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - m_grabbers[2].render(true, grabber_mean_size); - m_grabbers[3].render(true, grabber_mean_size); - shader->stop_using(); - } - } - else if ((m_hover_id == 4 || m_hover_id == 5) && m_grabbers[4].enabled && m_grabbers[5].enabled) { - // draw connections -#if ENABLE_GL_CORE_PROFILE - GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_CORE_PROFILE - if (shader != nullptr) { - shader->start_using(); - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#if ENABLE_GL_CORE_PROFILE - const std::array<int, 4>& viewport = camera.get_viewport(); - shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); - shader->set_uniform("width", 0.25f); - shader->set_uniform("gap_size", 0.0f); -#endif // ENABLE_GL_CORE_PROFILE - render_grabbers_connection(4, 5, m_grabbers[4].color); - shader->stop_using(); - } - - // draw grabbers - shader = wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - m_grabbers[4].render(true, grabber_mean_size); - m_grabbers[5].render(true, grabber_mean_size); - shader->stop_using(); - } - } - else if (m_hover_id >= 6) { - // draw connections -#if ENABLE_GL_CORE_PROFILE - GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_CORE_PROFILE - if (shader != nullptr) { - shader->start_using(); - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#if ENABLE_GL_CORE_PROFILE - const std::array<int, 4>& viewport = camera.get_viewport(); - shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); - shader->set_uniform("width", 0.25f); - shader->set_uniform("gap_size", 0.0f); -#endif // ENABLE_GL_CORE_PROFILE - render_grabbers_connection(6, 7, m_drag_color); - render_grabbers_connection(7, 8, m_drag_color); - render_grabbers_connection(8, 9, m_drag_color); - render_grabbers_connection(9, 6, m_drag_color); - shader->stop_using(); - } - - // draw grabbers - shader = wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - for (int i = 6; i < 10; ++i) { - m_grabbers[i].render(true, grabber_mean_size); - } - shader->stop_using(); - } - } -} -#endif // ENABLE_WORLD_COORDINATE void GLGizmoScale3D::on_register_raycasters_for_picking() { @@ -717,7 +385,6 @@ void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int m_grabber_connections[id].model.render(); } -#if ENABLE_WORLD_COORDINATE void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) { double ratio = calc_ratio(data); @@ -727,64 +394,18 @@ void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) m_scale = curr_scale; } } -#else -void GLGizmoScale3D::do_scale_along_axis(Axis axis, const UpdateData& data) -{ - const double ratio = calc_ratio(data); - if (ratio > 0.0) { - m_scale(axis) = m_starting.scale(axis) * ratio; - if (m_starting.ctrl_down) { - double local_offset = 0.5 * (m_scale(axis) - m_starting.scale(axis)) * m_starting.box.size()(axis); - - if (m_hover_id == 2 * axis) - local_offset *= -1.0; - - Vec3d local_offset_vec; - switch (axis) - { - case X: { local_offset_vec = local_offset * Vec3d::UnitX(); break; } - case Y: { local_offset_vec = local_offset * Vec3d::UnitY(); break; } - case Z: { local_offset_vec = local_offset * Vec3d::UnitZ(); break; } - default: break; - } - - m_offset = m_offsets_transform * local_offset_vec; - } - else - m_offset = Vec3d::Zero(); - } -} -#endif // ENABLE_WORLD_COORDINATE - -#if ENABLE_WORLD_COORDINATE void GLGizmoScale3D::do_scale_uniform(const UpdateData & data) { const double ratio = calc_ratio(data); if (ratio > 0.0) m_scale = m_starting.scale * ratio; } -#else -void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) -{ - const double ratio = calc_ratio(data); - if (ratio > 0.0) { - m_scale = m_starting.scale * ratio; - m_offset = Vec3d::Zero(); - } -} -#endif // ENABLE_WORLD_COORDINATE double GLGizmoScale3D::calc_ratio(const UpdateData& data) const { double ratio = 0.0; - -#if ENABLE_WORLD_COORDINATE const Vec3d starting_vec = m_starting.drag_position - m_starting.center; -#else - const Vec3d pivot = (m_starting.ctrl_down && m_hover_id < 6) ? m_starting.pivots[m_hover_id] : m_starting.box.center(); - const Vec3d starting_vec = m_starting.drag_position - pivot; -#endif // ENABLE_WORLD_COORDINATE const double len_starting_vec = starting_vec.norm(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index c2ad916bb..d0b239c33 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -3,16 +3,10 @@ #include "GLGizmoBase.hpp" -#if !ENABLE_WORLD_COORDINATE -#include "libslic3r/BoundingBox.hpp" -#endif // !ENABLE_WORLD_COORDINATE - namespace Slic3r { namespace GUI { -#if ENABLE_WORLD_COORDINATE class Selection; -#endif // ENABLE_WORLD_COORDINATE class GLGizmoScale3D : public GLGizmoBase { @@ -23,27 +17,16 @@ class GLGizmoScale3D : public GLGizmoBase bool ctrl_down{ false }; Vec3d scale{ Vec3d::Ones() }; Vec3d drag_position{ Vec3d::Zero() }; -#if ENABLE_WORLD_COORDINATE Vec3d center{ Vec3d::Zero() }; Vec3d instance_center{ Vec3d::Zero() }; Vec3d constraint_position{ Vec3d::Zero() }; -#endif // ENABLE_WORLD_COORDINATE BoundingBoxf3 box; -#if !ENABLE_WORLD_COORDINATE - std::array<Vec3d, 6> pivots{ Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero(), Vec3d::Zero() }; -#endif // !ENABLE_WORLD_COORDINATE }; BoundingBoxf3 m_bounding_box; -#if ENABLE_WORLD_COORDINATE Transform3d m_grabbers_transform; Vec3d m_center{ Vec3d::Zero() }; Vec3d m_instance_center{ Vec3d::Zero() }; -#else - Transform3d m_transform; - // Transforms grabbers offsets to the proper reference system (world for instances, instance for volumes) - Transform3d m_offsets_transform; -#endif // ENABLE_WORLD_COORDINATE Vec3d m_scale{ Vec3d::Ones() }; double m_snap_step{ 0.05 }; StartingData m_starting; @@ -67,11 +50,7 @@ public: void set_snap_step(double step) { m_snap_step = step; } const Vec3d& get_scale() const { return m_scale; } -#if ENABLE_WORLD_COORDINATE void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } -#else - void set_scale(const Vec3d& scale) { m_starting.scale = scale; m_scale = scale; } -#endif // ENABLE_WORLD_COORDINATE std::string get_tooltip() const override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 4d76dfb04..212720822 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -167,11 +167,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection) trafo.translation()(2) += shift_z; const Geometry::Transformation transformation{trafo}; -#if ENABLE_WORLD_COORDINATE const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); -#else - const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d& view_matrix = camera.get_view_matrix(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 1765789b9..59be6cabb 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -436,11 +436,7 @@ std::vector<unsigned> MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo { std::vector<unsigned> out; -#if ENABLE_WORLD_COORDINATE const Transform3d instance_matrix_no_translation_no_scaling = trafo.get_rotation_matrix(); -#else - const Transform3d& instance_matrix_no_translation_no_scaling = trafo.get_matrix(true,false,true); -#endif // ENABLE_WORLD_COORDINATE Vec3d direction_to_camera = -camera.get_dir_forward(); Vec3d direction_to_camera_mesh = (instance_matrix_no_translation_no_scaling.inverse() * direction_to_camera).normalized().eval(); direction_to_camera_mesh = direction_to_camera_mesh.cwiseProduct(trafo.get_scaling_factor()); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a5b054748..9b41bb1a1 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -60,9 +60,7 @@ #include "GUI_ObjectManipulation.hpp" #include "GUI_ObjectLayers.hpp" #include "GUI_Utils.hpp" -#if ENABLE_WORLD_COORDINATE #include "GUI_Geometry.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "GUI_Factories.hpp" #include "wxExtensions.hpp" #include "MainFrame.hpp" @@ -1543,10 +1541,8 @@ void Sidebar::update_mode() wxWindowUpdateLocker noUpdates(this); -#if ENABLE_WORLD_COORDINATE if (m_mode == comSimple) p->object_manipulation->set_coordinates_type(ECoordinatesType::World); -#endif // ENABLE_WORLD_COORDINATE p->object_list->get_sizer()->Show(m_mode > comSimple); @@ -2112,9 +2108,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_MOVED, &priv::on_wipetower_moved, this); view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_ROTATED, &priv::on_wipetower_rotated, this); view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_ROTATED, [this](SimpleEvent&) { update(); }); -#if ENABLE_WORLD_COORDINATE view3D_canvas->Bind(EVT_GLCANVAS_RESET_SKEW, [this](SimpleEvent&) { update(); }); -#endif // ENABLE_WORLD_COORDINATE view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_SCALED, [this](SimpleEvent&) { update(); }); view3D_canvas->Bind(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, [this](Event<bool>& evt) { this->sidebar->enable_buttons(evt.data); }); view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_GEOMETRY, &priv::on_update_geometry, this); @@ -3537,11 +3531,7 @@ bool Plater::priv::replace_volume_with_stl(int object_idx, int volume_idx, const new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); new_volume->set_transformation(old_volume->get_transformation()); -#if ENABLE_WORLD_COORDINATE new_volume->translate(new_volume->get_transformation().get_matrix_no_offset() * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); -#else - new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); -#endif // ENABLE_WORLD_COORDINATE assert(!old_volume->source.is_converted_from_inches || !old_volume->source.is_converted_from_meters); if (old_volume->source.is_converted_from_inches) new_volume->convert_from_imperial_units(); @@ -3822,19 +3812,12 @@ void Plater::priv::reload_from_disk() new_volume->config.apply(old_volume->config); new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); -#if ENABLE_WORLD_COORDINATE new_volume->set_transformation( old_volume->get_transformation().get_matrix() * old_volume->source.transform.get_matrix_no_offset() * Geometry::translation_transform(new_volume->source.mesh_offset - old_volume->source.mesh_offset) * new_volume->source.transform.get_matrix_no_offset().inverse() ); -#else - new_volume->set_transformation(Geometry::assemble_transform(old_volume->source.transform.get_offset()) * - old_volume->get_transformation().get_matrix(true) * - old_volume->source.transform.get_matrix(true)); - new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); -#endif // ENABLE_WORLD_COORDINATE new_volume->source.object_idx = old_volume->source.object_idx; new_volume->source.volume_idx = old_volume->source.volume_idx; assert(!old_volume->source.is_converted_from_inches || !old_volume->source.is_converted_from_meters); @@ -4363,11 +4346,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt) const bool is_some_full_instances = selection.is_single_full_instance() || selection.is_single_full_object() || selection.is_multiple_full_instance(); -#if ENABLE_WORLD_COORDINATE const bool is_part = selection.is_single_volume_or_modifier() && ! selection.is_any_connector(); -#else - const bool is_part = selection.is_single_volume() || selection.is_single_modifier(); -#endif // ENABLE_WORLD_COORDINATE if (is_some_full_instances) menu = printer_technology == ptSLA ? menus.sla_object_menu() : menus.object_menu(); else if (is_part) @@ -4665,11 +4644,7 @@ bool Plater::priv::layers_height_allowed() const bool Plater::priv::can_mirror() const { -#if ENABLE_WORLD_COORDINATE return !sidebar->obj_list()->has_selected_cut_object(); -#else - return !sidebar->obj_list()->has_selected_cut_object() && get_selection().is_from_single_instance(); -#endif // ENABLE_WORLD_COORDINATE } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index d1296e40a..6d00faa2a 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -9,9 +9,7 @@ #include "GUI_ObjectList.hpp" #include "Camera.hpp" #include "Plater.hpp" -#if ENABLE_WORLD_COORDINATE #include "MsgDialog.hpp" -#endif // ENABLE_WORLD_COORDINATE #include "Gizmos/GLGizmoBase.hpp" @@ -40,18 +38,11 @@ Selection::VolumeCache::TransformCache::TransformCache(const Geometry::Transform , scaling_factor(transform.get_scaling_factor()) , mirror(transform.get_mirror()) , full_matrix(transform.get_matrix()) -#if ENABLE_WORLD_COORDINATE , transform(transform) , rotation_matrix(transform.get_rotation_matrix()) , scale_matrix(transform.get_scaling_factor_matrix()) , mirror_matrix(transform.get_mirror_matrix()) -#endif // ENABLE_WORLD_COORDINATE { -#if !ENABLE_WORLD_COORDINATE - rotation_matrix = Geometry::assemble_transform(Vec3d::Zero(), rotation); - scale_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scaling_factor); - mirror_matrix = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d::Ones(), mirror); -#endif // !ENABLE_WORLD_COORDINATE } Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform) @@ -118,12 +109,10 @@ Selection::Selection() , m_scale_factor(1.0f) { this->set_bounding_boxes_dirty(); -#if ENABLE_WORLD_COORDINATE m_axes.set_stem_radius(0.5f); m_axes.set_stem_length(20.0f); m_axes.set_tip_radius(1.5f); m_axes.set_tip_length(5.0f); -#endif // ENABLE_WORLD_COORDINATE } @@ -595,11 +584,7 @@ bool Selection::is_sla_compliant() const bool Selection::is_single_text() const { -#if ENABLE_WORLD_COORDINATE if (!is_single_volume_or_modifier()) -#else - if (!is_single_volume() && !is_single_modifier()) -#endif // ENABLE_WORLD_COORDINATE return false; const GLVolume* gl_volume = (*m_volumes)[*m_list.begin()]; @@ -653,16 +638,6 @@ bool Selection::matches(const std::vector<unsigned int>& volume_idxs) const return count == (unsigned int)m_list.size(); } -#if !ENABLE_WORLD_COORDINATE -bool Selection::requires_uniform_scale() const -{ - if (is_single_full_instance() || is_single_modifier() || is_single_volume()) - return false; - - return true; -} -#endif // !ENABLE_WORLD_COORDINATE - int Selection::get_object_idx() const { return (m_cache.content.size() == 1) ? m_cache.content.begin()->first : -1; @@ -721,11 +696,7 @@ const BoundingBoxf3& Selection::get_unscaled_instance_bounding_box() const const GLVolume& volume = *(*m_volumes)[i]; if (volume.is_modifier) continue; -#if ENABLE_WORLD_COORDINATE Transform3d trafo = volume.get_instance_transformation().get_matrix_no_scaling_factor() * volume.get_volume_transformation().get_matrix(); -#else - Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, true, false) * volume.get_volume_transformation().get_matrix(); -#endif // ENABLE_WORLD_COORDINATE trafo.translation().z() += volume.get_sla_shift_z(); (*bbox)->merge(volume.transformed_convex_hull_bounding_box(trafo)); } @@ -755,7 +726,6 @@ const BoundingBoxf3& Selection::get_scaled_instance_bounding_box() const return *m_scaled_instance_bounding_box; } -#if ENABLE_WORLD_COORDINATE const BoundingBoxf3& Selection::get_full_unscaled_instance_bounding_box() const { assert(is_single_full_instance()); @@ -886,9 +856,7 @@ std::pair<BoundingBoxf3, Transform3d> Selection::get_bounding_box_in_reference_s const Vec3d center = 0.5 * (min + max); out_trafo.set_offset(basis_trafo * center); return { out_box, out_trafo.get_matrix_no_scaling_factor() }; - } -#endif // ENABLE_WORLD_COORDINATE void Selection::setup_cache() { @@ -898,7 +866,6 @@ void Selection::setup_cache() set_caches(); } -#if ENABLE_WORLD_COORDINATE void Selection::translate(const Vec3d& displacement, TransformationType transformation_type) { if (!m_valid) @@ -947,50 +914,8 @@ void Selection::translate(const Vec3d& displacement, TransformationType transfor set_bounding_boxes_dirty(); wxGetApp().plater()->canvas3D()->requires_check_outside_state(); } -#else -void Selection::translate(const Vec3d& displacement, bool local) -{ - if (!m_valid) - return; - - EMode translation_type = m_mode; - - for (unsigned int i : m_list) { - GLVolume& v = *(*m_volumes)[i]; - if (m_mode == Volume || v.is_wipe_tower) { - if (local) - v.set_volume_offset(m_cache.volumes_data[i].get_volume_position() + displacement); - else { - const Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * m_cache.volumes_data[i].get_instance_mirror_matrix()).inverse() * displacement; - v.set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); - } - } - else if (m_mode == Instance) { - if (is_from_fully_selected_instance(i)) - v.set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); - else { - const Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * m_cache.volumes_data[i].get_instance_mirror_matrix()).inverse() * displacement; - v.set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); - translation_type = Volume; - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (translation_type == Instance) - synchronize_unselected_instances(SyncRotationType::NONE); - else if (translation_type == Volume) - synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - ensure_not_below_bed(); - set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); -} -#endif // ENABLE_WORLD_COORDINATE // Rotate an object around one of the axes. Only one rotation component is expected to be changing. -#if ENABLE_WORLD_COORDINATE void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type) { if (!m_valid) @@ -1072,119 +997,6 @@ void Selection::rotate(const Vec3d& rotation, TransformationType transformation_ set_bounding_boxes_dirty(); wxGetApp().plater()->canvas3D()->requires_check_outside_state(); } -#else -void Selection::rotate(const Vec3d& rotation, TransformationType transformation_type) -{ - if (!m_valid) - return; - - // Only relative rotation values are allowed in the world coordinate system. - assert(!transformation_type.world() || transformation_type.relative()); - - if (!is_wipe_tower()) { - int rot_axis_max = 0; - if (rotation.isApprox(Vec3d::Zero())) { - for (unsigned int i : m_list) { - GLVolume &v = *(*m_volumes)[i]; - if (m_mode == Instance) { - v.set_instance_rotation(m_cache.volumes_data[i].get_instance_rotation()); - v.set_instance_offset(m_cache.volumes_data[i].get_instance_position()); - } - else if (m_mode == Volume) { - v.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation()); - v.set_volume_offset(m_cache.volumes_data[i].get_volume_position()); - } - } - } - else { // this is not the wipe tower - //FIXME this does not work for absolute rotations (transformation_type.absolute() is true) - rotation.cwiseAbs().maxCoeff(&rot_axis_max); - -// if ( single instance or single volume ) - // Rotate around center , if only a single object or volume -// transformation_type.set_independent(); - - // For generic rotation, we want to rotate the first volume in selection, and then to synchronize the other volumes with it. - std::vector<int> object_instance_first(m_model->objects.size(), -1); - auto rotate_instance = [this, &rotation, &object_instance_first, rot_axis_max, transformation_type](GLVolume &volume, int i) { - const int first_volume_idx = object_instance_first[volume.object_idx()]; - if (rot_axis_max != 2 && first_volume_idx != -1) { - // Generic rotation, but no rotation around the Z axis. - // Always do a local rotation (do not consider the selection to be a rigid body). - assert(is_approx(rotation.z(), 0.0)); - const GLVolume &first_volume = *(*m_volumes)[first_volume_idx]; - const Vec3d &rotation = first_volume.get_instance_rotation(); - const double z_diff = Geometry::rotation_diff_z(m_cache.volumes_data[first_volume_idx].get_instance_rotation(), m_cache.volumes_data[i].get_instance_rotation()); - volume.set_instance_rotation(Vec3d(rotation.x(), rotation.y(), rotation.z() + z_diff)); - } - else { - // extracts rotations from the composed transformation - const Vec3d new_rotation = transformation_type.world() ? - Geometry::extract_rotation(Geometry::assemble_transform(Vec3d::Zero(), rotation) * m_cache.volumes_data[i].get_instance_rotation_matrix()) : - transformation_type.absolute() ? rotation : rotation + m_cache.volumes_data[i].get_instance_rotation(); - if (rot_axis_max == 2 && transformation_type.joint()) { - // Only allow rotation of multiple instances as a single rigid body when rotating around the Z axis. - const double z_diff = Geometry::rotation_diff_z(m_cache.volumes_data[i].get_instance_rotation(), new_rotation); - volume.set_instance_offset(m_cache.dragging_center + Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()) * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - } - volume.set_instance_rotation(new_rotation); - object_instance_first[volume.object_idx()] = i; - } - }; - - for (unsigned int i : m_list) { - GLVolume &v = *(*m_volumes)[i]; - if (is_single_full_instance()) - rotate_instance(v, i); - else if (is_single_volume() || is_single_modifier()) { - if (transformation_type.independent()) - v.set_volume_rotation(m_cache.volumes_data[i].get_volume_rotation() + rotation); - else { - const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - const Vec3d new_rotation = Geometry::extract_rotation(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - v.set_volume_rotation(new_rotation); - } - } - else { - if (m_mode == Instance) - rotate_instance(v, i); - else if (m_mode == Volume) { - // extracts rotations from the composed transformation - const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), rotation); - const Vec3d new_rotation = Geometry::extract_rotation(m * m_cache.volumes_data[i].get_volume_rotation_matrix()); - if (transformation_type.joint()) { - const Vec3d local_pivot = m_cache.volumes_data[i].get_instance_full_matrix().inverse() * m_cache.dragging_center; - const Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() - local_pivot); - v.set_volume_offset(local_pivot + offset); - } - v.set_volume_rotation(new_rotation); - } - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - synchronize_unselected_instances((rot_axis_max == 2) ? SyncRotationType::NONE : SyncRotationType::GENERAL); - else if (m_mode == Volume) - synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - } - else { // it's the wipe tower that's selected and being rotated - GLVolume& volume = *((*m_volumes)[*m_list.begin()]); // the wipe tower is always alone in the selection - - // make sure the wipe tower rotates around its center, not origin - // we can assume that only Z rotation changes - const Vec3d center_local = volume.transformed_bounding_box().center() - volume.get_volume_offset(); - const Vec3d center_local_new = Eigen::AngleAxisd(rotation.z()-volume.get_volume_rotation().z(), Vec3d::UnitZ()) * center_local; - volume.set_volume_rotation(rotation); - volume.set_volume_offset(volume.get_volume_offset() + center_local - center_local_new); - } - - set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); -} -#endif // ENABLE_WORLD_COORDINATE void Selection::flattening_rotate(const Vec3d& normal) { @@ -1199,21 +1011,11 @@ void Selection::flattening_rotate(const Vec3d& normal) for (unsigned int i : m_list) { GLVolume& v = *(*m_volumes)[i]; // Normal transformed from the object coordinate space to the world coordinate space. -#if ENABLE_WORLD_COORDINATE const Geometry::Transformation& old_inst_trafo = v.get_instance_transformation(); const Vec3d tnormal = old_inst_trafo.get_matrix().matrix().block(0, 0, 3, 3).inverse().transpose() * normal; // Additional rotation to align tnormal with the down vector in the world coordinate space. const Transform3d rotation_matrix = Transform3d(Eigen::Quaterniond().setFromTwoVectors(tnormal, -Vec3d::UnitZ())); v.set_instance_transformation(old_inst_trafo.get_offset_matrix() * rotation_matrix * old_inst_trafo.get_matrix_no_offset()); -#else - const auto& voldata = m_cache.volumes_data[i]; - Vec3d tnormal = (Geometry::assemble_transform( - Vec3d::Zero(), voldata.get_instance_rotation(), - voldata.get_instance_scaling_factor().cwiseInverse(), voldata.get_instance_mirror()) * normal).normalized(); - // Additional rotation to align tnormal with the down vector in the world coordinate space. - auto extra_rotation = Eigen::Quaterniond().setFromTwoVectors(tnormal, -Vec3d::UnitZ()); - v.set_instance_rotation(Geometry::extract_rotation(extra_rotation.toRotationMatrix() * m_cache.volumes_data[i].get_instance_rotation_matrix())); -#endif // ENABLE_WORLD_COORDINATE } #if !DISABLE_INSTANCES_SYNCH @@ -1226,79 +1028,10 @@ void Selection::flattening_rotate(const Vec3d& normal) this->set_bounding_boxes_dirty(); } -#if ENABLE_WORLD_COORDINATE void Selection::scale(const Vec3d& scale, TransformationType transformation_type) { scale_and_translate(scale, Vec3d::Zero(), transformation_type); } -#else -void Selection::scale(const Vec3d& scale, TransformationType transformation_type) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) { - GLVolume &v = *(*m_volumes)[i]; - if (is_single_full_instance()) { - if (transformation_type.relative()) { - const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); - const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - const Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) - v.set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - - v.set_instance_scaling_factor(new_scale); - } - else { - if (transformation_type.world() && (std::abs(scale.x() - scale.y()) > EPSILON || std::abs(scale.x() - scale.z()) > EPSILON)) { - // Non-uniform scaling. Transform the scaling factors into the local coordinate system. - // This is only possible, if the instance rotation is mulitples of ninety degrees. - assert(Geometry::is_rotation_ninety_degrees(v.get_instance_rotation())); - v.set_instance_scaling_factor((v.get_instance_transformation().get_matrix(true, false, true, true).matrix().block<3, 3>(0, 0).transpose() * scale).cwiseAbs()); - } - else - v.set_instance_scaling_factor(scale); - } - } - else if (is_single_volume() || is_single_modifier()) - v.set_volume_scaling_factor(scale); - else { - const Transform3d m = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), scale); - if (m_mode == Instance) { - const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> new_matrix = (m * m_cache.volumes_data[i].get_instance_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - const Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) - v.set_instance_offset(m_cache.dragging_center + m * (m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center)); - - v.set_instance_scaling_factor(new_scale); - } - else if (m_mode == Volume) { - const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> new_matrix = (m * m_cache.volumes_data[i].get_volume_scale_matrix()).matrix().block(0, 0, 3, 3); - // extracts scaling factors from the composed transformation - const Vec3d new_scale(new_matrix.col(0).norm(), new_matrix.col(1).norm(), new_matrix.col(2).norm()); - if (transformation_type.joint()) { - const Vec3d offset = m * (m_cache.volumes_data[i].get_volume_position() + m_cache.volumes_data[i].get_instance_position() - m_cache.dragging_center); - v.set_volume_offset(m_cache.dragging_center - m_cache.volumes_data[i].get_instance_position() + offset); - } - v.set_volume_scaling_factor(new_scale); - } - } - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - synchronize_unselected_instances(SyncRotationType::NONE); - else if (m_mode == Volume) - synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - ensure_on_bed(); - set_bounding_boxes_dirty(); - wxGetApp().plater()->canvas3D()->requires_check_outside_state(); -} -#endif // ENABLE_WORLD_COORDINATE void Selection::scale_to_fit_print_volume(const BuildVolume& volume) { @@ -1322,13 +1055,9 @@ void Selection::scale_to_fit_print_volume(const BuildVolume& volume) // center selection on print bed setup_cache(); offset.z() = -get_bounding_box().min.z(); -#if ENABLE_WORLD_COORDINATE TransformationType trafo_type; trafo_type.set_relative(); translate(offset, trafo_type); -#else - translate(offset); -#endif // ENABLE_WORLD_COORDINATE wxGetApp().plater()->canvas3D()->do_move(""); // avoid storing another snapshot wxGetApp().obj_manipul()->set_dirty(); @@ -1423,38 +1152,12 @@ void Selection::scale_to_fit_print_volume(const BuildVolume& volume) } } -#if ENABLE_WORLD_COORDINATE void Selection::mirror(Axis axis, TransformationType transformation_type) { const Vec3d mirror((axis == X) ? -1.0 : 1.0, (axis == Y) ? -1.0 : 1.0, (axis == Z) ? -1.0 : 1.0); scale_and_translate(mirror, Vec3d::Zero(), transformation_type); } -#else -void Selection::mirror(Axis axis) -{ - if (!m_valid) - return; - for (unsigned int i : m_list) { - GLVolume& v = *(*m_volumes)[i]; - if (is_single_full_instance()) - v.set_instance_mirror(axis, -v.get_instance_mirror(axis)); - else if (m_mode == Volume) - v.set_volume_mirror(axis, -v.get_volume_mirror(axis)); - } - -#if !DISABLE_INSTANCES_SYNCH - if (m_mode == Instance) - synchronize_unselected_instances(SyncRotationType::NONE); - else if (m_mode == Volume) - synchronize_unselected_volumes(); -#endif // !DISABLE_INSTANCES_SYNCH - - set_bounding_boxes_dirty(); -} -#endif // ENABLE_WORLD_COORDINATE - -#if ENABLE_WORLD_COORDINATE void Selection::scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type) { if (!m_valid) @@ -1588,50 +1291,6 @@ void Selection::reset_skew() set_bounding_boxes_dirty(); wxGetApp().plater()->canvas3D()->requires_check_outside_state(); } -#else -void Selection::translate(unsigned int object_idx, const Vec3d& displacement) -{ - if (!m_valid) - return; - - for (unsigned int i : m_list) { - GLVolume& v = *(*m_volumes)[i]; - if (v.object_idx() == (int)object_idx) - v.set_instance_offset(v.get_instance_offset() + displacement); - } - - std::set<unsigned int> done; // prevent processing volumes twice - done.insert(m_list.begin(), m_list.end()); - - for (unsigned int i : m_list) { - if (done.size() == m_volumes->size()) - break; - - if ((*m_volumes)[i]->is_wipe_tower) - continue; - - int object_idx = (*m_volumes)[i]->object_idx(); - - // Process unselected volumes of the object. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) { - if (done.size() == m_volumes->size()) - break; - - if (done.find(j) != done.end()) - continue; - - GLVolume& v = *(*m_volumes)[j]; - if (v.object_idx() != object_idx) - continue; - - v.set_instance_offset(v.get_instance_offset() + displacement); - done.insert(j); - } - } - - this->set_bounding_boxes_dirty(); -} -#endif // ENABLE_WORLD_COORDINATE void Selection::translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement) { @@ -1641,11 +1300,7 @@ void Selection::translate(unsigned int object_idx, unsigned int instance_idx, co for (unsigned int i : m_list) { GLVolume& v = *(*m_volumes)[i]; if (v.object_idx() == (int)object_idx && v.instance_idx() == (int)instance_idx) -#if ENABLE_WORLD_COORDINATE v.set_instance_transformation(Geometry::translation_transform(displacement) * v.get_instance_transformation().get_matrix()); -#else - v.set_instance_offset(v.get_instance_offset() + displacement); -#endif // ENABLE_WORLD_COORDINATE } std::set<unsigned int> done; // prevent processing volumes twice @@ -1672,11 +1327,7 @@ void Selection::translate(unsigned int object_idx, unsigned int instance_idx, co if (v.object_idx() != object_idx || v.instance_idx() != (int)instance_idx) continue; -#if ENABLE_WORLD_COORDINATE v.set_instance_transformation(Geometry::translation_transform(displacement) * v.get_instance_transformation().get_matrix()); -#else - v.set_instance_offset(v.get_instance_offset() + displacement); -#endif // ENABLE_WORLD_COORDINATE done.insert(j); } } @@ -1684,7 +1335,6 @@ void Selection::translate(unsigned int object_idx, unsigned int instance_idx, co this->set_bounding_boxes_dirty(); } -#if ENABLE_WORLD_COORDINATE int Selection::bake_transform_if_needed() const { if ((is_single_full_instance() && wxGetApp().obj_manipul()->is_world_coordinates()) || @@ -1735,7 +1385,6 @@ int Selection::bake_transform_if_needed() const return 1; } -#endif // ENABLE_WORLD_COORDINATE void Selection::erase() { @@ -1849,12 +1498,8 @@ void Selection::render(float scale_factor) m_scale_factor = scale_factor; // render cumulative bounding box of selected volumes -#if ENABLE_WORLD_COORDINATE const auto& [box, trafo] = get_bounding_box_in_current_reference_system(); render_bounding_box(box, trafo, ColorRGB::WHITE()); -#else - render_bounding_box(get_bounding_box(), ColorRGB::WHITE()); -#endif // ENABLE_WORLD_COORDINATE render_synchronized_volumes(); } @@ -1903,39 +1548,15 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) const Transform3d base_matrix = Geometry::translation_transform(get_bounding_box().center()); Transform3d orient_matrix = Transform3d::Identity(); -#if ENABLE_WORLD_COORDINATE const Vec3d center = get_bounding_box().center(); Vec3d axes_center = center; -#endif // ENABLE_WORLD_COORDINATE if (!boost::starts_with(sidebar_field, "layer")) { shader->set_uniform("emission_factor", 0.05f); -#if ENABLE_WORLD_COORDINATE if (is_single_full_instance() && !wxGetApp().obj_manipul()->is_world_coordinates()) { orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); axes_center = (*m_volumes)[*m_list.begin()]->get_instance_offset(); -#else - const Vec3d& center = get_bounding_box().center(); - if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { - glsafe(::glTranslated(center.x(), center.y(), center.z())); - if (!boost::starts_with(sidebar_field, "position")) { - if (boost::starts_with(sidebar_field, "scale")) - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - else if (boost::starts_with(sidebar_field, "rotation")) { - if (boost::ends_with(sidebar_field, "x")) - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - else if (boost::ends_with(sidebar_field, "y")) { - const Vec3d& rotation = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation(); - if (rotation.x() == 0.0) - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - else - orient_matrix.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); - } - } - } -#endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_WORLD_COORDINATE else if (is_single_volume_or_modifier()) { if (!wxGetApp().obj_manipul()->is_world_coordinates()) { if (wxGetApp().obj_manipul()->is_local_coordinates()) { @@ -1948,32 +1569,18 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) axes_center = (*m_volumes)[*m_list.begin()]->get_instance_offset(); } } -#else - else if (is_single_volume() || is_single_modifier()) { - glsafe(::glTranslated(center.x(), center.y(), center.z())); - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); - if (!boost::starts_with(sidebar_field, "position")) - orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); -#endif // ENABLE_WORLD_COORDINATE } else { if (requires_local_axes()) -#if ENABLE_WORLD_COORDINATE orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); -#else - orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); -#endif // ENABLE_WORLD_COORDINATE } } if (!boost::starts_with(sidebar_field, "layer")) glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); -#if ENABLE_WORLD_COORDINATE - if (!boost::starts_with(sidebar_field, "layer")) { + if (!boost::starts_with(sidebar_field, "layer")) shader->set_uniform("emission_factor", 0.1f); - } -#endif // ENABLE_WORLD_COORDINATE if (boost::starts_with(sidebar_field, "position")) render_sidebar_position_hints(sidebar_field, *shader, base_matrix * orient_matrix); @@ -1984,12 +1591,10 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) else if (boost::starts_with(sidebar_field, "layer")) render_sidebar_layers_hints(sidebar_field, *shader); -#if ENABLE_WORLD_COORDINATE if (!boost::starts_with(sidebar_field, "layer")) { if (wxGetApp().obj_manipul()->is_instance_coordinates()) m_axes.render(Geometry::translation_transform(axes_center) * orient_matrix, 0.25f); } -#endif // ENABLE_WORLD_COORDINATE shader->stop_using(); } @@ -2430,11 +2035,9 @@ void Selection::render_synchronized_volumes() if (m_mode == Instance) return; -#if ENABLE_WORLD_COORDINATE const ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); BoundingBoxf3 box; Transform3d trafo; -#endif // ENABLE_WORLD_COORDINATE for (unsigned int i : m_list) { const GLVolume& volume = *(*m_volumes)[i]; @@ -2448,7 +2051,6 @@ void Selection::render_synchronized_volumes() if (v.object_idx() != object_idx || v.volume_idx() != volume_idx) continue; -#if ENABLE_WORLD_COORDINATE if (coordinates_type == ECoordinatesType::World) { box = v.transformed_convex_hull_bounding_box(); trafo = Transform3d::Identity(); @@ -2462,18 +2064,11 @@ void Selection::render_synchronized_volumes() trafo = v.get_instance_transformation().get_matrix(); } render_bounding_box(box, trafo, ColorRGB::YELLOW()); -#else - render_bounding_box(v.transformed_convex_hull_bounding_box(), ColorRGB::YELLOW()); -#endif // ENABLE_WORLD_COORDINATE } } } -#if ENABLE_WORLD_COORDINATE void Selection::render_bounding_box(const BoundingBoxf3& box, const Transform3d& trafo, const ColorRGB& color) -#else -void Selection::render_bounding_box(const BoundingBoxf3& box, const ColorRGB& color) -#endif // ENABLE_WORLD_COORDINATE { const BoundingBoxf3& curr_box = m_box.get_bounding_box(); @@ -2570,11 +2165,7 @@ void Selection::render_bounding_box(const BoundingBoxf3& box, const ColorRGB& co shader->start_using(); const Camera& camera = wxGetApp().plater()->get_camera(); -#if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * trafo); -#else - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); -#endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #if ENABLE_GL_CORE_PROFILE const std::array<int, 4>& viewport = camera.get_viewport(); @@ -2656,11 +2247,7 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field, void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) { -#if ENABLE_WORLD_COORDINATE const bool uniform_scale = wxGetApp().obj_manipul()->get_uniform_scaling(); -#else - const bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); -#endif // ENABLE_WORLD_COORDINATE auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis, GLShaderProgram& shader, const Transform3d& view_matrix, const Transform3d& model_matrix) { m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); @@ -2792,7 +2379,7 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GL glsafe(::glDisable(GL_BLEND)); } -#if ENABLE_WORLD_COORDINATE_DEBUG +#if ENABLE_MATRICES_DEBUG void Selection::render_debug_window() const { if (m_list.empty()) @@ -2912,7 +2499,7 @@ void Selection::render_debug_window() const imgui.end(); } -#endif // ENABLE_WORLD_COORDINATE_DEBUG +#endif // ENABLE_MATRICES_DEBUG static bool is_left_handed(const Transform3d::ConstLinearPart& m) { @@ -3011,7 +2598,6 @@ static void verify_instances_rotation_synchronized(const Model &model, const GLV #endif /* NDEBUG */ -#if ENABLE_WORLD_COORDINATE void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_type) { std::set<unsigned int> done; // prevent processing volumes twice @@ -3060,69 +2646,6 @@ void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_ verify_instances_rotation_synchronized(*m_model, *m_volumes); #endif /* NDEBUG */ } -#else -void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_type) -{ - std::set<unsigned int> done; // prevent processing volumes twice - done.insert(m_list.begin(), m_list.end()); - - for (unsigned int i : m_list) { - if (done.size() == m_volumes->size()) - break; - - const GLVolume* volume_i = (*m_volumes)[i]; - if (volume_i->is_wipe_tower) - continue; - - const int object_idx = volume_i->object_idx(); - const int instance_idx = volume_i->instance_idx(); - const Vec3d& rotation = volume_i->get_instance_rotation(); - const Vec3d& scaling_factor = volume_i->get_instance_scaling_factor(); - const Vec3d& mirror = volume_i->get_instance_mirror(); - - // Process unselected instances. - for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) { - if (done.size() == m_volumes->size()) - break; - - if (done.find(j) != done.end()) - continue; - - GLVolume* volume_j = (*m_volumes)[j]; - if (volume_j->object_idx() != object_idx || volume_j->instance_idx() == instance_idx) - continue; - - assert(is_rotation_xy_synchronized(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation())); - - switch (sync_rotation_type) { - case SyncRotationType::NONE: { - // z only rotation -> synch instance z - // The X,Y rotations should be synchronized from start to end of the rotation. - assert(is_rotation_xy_synchronized(rotation, volume_j->get_instance_rotation())); - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA) - volume_j->set_instance_offset(Z, volume_i->get_instance_offset().z()); - break; - } - case SyncRotationType::GENERAL: { - // generic rotation -> update instance z with the delta of the rotation. - const double z_diff = Geometry::rotation_diff_z(m_cache.volumes_data[i].get_instance_rotation(), m_cache.volumes_data[j].get_instance_rotation()); - volume_j->set_instance_rotation({ rotation.x(), rotation.y(), rotation.z() + z_diff }); - break; - } - } - - volume_j->set_instance_scaling_factor(scaling_factor); - volume_j->set_instance_mirror(mirror); - - done.insert(j); - } - } - -#ifndef NDEBUG - verify_instances_rotation_synchronized(*m_model, *m_volumes); -#endif /* NDEBUG */ -} -#endif // ENABLE_WORLD_COORDINATE void Selection::synchronize_unselected_volumes() { @@ -3133,14 +2656,7 @@ void Selection::synchronize_unselected_volumes() const int object_idx = volume->object_idx(); const int volume_idx = volume->volume_idx(); -#if ENABLE_WORLD_COORDINATE const Geometry::Transformation& trafo = volume->get_volume_transformation(); -#else - const Vec3d& offset = volume->get_volume_offset(); - const Vec3d& rotation = volume->get_volume_rotation(); - const Vec3d& scaling_factor = volume->get_volume_scaling_factor(); - const Vec3d& mirror = volume->get_volume_mirror(); -#endif // ENABLE_WORLD_COORDINATE // Process unselected volumes. for (unsigned int j = 0; j < (unsigned int)m_volumes->size(); ++j) { @@ -3151,14 +2667,7 @@ void Selection::synchronize_unselected_volumes() if (v->object_idx() != object_idx || v->volume_idx() != volume_idx) continue; -#if ENABLE_WORLD_COORDINATE v->set_volume_transformation(trafo); -#else - v->set_volume_offset(offset); - v->set_volume_rotation(rotation); - v->set_volume_scaling_factor(scaling_factor); - v->set_volume_mirror(mirror); -#endif // ENABLE_WORLD_COORDINATE } } } @@ -3278,13 +2787,8 @@ void Selection::paste_volumes_from_clipboard() { ModelInstance* dst_instance = dst_object->instances[dst_inst_idx]; BoundingBoxf3 dst_instance_bb = dst_object->instance_bounding_box(dst_inst_idx); -#if ENABLE_WORLD_COORDINATE Transform3d src_matrix = src_object->instances[0]->get_transformation().get_matrix_no_offset(); Transform3d dst_matrix = dst_instance->get_transformation().get_matrix_no_offset(); -#else - Transform3d src_matrix = src_object->instances[0]->get_transformation().get_matrix(true); - Transform3d dst_matrix = dst_instance->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE bool from_same_object = (src_object->input_file == dst_object->input_file) && src_matrix.isApprox(dst_matrix); // used to keep relative position of multivolume selections when pasting from another object @@ -3362,7 +2866,6 @@ void Selection::paste_objects_from_clipboard() #endif /* _DEBUG */ } -#if ENABLE_WORLD_COORDINATE void Selection::transform_instance_relative(GLVolume& volume, const VolumeCache& volume_data, TransformationType transformation_type, const Transform3d& transform, const Vec3d& world_pivot) { @@ -3404,7 +2907,6 @@ void Selection::transform_volume_relative(GLVolume& volume, const VolumeCache& v else assert(false); } -#endif // ENABLE_WORLD_COORDINATE } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index b50e8acdb..6d21b0ba2 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -2,12 +2,8 @@ #define slic3r_GUI_Selection_hpp_ #include "libslic3r/Geometry.hpp" -#if ENABLE_WORLD_COORDINATE #include "GUI_Geometry.hpp" #include "CoordAxes.hpp" -#else -#include "GLModel.hpp" -#endif // ENABLE_WORLD_COORDINATE #include <set> #include <optional> @@ -29,60 +25,6 @@ using ModelObjectPtrs = std::vector<ModelObject*>; namespace GUI { -#if !ENABLE_WORLD_COORDINATE -class TransformationType -{ -public: - enum Enum { - // Transforming in a world coordinate system - World = 0, - // Transforming in a local coordinate system - Local = 1, - // Absolute transformations, allowed in local coordinate system only. - Absolute = 0, - // Relative transformations, allowed in both local and world coordinate system. - Relative = 2, - // For group selection, the transformation is performed as if the group made a single solid body. - Joint = 0, - // For group selection, the transformation is performed on each object independently. - Independent = 4, - - World_Relative_Joint = World | Relative | Joint, - World_Relative_Independent = World | Relative | Independent, - Local_Absolute_Joint = Local | Absolute | Joint, - Local_Absolute_Independent = Local | Absolute | Independent, - Local_Relative_Joint = Local | Relative | Joint, - Local_Relative_Independent = Local | Relative | Independent, - }; - - TransformationType() : m_value(World) {} - TransformationType(Enum value) : m_value(value) {} - TransformationType& operator=(Enum value) { m_value = value; return *this; } - - Enum operator()() const { return m_value; } - bool has(Enum v) const { return ((unsigned int)m_value & (unsigned int)v) != 0; } - - void set_world() { this->remove(Local); } - void set_local() { this->add(Local); } - void set_absolute() { this->remove(Relative); } - void set_relative() { this->add(Relative); } - void set_joint() { this->remove(Independent); } - void set_independent() { this->add(Independent); } - - bool world() const { return !this->has(Local); } - bool local() const { return this->has(Local); } - bool absolute() const { return !this->has(Relative); } - bool relative() const { return this->has(Relative); } - bool joint() const { return !this->has(Independent); } - bool independent() const { return this->has(Independent); } - -private: - void add(Enum v) { m_value = Enum((unsigned int)m_value | (unsigned int)v); } - void remove(Enum v) { m_value = Enum((unsigned int)m_value & (~(unsigned int)v)); } - - Enum m_value; -}; -#endif // !ENABLE_WORLD_COORDINATE class Selection { @@ -125,9 +67,7 @@ private: Transform3d scale_matrix{ Transform3d::Identity() }; Transform3d mirror_matrix{ Transform3d::Identity() }; Transform3d full_matrix{ Transform3d::Identity() }; -#if ENABLE_WORLD_COORDINATE Geometry::Transformation transform; -#endif // ENABLE_WORLD_COORDINATE TransformCache() = default; explicit TransformCache(const Geometry::Transformation& transform); @@ -141,18 +81,11 @@ private: VolumeCache(const Geometry::Transformation& volume_transform, const Geometry::Transformation& instance_transform); const Vec3d& get_volume_position() const { return m_volume.position; } -#if !ENABLE_WORLD_COORDINATE - const Vec3d& get_volume_rotation() const { return m_volume.rotation; } - const Vec3d& get_volume_scaling_factor() const { return m_volume.scaling_factor; } - const Vec3d& get_volume_mirror() const { return m_volume.mirror; } -#endif // !ENABLE_WORLD_COORDINATE const Transform3d& get_volume_rotation_matrix() const { return m_volume.rotation_matrix; } const Transform3d& get_volume_scale_matrix() const { return m_volume.scale_matrix; } const Transform3d& get_volume_mirror_matrix() const { return m_volume.mirror_matrix; } const Transform3d& get_volume_full_matrix() const { return m_volume.full_matrix; } -#if ENABLE_WORLD_COORDINATE const Geometry::Transformation& get_volume_transform() const { return m_volume.transform; } -#endif // ENABLE_WORLD_COORDINATE const Vec3d& get_instance_position() const { return m_instance.position; } const Vec3d& get_instance_rotation() const { return m_instance.rotation; } @@ -162,9 +95,7 @@ private: const Transform3d& get_instance_scale_matrix() const { return m_instance.scale_matrix; } const Transform3d& get_instance_mirror_matrix() const { return m_instance.mirror_matrix; } const Transform3d& get_instance_full_matrix() const { return m_instance.full_matrix; } -#if ENABLE_WORLD_COORDINATE const Geometry::Transformation& get_instance_transform() const { return m_instance.transform; } -#endif // ENABLE_WORLD_COORDINATE }; public: @@ -232,7 +163,6 @@ private: // Bounding box of a single full instance selection, in world coordinates. // Modifiers are NOT taken in account std::optional<BoundingBoxf3> m_scaled_instance_bounding_box; -#if ENABLE_WORLD_COORDINATE // Bounding box of a single full instance selection, in world coordinates, with no instance scaling applied. // Modifiers are taken in account std::optional<BoundingBoxf3> m_full_unscaled_instance_bounding_box; @@ -245,15 +175,12 @@ private: // Bounding box aligned to the axis of the currently selected reference system (World/Object/Part) // and transform to place and orient it in world coordinates std::optional<std::pair<BoundingBoxf3, Transform3d>> m_bounding_box_in_current_reference_system; -#endif // ENABLE_WORLD_COORDINATE #if ENABLE_RENDER_SELECTION_CENTER GLModel m_vbo_sphere; #endif // ENABLE_RENDER_SELECTION_CENTER -#if ENABLE_WORLD_COORDINATE CoordAxes m_axes; -#endif // ENABLE_WORLD_COORDINATE GLModel m_arrow; GLModel m_curved_arrow; GLModel m_box; @@ -328,9 +255,7 @@ public: bool is_from_single_object() const; bool is_sla_compliant() const; bool is_instance_mode() const { return m_mode == Instance; } -#if ENABLE_WORLD_COORDINATE bool is_single_volume_or_modifier() const { return is_single_volume() || is_single_modifier(); } -#endif // ENABLE_WORLD_COORDINATE bool is_single_volume_instance() const { return is_single_full_instance() && m_list.size() == 1; } bool is_single_text() const; @@ -344,7 +269,6 @@ public: // returns true if the selection contains all and only the given indices bool matches(const std::vector<unsigned int>& volume_idxs) const; -#if ENABLE_WORLD_COORDINATE enum class EUniformScaleRequiredReason : unsigned char { NotRequired, @@ -353,9 +277,6 @@ public: VolumeNotAxisAligned_Instance, MultipleSelection, }; -#else - bool requires_uniform_scale() const; -#endif // ENABLE_WORLD_COORDINATE // Returns the the object id if the selection is from a single object, otherwise is -1 int get_object_idx() const; @@ -381,7 +302,6 @@ public: // Bounding box of a single full instance selection, in world coordinates. // Modifiers are NOT taken in account const BoundingBoxf3& get_scaled_instance_bounding_box() const; -#if ENABLE_WORLD_COORDINATE // Bounding box of a single full instance selection, in world coordinates, with no instance scaling applied. // Modifiers are taken in account const BoundingBoxf3& get_full_unscaled_instance_bounding_box() const; @@ -397,36 +317,24 @@ public: // Returns the bounding box aligned to the axes of the given reference system // and the transform to place and orient it in world coordinates std::pair<BoundingBoxf3, Transform3d> get_bounding_box_in_reference_system(ECoordinatesType type) const; -#endif // ENABLE_WORLD_COORDINATE void setup_cache(); -#if ENABLE_WORLD_COORDINATE void translate(const Vec3d& displacement, TransformationType transformation_type); -#else - void translate(const Vec3d& displacement, bool local = false); -#endif // ENABLE_WORLD_COORDINATE void rotate(const Vec3d& rotation, TransformationType transformation_type); void flattening_rotate(const Vec3d& normal); void scale(const Vec3d& scale, TransformationType transformation_type); void scale_to_fit_print_volume(const BuildVolume& volume); -#if ENABLE_WORLD_COORDINATE void scale_and_translate(const Vec3d& scale, const Vec3d& world_translation, TransformationType transformation_type); void mirror(Axis axis, TransformationType transformation_type); void reset_skew(); -#else - void mirror(Axis axis); - void translate(unsigned int object_idx, const Vec3d& displacement); -#endif // ENABLE_WORLD_COORDINATE void translate(unsigned int object_idx, unsigned int instance_idx, const Vec3d& displacement); -#if ENABLE_WORLD_COORDINATE // returns: // -1 if the user refused to proceed with baking when asked // 0 if the baking was performed // 1 if no baking was needed int bake_transform_if_needed() const; -#endif // ENABLE_WORLD_COORDINATE void erase(); @@ -456,9 +364,9 @@ public: // returns the list of idxs of the objects which are in the selection std::set<unsigned int> get_object_idxs() const; -#if ENABLE_WORLD_COORDINATE_DEBUG +#if ENABLE_MATRICES_DEBUG void render_debug_window() const; -#endif // ENABLE_WORLD_COORDINATE_DEBUG +#endif // ENABLE_MATRICES_DEBUG private: void update_valid(); @@ -469,7 +377,6 @@ private: void do_remove_volume(unsigned int volume_idx); void do_remove_instance(unsigned int object_idx, unsigned int instance_idx); void do_remove_object(unsigned int object_idx); -#if ENABLE_WORLD_COORDINATE void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); @@ -477,15 +384,8 @@ private: m_full_unscaled_instance_local_bounding_box.reset(); m_bounding_box_in_current_reference_system.reset(); } -#else - void set_bounding_boxes_dirty() { m_bounding_box.reset(); m_unscaled_instance_bounding_box.reset(); m_scaled_instance_bounding_box.reset(); } -#endif // ENABLE_WORLD_COORDINATE void render_synchronized_volumes(); -#if ENABLE_WORLD_COORDINATE void render_bounding_box(const BoundingBoxf3& box, const Transform3d& trafo, const ColorRGB& color); -#else - void render_bounding_box(const BoundingBoxf3& box, const ColorRGB& color); -#endif // ENABLE_WORLD_COORDINATE void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); @@ -499,10 +399,8 @@ public: NONE = 0, // Synchronize after rotation by an axis not parallel with Z. GENERAL = 1, -#if ENABLE_WORLD_COORDINATE // Synchronize after rotation reset. RESET = 2 -#endif // ENABLE_WORLD_COORDINATE }; void synchronize_unselected_instances(SyncRotationType sync_rotation_type); void synchronize_unselected_volumes(); @@ -515,12 +413,10 @@ private: void paste_volumes_from_clipboard(); void paste_objects_from_clipboard(); -#if ENABLE_WORLD_COORDINATE void transform_instance_relative(GLVolume& volume, const VolumeCache& volume_data, TransformationType transformation_type, const Transform3d& transform, const Vec3d& world_pivot); void transform_volume_relative(GLVolume& volume, const VolumeCache& volume_data, TransformationType transformation_type, const Transform3d& transform, const Vec3d& world_pivot); -#endif // ENABLE_WORLD_COORDINATE }; } // namespace GUI diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e528191aa..ac742da2e 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -590,13 +590,7 @@ void LockButton::OnButton(wxCommandEvent& event) if (m_disabled) return; -#if ENABLE_WORLD_COORDINATE SetLock(!m_is_pushed); -#else - m_is_pushed = !m_is_pushed; - update_button_bitmaps(); -#endif // ENABLE_WORLD_COORDINATE - event.Skip(); } From e3aff0383cb3345b6bc02518b1b7a7add10506c2 Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Thu, 9 Mar 2023 09:06:06 +0100 Subject: [PATCH 3/5] Ensure that the Coordinate System selected in the sidebar panel is always one supported by the current selection --- src/libslic3r/Technologies.hpp | 15 ++++---- src/slic3r/GUI/GLCanvas3D.cpp | 3 ++ src/slic3r/GUI/GUI_ObjectList.cpp | 8 +++++ src/slic3r/GUI/GUI_ObjectManipulation.cpp | 43 +++++++++++++---------- src/slic3r/GUI/GUI_ObjectManipulation.hpp | 4 +++ 5 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 793585a67..60d89c9e9 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -34,6 +34,8 @@ #define ENABLE_GLMODEL_STATISTICS 0 // Shows an imgui dialog containing the matrices of the selected volumes #define ENABLE_MATRICES_DEBUG 0 +// Shows an imgui dialog containing data from class ObjectManipulation +#define ENABLE_OBJECT_MANIPULATION_DEBUG 0 // Enable rendering of objects using environment map @@ -41,18 +43,19 @@ // Enable smoothing of objects normals #define ENABLE_SMOOTH_NORMALS 0 - -//==================== -// 2.6.0.alpha1 techs -//==================== -#define ENABLE_2_6_0_ALPHA1 1 - // Enable OpenGL ES #define ENABLE_OPENGL_ES 0 // Enable OpenGL core profile context (tested against Mesa 20.1.8 on Windows) #define ENABLE_GL_CORE_PROFILE (1 && !ENABLE_OPENGL_ES) // Enable OpenGL debug messages using debug context #define ENABLE_OPENGL_DEBUG_OPTION (1 && ENABLE_GL_CORE_PROFILE) + + +//==================== +// 2.6.0.alpha1 techs +//==================== +#define ENABLE_2_6_0_ALPHA1 1 + // Enable alternative version of file_wildcards() #define ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR (1 && ENABLE_2_6_0_ALPHA1) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index cfc944888..1b1e268f0 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1639,6 +1639,9 @@ void GLCanvas3D::render() #if ENABLE_GLMODEL_STATISTICS GLModel::render_statistics(); #endif // ENABLE_GLMODEL_STATISTICS +#if ENABLE_OBJECT_MANIPULATION_DEBUG + wxGetApp().obj_manipul()->render_debug_window(); +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG std::string tooltip; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 0731be1f8..17345e36b 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2668,6 +2668,8 @@ void ObjectList::part_selection_changed() bool disable_ss_manipulation {false}; bool disable_ununiform_scale {false}; + ECoordinatesType coordinates_type = wxGetApp().obj_manipul()->get_coordinates_type(); + const auto item = GetSelection(); GLGizmosManager& gizmos_mgr = wxGetApp().plater()->canvas3D()->get_gizmos_manager(); @@ -2684,6 +2686,7 @@ void ObjectList::part_selection_changed() if (selection.is_single_full_object()) { og_name = _L("Object manipulation"); + coordinates_type = ECoordinatesType::World; update_and_show_manipulations = true; obj_idx = selection.get_object_idx(); @@ -2693,6 +2696,7 @@ void ObjectList::part_selection_changed() } else { og_name = _L("Group manipulation"); + coordinates_type = ECoordinatesType::World; // don't show manipulation panel for case of all Object's parts selection update_and_show_manipulations = !selection.is_single_full_instance(); @@ -2748,6 +2752,8 @@ void ObjectList::part_selection_changed() || type == itInfo) { og_name = _L("Object manipulation"); m_config = &object->config; + if (!scene_selection().is_single_full_instance() || coordinates_type > ECoordinatesType::Instance) + coordinates_type = ECoordinatesType::World; update_and_show_manipulations = true; if (type == itInfo) { @@ -2825,6 +2831,8 @@ void ObjectList::part_selection_changed() if (update_and_show_manipulations) { wxGetApp().obj_manipul()->get_og()->set_name(" " + og_name + " "); + if (wxGetApp().obj_manipul()->get_coordinates_type() != coordinates_type) + wxGetApp().obj_manipul()->set_coordinates_type(coordinates_type); if (item) { wxGetApp().obj_manipul()->update_item_name(m_objects_model->GetName(item)); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 9314a0d06..472ffe26b 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -482,6 +482,8 @@ void ObjectManipulation::Show(const bool show) } if (show) { + ECoordinatesType coordinates_type = m_coordinates_type; + // Show the "World Coordinates" / "Local Coordintes" Combo in Advanced / Expert mode only. const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); bool show_world_local_combo = wxGetApp().get_mode() != comSimple && (selection.is_single_full_instance() || selection.is_single_volume_or_modifier()); @@ -491,15 +493,12 @@ void ObjectManipulation::Show(const bool show) #else m_word_local_combo->Insert(coordinate_type_str(ECoordinatesType::Local), wxNullBitmap, 2); #endif // __linux__ - m_word_local_combo->Select((int)ECoordinatesType::World); - this->set_coordinates_type(m_word_local_combo->GetString(m_word_local_combo->GetSelection())); } else if (selection.is_single_full_instance() && m_word_local_combo->GetCount() > 2) { m_word_local_combo->Delete(2); - m_word_local_combo->Select((int)ECoordinatesType::World); - this->set_coordinates_type(m_word_local_combo->GetString(m_word_local_combo->GetSelection())); + if (coordinates_type > ECoordinatesType::Instance) + coordinates_type = ECoordinatesType::World; } - m_word_local_combo->Show(show_world_local_combo); m_empty_str->Show(!show_world_local_combo); } @@ -742,9 +741,6 @@ void ObjectManipulation::update_if_dirty() m_lock_bnt->SetToolTip(wxEmptyString); m_lock_bnt->enable(); - if (m_word_local_combo->GetSelection() != (int)m_coordinates_type) - m_word_local_combo->SetSelection((int)m_coordinates_type); - if (m_new_enabled) m_og->enable(); else @@ -858,6 +854,19 @@ wxString ObjectManipulation::coordinate_type_str(ECoordinatesType type) } } +#if ENABLE_OBJECT_MANIPULATION_DEBUG +void ObjectManipulation::render_debug_window() +{ + ImGuiWrapper& imgui = *wxGetApp().imgui(); +// ImGui::SetNextWindowCollapsed(true, ImGuiCond_Once); + imgui.begin(std::string("ObjectManipulation"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, "Coordinates type"); + ImGui::SameLine(); + imgui.text(coordinate_type_str(m_coordinates_type)); + imgui.end(); +} +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + void ObjectManipulation::reset_settings_value() { m_new_position = Vec3d::Zero(); @@ -1084,6 +1093,7 @@ void ObjectManipulation::set_coordinates_type(ECoordinatesType type) return; m_coordinates_type = type; + m_word_local_combo->SetSelection((int)m_coordinates_type); this->UpdateAndShow(true); GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); canvas->get_gizmos_manager().update_data(); @@ -1093,10 +1103,6 @@ void ObjectManipulation::set_coordinates_type(ECoordinatesType type) ECoordinatesType ObjectManipulation::get_coordinates_type() const { - const wxString og_name = get_og()->get_name(); - if (og_name.Contains(_L("Group manipulation"))) - return ECoordinatesType::World; - return m_coordinates_type; } @@ -1151,13 +1157,12 @@ void ObjectManipulation::sys_color_changed() void ObjectManipulation::set_coordinates_type(const wxString& type_string) { - ECoordinatesType type = ECoordinatesType::World; - if (type_string == coordinate_type_str(ECoordinatesType::Instance)) - type = ECoordinatesType::Instance; - else if (type_string == coordinate_type_str(ECoordinatesType::Local)) - type = ECoordinatesType::Local; - - this->set_coordinates_type(type); + if (type_string == coordinate_type_str(ECoordinatesType::Instance)) + this->set_coordinates_type(ECoordinatesType::Instance); + else if (type_string == coordinate_type_str(ECoordinatesType::Local)) + this->set_coordinates_type(ECoordinatesType::Local); + else + this->set_coordinates_type(ECoordinatesType::World); } static const char axes[] = { 'x', 'y', 'z' }; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 1523ad1fa..428ffc24b 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -213,6 +213,10 @@ public: static wxString coordinate_type_str(ECoordinatesType type); +#if ENABLE_OBJECT_MANIPULATION_DEBUG + void render_debug_window(); +#endif // ENABLE_OBJECT_MANIPULATION_DEBUG + private: void reset_settings_value(); void update_settings_value(const Selection& selection); From 9ab132ca44a02f2d33d7891978ac3cc7204988ad Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Thu, 9 Mar 2023 09:49:55 +0100 Subject: [PATCH 4/5] Fixed warnings --- src/slic3r/GUI/3DScene.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 5 ++--- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index c25bff45d..7b4fee156 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -494,7 +494,7 @@ int GLVolumeCollection::load_wipe_tower_preview( height = 0.1f; static const float brim_height = 0.2f; - const float scaled_brim_height = brim_height / height; +// const float scaled_brim_height = brim_height / height; TriangleMesh mesh; ColorRGBA color = ColorRGBA::DARK_YELLOW(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1b1e268f0..3ea788126 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -7137,11 +7137,10 @@ const ModelVolume *get_model_volume(const GLVolume &v, const Model &model) { const ModelVolume * ret = nullptr; - if (v.object_idx() < model.objects.size()) { + if (v.object_idx() < (int)model.objects.size()) { const ModelObject *obj = model.objects[v.object_idx()]; - if (v.volume_idx() < obj->volumes.size()) { + if (v.volume_idx() < (int)obj->volumes.size()) ret = obj->volumes[v.volume_idx()]; - } } return ret; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index eec764efe..332572c01 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -58,7 +58,7 @@ std::string GLGizmoScale3D::get_tooltip() const static int constraint_id(int grabber_id) { static const std::vector<int> id_map = { 1, 0, 3, 2, 5, 4, 8, 9, 6, 7 }; - return (0 <= grabber_id && grabber_id < id_map.size()) ? id_map[grabber_id] : -1; + return (0 <= grabber_id && grabber_id < (int)id_map.size()) ? id_map[grabber_id] : -1; } bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) @@ -157,8 +157,6 @@ void GLGizmoScale3D::on_dragging(const UpdateData& data) void GLGizmoScale3D::on_render() { - const Selection& selection = m_parent.get_selection(); - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); From 91db979c8c5fab33d5c01df67121246c7fd20a41 Mon Sep 17 00:00:00 2001 From: enricoturri1966 <enricoturri@seznam.cz> Date: Thu, 30 Mar 2023 09:09:50 +0200 Subject: [PATCH 5/5] Show the reset button for skew only when the world matrix contains skew (so that the skewed object is visible in the 3D scene view) --- src/slic3r/GUI/GUI_ObjectManipulation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index dc4b17707..7c8df40b3 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -433,7 +433,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : m_main_grid_sizer->Add(editors_grid_sizer, 1, wxEXPAND); - m_skew_label = new wxStaticText(parent, wxID_ANY, _L("Skew")); + m_skew_label = new wxStaticText(parent, wxID_ANY, _L("Skew [World]")); m_main_grid_sizer->Add(m_skew_label, 1, wxEXPAND); m_reset_skew_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo")); @@ -780,7 +780,7 @@ void ObjectManipulation::update_reset_buttons_visibility() show_rotation = trafo_svd.rotation; show_scale = trafo_svd.scale; show_mirror = trafo_svd.mirror; - show_skew = trafo_svd.skew; + show_skew = Geometry::TransformationSVD(volume->world_matrix()).skew; } wxGetApp().CallAfter([this, show_drop_to_bed, show_rotation, show_scale, show_mirror, show_skew] {