diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index c0d9c4005..193673260 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -216,6 +216,7 @@ GLVolume::GLVolume(float r, float g, float b, float a) , m_world_matrix_dirty(true) , m_transformed_bounding_box_dirty(true) #endif // ENABLE_MODELVOLUME_TRANSFORM + , m_sla_shift_z(0.0) , m_transformed_convex_hull_bounding_box_dirty(true) , m_convex_hull(nullptr) , m_convex_hull_owned(false) @@ -380,7 +381,14 @@ void GLVolume::set_convex_hull(const TriangleMesh *convex_hull, bool owned) m_convex_hull_owned = owned; } -#if !ENABLE_MODELVOLUME_TRANSFORM +#if ENABLE_MODELVOLUME_TRANSFORM +Transform3d GLVolume::world_matrix() const +{ + Transform3d m = m_instance_transformation.get_matrix() * m_volume_transformation.get_matrix(); + m.translation()(2) += m_sla_shift_z; + return m; +} +#else const Transform3f& GLVolume::world_matrix() const { if (m_world_matrix_dirty) @@ -390,7 +398,7 @@ const Transform3f& GLVolume::world_matrix() const } return m_world_matrix; } -#endif // !ENABLE_MODELVOLUME_TRANSFORM +#endif // ENABLE_MODELVOLUME_TRANSFORM const BoundingBoxf3& GLVolume::transformed_bounding_box() const { diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index c1a3a3af2..eb6bb9311 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -278,6 +278,8 @@ private: // Whether or not is needed to recalculate the world matrix. mutable bool m_world_matrix_dirty; #endif // ENABLE_MODELVOLUME_TRANSFORM + // Shift in z required by sla supports+pad + double m_sla_shift_z; // Bounding box of this volume, in unscaled coordinates. mutable BoundingBoxf3 m_transformed_bounding_box; // Whether or not is needed to recalculate the transformed bounding box. @@ -426,6 +428,9 @@ public: const Vec3d& get_offset() const; void set_offset(const Vec3d& offset); #endif // ENABLE_MODELVOLUME_TRANSFORM + + double get_sla_shift_z() const { return m_sla_shift_z; } + void set_sla_shift_z(double z) { m_sla_shift_z = z; } void set_convex_hull(const TriangleMesh *convex_hull, bool owned); @@ -434,7 +439,7 @@ public: int instance_idx() const { return this->composite_id.instance_id; } #if ENABLE_MODELVOLUME_TRANSFORM - Transform3d world_matrix() const { return m_instance_transformation.get_matrix() * m_volume_transformation.get_matrix(); } + Transform3d world_matrix() const; #else const Transform3f& world_matrix() const; #endif // ENABLE_MODELVOLUME_TRANSFORM diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7a618436e..2f704a9ba 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3937,6 +3937,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re delete volume; } else { // This GLVolume will be reused. + volume->set_sla_shift_z(0.0); map_glvolume_old_to_new[volume_id] = glvolumes_new.size(); mvs->volume_idx = glvolumes_new.size(); glvolumes_new.emplace_back(volume); @@ -4045,7 +4046,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); else // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. - m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, -1, instance_idx); + m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); } } @@ -4060,11 +4061,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re { // If any volume has been added // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed - Vec3d shift_z(0.0, 0.0, print_object->get_elevation()); + double shift_z = print_object->get_elevation(); for (GLVolume* volume : m_volumes.volumes) { if (volume->object_idx() == object_idx) - volume->set_instance_offset(volume->get_instance_offset() + shift_z); + volume->set_sla_shift_z(shift_z); } } }