From 9069e97dce21ca0adf795b74b220247bde32471e Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 23 Jan 2022 15:12:27 +0100 Subject: [PATCH] Filter out triangles with NaN coordinates Sorting a vector with such values gives invalid result because comparison with NaN is always false. --- components/detournavigator/recastmeshbuilder.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/components/detournavigator/recastmeshbuilder.cpp b/components/detournavigator/recastmeshbuilder.cpp index 0f7552aa77..08e7002cf8 100644 --- a/components/detournavigator/recastmeshbuilder.cpp +++ b/components/detournavigator/recastmeshbuilder.cpp @@ -20,6 +20,7 @@ #include #include #include +#include namespace DetourNavigator { @@ -40,6 +41,16 @@ namespace DetourNavigator { return static_cast(cellSize) / (dataSize - 1); } + + bool isNan(const RecastMeshTriangle& triangle) + { + for (std::size_t i = 0; i < 3; ++i) + if (std::isnan(triangle.mVertices[i].x()) + || std::isnan(triangle.mVertices[i].y()) + || std::isnan(triangle.mVertices[i].z())) + return true; + return false; + } } Mesh makeMesh(std::vector&& triangles, const osg::Vec3f& shift) @@ -264,6 +275,7 @@ namespace DetourNavigator std::shared_ptr RecastMeshBuilder::create(std::size_t generation, std::size_t revision) && { + mTriangles.erase(std::remove_if(mTriangles.begin(), mTriangles.end(), isNan), mTriangles.end()); std::sort(mTriangles.begin(), mTriangles.end()); std::sort(mWater.begin(), mWater.end()); Mesh mesh = makeMesh(std::move(mTriangles));