From d45739fa15bc4594ee09c934c07d504890c1ab79 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 16 Nov 2018 11:30:36 +0100 Subject: [PATCH] Keeps objects on bed while scaling them using the scale gizmo --- src/libslic3r/Technologies.hpp | 2 ++ src/slic3r/GUI/GLCanvas3D.cpp | 17 +++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 3 +++ 3 files changed, 22 insertions(+) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 2e5e5c845c..090013df0d 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -23,6 +23,8 @@ #define ENABLE_MODIFIED_CAMERA_TARGET (1 && ENABLE_1_42_0) // Add Geometry::Transformation class and use it into ModelInstance, ModelVolume and GLVolume #define ENABLE_MODELVOLUME_TRANSFORM (1 && ENABLE_1_42_0) +// Keeps objects on bed while scaling them using the scale gizmo +#define ENABLE_ENSURE_ON_BED_WHILE_SCALING (1 && ENABLE_MODELVOLUME_TRANSFORM) // Gizmos always rendered on top of objects #define ENABLE_GIZMOS_ON_TOP (1 && ENABLE_1_42_0) // New menu layout (open/save/save as project + import/export) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index da6a9839c7..586c8bb1c3 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1639,6 +1639,10 @@ void GLCanvas3D::Selection::scale(const Vec3d& scale) _synchronize_unselected_volumes(); #endif // !DISABLE_INSTANCES_SYNCH +#if ENABLE_ENSURE_ON_BED_WHILE_SCALING + _ensure_on_bed(); +#endif // ENABLE_ENSURE_ON_BED_WHILE_SCALING + m_bounding_box_dirty = true; } @@ -2302,6 +2306,19 @@ void GLCanvas3D::Selection::_synchronize_unselected_volumes() } } +#if ENABLE_ENSURE_ON_BED_WHILE_SCALING +void GLCanvas3D::Selection::_ensure_on_bed() +{ + for (unsigned int i : m_list) + { + GLVolume* volume = (*m_volumes)[i]; + double min_z = volume->transformed_convex_hull_bounding_box().min(2); + if (min_z != 0.0) + volume->set_instance_offset(Z, volume->get_instance_offset(Z) - min_z); + } +} +#endif // ENABLE_ENSURE_ON_BED_WHILE_SCALING + const float GLCanvas3D::Gizmos::OverlayTexturesScale = 0.75f; const float GLCanvas3D::Gizmos::OverlayOffsetX = 10.0f * OverlayTexturesScale; const float GLCanvas3D::Gizmos::OverlayGapY = 5.0f * OverlayTexturesScale; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index be48b1ac22..3f76f5b4e7 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -559,6 +559,9 @@ public: void _render_bounding_box(const BoundingBoxf3& box, float* color) const; void _synchronize_unselected_instances(); void _synchronize_unselected_volumes(); +#if ENABLE_ENSURE_ON_BED_WHILE_SCALING + void _ensure_on_bed(); +#endif // ENABLE_ENSURE_ON_BED_WHILE_SCALING }; private: