Optimisations and improvements.
This commit is contained in:
parent
3e00303371
commit
d0adeb328b
@ -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);
|
||||||
|
|
||||||
|
@ -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,27 +321,78 @@ 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)
|
||||||
{
|
{
|
||||||
Quad result;
|
std::pair<bool, Quad> resultPair;
|
||||||
result.material = q1.material;
|
resultPair.first = false;
|
||||||
|
|
||||||
for(uint32_t vertex = 0; vertex < 4; vertex++)
|
if(q1.material == q2.material)
|
||||||
{
|
{
|
||||||
uint32_t quad1vertex = q1.vertices[vertex];
|
resultPair.second.material = q1.material;
|
||||||
uint32_t quad2vertex = q2.vertices[vertex];
|
|
||||||
|
|
||||||
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<typename> class VolumeType, typename VoxelType>
|
template< template<typename> class VolumeType, typename VoxelType>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user