diff --git a/library/PolyVoxCore/include/SurfaceExtractor.h b/library/PolyVoxCore/include/SurfaceExtractor.h index 385c6a30..3d338631 100644 --- a/library/PolyVoxCore/include/SurfaceExtractor.h +++ b/library/PolyVoxCore/include/SurfaceExtractor.h @@ -48,7 +48,7 @@ namespace PolyVox uint8_t m_uStepSize; Volume m_volData; - VolumeSampler m_iterVolume; + VolumeSampler m_sampVolume; uint8_t* m_pPreviousBitmask; uint8_t* m_pCurrentBitmask; @@ -65,10 +65,10 @@ namespace PolyVox //void extractSurfaceForRegionLevel0(Volume* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch); - void extractSurfaceImpl(Volume* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch); - uint32_t computeBitmaskForSlice(VolumeSampler& volIter, const Region& regSlice, const Vector3DFloat& offset); - void generateIndicesForSlice(VolumeSampler& volIter, const Region& regSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset); - void generateVerticesForSlice(VolumeSampler& volIter, Region& regSlice, const Vector3DFloat& offset, IndexedSurfacePatch* singleMaterialPatch); + void extractSurfaceImpl(Region region, IndexedSurfacePatch* singleMaterialPatch); + uint32_t computeBitmaskForSlice(const Region& regSlice, const Vector3DFloat& offset); + void generateIndicesForSlice(const Region& regSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset); + void generateVerticesForSlice(Region& regSlice, const Vector3DFloat& offset, IndexedSurfacePatch* singleMaterialPatch); }; } diff --git a/library/PolyVoxCore/source/SurfaceExtractor.cpp b/library/PolyVoxCore/source/SurfaceExtractor.cpp index c1201ffc..f8107e75 100644 --- a/library/PolyVoxCore/source/SurfaceExtractor.cpp +++ b/library/PolyVoxCore/source/SurfaceExtractor.cpp @@ -9,7 +9,7 @@ namespace PolyVox SurfaceExtractor::SurfaceExtractor(Volume& volData) :m_uLodLevel(0) ,m_volData(volData) - ,m_iterVolume(volData) + ,m_sampVolume(volData) { } @@ -30,7 +30,7 @@ namespace PolyVox { POLYVOX_SHARED_PTR result(new IndexedSurfacePatch()); - extractSurfaceImpl(&m_volData, region, result.get()); + extractSurfaceImpl(region, result.get()); result->m_Region = region; @@ -46,7 +46,7 @@ namespace PolyVox // Level 0 //////////////////////////////////////////////////////////////////////////////// - /*uint32_t SurfaceExtractor::computeBitmaskForSliceLevel0(VolumeSampler& volIter, const Region& regSlice, const Vector3DFloat& offset, uint8_t* bitmask, uint8_t* previousBitmask) + /*uint32_t SurfaceExtractor::computeBitmaskForSliceLevel0(VolumeSampler& m_sampVolume, const Region& regSlice, const Vector3DFloat& offset, uint8_t* bitmask, uint8_t* previousBitmask) { uint32_t uNoOfNonEmptyCells = 0; @@ -56,17 +56,17 @@ namespace PolyVox for(uint16_t uXVolSpace = regSlice.getLowerCorner().getX(); uXVolSpace <= regSlice.getUpperCorner().getX(); uXVolSpace++) { uint16_t uZVolSpace = regSlice.getLowerCorner().getZ(); - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); //Current position - const uint16_t uXRegSpace = volIter.getPosX() - offset.getX(); - const uint16_t uYRegSpace = volIter.getPosY() - offset.getY(); + const uint16_t uXRegSpace = m_sampVolume.getPosX() - offset.getX(); + const uint16_t uYRegSpace = m_sampVolume.getPosY() - offset.getY(); //Determine the index into the edge table which tells us which vertices are inside of the surface uint8_t iCubeIndex = 0; - if((uXVolSpace < volIter.getVolume().getWidth()-1) && - (uYVolSpace < volIter.getVolume().getHeight()-1) && - (uZVolSpace < volIter.getVolume().getDepth()-1)) + if((uXVolSpace < m_sampVolume.getVolume().getWidth()-1) && + (uYVolSpace < m_sampVolume.getVolume().getHeight()-1) && + (uZVolSpace < m_sampVolume.getVolume().getDepth()-1)) { bool isPrevXAvail = uXRegSpace > 0; bool isPrevYAvail = uYRegSpace > 0; @@ -78,7 +78,7 @@ namespace PolyVox { if(isPrevXAvail) { - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //z uint8_t iPreviousCubeIndexZ = previousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -100,8 +100,8 @@ namespace PolyVox } else //previous X not available { - const uint8_t v011 = volIter.peekVoxel0px1py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v011 = m_sampVolume.peekVoxel0px1py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //z uint8_t iPreviousCubeIndexZ = previousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -122,8 +122,8 @@ namespace PolyVox { if(isPrevXAvail) { - const uint8_t v101 = volIter.peekVoxel1px0py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v101 = m_sampVolume.peekVoxel1px0py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //z uint8_t iPreviousCubeIndexZ = previousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -141,10 +141,10 @@ namespace PolyVox } else //previous X not available { - const uint8_t v001 = volIter.peekVoxel0px0py1pz(); - const uint8_t v101 = volIter.peekVoxel1px0py1pz(); - const uint8_t v011 = volIter.peekVoxel0px1py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v001 = m_sampVolume.peekVoxel0px0py1pz(); + const uint8_t v101 = m_sampVolume.peekVoxel1px0py1pz(); + const uint8_t v011 = m_sampVolume.peekVoxel0px1py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //z uint8_t iPreviousCubeIndexZ = previousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -163,8 +163,8 @@ namespace PolyVox { if(isPrevXAvail) { - const uint8_t v110 = volIter.peekVoxel1px1py0pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v110 = m_sampVolume.peekVoxel1px1py0pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //y uint8_t iPreviousCubeIndexY = bitmask[getIndex(uXRegSpace,uYRegSpace-1, regSlice.width()+1)]; @@ -183,11 +183,11 @@ namespace PolyVox } else //previous X not available { - const uint8_t v010 = volIter.peekVoxel0px1py0pz(); - const uint8_t v110 = volIter.peekVoxel1px1py0pz(); + const uint8_t v010 = m_sampVolume.peekVoxel0px1py0pz(); + const uint8_t v110 = m_sampVolume.peekVoxel1px1py0pz(); - const uint8_t v011 = volIter.peekVoxel0px1py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v011 = m_sampVolume.peekVoxel0px1py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //y uint8_t iPreviousCubeIndexY = bitmask[getIndex(uXRegSpace,uYRegSpace-1, regSlice.width()+1)]; @@ -206,11 +206,11 @@ namespace PolyVox { if(isPrevXAvail) { - const uint8_t v100 = volIter.peekVoxel1px0py0pz(); - const uint8_t v110 = volIter.peekVoxel1px1py0pz(); + const uint8_t v100 = m_sampVolume.peekVoxel1px0py0pz(); + const uint8_t v110 = m_sampVolume.peekVoxel1px1py0pz(); - const uint8_t v101 = volIter.peekVoxel1px0py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v101 = m_sampVolume.peekVoxel1px0py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); //x uint8_t iPreviousCubeIndexX = bitmask[getIndex(uXRegSpace-1,uYRegSpace, regSlice.width()+1)]; @@ -226,15 +226,15 @@ namespace PolyVox } else //previous X not available { - const uint8_t v000 = volIter.getVoxel(); - const uint8_t v100 = volIter.peekVoxel1px0py0pz(); - const uint8_t v010 = volIter.peekVoxel0px1py0pz(); - const uint8_t v110 = volIter.peekVoxel1px1py0pz(); + const uint8_t v000 = m_sampVolume.getVoxel(); + const uint8_t v100 = m_sampVolume.peekVoxel1px0py0pz(); + const uint8_t v010 = m_sampVolume.peekVoxel0px1py0pz(); + const uint8_t v110 = m_sampVolume.peekVoxel1px1py0pz(); - const uint8_t v001 = volIter.peekVoxel0px0py1pz(); - const uint8_t v101 = volIter.peekVoxel1px0py1pz(); - const uint8_t v011 = volIter.peekVoxel0px1py1pz(); - const uint8_t v111 = volIter.peekVoxel1px1py1pz(); + const uint8_t v001 = m_sampVolume.peekVoxel0px0py1pz(); + const uint8_t v101 = m_sampVolume.peekVoxel1px0py1pz(); + const uint8_t v011 = m_sampVolume.peekVoxel0px1py1pz(); + const uint8_t v111 = m_sampVolume.peekVoxel1px1py1pz(); if (v000 == 0) iCubeIndex |= 1; if (v100 == 0) iCubeIndex |= 2; @@ -250,15 +250,15 @@ namespace PolyVox } else //We're at the edge of the volume - use bounds checking. { - const uint8_t v000 = volIter.getVoxel(); - const uint8_t v100 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace ); - const uint8_t v010 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace ); - const uint8_t v110 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); + const uint8_t v000 = m_sampVolume.getVoxel(); + const uint8_t v100 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace ); + const uint8_t v010 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace ); + const uint8_t v110 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); - const uint8_t v001 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace , uZVolSpace+1); - const uint8_t v101 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace+1); - const uint8_t v011 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace+1); - const uint8_t v111 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); + const uint8_t v001 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace , uZVolSpace+1); + const uint8_t v101 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace+1); + const uint8_t v011 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace+1); + const uint8_t v111 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); if (v000 == 0) iCubeIndex |= 1; if (v100 == 0) iCubeIndex |= 2; @@ -288,7 +288,7 @@ namespace PolyVox // Level 1 //////////////////////////////////////////////////////////////////////////////// - void SurfaceExtractor::extractSurfaceImpl(Volume* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch) + void SurfaceExtractor::extractSurfaceImpl(Region region, IndexedSurfacePatch* singleMaterialPatch) { singleMaterialPatch->clear(); @@ -310,7 +310,7 @@ namespace PolyVox //When generating the mesh for a region we actually look outside it in the // back, bottom, right direction. Protect against access violations by cropping region here - Region regVolume = volumeData->getEnclosingRegion(); + Region regVolume = m_volData.getEnclosingRegion(); if(m_uLodLevel > 0) { regVolume.setUpperCorner(regVolume.getUpperCorner() - Vector3DInt32(2*m_uStepSize-1,2*m_uStepSize-1,2*m_uStepSize-1)); @@ -325,10 +325,7 @@ namespace PolyVox Vector3DInt32 v3dUpperCorner = regSlice0.getUpperCorner(); v3dUpperCorner.setZ(regSlice0.getLowerCorner().getZ()); //Set the upper z to the lower z to make it one slice thick. regSlice0.setUpperCorner(v3dUpperCorner); - Region regSlice1 = regSlice0; - - //Iterator to access the volume data - VolumeSampler volIter(*volumeData); + Region regSlice1 = regSlice0; uint32_t uNoOfNonEmptyCellsForSlice0 = 0; uint32_t uNoOfNonEmptyCellsForSlice1 = 0; @@ -338,18 +335,18 @@ namespace PolyVox for(uint32_t uSlice = 0; ((uSlice <= region.depth()) && (uSlice + offset.getZ() <= regVolume.getUpperCorner().getZ())); uSlice += m_uStepSize) { - uNoOfNonEmptyCellsForSlice1 = computeBitmaskForSlice(volIter, regSlice1, offset); + uNoOfNonEmptyCellsForSlice1 = computeBitmaskForSlice(regSlice1, offset); if(uNoOfNonEmptyCellsForSlice1 != 0) { - generateVerticesForSlice(volIter, regSlice1, offset, singleMaterialPatch); + generateVerticesForSlice(regSlice1, offset, singleMaterialPatch); } if(isFirstSliceDone) { if((uNoOfNonEmptyCellsForSlice0 != 0) || (uNoOfNonEmptyCellsForSlice1 != 0)) { - generateIndicesForSlice(volIter, regSlice0, singleMaterialPatch, offset); + generateIndicesForSlice(regSlice0, singleMaterialPatch, offset); } } @@ -375,7 +372,7 @@ namespace PolyVox delete[] m_pCurrentVertexIndicesZ; } - uint32_t SurfaceExtractor::computeBitmaskForSlice(VolumeSampler& volIter, const Region& regSlice, const Vector3DFloat& offset) + uint32_t SurfaceExtractor::computeBitmaskForSlice(const Region& regSlice, const Vector3DFloat& offset) { uint32_t uNoOfNonEmptyCells = 0; @@ -386,7 +383,7 @@ namespace PolyVox { uint16_t uZVolSpace = regSlice.getLowerCorner().getZ(); //Current position - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); const uint16_t uXRegSpace = uXVolSpace - offset.getX(); const uint16_t uYRegSpace = uYVolSpace - offset.getY(); @@ -395,9 +392,9 @@ namespace PolyVox //Determine the index into the edge table which tells us which vertices are inside of the surface uint8_t iCubeIndex = 0; - if((uXVolSpace < volIter.getVolume().getWidth()-m_uStepSize) && - (uYVolSpace < volIter.getVolume().getHeight()-m_uStepSize) && - (uZVolSpace < volIter.getVolume().getDepth()-m_uStepSize)) + if((uXVolSpace < m_sampVolume.getVolume().getWidth()-m_uStepSize) && + (uYVolSpace < m_sampVolume.getVolume().getHeight()-m_uStepSize) && + (uZVolSpace < m_sampVolume.getVolume().getDepth()-m_uStepSize)) { bool isPrevXAvail = uXRegSpace > 0; bool isPrevYAvail = uYRegSpace > 0; @@ -409,8 +406,8 @@ namespace PolyVox { if(isPrevXAvail) { - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //z uint8_t iPreviousCubeIndexZ = m_pPreviousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -432,10 +429,10 @@ namespace PolyVox } else //previous X not available { - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v011 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //z uint8_t iPreviousCubeIndexZ = m_pPreviousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -456,10 +453,10 @@ namespace PolyVox { if(isPrevXAvail) { - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v101 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //z uint8_t iPreviousCubeIndexZ = m_pPreviousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -477,14 +474,14 @@ namespace PolyVox } else //previous X not available { - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v001 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v101 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v011 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v001 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //z uint8_t iPreviousCubeIndexZ = m_pPreviousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)]; @@ -503,11 +500,11 @@ namespace PolyVox { if(isPrevXAvail) { - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v110 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //y uint8_t iPreviousCubeIndexY = m_pCurrentBitmask[getIndex(uXRegSpace,uYRegSpace-m_uStepSize, regSlice.width()+1)]; @@ -526,15 +523,15 @@ namespace PolyVox } else //previous X not available { - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v010 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v110 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v010 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v011 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //y uint8_t iPreviousCubeIndexY = m_pCurrentBitmask[getIndex(uXRegSpace,uYRegSpace-m_uStepSize, regSlice.width()+1)]; @@ -553,15 +550,15 @@ namespace PolyVox { if(isPrevXAvail) { - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); - const uint8_t v100 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v110 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); + const uint8_t v100 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v101 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //x uint8_t iPreviousCubeIndexX = m_pCurrentBitmask[getIndex(uXRegSpace-m_uStepSize,uYRegSpace, regSlice.width()+1)]; @@ -577,23 +574,23 @@ namespace PolyVox } else //previous X not available { - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); - const uint8_t v000 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); - const uint8_t v100 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v010 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); - const uint8_t v110 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); + const uint8_t v000 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace); + const uint8_t v100 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v010 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace); + const uint8_t v110 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v001 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); - const uint8_t v101 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v011 = volIter.getSubSampledVoxel(m_uLodLevel); - volIter.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); - const uint8_t v111 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v001 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace,uZVolSpace+m_uStepSize); + const uint8_t v101 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v011 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+m_uStepSize,uYVolSpace+m_uStepSize,uZVolSpace+m_uStepSize); + const uint8_t v111 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); if (v000 == 0) iCubeIndex |= 1; if (v100 == 0) iCubeIndex |= 2; @@ -611,15 +608,15 @@ namespace PolyVox { if(m_uLodLevel == 0) { - const uint8_t v000 = volIter.getVoxel(); - const uint8_t v100 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace ); - const uint8_t v010 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace ); - const uint8_t v110 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); + const uint8_t v000 = m_sampVolume.getVoxel(); + const uint8_t v100 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace ); + const uint8_t v010 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace ); + const uint8_t v110 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); - const uint8_t v001 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace , uZVolSpace+1); - const uint8_t v101 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace+1); - const uint8_t v011 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace+1); - const uint8_t v111 = volIter.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); + const uint8_t v001 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace , uZVolSpace+1); + const uint8_t v101 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace , uZVolSpace+1); + const uint8_t v011 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace , uYVolSpace+1, uZVolSpace+1); + const uint8_t v111 = m_sampVolume.getVolume().getVoxelAtWithBoundCheck(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); if (v000 == 0) iCubeIndex |= 1; if (v100 == 0) iCubeIndex |= 2; @@ -632,29 +629,29 @@ namespace PolyVox } else { - const uint8_t v000 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + const uint8_t v000 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace+1, uYVolSpace , uZVolSpace ); - const uint8_t v100 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+1, uYVolSpace , uZVolSpace ); + const uint8_t v100 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace , uYVolSpace+1, uZVolSpace ); - const uint8_t v010 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace , uYVolSpace+1, uZVolSpace ); + const uint8_t v010 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); - const uint8_t v110 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+1, uYVolSpace+1, uZVolSpace ); + const uint8_t v110 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace , uYVolSpace , uZVolSpace+1); - const uint8_t v001 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace , uYVolSpace , uZVolSpace+1); + const uint8_t v001 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace+1, uYVolSpace , uZVolSpace+1); - const uint8_t v101 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+1, uYVolSpace , uZVolSpace+1); + const uint8_t v101 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace , uYVolSpace+1, uZVolSpace+1); - const uint8_t v011 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace , uYVolSpace+1, uZVolSpace+1); + const uint8_t v011 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); - volIter.setPosition(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); - const uint8_t v111 = volIter.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace+1, uYVolSpace+1, uZVolSpace+1); + const uint8_t v111 = m_sampVolume.getSubSampledVoxelWithBoundsCheck(m_uLodLevel); if (v000 == 0) iCubeIndex |= 1; if (v100 == 0) iCubeIndex |= 2; @@ -681,7 +678,7 @@ namespace PolyVox return uNoOfNonEmptyCells; } - void SurfaceExtractor::generateVerticesForSlice(VolumeSampler& volIter, Region& regSlice, const Vector3DFloat& offset, IndexedSurfacePatch* singleMaterialPatch) + void SurfaceExtractor::generateVerticesForSlice(Region& regSlice, const Vector3DFloat& offset, IndexedSurfacePatch* singleMaterialPatch) { //Iterate over each cell in the region for(uint16_t uYVolSpace = regSlice.getLowerCorner().getY(); uYVolSpace <= regSlice.getUpperCorner().getY(); uYVolSpace += m_uStepSize) @@ -698,8 +695,8 @@ namespace PolyVox //Current position //const uint16_t z = regSlice.getLowerCorner().getZ(); - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); - const uint8_t v000 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); + const uint8_t v000 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); //Determine the index into the edge table which tells us which vertices are inside of the surface uint8_t iCubeIndex = m_pCurrentBitmask[getIndex(uXVolSpace - offset.getX(),uYVolSpace - offset.getY(), regSlice.width()+1)]; @@ -715,8 +712,8 @@ namespace PolyVox { if(uXVolSpace != regSlice.getUpperCorner().getX()) { - volIter.setPosition(uXVolSpace + m_uStepSize,uYVolSpace,uZVolSpace); - const uint8_t v100 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace + m_uStepSize,uYVolSpace,uZVolSpace); + const uint8_t v100 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); const Vector3DFloat v3dPosition(uXVolSpace - offset.getX() + 0.5f * m_uStepSize, uYVolSpace - offset.getY(), uZVolSpace - offset.getZ()); const Vector3DFloat v3dNormal(v000 > v100 ? 1.0f : -1.0f,0.0,0.0); const uint8_t uMaterial = v000 | v100; //Because one of these is 0, the or operation takes the max. @@ -729,8 +726,8 @@ namespace PolyVox { if(uYVolSpace != regSlice.getUpperCorner().getY()) { - volIter.setPosition(uXVolSpace,uYVolSpace + m_uStepSize,uZVolSpace); - const uint8_t v010 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace + m_uStepSize,uZVolSpace); + const uint8_t v010 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); const Vector3DFloat v3dPosition(uXVolSpace - offset.getX(), uYVolSpace - offset.getY() + 0.5f * m_uStepSize, uZVolSpace - offset.getZ()); const Vector3DFloat v3dNormal(0.0,v000 > v010 ? 1.0f : -1.0f,0.0); const uint8_t uMaterial = v000 | v010; //Because one of these is 0, the or operation takes the max. @@ -743,8 +740,8 @@ namespace PolyVox { //if(z != regSlice.getUpperCorner.getZ()) { - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace + m_uStepSize); - const uint8_t v001 = volIter.getSubSampledVoxel(m_uLodLevel); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace + m_uStepSize); + const uint8_t v001 = m_sampVolume.getSubSampledVoxel(m_uLodLevel); const Vector3DFloat v3dPosition(uXVolSpace - offset.getX(), uYVolSpace - offset.getY(), uZVolSpace - offset.getZ() + 0.5f * m_uStepSize); const Vector3DFloat v3dNormal(0.0,0.0,v000 > v001 ? 1.0f : -1.0f); const uint8_t uMaterial = v000 | v001; //Because one of these is 0, the or operation takes the max. @@ -757,7 +754,7 @@ namespace PolyVox } } - void SurfaceExtractor::generateIndicesForSlice(VolumeSampler& volIter, const Region& regSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset) + void SurfaceExtractor::generateIndicesForSlice(const Region& regSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset) { uint32_t indlist[12]; @@ -766,12 +763,12 @@ namespace PolyVox for(uint16_t uXVolSpace = regSlice.getLowerCorner().getX(); uXVolSpace < regSlice.getUpperCorner().getX(); uXVolSpace += m_uStepSize) { uint16_t uZVolSpace = regSlice.getLowerCorner().getZ(); - volIter.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); + m_sampVolume.setPosition(uXVolSpace,uYVolSpace,uZVolSpace); //Current position - const uint16_t uXRegSpace = volIter.getPosX() - offset.getX(); - const uint16_t uYRegSpace = volIter.getPosY() - offset.getY(); - const uint16_t uZRegSpace = volIter.getPosZ() - offset.getZ(); + const uint16_t uXRegSpace = m_sampVolume.getPosX() - offset.getX(); + const uint16_t uYRegSpace = m_sampVolume.getPosY() - offset.getY(); + const uint16_t uZRegSpace = m_sampVolume.getPosZ() - offset.getZ(); //Determine the index into the edge table which tells us which vertices are inside of the surface uint8_t iCubeIndex = m_pPreviousBitmask[getIndex(uXRegSpace,uYRegSpace, regSlice.width()+1)];