Refactoring VolumeChangeTracker
This commit is contained in:
parent
b7e9216355
commit
7a4e4556b1
@ -55,6 +55,7 @@ namespace PolyVox
|
|||||||
void setNormalGenerationMethod(NormalGenerationMethod method);
|
void setNormalGenerationMethod(NormalGenerationMethod method);
|
||||||
|
|
||||||
std::list<RegionGeometry> getChangedRegionGeometry(void);
|
std::list<RegionGeometry> getChangedRegionGeometry(void);
|
||||||
|
void getChangedRegions(std::list<Region>& listToFill);
|
||||||
|
|
||||||
void setAllUpToDateFlagsTo(bool newUpToDateValue);
|
void setAllUpToDateFlagsTo(bool newUpToDateValue);
|
||||||
|
|
||||||
@ -68,7 +69,8 @@ namespace PolyVox
|
|||||||
public:
|
public:
|
||||||
void markRegionChanged(boost::uint16_t firstX, boost::uint16_t firstY, boost::uint16_t firstZ, boost::uint16_t lastX, boost::uint16_t lastY, boost::uint16_t lastZ);
|
void markRegionChanged(boost::uint16_t firstX, boost::uint16_t firstY, boost::uint16_t firstZ, boost::uint16_t lastX, boost::uint16_t lastY, boost::uint16_t lastZ);
|
||||||
|
|
||||||
void setVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value);
|
void setLockedVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value);
|
||||||
|
void setUnlockedVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,7 +57,34 @@ namespace PolyVox
|
|||||||
|
|
||||||
std::list<RegionGeometry> VolumeChangeTracker::getChangedRegionGeometry(void)
|
std::list<RegionGeometry> VolumeChangeTracker::getChangedRegionGeometry(void)
|
||||||
{
|
{
|
||||||
|
std::list<Region> listChangedRegions;
|
||||||
|
getChangedRegions(listChangedRegions);
|
||||||
|
|
||||||
std::list<RegionGeometry> listChangedRegionGeometry;
|
std::list<RegionGeometry> listChangedRegionGeometry;
|
||||||
|
for(std::list<Region>::const_iterator iterChangedRegions = listChangedRegions.begin(); iterChangedRegions != listChangedRegions.end(); ++iterChangedRegions)
|
||||||
|
{
|
||||||
|
//Generate the surface
|
||||||
|
RegionGeometry regionGeometry;
|
||||||
|
regionGeometry.m_patchSingleMaterial = new IndexedSurfacePatch(false);
|
||||||
|
regionGeometry.m_patchMultiMaterial = new IndexedSurfacePatch(true);
|
||||||
|
regionGeometry.m_v3dRegionPosition = iterChangedRegions->getLowerCorner();
|
||||||
|
|
||||||
|
generateRoughMeshDataForRegion(volumeData, *iterChangedRegions, regionGeometry.m_patchSingleMaterial, regionGeometry.m_patchMultiMaterial);
|
||||||
|
|
||||||
|
regionGeometry.m_bContainsSingleMaterialPatch = regionGeometry.m_patchSingleMaterial->getVertices().size() > 0;
|
||||||
|
regionGeometry.m_bContainsMultiMaterialPatch = regionGeometry.m_patchMultiMaterial->getVertices().size() > 0;
|
||||||
|
regionGeometry.m_bIsEmpty = ((regionGeometry.m_patchSingleMaterial->getVertices().size() == 0) && (regionGeometry.m_patchMultiMaterial->getIndices().size() == 0));
|
||||||
|
|
||||||
|
listChangedRegionGeometry.push_back(regionGeometry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return listChangedRegionGeometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VolumeChangeTracker::getChangedRegions(std::list<Region>& listToFill)
|
||||||
|
{
|
||||||
|
//Clear the list
|
||||||
|
listToFill.clear();
|
||||||
|
|
||||||
//Regenerate meshes.
|
//Regenerate meshes.
|
||||||
for(uint16_t regionZ = 0; regionZ < POLYVOX_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ)
|
for(uint16_t regionZ = 0; regionZ < POLYVOX_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionZ)
|
||||||
@ -69,15 +96,8 @@ namespace PolyVox
|
|||||||
for(uint16_t regionX = 0; regionX < POLYVOX_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX)
|
for(uint16_t regionX = 0; regionX < POLYVOX_VOLUME_SIDE_LENGTH_IN_REGIONS; ++regionX)
|
||||||
//for(uint16_t regionX = 3; regionX < 4; ++regionX)
|
//for(uint16_t regionX = 3; regionX < 4; ++regionX)
|
||||||
{
|
{
|
||||||
//if(surfaceUpToDate[regionX][regionY][regionZ] == false)
|
|
||||||
if(volSurfaceUpToDate->getVoxelAt(regionX, regionY, regionZ) == false)
|
if(volSurfaceUpToDate->getVoxelAt(regionX, regionY, regionZ) == false)
|
||||||
{
|
{
|
||||||
//Generate the surface
|
|
||||||
RegionGeometry regionGeometry;
|
|
||||||
regionGeometry.m_patchSingleMaterial = new IndexedSurfacePatch(false);
|
|
||||||
regionGeometry.m_patchMultiMaterial = new IndexedSurfacePatch(true);
|
|
||||||
regionGeometry.m_v3dRegionPosition = Vector3DInt32(regionX, regionY, regionZ);
|
|
||||||
|
|
||||||
const uint16_t firstX = regionX * POLYVOX_REGION_SIDE_LENGTH;
|
const uint16_t firstX = regionX * POLYVOX_REGION_SIDE_LENGTH;
|
||||||
const uint16_t firstY = regionY * POLYVOX_REGION_SIDE_LENGTH;
|
const uint16_t firstY = regionY * POLYVOX_REGION_SIDE_LENGTH;
|
||||||
const uint16_t firstZ = regionZ * POLYVOX_REGION_SIDE_LENGTH;
|
const uint16_t firstZ = regionZ * POLYVOX_REGION_SIDE_LENGTH;
|
||||||
@ -85,19 +105,11 @@ namespace PolyVox
|
|||||||
const uint16_t lastY = firstY + POLYVOX_REGION_SIDE_LENGTH-1;
|
const uint16_t lastY = firstY + POLYVOX_REGION_SIDE_LENGTH-1;
|
||||||
const uint16_t lastZ = firstZ + POLYVOX_REGION_SIDE_LENGTH-1;
|
const uint16_t lastZ = firstZ + POLYVOX_REGION_SIDE_LENGTH-1;
|
||||||
|
|
||||||
generateRoughMeshDataForRegion(volumeData, Region(Vector3DInt32(firstX, firstY, firstZ), Vector3DInt32(lastX, lastY, lastZ)), regionGeometry.m_patchSingleMaterial, regionGeometry.m_patchMultiMaterial);
|
listToFill.push_back(Region(Vector3DInt32(firstX, firstY, firstZ), Vector3DInt32(lastX, lastY, lastZ)));
|
||||||
|
|
||||||
regionGeometry.m_bContainsSingleMaterialPatch = regionGeometry.m_patchSingleMaterial->getVertices().size() > 0;
|
|
||||||
regionGeometry.m_bContainsMultiMaterialPatch = regionGeometry.m_patchMultiMaterial->getVertices().size() > 0;
|
|
||||||
regionGeometry.m_bIsEmpty = ((regionGeometry.m_patchSingleMaterial->getVertices().size() == 0) && (regionGeometry.m_patchMultiMaterial->getIndices().size() == 0));
|
|
||||||
|
|
||||||
listChangedRegionGeometry.push_back(regionGeometry);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return listChangedRegionGeometry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolumeChangeTracker::setAllUpToDateFlagsTo(bool newUpToDateValue)
|
void VolumeChangeTracker::setAllUpToDateFlagsTo(bool newUpToDateValue)
|
||||||
@ -168,7 +180,7 @@ namespace PolyVox
|
|||||||
return volumeData;
|
return volumeData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolumeChangeTracker::setVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value)
|
void VolumeChangeTracker::setUnlockedVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value)
|
||||||
{
|
{
|
||||||
//FIXME - rather than creating a iterator each time we should have one stored
|
//FIXME - rather than creating a iterator each time we should have one stored
|
||||||
VolumeIterator<boost::uint8_t> iterVol(*volumeData);
|
VolumeIterator<boost::uint8_t> iterVol(*volumeData);
|
||||||
@ -211,4 +223,12 @@ namespace PolyVox
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VolumeChangeTracker::setLockedVoxelAt(boost::uint16_t x, boost::uint16_t y, boost::uint16_t z, boost::uint8_t value)
|
||||||
|
{
|
||||||
|
//FIXME - rather than creating a iterator each time we should have one stored
|
||||||
|
VolumeIterator<boost::uint8_t> iterVol(*volumeData);
|
||||||
|
iterVol.setPosition(x,y,z);
|
||||||
|
iterVol.setVoxel(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user