From 864bc6ad485481a4dd45ca98d528fe5538c17e9b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 5 Nov 2018 08:51:00 +0100 Subject: [PATCH] Mirror of ModelVolume as transformation component (without modifying the mesh) --- src/libslic3r/Model.cpp | 24 +++++++++++++++++++++--- src/libslic3r/Model.hpp | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index e86e094637..c426913958 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -894,15 +894,16 @@ void ModelObject::rotate(double angle, const Vec3d& axis) this->invalidate_bounding_box(); } -void ModelObject::mirror(const Axis &axis) +void ModelObject::mirror(Axis axis) { for (ModelVolume *v : this->volumes) { - v->mesh.mirror(axis); - v->m_convex_hull.mirror(axis); + v->mirror(axis); } +#if !ENABLE_MODELVOLUME_TRANSFORM this->origin_translation = Vec3d::Zero(); +#endif // !ENABLE_MODELVOLUME_TRANSFORM this->invalidate_bounding_box(); } @@ -1276,6 +1277,23 @@ void ModelVolume::rotate(double angle, const Vec3d& axis) #endif // ENABLE_MODELVOLUME_TRANSFORM } +void ModelVolume::mirror(Axis axis) +{ +#if ENABLE_MODELVOLUME_TRANSFORM + Vec3d mirror = m_transformation.get_mirror(); + switch (axis) + { + case X: { mirror(0) *= -1.0; break; } + case Y: { mirror(1) *= -1.0; break; } + case Z: { mirror(2) *= -1.0; break; } + } + m_transformation.set_mirror(mirror); +#else + mesh.mirror(axis); + m_convex_hull.mirror(axis); +#endif // ENABLE_MODELVOLUME_TRANSFORM +} + #if !ENABLE_MODELVOLUME_TRANSFORM void ModelInstance::set_rotation(const Vec3d& rotation) { diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index c420c5ead8..a3aeab7395 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -233,7 +233,7 @@ public: void scale(double x, double y, double z) { this->scale(Vec3d(x, y, z)); } void rotate(double angle, Axis axis); void rotate(double angle, const Vec3d& axis); - void mirror(const Axis &axis); + void mirror(Axis axis); size_t materials_count() const; size_t facets_count() const; bool needed_repair() const; @@ -321,6 +321,7 @@ public: void scale(double s) { scale(Vec3d(s, s, s)); } void rotate(double angle, Axis axis); void rotate(double angle, const Vec3d& axis); + void mirror(Axis axis); ModelMaterial* assign_unique_material();