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,12 +435,17 @@ static aiVector3D CalculateVertexNormal(SIBMesh* mesh, uint32_t faceIdx, uint32_
{ {
SIBEdge& edge = GetEdge(mesh, posA, posB); SIBEdge& edge = GetEdge(mesh, posA, posB);
// Move to whichever side we didn't just come from. // Non-manifold meshes can produce faces which share
if (!edge.creased) { // positions but have no edge entry, so check it.
if (edge.faceA != prevFaceIdx && edge.faceA != faceIdx) if (edge.faceA == faceIdx || edge.faceB == faceIdx)
nextFaceIdx = edge.faceA; {
else if (edge.faceB != prevFaceIdx && edge.faceB != faceIdx) // Move to whichever side we didn't just come from.
nextFaceIdx = edge.faceB; if (!edge.creased) {
if (edge.faceA != prevFaceIdx && edge.faceA != faceIdx && edge.faceA != 0xffffffff)
nextFaceIdx = edge.faceA;
else if (edge.faceB != prevFaceIdx && edge.faceB != faceIdx && edge.faceB != 0xffffffff)
nextFaceIdx = edge.faceB;
}
} }
} }