Optimisations and improvements.

This commit is contained in:
David Williams 2011-05-10 23:53:07 +01:00
parent 3e00303371
commit d0adeb328b
2 changed files with 70 additions and 20 deletions

View File

@ -97,7 +97,7 @@ namespace PolyVox
bool decimate(std::list<Quad>& quads); bool decimate(std::list<Quad>& quads);
Quad mergeQuads(const Quad& q1, const Quad& q2); std::pair<bool, Quad> mergeQuads(const Quad& q1, const Quad& q2);
bool canMergeQuads(const Quad& q1, const Quad& q2); bool canMergeQuads(const Quad& q1, const Quad& q2);

View File

@ -297,19 +297,18 @@ namespace PolyVox
innerIter++; innerIter++;
while(innerIter != quads.end()) while(innerIter != quads.end())
{ {
Quad q1 = *outerIter; Quad& q1 = *outerIter;
Quad q2 = *innerIter; Quad& q2 = *innerIter;
if(canMergeQuads(q1, q2)) std::pair<bool, Quad> result = mergeQuads(q1,q2);
if(result.first)
{ {
//std::cout << "Can merge" << std::endl; quads.push_back(result.second);
Quad result = mergeQuads(q1,q2);
quads.erase(innerIter); quads.erase(innerIter);
quads.erase(outerIter); quads.erase(outerIter);
quads.push_back(result);
return true; return true;
} }
@ -322,7 +321,50 @@ namespace PolyVox
} }
template< template<typename> class VolumeType, typename VoxelType> template< template<typename> class VolumeType, typename VoxelType>
Quad ImprovedCubicSurfaceExtractor<VolumeType, VoxelType>::mergeQuads(const Quad& q1, const Quad& q2) std::pair<bool, Quad> ImprovedCubicSurfaceExtractor<VolumeType, VoxelType>::mergeQuads(const Quad& q1, const Quad& q2)
{
std::pair<bool, Quad> resultPair;
resultPair.first = false;
if(q1.material == q2.material)
{
resultPair.second.material = q1.material;
if((q1.vertices[0] == q2.vertices[1]) && ((q1.vertices[3] == q2.vertices[2])))
{
resultPair.first = true;
resultPair.second.vertices[0] = q2.vertices[0];
resultPair.second.vertices[1] = q1.vertices[1];
resultPair.second.vertices[2] = q1.vertices[2];
resultPair.second.vertices[3] = q2.vertices[3];
}
else if((q1.vertices[3] == q2.vertices[0]) && ((q1.vertices[2] == q2.vertices[1])))
{
resultPair.first = true;
resultPair.second.vertices[0] = q1.vertices[0];
resultPair.second.vertices[1] = q1.vertices[1];
resultPair.second.vertices[2] = q2.vertices[2];
resultPair.second.vertices[3] = q2.vertices[3];
}
else if((q1.vertices[1] == q2.vertices[0]) && ((q1.vertices[2] == q2.vertices[3])))
{
resultPair.first = true;
resultPair.second.vertices[0] = q1.vertices[0];
resultPair.second.vertices[1] = q2.vertices[1];
resultPair.second.vertices[2] = q2.vertices[2];
resultPair.second.vertices[3] = q1.vertices[3];
}
else if((q1.vertices[0] == q2.vertices[3]) && ((q1.vertices[1] == q2.vertices[1])))
{
resultPair.first = true;
resultPair.second.vertices[0] = q2.vertices[0];
resultPair.second.vertices[1] = q2.vertices[1];
resultPair.second.vertices[2] = q1.vertices[2];
resultPair.second.vertices[3] = q1.vertices[3];
}
}
/*if(canMergeQuads(q1,q2))
{ {
Quad result; Quad result;
result.material = q1.material; result.material = q1.material;
@ -342,7 +384,15 @@ namespace PolyVox
} }
} }
return result; resultPair.first = true;
resultPair.second = result;
}
else
{
resultPair.first = false;
}*/
return resultPair;
} }
template< template<typename> class VolumeType, typename VoxelType> template< template<typename> class VolumeType, typename VoxelType>