summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-04-05 01:40:02 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2025-04-05 01:40:02 +0100
commitabb7103b26b3d2ab1674f0aea360375cee10906e (patch)
tree92a8972c2dd44274410881cb5a093fa65aed519e
parentAdd OpenMesh/range helpers which support OpenMesh11 (diff)
downloadilt-abb7103b26b3d2ab1674f0aea360375cee10906e.tar.bz2
ilt-abb7103b26b3d2ab1674f0aea360375cee10906e.tar.xz
ilt-abb7103b26b3d2ab1674f0aea360375cee10906e.zip
Replace call to calc_vertex_normal_correct
Same code copied inline, but adjusted to avoid normalising using Scalar which is an integral type.
-rw-r--r--game/geoData.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/game/geoData.cpp b/game/geoData.cpp
index 5cea4dd..db0f3f4 100644
--- a/game/geoData.cpp
+++ b/game/geoData.cpp
@@ -286,9 +286,27 @@ GeoData::updateAllVertexNormals(const R & range)
void
GeoData::updateVertexNormal(VertexHandle vertex)
{
- Normal3D n;
- calc_vertex_normal_correct(vertex, n);
- set_normal(vertex, glm::normalize(n));
+ Normal3D normal {};
+ { // Lifted from calc_vertex_normal_correct in PolyMeshT_impl.hh but doesn't use Scalar to normalise
+ ConstVertexIHalfedgeIter cvih_it = this->cvih_iter(vertex);
+ if (!cvih_it.is_valid()) { // don't crash on isolated vertices
+ return;
+ }
+ Normal in_he_vec;
+ calc_edge_vector(*cvih_it, in_he_vec);
+ for (; cvih_it.is_valid(); ++cvih_it) { // calculates the sector normal defined by cvih_it and adds it to normal
+ if (this->is_boundary(*cvih_it)) {
+ continue;
+ }
+ HalfedgeHandle out_heh(this->next_halfedge_handle(*cvih_it));
+ Normal out_he_vec;
+ calc_edge_vector(out_heh, out_he_vec);
+ normal += cross(in_he_vec, out_he_vec); // sector area is taken into account
+ in_he_vec = out_he_vec;
+ in_he_vec *= -1; // change the orientation
+ }
+ } // End lift
+ set_normal(vertex, glm::normalize(normal));
}
OpenMesh::VertexHandle