summaryrefslogtreecommitdiff
path: root/src/client/mesh.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/mesh.cpp')
-rw-r--r--src/client/mesh.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp
index 4d73ead8a..91781373c 100644
--- a/src/client/mesh.cpp
+++ b/src/client/mesh.cpp
@@ -328,6 +328,26 @@ void recalculateBoundingBox(scene::IMesh *src_mesh)
src_mesh->setBoundingBox(bbox);
}
+bool checkMeshNormals(scene::IMesh *mesh)
+{
+ u32 buffer_count = mesh->getMeshBufferCount();
+
+ for (u32 i = 0; i < buffer_count; i++) {
+ scene::IMeshBuffer *buffer = mesh->getMeshBuffer(i);
+
+ // Here we intentionally check only first normal, assuming that if buffer
+ // has it valid, then most likely all other ones are fine too. We can
+ // check all of the normals to have length, but it seems like an overkill
+ // hurting the performance and covering only really weird broken models.
+ f32 length = buffer->getNormal(0).getLength();
+
+ if (!isfinite(length) || fabs(length) < 1e-10)
+ return false;
+ }
+
+ return true;
+}
+
scene::IMeshBuffer* cloneMeshBuffer(scene::IMeshBuffer *mesh_buffer)
{
switch (mesh_buffer->getVertexType()) {