فهرست منبع

Merge pull request #1910 from sacereda/master

ImproveCacheLocality crashes if non triangular faces
Kim Kulling 7 سال پیش
والد
کامیت
620182770d
3فایلهای تغییر یافته به همراه23 افزوده شده و 17 حذف شده
  1. 8 5
      code/ImproveCacheLocality.cpp
  2. 12 12
      code/VertexTriangleAdjacency.cpp
  3. 3 0
      test/unit/utVertexTriangleAdjacency.cpp

+ 8 - 5
code/ImproveCacheLocality.cpp

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

+ 12 - 12
code/VertexTriangleAdjacency.cpp

@@ -88,10 +88,13 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
     *piEnd++ = 0u;
 
     // first pass: compute the number of faces referencing each vertex
-    for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace) {
-        pi[pcFace->mIndices[0]]++;
-        pi[pcFace->mIndices[1]]++;
-        pi[pcFace->mIndices[2]]++;
+    for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace)
+    {
+        unsigned nind = pcFace->mNumIndices;
+        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
@@ -109,15 +112,12 @@ VertexTriangleAdjacency::VertexTriangleAdjacency(aiFace *pcFaces,
     this->mAdjacencyTable = new unsigned int[iSum];
     iSum = 0;
     for (aiFace* pcFace = pcFaces; pcFace != pcFaceEnd; ++pcFace,++iSum)    {
+        unsigned nind = pcFace->mNumIndices;
+        unsigned * ind = pcFace->mIndices;
 
-        unsigned int idx = pcFace->mIndices[0];
-        mAdjacencyTable[pi[idx]++] = iSum;
-
-        idx = pcFace->mIndices[1];
-        mAdjacencyTable[pi[idx]++] = iSum;
-
-        idx = pcFace->mIndices[2];
-        mAdjacencyTable[pi[idx]++] = iSum;
+        if (nind > 0) mAdjacencyTable[pi[ind[0]]++] = iSum;
+        if (nind > 1) mAdjacencyTable[pi[ind[1]]++] = iSum;
+        if (nind > 2) mAdjacencyTable[pi[ind[2]]++] = iSum;
     }
     // 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.

+ 3 - 0
test/unit/utVertexTriangleAdjacency.cpp

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