Removed edge case handling in CubicSurfaceExtractor. Behaviour is now more similar to 'WithNormals' version.

This commit is contained in:
unknown 2012-08-10 16:48:32 +02:00
parent 125d9000dd
commit f19e9caae1

View File

@ -74,20 +74,17 @@ namespace PolyVox
typename VolumeType::Sampler volumeSampler(m_volData); typename VolumeType::Sampler volumeSampler(m_volData);
Quad quad; Quad quad;
for(int32_t z = m_regSizeInVoxels.getLowerCorner().getZ(); z <= m_regSizeInVoxels.getUpperCorner().getZ() + 1; z++) for(int32_t z = m_regSizeInVoxels.getLowerCorner().getZ(); z <= m_regSizeInVoxels.getUpperCorner().getZ(); z++)
{ {
uint32_t regZ = z - m_regSizeInVoxels.getLowerCorner().getZ(); uint32_t regZ = z - m_regSizeInVoxels.getLowerCorner().getZ();
bool finalZ = (z == m_regSizeInVoxels.getUpperCorner().getZ() + 1);
for(int32_t y = m_regSizeInVoxels.getLowerCorner().getY(); y <= m_regSizeInVoxels.getUpperCorner().getY() + 1; y++) for(int32_t y = m_regSizeInVoxels.getLowerCorner().getY(); y <= m_regSizeInVoxels.getUpperCorner().getY(); y++)
{ {
uint32_t regY = y - m_regSizeInVoxels.getLowerCorner().getY(); uint32_t regY = y - m_regSizeInVoxels.getLowerCorner().getY();
bool finalY = (y == m_regSizeInVoxels.getUpperCorner().getY() + 1);
for(int32_t x = m_regSizeInVoxels.getLowerCorner().getX(); x <= m_regSizeInVoxels.getUpperCorner().getX() + 1; x++) for(int32_t x = m_regSizeInVoxels.getLowerCorner().getX(); x <= m_regSizeInVoxels.getUpperCorner().getX(); x++)
{ {
uint32_t regX = x - m_regSizeInVoxels.getLowerCorner().getX(); uint32_t regX = x - m_regSizeInVoxels.getLowerCorner().getX();
bool finalX = (x == m_regSizeInVoxels.getUpperCorner().getX() + 1);
volumeSampler.setPosition(x,y,z); volumeSampler.setPosition(x,y,z);
@ -97,109 +94,98 @@ namespace PolyVox
typename VolumeType::VoxelType negXVoxel = volumeSampler.peekVoxel1nx0py0pz(); typename VolumeType::VoxelType negXVoxel = volumeSampler.peekVoxel1nx0py0pz();
bool negXVoxelIsSolid = negXVoxel.getMaterial() != 0; bool negXVoxelIsSolid = negXVoxel.getMaterial() != 0;
if((currentVoxelIsSolid != negXVoxelIsSolid) && (finalY == false) && (finalZ == false)) if(currentVoxelIsSolid != negXVoxelIsSolid)
{ {
uint32_t material = (std::max)(currentVoxel.getMaterial(), negXVoxel.getMaterial()); uint32_t material = (std::max)(currentVoxel.getMaterial(), negXVoxel.getMaterial());
// Check to ensure that when a voxel solid/non-solid change is right on a region border, the vertices are generated on the solid side of the region border uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
if(((currentVoxelIsSolid > negXVoxelIsSolid) && finalX == false) || ((currentVoxelIsSolid < negXVoxelIsSolid) && regX != 0)) uint32_t v1 = addVertex(regX - 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices);
uint32_t v2 = addVertex(regX - 0.5f, regY + 0.5f, regZ + 0.5f, material, m_currentSliceVertices);
uint32_t v3 = addVertex(regX - 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
if(currentVoxelIsSolid > negXVoxelIsSolid)
{
quad.vertices[0] = v0;
quad.vertices[1] = v1;
quad.vertices[2] = v2;
quad.vertices[3] = v3;
m_vecQuads[NegativeX][regX].push_back(quad);
}
else
{ {
uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices); quad.vertices[0] = v0;
uint32_t v1 = addVertex(regX - 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices); quad.vertices[1] = v3;
uint32_t v2 = addVertex(regX - 0.5f, regY + 0.5f, regZ + 0.5f, material, m_currentSliceVertices); quad.vertices[2] = v2;
uint32_t v3 = addVertex(regX - 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices); quad.vertices[3] = v1;
if(currentVoxelIsSolid > negXVoxelIsSolid)
{
quad.vertices[0] = v0;
quad.vertices[1] = v1;
quad.vertices[2] = v2;
quad.vertices[3] = v3;
m_vecQuads[NegativeX][regX].push_back(quad);
}
else
{
quad.vertices[0] = v0;
quad.vertices[1] = v3;
quad.vertices[2] = v2;
quad.vertices[3] = v1;
m_vecQuads[PositiveX][regX].push_back(quad);
}
m_vecQuads[PositiveX][regX].push_back(quad);
} }
} }
typename VolumeType::VoxelType negYVoxel = volumeSampler.peekVoxel0px1ny0pz(); typename VolumeType::VoxelType negYVoxel = volumeSampler.peekVoxel0px1ny0pz();
bool negYVoxelIsSolid = negYVoxel.getMaterial() != 0; bool negYVoxelIsSolid = negYVoxel.getMaterial() != 0;
if((currentVoxelIsSolid != negYVoxelIsSolid) && (finalX == false) && (finalZ == false)) if(currentVoxelIsSolid != negYVoxelIsSolid)
{ {
int material = (std::max)(currentVoxel.getMaterial(),negYVoxel.getMaterial()); int material = (std::max)(currentVoxel.getMaterial(),negYVoxel.getMaterial());
if(((currentVoxelIsSolid > negYVoxelIsSolid) && finalY == false) || ((currentVoxelIsSolid < negYVoxelIsSolid) && regY != 0)) uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
uint32_t v1 = addVertex(regX - 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices);
uint32_t v2 = addVertex(regX + 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices);
uint32_t v3 = addVertex(regX + 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
if(currentVoxelIsSolid > negYVoxelIsSolid)
{ {
uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices); //NOTE: For some reason y windong is opposite of X and Z. Investigate this...
uint32_t v1 = addVertex(regX - 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices); quad.vertices[0] = v0;
uint32_t v2 = addVertex(regX + 0.5f, regY - 0.5f, regZ + 0.5f, material, m_currentSliceVertices); quad.vertices[1] = v3;
uint32_t v3 = addVertex(regX + 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices); quad.vertices[2] = v2;
quad.vertices[3] = v1;
if(currentVoxelIsSolid > negYVoxelIsSolid) m_vecQuads[NegativeY][regY].push_back(quad);
{ }
//NOTE: For some reason y windong is opposite of X and Z. Investigate this... else
quad.vertices[0] = v0; {
quad.vertices[1] = v3; //NOTE: For some reason y windong is opposite of X and Z. Investigate this...
quad.vertices[2] = v2; quad.vertices[0] = v0;
quad.vertices[3] = v1; quad.vertices[1] = v1;
quad.vertices[2] = v2;
quad.vertices[3] = v3;
m_vecQuads[NegativeY][regY].push_back(quad); m_vecQuads[PositiveY][regY].push_back(quad);
}
else
{
//NOTE: For some reason y windong is opposite of X and Z. Investigate this...
quad.vertices[0] = v0;
quad.vertices[1] = v1;
quad.vertices[2] = v2;
quad.vertices[3] = v3;
m_vecQuads[PositiveY][regY].push_back(quad);
}
} }
} }
typename VolumeType::VoxelType negZVoxel = volumeSampler.peekVoxel0px0py1nz(); typename VolumeType::VoxelType negZVoxel = volumeSampler.peekVoxel0px0py1nz();
bool negZVoxelIsSolid = negZVoxel.getMaterial() != 0; bool negZVoxelIsSolid = negZVoxel.getMaterial() != 0;
if((currentVoxelIsSolid != negZVoxelIsSolid) && (finalX == false) && (finalY == false)) if(currentVoxelIsSolid != negZVoxelIsSolid)
{ {
int material = (std::max)(currentVoxel.getMaterial(), negZVoxel.getMaterial()); int material = (std::max)(currentVoxel.getMaterial(), negZVoxel.getMaterial());
if(((currentVoxelIsSolid > negZVoxelIsSolid) && finalZ == false) || ((currentVoxelIsSolid < negZVoxelIsSolid) && regZ != 0)) uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
{ uint32_t v1 = addVertex(regX - 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
uint32_t v0 = addVertex(regX - 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices); uint32_t v2 = addVertex(regX + 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
uint32_t v1 = addVertex(regX - 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices); uint32_t v3 = addVertex(regX + 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
uint32_t v2 = addVertex(regX + 0.5f, regY + 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
uint32_t v3 = addVertex(regX + 0.5f, regY - 0.5f, regZ - 0.5f, material, m_previousSliceVertices);
if(currentVoxelIsSolid > negZVoxelIsSolid) if(currentVoxelIsSolid > negZVoxelIsSolid)
{ {
quad.vertices[0] = v0; quad.vertices[0] = v0;
quad.vertices[1] = v1; quad.vertices[1] = v1;
quad.vertices[2] = v2; quad.vertices[2] = v2;
quad.vertices[3] = v3; quad.vertices[3] = v3;
m_vecQuads[NegativeZ][regZ].push_back(quad); m_vecQuads[NegativeZ][regZ].push_back(quad);
} }
else else
{ {
quad.vertices[0] = v0; quad.vertices[0] = v0;
quad.vertices[1] = v3; quad.vertices[1] = v3;
quad.vertices[2] = v2; quad.vertices[2] = v2;
quad.vertices[3] = v1; quad.vertices[3] = v1;
m_vecQuads[PositiveZ][regZ].push_back(quad); m_vecQuads[PositiveZ][regZ].push_back(quad);
}
} }
} }
} }