From a5812c02c8286244bd79c89aa2c1e787f3475eb6 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 15 Mar 2024 23:27:24 +0300 Subject: [PATCH] Add generic cg::triangle_mesh convex body --- .../include/psemek/cg/body/triangle_mesh.hpp | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 libs/cg/include/psemek/cg/body/triangle_mesh.hpp diff --git a/libs/cg/include/psemek/cg/body/triangle_mesh.hpp b/libs/cg/include/psemek/cg/body/triangle_mesh.hpp new file mode 100644 index 00000000..c8630f36 --- /dev/null +++ b/libs/cg/include/psemek/cg/body/triangle_mesh.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include + +#include +#include + +namespace psemek::cg +{ + template + struct triangle_mesh + { + triangle_mesh() = default; + triangle_mesh(std::vector> vertices, std::vector> triangles); + + std::vector> vertices; + std::vector> triangles; + std::vector> edges; + std::vector> edge_directions; + }; + + template + triangle_mesh::triangle_mesh(std::vector> vertices, std::vector> triangles) + : vertices(std::move(vertices)) + , triangles(std::move(triangles)) + { + for (auto const & t : this->triangles) + { + // Add each edge just once + if (t[0] < t[1]) edges.push_back({t[0], t[1]}); + if (t[1] < t[2]) edges.push_back({t[1], t[2]}); + if (t[2] < t[0]) edges.push_back({t[2], t[0]}); + } + + for (auto const & e : edges) + edge_directions.push_back(geom::normalized(this->vertices[e[1]] - this->vertices[e[0]])); + } + + template + auto const & vertices(triangle_mesh const & m) + { + return m.vertices; + } + + template + auto const & edges(triangle_mesh const & m) + { + return m.edges; + } + + template + auto const & edge_directions(triangle_mesh const & m) + { + return m.edge_directions; + } + + template + auto const & triangles(triangle_mesh const & m) + { + return m.triangles; + } + +}