Skip to content
Permalink
Browse files

Recalculate mesh normals for CAOs (#10000)

  • Loading branch information
dcbrwn committed Jun 7, 2020
1 parent 8fc9e7e commit fe1f72ab0ac8bcc233c91eb5b2d71bd2d2574cf8
Showing with 34 additions and 0 deletions.
  1. +8 −0 src/client/content_cao.cpp
  2. +20 −0 src/client/mesh.cpp
  3. +6 −0 src/client/mesh.h
@@ -726,6 +726,14 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
addAnimatedMeshSceneNode(mesh, m_matrixnode);
m_animated_meshnode->grab();
mesh->drop(); // The scene node took hold of it

if (!checkMeshNormals(mesh)) {
infostream << "GenericCAO: recalculating normals for mesh "
<< m_prop.mesh << std::endl;
m_smgr->getMeshManipulator()->
recalculateNormals(mesh, true, false);
}

m_animated_meshnode->animateJoints(); // Needed for some animations
m_animated_meshnode->setScale(m_prop.visual_size);

@@ -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()) {
@@ -121,6 +121,12 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes,
*/
void recalculateBoundingBox(scene::IMesh *src_mesh);

/*
Check if mesh has valid normals and return true if it does.
We assume normal to be valid when it's 0 < length < Inf. and not NaN
*/
bool checkMeshNormals(scene::IMesh *mesh);

/*
Vertex cache optimization according to the Forsyth paper:
http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html

0 comments on commit fe1f72a

Please sign in to comment.
You can’t perform that action at this time.