New marching cubes implementation - computeBitmaskForSlice is now only called once per slice.

This commit is contained in:
David Williams
2008-06-05 18:28:21 +00:00
parent 63b2c5ccb0
commit 8bf6f4d08d
2 changed files with 28 additions and 20 deletions

View File

@ -37,7 +37,7 @@ namespace PolyVox
POLYVOX_API std::list<RegionGeometry> getChangedRegionGeometry(VolumeChangeTracker& volume); POLYVOX_API std::list<RegionGeometry> getChangedRegionGeometry(VolumeChangeTracker& volume);
POLYVOX_API void generateExperimentalMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch); POLYVOX_API void generateExperimentalMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch);
POLYVOX_API void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<boost::uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset); POLYVOX_API void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<boost::uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset, boost::uint8_t bitmask0[][POLYVOX_REGION_SIDE_LENGTH+1], boost::uint8_t bitmask1[][POLYVOX_REGION_SIDE_LENGTH+1]);
POLYVOX_API void computeBitmaskForSlice(BlockVolumeIterator<boost::uint8_t>& volIter, Region& regSlice, const Vector3DFloat& offset, boost::uint8_t bitmask[][POLYVOX_REGION_SIDE_LENGTH+1]); POLYVOX_API void computeBitmaskForSlice(BlockVolumeIterator<boost::uint8_t>& volIter, Region& regSlice, const Vector3DFloat& offset, boost::uint8_t bitmask[][POLYVOX_REGION_SIDE_LENGTH+1]);
POLYVOX_API void generateRoughMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch); POLYVOX_API void generateRoughMeshDataForRegion(BlockVolume<boost::uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch);

View File

@ -53,15 +53,34 @@ namespace PolyVox
//Offset from region corner //Offset from region corner
const Vector3DFloat offset = static_cast<Vector3DFloat>(region.getLowerCorner()); const Vector3DFloat offset = static_cast<Vector3DFloat>(region.getLowerCorner());
//Cell bitmasks
boost::uint8_t bitmask0[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
boost::uint8_t bitmask1[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
memset(bitmask0, 0x00, sizeof(bitmask0));
memset(bitmask1, 0x00, sizeof(bitmask1));
Region regFirstSlice(region);
regFirstSlice.setUpperCorner(Vector3DInt32(regFirstSlice.getUpperCorner().getX(),regFirstSlice.getUpperCorner().getY(),regFirstSlice.getLowerCorner().getZ()));
BlockVolumeIterator<boost::uint8_t> volIter(*volumeData); BlockVolumeIterator<boost::uint8_t> volIter(*volumeData);
computeBitmaskForSlice(volIter, regFirstSlice, offset, bitmask0);
for(boost::uint32_t uSlice = 0; ((uSlice <= 15) && (uSlice + offset.getZ() < region.getUpperCorner().getZ())); ++uSlice) for(boost::uint32_t uSlice = 0; ((uSlice <= 15) && (uSlice + offset.getZ() < region.getUpperCorner().getZ())); ++uSlice)
{ {
Vector3DInt32 lowerCorner = Vector3DInt32(region.getLowerCorner().getX(), region.getLowerCorner().getY(), region.getLowerCorner().getZ() + uSlice); Vector3DInt32 lowerCorner = Vector3DInt32(region.getLowerCorner().getX(), region.getLowerCorner().getY(), region.getLowerCorner().getZ() + uSlice);
Vector3DInt32 upperCorner = Vector3DInt32(region.getUpperCorner().getX(), region.getUpperCorner().getY(), region.getLowerCorner().getZ() + uSlice + 1); Vector3DInt32 upperCorner = Vector3DInt32(region.getUpperCorner().getX(), region.getUpperCorner().getY(), region.getLowerCorner().getZ() + uSlice + 1);
Region regTwoSlice(lowerCorner, upperCorner); Region regTwoSlice(lowerCorner, upperCorner);
generateExperimentalMeshDataForRegionSlice(volIter, regTwoSlice, singleMaterialPatch, offset);
Region regSecondSlice(regTwoSlice);
regSecondSlice.setLowerCorner(regSecondSlice.getLowerCorner() + Vector3DInt32(0,0,1));
computeBitmaskForSlice(volIter, regSecondSlice, offset, bitmask1);
generateExperimentalMeshDataForRegionSlice(volIter, regTwoSlice, singleMaterialPatch, offset, bitmask0, bitmask1);
memcpy(bitmask0, bitmask1, sizeof(bitmask0));
memset(bitmask1, 0, sizeof(bitmask1));
} }
@ -74,7 +93,7 @@ namespace PolyVox
} }
} }
void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset) void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset, uint8_t bitmask0[][POLYVOX_REGION_SIDE_LENGTH+1], uint8_t bitmask1[][POLYVOX_REGION_SIDE_LENGTH+1])
{ {
//For edge indices //For edge indices
boost::int32_t vertexIndicesX[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1]; boost::int32_t vertexIndicesX[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
@ -84,26 +103,14 @@ namespace PolyVox
memset(vertexIndicesY,0xFF,sizeof(vertexIndicesY)); memset(vertexIndicesY,0xFF,sizeof(vertexIndicesY));
memset(vertexIndicesZ,0xFF,sizeof(vertexIndicesZ)); memset(vertexIndicesZ,0xFF,sizeof(vertexIndicesZ));
//Cell bitmasks
boost::uint8_t bitmask0[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
boost::uint8_t bitmask1[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
memset(bitmask0, 0x00, sizeof(bitmask0));
memset(bitmask1, 0x00, sizeof(bitmask1));
Region regFirstSlice(regTwoSlice); Region regFirstSlice(regTwoSlice);
regFirstSlice.setUpperCorner(regFirstSlice.getUpperCorner() - Vector3DInt32(0,0,1)); regFirstSlice.setUpperCorner(regFirstSlice.getUpperCorner() - Vector3DInt32(0,0,1));
Region regSecondSlice(regTwoSlice); Region regSecondSlice(regTwoSlice);
regSecondSlice.setLowerCorner(regSecondSlice.getLowerCorner() + Vector3DInt32(0,0,1)); regSecondSlice.setLowerCorner(regSecondSlice.getLowerCorner() + Vector3DInt32(0,0,1));
//////////////////////////////////////////////////////////////////////////
// Compute bitmasks
//////////////////////////////////////////////////////////////////////////
computeBitmaskForSlice(volIter, regFirstSlice, offset, bitmask0);
computeBitmaskForSlice(volIter, regSecondSlice, offset, bitmask1);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
//Get mesh data //Generate vertices
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
Vector3DFloat vertlist[12]; Vector3DFloat vertlist[12];
@ -237,15 +244,16 @@ namespace PolyVox
} }
}while(volIter.moveForwardInRegionXYZ());//For each cell }while(volIter.moveForwardInRegionXYZ());//For each cell
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
// Set the indices // Set the indices
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
boost::uint32_t indlist[12]; boost::uint32_t indlist[12];
//Iterate over each cell in the region //Iterate over each cell in the region
regTwoSlice.setUpperCorner(regTwoSlice.getUpperCorner() - Vector3DInt32(1,1,1)); regFirstSlice.setUpperCorner(regFirstSlice.getUpperCorner() - Vector3DInt32(1,1,0));
volIter.setPosition(regTwoSlice.getLowerCorner().getX(),regTwoSlice.getLowerCorner().getY(), regTwoSlice.getLowerCorner().getZ()); volIter.setPosition(regFirstSlice.getLowerCorner().getX(),regFirstSlice.getLowerCorner().getY(), regFirstSlice.getLowerCorner().getZ());
volIter.setValidRegion(regTwoSlice); volIter.setValidRegion(regFirstSlice);
//while(volIter.moveForwardInRegionXYZ()) //while(volIter.moveForwardInRegionXYZ())
do do
{ {