diff --git a/libs/geom/include/psemek/geom/mesh.hpp b/libs/geom/include/psemek/geom/mesh.hpp index cb0b9b73..0869abfb 100644 --- a/libs/geom/include/psemek/geom/mesh.hpp +++ b/libs/geom/include/psemek/geom/mesh.hpp @@ -123,6 +123,26 @@ namespace psemek::geom return result; } + template + auto smooth_normals(std::vector const & vertices, std::vector> const & triangles) + { + using vector_type = std::decay_t; + std::vector normals(vertices.size(), vector_type::zero()); + + for (auto const & t : triangles) + { + auto const n = cross(vertices[t[1]] - vertices[t[0]], vertices[t[2]] - vertices[t[0]]); + normals[t[0]] += n; + normals[t[1]] += n; + normals[t[2]] += n; + } + + for (auto & n : normals) + n = normalized(n); + + return normals; + } + template std::vector> triangulate_convex(std::vector const & v) {