Refactoring CubicSurfaceExtractor to free functions rather than just wrapping a class.

This commit is contained in:
David Williams 2015-12-08 23:29:38 +00:00
parent 65a973f94e
commit 9617197893
2 changed files with 31 additions and 32 deletions

View File

@ -125,6 +125,36 @@ namespace PolyVox
//Quads cannot be merged. //Quads cannot be merged.
return false; return false;
} }
template<typename MeshType>
bool performQuadMerging(std::list<Quad>& quads, MeshType* m_meshCurrent)
{
bool bDidMerge = false;
for (typename std::list<Quad>::iterator outerIter = quads.begin(); outerIter != quads.end(); outerIter++)
{
typename std::list<Quad>::iterator innerIter = outerIter;
innerIter++;
while (innerIter != quads.end())
{
Quad& q1 = *outerIter;
Quad& q2 = *innerIter;
bool result = mergeQuads(q1, q2, m_meshCurrent);
if (result)
{
bDidMerge = true;
innerIter = quads.erase(innerIter);
}
else
{
innerIter++;
}
}
}
return bDidMerge;
}
/// Do not use this class directly. Use the 'extractCubicSurface' function instead (see examples). /// Do not use this class directly. Use the 'extractCubicSurface' function instead (see examples).
template<typename VolumeType, typename MeshType, typename IsQuadNeeded> template<typename VolumeType, typename MeshType, typename IsQuadNeeded>
@ -154,7 +184,6 @@ namespace PolyVox
private: private:
int32_t addVertex(uint32_t uX, uint32_t uY, uint32_t uZ, typename VolumeType::VoxelType uMaterial, Array<3, IndexAndMaterial>& existingVertices); int32_t addVertex(uint32_t uX, uint32_t uY, uint32_t uZ, typename VolumeType::VoxelType uMaterial, Array<3, IndexAndMaterial>& existingVertices);
bool performQuadMerging(std::list<Quad>& quads);
IsQuadNeeded m_funcIsQuadNeededCallback; IsQuadNeeded m_funcIsQuadNeededCallback;

View File

@ -182,7 +182,7 @@ namespace PolyVox
{ {
//Repeatedly call this function until it returns //Repeatedly call this function until it returns
//false to indicate nothing more can be done. //false to indicate nothing more can be done.
while(performQuadMerging(listQuads)){} while (performQuadMerging(listQuads, m_meshCurrent)){}
} }
typename std::list<Quad>::iterator iterEnd = listQuads.end(); typename std::list<Quad>::iterator iterEnd = listQuads.end();
@ -234,34 +234,4 @@ namespace PolyVox
POLYVOX_THROW(std::runtime_error, "All slots full but no matches during cubic surface extraction. This is probably a bug in PolyVox"); POLYVOX_THROW(std::runtime_error, "All slots full but no matches during cubic surface extraction. This is probably a bug in PolyVox");
return -1; //Should never happen. return -1; //Should never happen.
} }
template<typename VolumeType, typename MeshType, typename IsQuadNeeded>
bool CubicSurfaceExtractor<VolumeType, MeshType, IsQuadNeeded>::performQuadMerging(std::list<Quad>& quads)
{
bool bDidMerge = false;
for(typename std::list<Quad>::iterator outerIter = quads.begin(); outerIter != quads.end(); outerIter++)
{
typename std::list<Quad>::iterator innerIter = outerIter;
innerIter++;
while(innerIter != quads.end())
{
Quad& q1 = *outerIter;
Quad& q2 = *innerIter;
bool result = mergeQuads(q1, q2, m_meshCurrent);
if(result)
{
bDidMerge = true;
innerIter = quads.erase(innerIter);
}
else
{
innerIter++;
}
}
}
return bDidMerge;
}
} }