Added "ImproveCacheLocality"-Step; Added Unit tests (3 at the moment); Fixed hp spelling errors.
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@68 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
|
||||
|
||||
|
||||
#include "utVertexTriangleAdjacency.h"
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION (VTAdjacency);
|
||||
|
||||
void VTAdjacency :: setUp (void)
|
||||
{
|
||||
// seed the randomizer
|
||||
time_t t;time(&t);
|
||||
srand((unsigned int)t);
|
||||
|
||||
// build a test mesh with randomized input data
|
||||
// *******************************************************************************
|
||||
pMesh = new aiMesh();
|
||||
|
||||
pMesh->mNumVertices = 500;
|
||||
pMesh->mNumFaces = 600;
|
||||
|
||||
pMesh->mFaces = new aiFace[600];
|
||||
unsigned int iCurrent = 0;
|
||||
for (unsigned int i = 0; i < 600;++i)
|
||||
{
|
||||
aiFace& face = pMesh->mFaces[i];
|
||||
face.mNumIndices = 3;
|
||||
face.mIndices = new unsigned int[3];
|
||||
|
||||
if (499 == iCurrent)iCurrent = 0;
|
||||
face.mIndices[0] = iCurrent++;
|
||||
|
||||
|
||||
while(face.mIndices[0] == ( face.mIndices[1] = unsigned int(((float)rand()/RAND_MAX)*499)));
|
||||
while(face.mIndices[0] == ( face.mIndices[2] = unsigned int(((float)rand()/RAND_MAX)*499)) ||
|
||||
face.mIndices[1] == face.mIndices[2]);
|
||||
}
|
||||
|
||||
|
||||
// build a second test mesh - this one is extremely small
|
||||
// *******************************************************************************
|
||||
pMesh2 = new aiMesh();
|
||||
|
||||
pMesh2->mNumVertices = 5;
|
||||
pMesh2->mNumFaces = 3;
|
||||
|
||||
pMesh2->mFaces = new aiFace[3];
|
||||
pMesh2->mFaces[0].mIndices = new unsigned int[3];
|
||||
pMesh2->mFaces[1].mIndices = new unsigned int[3];
|
||||
pMesh2->mFaces[2].mIndices = new unsigned int[3];
|
||||
|
||||
pMesh2->mFaces[0].mIndices[0] = 1;
|
||||
pMesh2->mFaces[0].mIndices[1] = 3;
|
||||
pMesh2->mFaces[0].mIndices[2] = 2;
|
||||
|
||||
pMesh2->mFaces[1].mIndices[0] = 0;
|
||||
pMesh2->mFaces[1].mIndices[1] = 2;
|
||||
pMesh2->mFaces[1].mIndices[2] = 3;
|
||||
|
||||
pMesh2->mFaces[2].mIndices[0] = 3;
|
||||
pMesh2->mFaces[2].mIndices[1] = 0;
|
||||
pMesh2->mFaces[2].mIndices[2] = 4;
|
||||
|
||||
|
||||
// build a third test mesh which does not reference all vertices
|
||||
// *******************************************************************************
|
||||
pMesh3 = new aiMesh();
|
||||
|
||||
pMesh3->mNumVertices = 500;
|
||||
pMesh3->mNumFaces = 600;
|
||||
|
||||
pMesh3->mFaces = new aiFace[600];
|
||||
iCurrent = 0;
|
||||
for (unsigned int i = 0; i < 600;++i)
|
||||
{
|
||||
aiFace& face = pMesh3->mFaces[i];
|
||||
face.mNumIndices = 3;
|
||||
face.mIndices = new unsigned int[3];
|
||||
|
||||
if (499 == iCurrent)iCurrent = 0;
|
||||
face.mIndices[0] = iCurrent++;
|
||||
|
||||
if (499 == iCurrent)iCurrent = 0;
|
||||
face.mIndices[1] = iCurrent++;
|
||||
|
||||
if (499 == iCurrent)iCurrent = 0;
|
||||
face.mIndices[2] = iCurrent++;
|
||||
|
||||
if (rand() > RAND_MAX/2 && face.mIndices[0])
|
||||
{
|
||||
face.mIndices[0]--;
|
||||
}
|
||||
else if (face.mIndices[1]) face.mIndices[1]--;
|
||||
}
|
||||
}
|
||||
|
||||
void VTAdjacency :: tearDown (void)
|
||||
{
|
||||
delete pMesh;
|
||||
pMesh = 0;
|
||||
|
||||
delete pMesh2;
|
||||
pMesh2 = 0;
|
||||
|
||||
delete pMesh3;
|
||||
pMesh3 = 0;
|
||||
}
|
||||
|
||||
void VTAdjacency :: largeRandomDataSet (void)
|
||||
{
|
||||
checkMesh(pMesh);
|
||||
}
|
||||
|
||||
void VTAdjacency :: smallDataSet (void)
|
||||
{
|
||||
checkMesh(pMesh2);
|
||||
}
|
||||
|
||||
void VTAdjacency :: unreferencedVerticesSet (void)
|
||||
{
|
||||
checkMesh(pMesh3);
|
||||
}
|
||||
|
||||
void VTAdjacency :: checkMesh (aiMesh* pMesh)
|
||||
{
|
||||
pAdj = new VertexTriangleAdjacency(pMesh->mFaces,pMesh->mNumFaces,pMesh->mNumVertices,true);
|
||||
|
||||
|
||||
unsigned int* const piNum = pAdj->mLiveTriangles;
|
||||
|
||||
// check the primary adjacency table and check whether all faces
|
||||
// are contained in the list
|
||||
unsigned int maxOfs = 0;
|
||||
for (unsigned int i = 0; i < pMesh->mNumFaces;++i)
|
||||
{
|
||||
aiFace& face = pMesh->mFaces[i];
|
||||
for (unsigned int qq = 0; qq < 3 ;++qq)
|
||||
{
|
||||
const unsigned int idx = face.mIndices[qq];
|
||||
const unsigned int num = piNum[idx];
|
||||
|
||||
// go to this offset
|
||||
const unsigned int ofs = pAdj->mOffsetTable[idx];
|
||||
maxOfs = std::max(ofs+num,maxOfs);
|
||||
unsigned int* pi = &pAdj->mAdjacencyTable[ofs];
|
||||
|
||||
// and search for us ...
|
||||
unsigned int tt = 0;
|
||||
for (; tt < num;++tt,++pi)
|
||||
{
|
||||
if (i == *pi)
|
||||
{
|
||||
// mask our entry in the table. Finally all entries should be masked
|
||||
*pi = 0xffffffff;
|
||||
|
||||
// there shouldn't be two entries for the same face
|
||||
break;
|
||||
}
|
||||
}
|
||||
// assert if *this* vertex has not been found in the table
|
||||
CPPUNIT_ASSERT(tt < num);
|
||||
}
|
||||
}
|
||||
|
||||
// now check whether there are invalid faces
|
||||
const unsigned int* pi = pAdj->mAdjacencyTable;
|
||||
for (unsigned int i = 0; i < maxOfs;++i,++pi)
|
||||
{
|
||||
CPPUNIT_ASSERT(0xffffffff == *pi);
|
||||
}
|
||||
|
||||
// check the numTrianglesPerVertex table
|
||||
for (unsigned int i = 0; i < pMesh->mNumFaces;++i)
|
||||
{
|
||||
aiFace& face = pMesh->mFaces[i];
|
||||
for (unsigned int qq = 0; qq < 3 ;++qq)
|
||||
{
|
||||
const unsigned int idx = face.mIndices[qq];
|
||||
|
||||
// we should not reach 0 here ...
|
||||
CPPUNIT_ASSERT( 0 != piNum[idx]);
|
||||
piNum[idx]--;
|
||||
}
|
||||
}
|
||||
|
||||
// check whether we reached 0 in all entries
|
||||
for (unsigned int i = 0; i < pMesh->mNumVertices;++i)
|
||||
{
|
||||
CPPUNIT_ASSERT(!piNum[i]);
|
||||
}
|
||||
delete pAdj;
|
||||
}
|
||||
Reference in New Issue
Block a user