Merge pull request #1910 from sacereda/master

ImproveCacheLocality crashes if non triangular faces
pull/1913/head
Kim Kulling 2018-04-24 14:53:24 +02:00 committed by GitHub
commit 620182770d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 17 deletions

View File

@ -276,8 +276,9 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh
// so iterate through all vertices of the current triangle // so iterate through all vertices of the current triangle
const aiFace* pcFace = &pMesh->mFaces[ fidx ]; const aiFace* pcFace = &pMesh->mFaces[ fidx ];
for (unsigned int* p = pcFace->mIndices, *p2 = pcFace->mIndices+3;p != p2;++p) { unsigned nind = pcFace->mNumIndices;
const unsigned int dp = *p; for (unsigned ind = 0; ind < nind; ind++) {
unsigned dp = pcFace->mIndices[ind];
// the current vertex won't have any free triangles after this step // the current vertex won't have any free triangles after this step
if (ivdx != (int)dp) { if (ivdx != (int)dp) {
@ -375,9 +376,11 @@ float ImproveCacheLocalityProcess::ProcessMesh( aiMesh* pMesh, unsigned int mesh
// sort the output index buffer back to the input array // sort the output index buffer back to the input array
piCSIter = piIBOutput; piCSIter = piIBOutput;
for (aiFace* pcFace = pMesh->mFaces; pcFace != pcEnd;++pcFace) { for (aiFace* pcFace = pMesh->mFaces; pcFace != pcEnd;++pcFace) {
pcFace->mIndices[0] = *piCSIter++; unsigned nind = pcFace->mNumIndices;
pcFace->mIndices[1] = *piCSIter++; unsigned * ind = pcFace->mIndices;
pcFace->mIndices[2] = *piCSIter++; if (nind > 0) ind[0] = *piCSIter++;
if (nind > 1) ind[1] = *piCSIter++;
if (nind > 2) ind[2] = *piCSIter++;
} }
// delete temporary storage // delete temporary storage

View File

@ -88,10 +88,13 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
*piEnd++ = 0u; *piEnd++ = 0u;
// first pass: compute the number of faces referencing each vertex // first pass: compute the number of faces referencing each vertex
for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) { for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace)
pi[pcFace->mIndices[0]]++; {
pi[pcFace->mIndices[1]]++; unsigned nind = pcFace->mNumIndices;
pi[pcFace->mIndices[2]]++; unsigned * ind = pcFace->mIndices;
if (nind > 0) pi[ind[0]]++;
if (nind > 1) pi[ind[1]]++;
if (nind > 2) pi[ind[2]]++;
} }
// second pass: compute the final offset table // second pass: compute the final offset table
@ -109,15 +112,12 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
this->mAdjacencyTable = new unsigned int[iSum]; this->mAdjacencyTable = new unsigned int[iSum];
iSum = 0; iSum = 0;
for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace,++iSum) { for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace,++iSum) {
unsigned nind = pcFace->mNumIndices;
unsigned * ind = pcFace->mIndices;
unsigned int idx = pcFace->mIndices[0]; if (nind > 0) mAdjacencyTable[pi[ind[0]]++] = iSum;
mAdjacencyTable[pi[idx]++] = iSum; if (nind > 1) mAdjacencyTable[pi[ind[1]]++] = iSum;
if (nind > 2) mAdjacencyTable[pi[ind[2]]++] = iSum;
idx = pcFace->mIndices[1];
mAdjacencyTable[pi[idx]++] = iSum;
idx = pcFace->mIndices[2];
mAdjacencyTable[pi[idx]++] = iSum;
} }
// fourth pass: undo the offset computations made during the third pass // fourth pass: undo the offset computations made during the third pass
// We could do this in a separate buffer, but this would be TIMES slower. // We could do this in a separate buffer, but this would be TIMES slower.

View File

@ -101,8 +101,11 @@ TEST_F(VTAdjacencyTest, smallDataSet)
mesh.mFaces = new aiFace[3]; mesh.mFaces = new aiFace[3];
mesh.mFaces[0].mIndices = new unsigned int[3]; mesh.mFaces[0].mIndices = new unsigned int[3];
mesh.mFaces[0].mNumIndices = 3;
mesh.mFaces[1].mIndices = new unsigned int[3]; mesh.mFaces[1].mIndices = new unsigned int[3];
mesh.mFaces[1].mNumIndices = 3;
mesh.mFaces[2].mIndices = new unsigned int[3]; mesh.mFaces[2].mIndices = new unsigned int[3];
mesh.mFaces[2].mNumIndices = 3;
mesh.mFaces[0].mIndices[0] = 1; mesh.mFaces[0].mIndices[0] = 1;
mesh.mFaces[0].mIndices[1] = 3; mesh.mFaces[0].mIndices[1] = 3;