diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 103af9a031..d3b28be268 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1828,7 +1828,7 @@ namespace Slic3r { stream << " \n"; } - Transform3d t = instance->world_matrix(); + Transform3d t = instance->get_matrix(); build_items.emplace_back(instance_id, t); stream << " \n"; diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 89b476d755..f016c2ffdf 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -727,7 +727,7 @@ void ModelObject::translate_instance(size_t instance_idx, const Vec3d& vector) invalidate_bounding_box(); } -void ModelObject::translate(coordf_t x, coordf_t y, coordf_t z) +void ModelObject::translate(double x, double y, double z) { for (ModelVolume *v : this->volumes) { @@ -918,7 +918,7 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const double min_z = DBL_MAX; ModelInstance* inst = instances[instance_idx]; - const Transform3d& m = inst->world_matrix(true); + const Transform3d& m = inst->get_matrix(true); for (ModelVolume *v : volumes) { @@ -945,7 +945,7 @@ unsigned int ModelObject::check_instances_print_volume_state(const BoundingBoxf3 unsigned int inside_outside = 0; for (const ModelVolume *vol : this->volumes) if (vol->is_model_part()) { - BoundingBoxf3 bb = vol->get_convex_hull().transformed_bounding_box(model_instance->world_matrix()); + BoundingBoxf3 bb = vol->get_convex_hull().transformed_bounding_box(model_instance->get_matrix()); if (print_volume.contains(bb)) inside_outside |= INSIDE; else if (print_volume.intersects(bb)) @@ -1042,11 +1042,6 @@ const TriangleMesh& ModelVolume::get_convex_hull() const return m_convex_hull; } -TriangleMesh& ModelVolume::get_convex_hull() -{ - return m_convex_hull; -} - ModelVolume::Type ModelVolume::type_from_string(const std::string &s) { // Legacy support @@ -1113,6 +1108,17 @@ size_t ModelVolume::split(unsigned int max_extruders) return idx; } +void ModelVolume::translate(double x, double y, double z) +{ + translate(Vec3d(x, y, z)); +} + +void ModelVolume::translate(const Vec3d& displacement) +{ + mesh.translate((float)displacement(0), (float)displacement(1), (float)displacement(2)); + m_convex_hull.translate((float)displacement(0), (float)displacement(1), (float)displacement(2)); +} + #if !ENABLE_MODELVOLUME_TRANSFORM void ModelInstance::set_rotation(const Vec3d& rotation) { @@ -1168,14 +1174,14 @@ void ModelInstance::set_mirror(Axis axis, double mirror) void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const { - mesh->transform(world_matrix(dont_translate).cast()); + mesh->transform(get_matrix(dont_translate).cast()); } BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh* mesh, bool dont_translate) const { // Rotate around mesh origin. TriangleMesh copy(*mesh); - copy.transform(world_matrix(true, false, true, true).cast()); + copy.transform(get_matrix(true, false, true, true).cast()); BoundingBoxf3 bbox = copy.bounding_box(); if (!empty(bbox)) { @@ -1212,12 +1218,12 @@ BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh* mes BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const { - return bbox.transformed(world_matrix(dont_translate)); + return bbox.transformed(get_matrix(dont_translate)); } Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const { - return world_matrix(dont_translate) * v; + return get_matrix(dont_translate) * v; } void ModelInstance::transform_polygon(Polygon* polygon) const diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index df7798a50b..b72f20501a 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -160,7 +160,7 @@ public: void translate_instances(const Vec3d& vector); void translate_instance(size_t instance_idx, const Vec3d& vector); void translate(const Vec3d &vector) { this->translate(vector(0), vector(1), vector(2)); } - void translate(coordf_t x, coordf_t y, coordf_t z); + void translate(double x, double y, double z); void scale(const Vec3d &versor); void scale(const double s) { this->scale(Vec3d(s, s, s)); } void rotate(float angle, const Axis &axis); @@ -210,13 +210,6 @@ class ModelVolume : public ModelBase { friend class ModelObject; - // The convex hull of this model's mesh. - TriangleMesh m_convex_hull; - -#if ENABLE_MODELVOLUME_TRANSFORM - Geometry::Transformation m_transformation; -#endif // ENABLE_MODELVOLUME_TRANSFORM - public: std::string name; // The triangular model. @@ -253,18 +246,22 @@ public: // Return the number of volumes created from this one. // This is useful to assign different materials to different volumes of an object. size_t split(unsigned int max_extruders); + void translate(double x, double y, double z); + void translate(const Vec3d& displacement); ModelMaterial* assign_unique_material(); void calculate_convex_hull(); const TriangleMesh& get_convex_hull() const; - TriangleMesh& get_convex_hull(); // Helpers for loading / storing into AMF / 3MF files. static Type type_from_string(const std::string &s); static std::string type_to_string(const Type t); #if ENABLE_MODELVOLUME_TRANSFORM + const Geometry::Transformation& get_transformation() const { return m_transformation; } + void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } + const Vec3d& get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } @@ -288,6 +285,8 @@ public: void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); } void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); } + + 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_MODELVOLUME_TRANSFORM private: @@ -296,7 +295,12 @@ private: // Is it an object to be printed, or a modifier volume? Type m_type; t_model_material_id m_material_id; - + // The convex hull of this model's mesh. + TriangleMesh m_convex_hull; +#if ENABLE_MODELVOLUME_TRANSFORM + Geometry::Transformation m_transformation; +#endif // ENABLE_MODELVOLUME_TRANSFORM + ModelVolume(ModelObject *object, const TriangleMesh &mesh) : mesh(mesh), m_type(MODEL_PART), object(object) { if (mesh.stl.stats.number_of_facets > 1) @@ -419,9 +423,9 @@ public: void transform_polygon(Polygon* polygon) const; #if ENABLE_MODELVOLUME_TRANSFORM - const Transform3d& world_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); } + 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); } #else - Transform3d world_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; + Transform3d get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; #endif // ENABLE_MODELVOLUME_TRANSFORM bool is_printable() const { return print_volume_state == PVS_Inside; } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index d6f0d9e0d0..53874849b4 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -411,7 +411,7 @@ void Print::add_model_object(ModelObject* model_object, int idx) // Set the transformation matrix without translation from the first instance. if (! model_object->instances.empty()) - object->set_trafo(model_object->instances.front()->world_matrix(true)); + object->set_trafo(model_object->instances.front()->get_matrix(true)); size_t volume_id = 0; for (const ModelVolume *volume : model_object->volumes) { @@ -686,7 +686,7 @@ static std::vector print_objects_from_model_object(const ModelOb trafo.copies.assign(1, Point()); for (ModelInstance *model_instance : model_object.instances) if (model_instance->is_printable()) { - trafo.trafo = model_instance->world_matrix(); + trafo.trafo = model_instance->get_matrix(); // Set the Z axis of the transformation. trafo.copies.front() = Point::new_scale(trafo.trafo.data()[3], trafo.trafo.data()[7]); trafo.trafo.data()[3] = 0; diff --git a/src/slic3r/GUI/GLGizmo.cpp b/src/slic3r/GUI/GLGizmo.cpp index 6deedb0b37..c7f0f66b7f 100644 --- a/src/slic3r/GUI/GLGizmo.cpp +++ b/src/slic3r/GUI/GLGizmo.cpp @@ -1184,7 +1184,7 @@ void GLGizmoFlatten::on_render(const GLCanvas3D::Selection& selection) const int instance_idx = selection.get_instance_idx(); if ((instance_idx != -1) && (m_model_object != nullptr)) { - Transform3d m = m_model_object->instances[instance_idx]->world_matrix(); + Transform3d m = m_model_object->instances[instance_idx]->get_matrix(); m.pretranslate(dragged_offset); ::glPushMatrix(); ::glMultMatrixd(m.data()); @@ -1214,7 +1214,7 @@ void GLGizmoFlatten::on_render_for_picking(const GLCanvas3D::Selection& selectio if ((instance_idx != -1) && (m_model_object != nullptr)) { ::glPushMatrix(); - ::glMultMatrixd(m_model_object->instances[instance_idx]->world_matrix().data()); + ::glMultMatrixd(m_model_object->instances[instance_idx]->get_matrix().data()); ::glBegin(GL_POLYGON); for (const Vec3d& vertex : m_planes[i].vertices) { @@ -1439,7 +1439,7 @@ bool GLGizmoFlatten::is_plane_update_necessary() const Vec3d GLGizmoFlatten::get_flattening_rotation() const { // calculates the rotations in model space, taking in account the scaling factors - Eigen::Matrix m = m_model_object->instances.front()->world_matrix(true, true).matrix().block(0, 0, 3, 3).inverse().transpose(); + Eigen::Matrix m = m_model_object->instances.front()->get_matrix(true, true).matrix().block(0, 0, 3, 3).inverse().transpose(); Eigen::Quaterniond q; Vec3d angles = Geometry::extract_euler_angles(q.setFromTwoVectors(m * m_normal, -Vec3d::UnitZ()).toRotationMatrix()); m_normal = Vec3d::Zero(); @@ -1478,7 +1478,7 @@ void GLGizmoSlaSupports::set_model_object_ptr(ModelObject* model_object) { m_starting_center = Vec3d::Zero(); m_model_object = model_object; - m_model_object_matrix = model_object->instances.front()->world_matrix(); + m_model_object_matrix = model_object->instances.front()->get_matrix(); if (is_mesh_update_necessary()) update_mesh(); } @@ -1560,7 +1560,7 @@ bool GLGizmoSlaSupports::is_mesh_update_necessary() const if (m_state != On || !m_model_object || m_model_object->instances.empty()) return false; - if ((m_model_object->instances.front()->world_matrix() * m_source_data.matrix.inverse() * Vec3d(1., 1., 1.) - Vec3d(1., 1., 1.)).norm() > 0.001 ) + if ((m_model_object->instances.front()->get_matrix() * m_source_data.matrix.inverse() * Vec3d(1., 1., 1.) - Vec3d(1., 1., 1.)).norm() > 0.001) return true; // following should detect direct mesh changes (can be removed after the mesh is made completely immutable): @@ -1588,7 +1588,7 @@ void GLGizmoSlaSupports::update_mesh() F(i, 1) = 3*i+1; F(i, 2) = 3*i+2; } - m_source_data.matrix = m_model_object->instances.front()->world_matrix(); + m_source_data.matrix = m_model_object->instances.front()->get_matrix(); const float* first_vertex = m_model_object->volumes.front()->get_convex_hull().first_vertex(); m_source_data.mesh_first_point = Vec3d((double)first_vertex[0], (double)first_vertex[1], (double)first_vertex[2]); // we'll now reload Grabbers (selection might have changed): @@ -1629,7 +1629,7 @@ Vec3f GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos) const Vec3f& b = m_V.row(m_F(fid, 1)); const Vec3f& c = m_V.row(m_F(fid, 2)); Vec3f point = bc(0)*a + bc(1)*b + bc(2)*c; - return m_model_object->instances.front()->world_matrix().inverse().cast() * point; + return m_model_object->instances.front()->get_matrix().inverse().cast() * point; } void GLGizmoSlaSupports::clicked_on_object(const Vec2d& mouse_position) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f8055261ba..def2d62182 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -729,10 +729,7 @@ void ObjectList::load_part( ModelObject* model_object, part_names.Add(new_volume->name); if (delta != Vec3d::Zero()) - { - new_volume->mesh.translate((float)delta(0), (float)delta(1), (float)delta(2)); - new_volume->get_convex_hull().translate((float)delta(0), (float)delta(1), (float)delta(2)); - } + new_volume->translate(delta); // set a default extruder value, since user can't add it manually new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));