Work on templatizing surface extractor.

This commit is contained in:
David Williams 2009-06-03 21:26:54 +00:00
parent 57eed6e901
commit 324987d380
2 changed files with 66 additions and 54 deletions

View File

@ -95,8 +95,8 @@ namespace PolyVox
//void extractSurfaceForRegionLevel0(Volume<uint8_t>* volumeData, Region region, IndexedSurfacePatch* m_ispCurrent); //void extractSurfaceForRegionLevel0(Volume<uint8_t>* volumeData, Region region, IndexedSurfacePatch* m_ispCurrent);
void extractSurfaceImpl(Region region); void extractSurfaceImpl(Region region, uint8_t uLodLevel);
uint32_t computeBitmaskForSlice(bool bIsFirstSlice); uint32_t computeBitmaskForSlice(bool isPrevZAvail, uint8_t uLodLevel);
void computeBitmaskForCell(bool isPrevXAvail, bool isPrevYAvail, bool isPrevZAvail, uint8_t uLodLevel); void computeBitmaskForCell(bool isPrevXAvail, bool isPrevYAvail, bool isPrevZAvail, uint8_t uLodLevel);
void generateIndicesForSlice(); void generateIndicesForSlice();
void generateVerticesForSlice(); void generateVerticesForSlice();

View File

@ -31,14 +31,14 @@ namespace PolyVox
//POLYVOX_SHARED_PTR<IndexedSurfacePatch> result(new IndexedSurfacePatch()); //POLYVOX_SHARED_PTR<IndexedSurfacePatch> result(new IndexedSurfacePatch());
m_ispCurrent = new IndexedSurfacePatch(); m_ispCurrent = new IndexedSurfacePatch();
extractSurfaceImpl(region); extractSurfaceImpl(region, m_uLodLevel);
m_ispCurrent->m_Region = region; m_ispCurrent->m_Region = region;
return POLYVOX_SHARED_PTR<IndexedSurfacePatch>(m_ispCurrent); return POLYVOX_SHARED_PTR<IndexedSurfacePatch>(m_ispCurrent);
} }
void SurfaceExtractor::extractSurfaceImpl(Region region) void SurfaceExtractor::extractSurfaceImpl(Region region, uint8_t uLodLevel)
{ {
m_ispCurrent->clear(); m_ispCurrent->clear();
@ -79,11 +79,28 @@ namespace PolyVox
uint32_t uNoOfNonEmptyCellsForSlice0 = 0; uint32_t uNoOfNonEmptyCellsForSlice0 = 0;
uint32_t uNoOfNonEmptyCellsForSlice1 = 0; uint32_t uNoOfNonEmptyCellsForSlice1 = 0;
bool isFirstSliceDone = false; //Process the first slice (previous slice not available)
computeBitmaskForSlice(false, uLodLevel);
uNoOfNonEmptyCellsForSlice1 = m_uNoOfOccupiedCells;
for(uint32_t uSlice = 0; ((uSlice <= region.depth()) && (uSlice + m_v3dRegionOffset.getZ() <= regVolume.getUpperCorner().getZ())); uSlice += m_uStepSize) if(uNoOfNonEmptyCellsForSlice1 != 0)
{
generateVerticesForSlice();
}
std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1);
std::swap(m_pPreviousBitmask, m_pCurrentBitmask);
std::swap(m_pPreviousVertexIndicesX, m_pCurrentVertexIndicesX);
std::swap(m_pPreviousVertexIndicesY, m_pCurrentVertexIndicesY);
std::swap(m_pPreviousVertexIndicesZ, m_pCurrentVertexIndicesZ);
regSlice0 = regSlice1;
regSlice1.shift(Vector3DInt32(0,0,m_uStepSize));
//Process the first slice (previous slice is available)
for(uint32_t uSlice = 1; ((uSlice <= region.depth()) && (uSlice + m_v3dRegionOffset.getZ() <= regVolume.getUpperCorner().getZ())); uSlice += m_uStepSize)
{ {
computeBitmaskForSlice(!isFirstSliceDone); computeBitmaskForSlice(true, uLodLevel);
uNoOfNonEmptyCellsForSlice1 = m_uNoOfOccupiedCells; uNoOfNonEmptyCellsForSlice1 = m_uNoOfOccupiedCells;
if(uNoOfNonEmptyCellsForSlice1 != 0) if(uNoOfNonEmptyCellsForSlice1 != 0)
@ -91,12 +108,9 @@ namespace PolyVox
generateVerticesForSlice(); generateVerticesForSlice();
} }
if(isFirstSliceDone) if((uNoOfNonEmptyCellsForSlice0 != 0) || (uNoOfNonEmptyCellsForSlice1 != 0))
{ {
if((uNoOfNonEmptyCellsForSlice0 != 0) || (uNoOfNonEmptyCellsForSlice1 != 0)) generateIndicesForSlice();
{
generateIndicesForSlice();
}
} }
std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1); std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1);
@ -107,8 +121,6 @@ namespace PolyVox
regSlice0 = regSlice1; regSlice0 = regSlice1;
regSlice1.shift(Vector3DInt32(0,0,m_uStepSize)); regSlice1.shift(Vector3DInt32(0,0,m_uStepSize));
isFirstSliceDone = true;
} }
delete[] m_pPreviousBitmask; delete[] m_pPreviousBitmask;
@ -121,7 +133,7 @@ namespace PolyVox
delete[] m_pCurrentVertexIndicesZ; delete[] m_pCurrentVertexIndicesZ;
} }
uint32_t SurfaceExtractor::computeBitmaskForSlice(bool bIsFirstSlice) uint32_t SurfaceExtractor::computeBitmaskForSlice(bool isPrevZAvail, uint8_t uLodLevel)
{ {
m_uNoOfOccupiedCells = 0; m_uNoOfOccupiedCells = 0;
@ -139,7 +151,7 @@ namespace PolyVox
uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY(); uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY();
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace);
computeBitmaskForCell(false, false, !bIsFirstSlice, m_uLodLevel); computeBitmaskForCell(false, false, isPrevZAvail, uLodLevel);
//Process the edge where x is minimal. //Process the edge where x is minimal.
@ -150,7 +162,7 @@ namespace PolyVox
uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY(); uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY();
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace);
computeBitmaskForCell(false, true, !bIsFirstSlice, m_uLodLevel); computeBitmaskForCell(false, true, isPrevZAvail, uLodLevel);
} }
//Process the edge where y is minimal. //Process the edge where y is minimal.
@ -161,7 +173,7 @@ namespace PolyVox
uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY(); uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY();
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace);
computeBitmaskForCell(true, false, !bIsFirstSlice, m_uLodLevel); computeBitmaskForCell(true, false, isPrevZAvail, uLodLevel);
} }
//Process all remaining elemnents of the slice. In this case, previous x and y values are always available //Process all remaining elemnents of the slice. In this case, previous x and y values are always available
@ -173,7 +185,7 @@ namespace PolyVox
uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY(); uYRegSpace = uYVolSpace - m_v3dRegionOffset.getY();
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace);
computeBitmaskForCell(true, true, !bIsFirstSlice, m_uLodLevel); computeBitmaskForCell(true, true, isPrevZAvail, uLodLevel);
} }
} }
@ -190,14 +202,14 @@ namespace PolyVox
{ {
if(isPrevXAvail) if(isPrevXAvail)
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v111 = m_sampVolume.peekVoxel1px1py1pz(); v111 = m_sampVolume.peekVoxel1px1py1pz();
} }
else else
{ {
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//z //z
@ -220,7 +232,7 @@ namespace PolyVox
} }
else //previous X not available else //previous X not available
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v011 = m_sampVolume.peekVoxel0px1py1pz(); v011 = m_sampVolume.peekVoxel0px1py1pz();
v111 = m_sampVolume.peekVoxel1px1py1pz(); v111 = m_sampVolume.peekVoxel1px1py1pz();
@ -229,9 +241,9 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v011 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//z //z
@ -253,7 +265,7 @@ namespace PolyVox
{ {
if(isPrevXAvail) if(isPrevXAvail)
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v101 = m_sampVolume.peekVoxel1px0py1pz(); v101 = m_sampVolume.peekVoxel1px0py1pz();
v111 = m_sampVolume.peekVoxel1px1py1pz(); v111 = m_sampVolume.peekVoxel1px1py1pz();
@ -262,9 +274,9 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize);
v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v101 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//z //z
@ -283,7 +295,7 @@ namespace PolyVox
} }
else //previous X not available else //previous X not available
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v001 = m_sampVolume.peekVoxel0px0py1pz(); v001 = m_sampVolume.peekVoxel0px0py1pz();
v101 = m_sampVolume.peekVoxel1px0py1pz(); v101 = m_sampVolume.peekVoxel1px0py1pz();
@ -293,13 +305,13 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize);
v001 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v001 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize);
v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v101 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v011 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//z //z
@ -319,7 +331,7 @@ namespace PolyVox
{ {
if(isPrevXAvail) if(isPrevXAvail)
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v110 = m_sampVolume.peekVoxel1px1py0pz(); v110 = m_sampVolume.peekVoxel1px1py0pz();
v111 = m_sampVolume.peekVoxel1px1py1pz(); v111 = m_sampVolume.peekVoxel1px1py1pz();
@ -327,10 +339,10 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace);
v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v110 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//y //y
@ -350,7 +362,7 @@ namespace PolyVox
} }
else //previous X not available else //previous X not available
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v010 = m_sampVolume.peekVoxel0px1py0pz(); v010 = m_sampVolume.peekVoxel0px1py0pz();
v110 = m_sampVolume.peekVoxel1px1py0pz(); v110 = m_sampVolume.peekVoxel1px1py0pz();
@ -361,14 +373,14 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace);
v010 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v010 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace);
v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v110 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v011 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//y //y
@ -388,7 +400,7 @@ namespace PolyVox
{ {
if(isPrevXAvail) if(isPrevXAvail)
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v100 = m_sampVolume.peekVoxel1px0py0pz(); v100 = m_sampVolume.peekVoxel1px0py0pz();
v110 = m_sampVolume.peekVoxel1px1py0pz(); v110 = m_sampVolume.peekVoxel1px1py0pz();
@ -399,14 +411,14 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace);
v100 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v100 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace);
v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v110 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize);
v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v101 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
//x //x
@ -423,7 +435,7 @@ namespace PolyVox
} }
else //previous X not available else //previous X not available
{ {
if(m_uLodLevel == 0) if(uLodLevel == 0)
{ {
v000 = m_sampVolume.getVoxel(); v000 = m_sampVolume.getVoxel();
v100 = m_sampVolume.peekVoxel1px0py0pz(); v100 = m_sampVolume.peekVoxel1px0py0pz();
@ -438,22 +450,22 @@ namespace PolyVox
else else
{ {
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace);
v000 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v000 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace);
v100 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v100 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace);
v010 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v010 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace);
v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v110 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize);
v001 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v001 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize);
v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v101 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v011 = m_sampVolume.getSubSampledVoxel(uLodLevel);
m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize);
v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); v111 = m_sampVolume.getSubSampledVoxel(uLodLevel);
} }
if (v000 == 0) iCubeIndex |= 1; if (v000 == 0) iCubeIndex |= 1;