Merge pull request #1210 from rmitton/sib-normals

Fix for faceted normals in SIB files
pull/1214/head
Kim Kulling 2017-03-21 14:31:34 +01:00 committed by GitHub
commit eb8b00617a
1 changed files with 12 additions and 7 deletions

View File

@ -391,7 +391,7 @@ static void ConnectFaces(SIBMesh* mesh)
// with non-2-manifold surfaces, but then so does Silo to begin with. // with non-2-manifold surfaces, but then so does Silo to begin with.
if (edge.faceA == 0xffffffff) if (edge.faceA == 0xffffffff)
edge.faceA = static_cast<uint32_t>(faceIdx); edge.faceA = static_cast<uint32_t>(faceIdx);
else else if (edge.faceB == 0xffffffff)
edge.faceB = static_cast<uint32_t>(faceIdx); edge.faceB = static_cast<uint32_t>(faceIdx);
prev = next; prev = next;
@ -435,14 +435,19 @@ static aiVector3D CalculateVertexNormal(SIBMesh* mesh, uint32_t faceIdx, uint32_
{ {
SIBEdge& edge = GetEdge(mesh, posA, posB); SIBEdge& edge = GetEdge(mesh, posA, posB);
// Non-manifold meshes can produce faces which share
// positions but have no edge entry, so check it.
if (edge.faceA == faceIdx || edge.faceB == faceIdx)
{
// Move to whichever side we didn't just come from. // Move to whichever side we didn't just come from.
if (!edge.creased) { if (!edge.creased) {
if (edge.faceA != prevFaceIdx && edge.faceA != faceIdx) if (edge.faceA != prevFaceIdx && edge.faceA != faceIdx && edge.faceA != 0xffffffff)
nextFaceIdx = edge.faceA; nextFaceIdx = edge.faceA;
else if (edge.faceB != prevFaceIdx && edge.faceB != faceIdx) else if (edge.faceB != prevFaceIdx && edge.faceB != faceIdx && edge.faceB != 0xffffffff)
nextFaceIdx = edge.faceB; nextFaceIdx = edge.faceB;
} }
} }
}
posA = posB; posA = posB;
} }