From 8e081d6d061954094fdc78dd13c2c2a16ea10ae6 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 9 Jun 2022 11:14:47 +0300 Subject: [PATCH] Add geom::smooth_normals --- libs/geom/include/psemek/geom/mesh.hpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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) {