Merge pull request #1910 from sacereda/master
ImproveCacheLocality crashes if non triangular facespull/1913/head
commit
620182770d
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue