From 2b8814e472197bb19e537b84ce1a6ef9cfd26956 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 28 May 2021 11:50:20 +0300 Subject: [PATCH] Change cg::dimension(body) to cg::body_traits::dimension --- libs/cg/include/psemek/cg/body/body.hpp | 7 +++++-- libs/cg/include/psemek/cg/body/box.hpp | 6 +++--- libs/cg/include/psemek/cg/body/frustum.hpp | 6 +++--- libs/cg/include/psemek/cg/body/icosahedron.hpp | 6 +++--- libs/cg/include/psemek/cg/body/polygon.hpp | 6 +++--- libs/cg/include/psemek/cg/body/prism.hpp | 6 +++--- libs/cg/include/psemek/cg/convex/separation.hpp | 11 +++++++---- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/libs/cg/include/psemek/cg/body/body.hpp b/libs/cg/include/psemek/cg/body/body.hpp index 382ef98a..bb1e7abe 100644 --- a/libs/cg/include/psemek/cg/body/body.hpp +++ b/libs/cg/include/psemek/cg/body/body.hpp @@ -13,12 +13,12 @@ namespace psemek::cg { /* The basic interface of a 2D body is - * constexpr dimension(body) -> 2 + * body_traits::static dimension -> 2 * vertices(body) -> [point] * edges(body) -> [(index, index)] * * The basic interface of a 3D body is - * constexpr dimension(body) -> 3 + * body_traits::static dimension -> 3 * vertices(body) -> [point] * edges(body) -> [(index, index)] * faces(body) -> [[index]] @@ -70,6 +70,9 @@ namespace psemek::cg } + template + struct body_traits; + template auto faces(Body const & b) { diff --git a/libs/cg/include/psemek/cg/body/box.hpp b/libs/cg/include/psemek/cg/body/box.hpp index f15894a4..b89635e5 100644 --- a/libs/cg/include/psemek/cg/body/box.hpp +++ b/libs/cg/include/psemek/cg/body/box.hpp @@ -14,10 +14,10 @@ namespace psemek::cg box(geom::box) -> box; template - constexpr std::size_t dimension(box const &) + struct body_traits> { - return N; - } + static constexpr std::size_t dimension = N; + }; template struct box diff --git a/libs/cg/include/psemek/cg/body/frustum.hpp b/libs/cg/include/psemek/cg/body/frustum.hpp index f6e36a16..e8046412 100644 --- a/libs/cg/include/psemek/cg/body/frustum.hpp +++ b/libs/cg/include/psemek/cg/body/frustum.hpp @@ -25,10 +25,10 @@ namespace psemek::cg }; template - constexpr std::size_t dimension(frustum const &) + struct body_traits> { - return N; - } + static constexpr std::size_t dimension = N; + }; template frustum::frustum(geom::matrix const & m) diff --git a/libs/cg/include/psemek/cg/body/icosahedron.hpp b/libs/cg/include/psemek/cg/body/icosahedron.hpp index 1f40d67d..f5e59435 100644 --- a/libs/cg/include/psemek/cg/body/icosahedron.hpp +++ b/libs/cg/include/psemek/cg/body/icosahedron.hpp @@ -15,10 +15,10 @@ namespace psemek::cg }; template - constexpr std::size_t dimension(icosahedron const &) + struct body_traits> { - return 3; - } + static constexpr std::size_t dimension = 3; + }; template icosahedron::icosahedron(geom::point const & origin, T radius) diff --git a/libs/cg/include/psemek/cg/body/polygon.hpp b/libs/cg/include/psemek/cg/body/polygon.hpp index d49caf4d..daea6f16 100644 --- a/libs/cg/include/psemek/cg/body/polygon.hpp +++ b/libs/cg/include/psemek/cg/body/polygon.hpp @@ -27,10 +27,10 @@ namespace psemek::cg } template - constexpr std::size_t dimension(polygon const &) + struct body_traits> { - return 2; - } + static constexpr std::size_t dimension = 2; + }; template auto const & vertices(polygon const & p) diff --git a/libs/cg/include/psemek/cg/body/prism.hpp b/libs/cg/include/psemek/cg/body/prism.hpp index cb982131..b77fc96a 100644 --- a/libs/cg/include/psemek/cg/body/prism.hpp +++ b/libs/cg/include/psemek/cg/body/prism.hpp @@ -16,10 +16,10 @@ namespace psemek::cg }; template - constexpr std::size_t dimension(triangular_prism const &) + struct body_traits> { - return 3; - } + static constexpr std::size_t dimension = 3; + }; template triangular_prism::triangular_prism(geom::triangle> const & t, geom::vector const & d) diff --git a/libs/cg/include/psemek/cg/convex/separation.hpp b/libs/cg/include/psemek/cg/convex/separation.hpp index 3c11a947..ec6fe875 100644 --- a/libs/cg/include/psemek/cg/convex/separation.hpp +++ b/libs/cg/include/psemek/cg/convex/separation.hpp @@ -173,14 +173,17 @@ namespace psemek::cg template auto separation(Body1 const & b1, Body2 const & b2) { - static_assert(dimension(b1) == dimension(b2)); - static_assert(dimension(b1) == 2 || dimension(b1) == 3); + constexpr auto dim1 = body_traits::dimension; + constexpr auto dim2 = body_traits::dimension; - if constexpr (dimension(b1) == 2) + static_assert(dim1 == dim2); + static_assert(dim1 == 2 || dim1 == 3); + + if constexpr (dim1 == 2) { return detail::separation_2d(b1, b2); } - else if constexpr (dimension(b1) == 3) + else if constexpr (dim1 == 3) { return detail::separation_3d(b1, b2); }