From f6e217171af4ccb0d5a6f2846d4ca7d821c5320a Mon Sep 17 00:00:00 2001
From: Lukas Matena <lukasmatena@seznam.cz>
Date: Tue, 10 Dec 2019 09:52:20 +0100
Subject: [PATCH] Added comments in MeshUtils.hpp PIMPL in MeshRaycaster now
 uses std::unique_ptr instead of raw pointer

---
 src/slic3r/GUI/MeshUtils.cpp |  7 +++---
 src/slic3r/GUI/MeshUtils.hpp | 49 ++++++++++++++++++++++++++++--------
 2 files changed, 42 insertions(+), 14 deletions(-)

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;
 };