diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_composed_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_composed_policies.h similarity index 74% rename from Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_composed_policies.h rename to Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_composed_policies.h index 2dddb8f0b2a..5c80d1ebe50 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_composed_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_composed_policies.h @@ -21,7 +21,12 @@ namespace CGAL { namespace Surface_mesh_simplification { namespace internal { -template +/* +That policy was created to merge the line policy with the existing ones. +Since it is a technical feature, it is internal to the library. +*/ + +template class Composed_quadric_calculator { typedef typename GarlandHeckbert_matrix_types::Mat_4 Mat_4; @@ -34,7 +39,7 @@ class Composed_quadric_calculator double weight_2; public: - Composed_quadric_calculator(Quadric_calculator_1 &&qc1, Quadric_calculator_2 &&qc2, double w1=1., double w2=1.): + Composed_quadric_calculator(Quadric_calculator_1 &qc1, Quadric_calculator_2 &qc2, double w1=1., double w2=1.): quadric_calculator_1(qc1), quadric_calculator_2(qc2), weight_1(w1), weight_2(w2){} Composed_quadric_calculator(double w1=1., double w2=1.): weight_1(w1), weight_2(w2){} @@ -54,8 +59,8 @@ public: const VertexPointMap point_map, const GeomTraits& gt) const { - return weight_1 * Quadric_calculator_1().construct_quadric_from_edge(he, tmesh, point_map, gt) + - weight_2 * Quadric_calculator_2().construct_quadric_from_edge(he, tmesh, point_map, gt); + return weight_1 * quadric_calculator_1.construct_quadric_from_edge(he, tmesh, point_map, gt) + + weight_2 * quadric_calculator_2.construct_quadric_from_edge(he, tmesh, point_map, gt); } template @@ -64,8 +69,8 @@ public: const VertexPointMap point_map, const GeomTraits& gt) const { - return weight_1 * Quadric_calculator_1().construct_quadric_from_face(f, tmesh, point_map, gt) + - weight_2 * Quadric_calculator_2().construct_quadric_from_face(f, tmesh, point_map, gt); + return weight_1 * quadric_calculator_1.construct_quadric_from_face(f, tmesh, point_map, gt) + + weight_2 * quadric_calculator_2.construct_quadric_from_face(f, tmesh, point_map, gt); } @@ -73,31 +78,33 @@ public: const Col_4& p0, const Col_4& p1) const { - //TODO How merge here? - return construct_optimal_point_singular(quadric, p0, p1); + if constexpr(invertible) + return construct_optimal_point_invertible(quadric); + else + return construct_optimal_point_singular(quadric, p0, p1); } }; -} // namespace internal - -template +template class GarlandHeckbert_composed_policies : public internal::GarlandHeckbert_cost_and_placement< internal::Composed_quadric_calculator, + typename GH_policies_2::Quadric_calculator, + invertible>, TriangleMesh, GeomTraits> { public: typedef internal::Composed_quadric_calculator + typename GH_policies_2::Quadric_calculator, + invertible> Quadric_calculator; private: typedef internal::GarlandHeckbert_cost_and_placement< Quadric_calculator, TriangleMesh, GeomTraits> Base; - typedef GarlandHeckbert_composed_policies Self; + typedef GarlandHeckbert_composed_policies Self; public: typedef Self Get_cost; @@ -111,11 +118,12 @@ public: : Base(tmesh, Quadric_calculator(w1, w2), dm) { } - // GarlandHeckbert_composed_policies(TriangleMesh& tmesh, - // GH_policies_1 - // double w1=1., double w2=1.,const FT dm = FT(100)) - // : Base(tmesh, Quadric_calculator(w1, w2), dm) - // { } + GarlandHeckbert_composed_policies(TriangleMesh& tmesh, + GH_policies_1 ghp1, + GH_policies_2 ghp2, + double w1=1., double w2=1.,const FT dm = FT(100)) + : Base(tmesh, Quadric_calculator(ghp1.m_quadric_calculator, ghp2.m_quadric_calculator, w1, w2), dm) + { } public: const Get_cost& get_cost() const { return *this; } @@ -124,6 +132,7 @@ public: using Base::operator(); }; +} // namespace internal } // namespace Surface_mesh_simplification } // namespace CGAL diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_line_policies.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h similarity index 95% rename from Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_line_policies.h rename to Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h index dbfd6b8bc5e..de2efa13a4f 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/GarlandHeckbert_line_policies.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_line_policies.h @@ -21,6 +21,11 @@ namespace CGAL { namespace Surface_mesh_simplification { namespace internal { +/* +This policy is not useful on its own; it is designed to be combined with another policy using a small weight. +Therefore, it is kept internal. +*/ + template class Line_quadric_calculator { @@ -67,8 +72,6 @@ public: } }; -} // namespace internal - template class GarlandHeckbert_line_policies : public internal::GarlandHeckbert_cost_and_placement< @@ -101,6 +104,7 @@ public: using Base::operator(); }; +} // namespace internal } // namespace Surface_mesh_simplification } // namespace CGAL diff --git a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h index 2f8d6cfbc78..5c4715dd1a1 100644 --- a/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h +++ b/Surface_mesh_simplification/include/CGAL/Surface_mesh_simplification/Policies/Edge_collapse/internal/GarlandHeckbert_policy_base.h @@ -59,7 +59,8 @@ struct GarlandHeckbert_quadrics_storage typedef QuadricCalculator Quadric_calculator; -protected: + public: +// protected: Vertex_cost_map m_cost_matrices; Quadric_calculator m_quadric_calculator;