diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 62a6813a6..d34466742 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -129,10 +129,9 @@ MeshRaycaster::MeshRaycaster(const TriangleMesh& mesh) { } -MeshRaycaster::~MeshRaycaster() -{ - delete m_AABB_wrapper; -} +// Define the default destructor here. This is needed for the PIMPL with +// unique_ptr to work, the AABBWrapper is complete here. +MeshRaycaster::~MeshRaycaster() = default; Vec3f MeshRaycaster::AABBWrapper::get_hit_pos(const igl::Hit& hit) const { diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index e4c4c20d2..d05cc4206 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -17,7 +17,7 @@ namespace GUI { struct Camera; - +// lm_FIXME: Following class might possibly be replaced by Eigen::Hyperplane class ClippingPlane { double m_data[4]; @@ -67,13 +67,23 @@ public: }; - +// MeshClipper class cuts a mesh and is able to return a triangulated cut. class MeshClipper { public: + // Inform MeshClipper about which plane we want to use to cut the mesh + // This is supposed to be in world coordinates. void set_plane(const ClippingPlane& plane); + + // Which mesh to cut. MeshClipper remembers const * to it, caller + // must make sure that it stays valid. void set_mesh(const TriangleMesh& mesh); + + // Inform the MeshClipper about the transformation that transforms the mesh + // into world coordinates. void set_transformation(const Geometry::Transformation& trafo); + // Return the triangulated cut. The points are returned directly + // in world coordinates. const std::vector<Vec3f>& get_triangles(); private: @@ -90,26 +100,45 @@ private: - +// MeshRaycaster class answers queries such as where on the mesh someone clicked, +// whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: + // The class saves a const* to the mesh, called is responsible + // for making sure it does not get invalid. MeshRaycaster(const TriangleMesh& mesh); + ~MeshRaycaster(); - void set_transformation(const Geometry::Transformation& trafo); - void set_camera(const Camera& camera); - bool unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane = nullptr) const; + // Given a mouse position, this returns true in case it is on the mesh. + bool unproject_on_mesh( + const Vec2d& mouse_pos, + const Transform3d& trafo, // how to get the mesh into world coords + const Camera& camera, // current camera position + Vec3f& position, // where to save the positibon of the hit (mesh coords) + Vec3f& normal, // normal of the triangle that was hit + const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) + ) const; - std::vector<unsigned> get_unobscured_idxs(const Geometry::Transformation& trafo, const Camera& camera, - const std::vector<Vec3f>& points, const ClippingPlane* clipping_plane = nullptr) const; + // Given a vector of points in woorld coordinates, this returns vector + // of indices of points that are visible (i.e. not cut by clipping plane + // or obscured by part of the mesh. + std::vector<unsigned> get_unobscured_idxs( + const Geometry::Transformation& trafo, // how to get the mesh into world coords + const Camera& camera, // current camera position + const std::vector<Vec3f>& points, // points in world coords + const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) + ) const; + // Given a point in world coords, the method returns closest point on the mesh. + // The output is in mesh coords. + // normal* can be used to also get normal of the respective triangle. Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; private: // PIMPL wrapper around igl::AABB so I don't have to include the header-only IGL here class AABBWrapper; - AABBWrapper* m_AABB_wrapper; + std::unique_ptr<AABBWrapper> m_AABB_wrapper; const TriangleMesh* m_mesh = nullptr; };