From d0adeb328bd6d5d3086eb504054e2297c2907fc2 Mon Sep 17 00:00:00 2001 From: David Williams Date: Tue, 10 May 2011 23:53:07 +0100 Subject: [PATCH] Optimisations and improvements. --- .../include/ImprovedCubicSurfaceExtractor.h | 2 +- .../include/ImprovedCubicSurfaceExtractor.inl | 88 +++++++++++++++---- 2 files changed, 70 insertions(+), 20 deletions(-) diff --git a/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.h b/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.h index 34616521..08ec3e4b 100644 --- a/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.h +++ b/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.h @@ -97,7 +97,7 @@ namespace PolyVox bool decimate(std::list& quads); - Quad mergeQuads(const Quad& q1, const Quad& q2); + std::pair mergeQuads(const Quad& q1, const Quad& q2); bool canMergeQuads(const Quad& q1, const Quad& q2); diff --git a/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.inl b/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.inl index 4415ddc8..32f45619 100644 --- a/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.inl +++ b/library/PolyVoxCore/include/ImprovedCubicSurfaceExtractor.inl @@ -297,18 +297,17 @@ namespace PolyVox innerIter++; while(innerIter != quads.end()) { - Quad q1 = *outerIter; - Quad q2 = *innerIter; + Quad& q1 = *outerIter; + Quad& q2 = *innerIter; - if(canMergeQuads(q1, q2)) + std::pair result = mergeQuads(q1,q2); + + if(result.first) { - //std::cout << "Can merge" << std::endl; - Quad result = mergeQuads(q1,q2); + quads.push_back(result.second); quads.erase(innerIter); - quads.erase(outerIter); - - quads.push_back(result); + quads.erase(outerIter); return true; } @@ -322,27 +321,78 @@ namespace PolyVox } template< template class VolumeType, typename VoxelType> - Quad ImprovedCubicSurfaceExtractor::mergeQuads(const Quad& q1, const Quad& q2) + std::pair ImprovedCubicSurfaceExtractor::mergeQuads(const Quad& q1, const Quad& q2) { - Quad result; - result.material = q1.material; + std::pair resultPair; + resultPair.first = false; - for(uint32_t vertex = 0; vertex < 4; vertex++) + if(q1.material == q2.material) { - uint32_t quad1vertex = q1.vertices[vertex]; - uint32_t quad2vertex = q2.vertices[vertex]; + resultPair.second.material = q1.material; - if(quadContainsVertex(q2, quad1vertex) != -1) + if((q1.vertices[0] == q2.vertices[1]) && ((q1.vertices[3] == q2.vertices[2]))) { - result.vertices[vertex] = quad2vertex; + 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 + else if((q1.vertices[3] == q2.vertices[0]) && ((q1.vertices[2] == q2.vertices[1]))) { - result.vertices[vertex] = quad1vertex; + 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]; } } - return result; + /*if(canMergeQuads(q1,q2)) + { + Quad result; + result.material = q1.material; + + for(uint32_t vertex = 0; vertex < 4; vertex++) + { + uint32_t quad1vertex = q1.vertices[vertex]; + uint32_t quad2vertex = q2.vertices[vertex]; + + if(quadContainsVertex(q2, quad1vertex) != -1) + { + result.vertices[vertex] = quad2vertex; + } + else + { + result.vertices[vertex] = quad1vertex; + } + } + + resultPair.first = true; + resultPair.second = result; + } + else + { + resultPair.first = false; + }*/ + + return resultPair; } template< template class VolumeType, typename VoxelType>