From 10e00d7c92ff64e879b04968ad58e77310195aed Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 16 Oct 2020 07:37:44 +0300 Subject: [PATCH] Add some meshing utilities --- libs/geom/include/psemek/geom/mesh.hpp | 72 ++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/libs/geom/include/psemek/geom/mesh.hpp b/libs/geom/include/psemek/geom/mesh.hpp index bc5cbdd4..cb0b9b73 100644 --- a/libs/geom/include/psemek/geom/mesh.hpp +++ b/libs/geom/include/psemek/geom/mesh.hpp @@ -51,6 +51,78 @@ namespace psemek::geom return result; } + template + std::vector> faces(box const &) + { + std::vector> result; + result.push_back({0, 1, 2}); + result.push_back({2, 1, 3}); + return result; + } + + template + std::vector> faces(box const &) + { + std::vector> result; + // -Z + result.push_back({0, 2, 1}); + result.push_back({1, 2, 3}); + // +Z + result.push_back({4, 5, 6}); + result.push_back({6, 5, 7}); + // -Y + result.push_back({0, 1, 4}); + result.push_back({4, 1, 5}); + // +Y + result.push_back({2, 6, 3}); + result.push_back({6, 7, 3}); + // -X + result.push_back({0, 4, 2}); + result.push_back({2, 4, 6}); + // +X + result.push_back({1, 3, 5}); + result.push_back({3, 7, 5}); + return result; + } + + template + std::vector> deindex(std::vector const & vertices, std::vector> const & simplices) + { + std::vector> result; + result.reserve(simplices.size()); + for (auto const & s : simplices) + { + result.emplace_back(); + for (std::size_t i = 0; i <= N; ++i) + result.back()[i] = vertices[s[i]]; + } + return result; + } + + namespace detail + { + + template + auto map_index_sequence(F && f, G && g, std::index_sequence) + { + return f(g(I)...); + } + + } + + template + std::vector> flat_normals(std::vector> const & vertices, std::vector> const & simplices) + { + std::vector> result; + result.reserve(simplices.size()); + for (auto const & s : simplices) + { + auto const n = detail::map_index_sequence([&](auto const & ... vs){ return normal(vs...); }, [&](std::size_t i){ return vertices[s[i]]; }, std::make_index_sequence{}); + result.push_back(n); + } + return result; + } + template std::vector> triangulate_convex(std::vector const & v) {