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