|
|
|
@ -87,75 +87,73 @@ namespace PolyVox
|
|
|
|
|
|
|
|
|
|
volumeSampler.setPosition(x,y,z);
|
|
|
|
|
|
|
|
|
|
uint32_t material; //Filled in by callback
|
|
|
|
|
typename VolumeType::VoxelType currentVoxel = volumeSampler.getVoxel();
|
|
|
|
|
bool currentVoxelIsSolid = currentVoxel.getMaterial() != 0;
|
|
|
|
|
|
|
|
|
|
typename VolumeType::VoxelType negXVoxel = volumeSampler.peekVoxel1nx0py0pz();
|
|
|
|
|
bool negXVoxelIsSolid = negXVoxel.getMaterial() != 0;
|
|
|
|
|
typename VolumeType::VoxelType negYVoxel = volumeSampler.peekVoxel0px1ny0pz();
|
|
|
|
|
typename VolumeType::VoxelType negZVoxel = volumeSampler.peekVoxel0px0py1nz();
|
|
|
|
|
|
|
|
|
|
if(currentVoxelIsSolid != negXVoxelIsSolid)
|
|
|
|
|
// X
|
|
|
|
|
if(m_funcIsQuadNeededCallback(currentVoxel, negXVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
uint32_t material = (std::max)(currentVoxel.getMaterial(), negXVoxel.getMaterial());
|
|
|
|
|
|
|
|
|
|
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 > negXVoxelIsSolid)
|
|
|
|
|
{
|
|
|
|
|
m_vecQuads[NegativeX][regX].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_vecQuads[PositiveX][regX].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
m_vecQuads[NegativeX][regX].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename VolumeType::VoxelType negYVoxel = volumeSampler.peekVoxel0px1ny0pz();
|
|
|
|
|
bool negYVoxelIsSolid = negYVoxel.getMaterial() != 0;
|
|
|
|
|
|
|
|
|
|
if(currentVoxelIsSolid != negYVoxelIsSolid)
|
|
|
|
|
if(m_funcIsQuadNeededCallback(negXVoxel, currentVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
int material = (std::max)(currentVoxel.getMaterial(),negYVoxel.getMaterial());
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
//NOTE: For some reason y windong is opposite of X and Z. Investigate this...
|
|
|
|
|
m_vecQuads[NegativeY][regY].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
//NOTE: For some reason y windong is opposite of X and Z. Investigate this...
|
|
|
|
|
m_vecQuads[PositiveY][regY].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
m_vecQuads[PositiveX][regX].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename VolumeType::VoxelType negZVoxel = volumeSampler.peekVoxel0px0py1nz();
|
|
|
|
|
bool negZVoxelIsSolid = negZVoxel.getMaterial() != 0;
|
|
|
|
|
|
|
|
|
|
if(currentVoxelIsSolid != negZVoxelIsSolid)
|
|
|
|
|
// Y
|
|
|
|
|
if(m_funcIsQuadNeededCallback(currentVoxel, negYVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
int material = (std::max)(currentVoxel.getMaterial(), negZVoxel.getMaterial());
|
|
|
|
|
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 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_currentSliceVertices);
|
|
|
|
|
|
|
|
|
|
m_vecQuads[NegativeY][regY].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_funcIsQuadNeededCallback(negYVoxel, currentVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
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 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_currentSliceVertices);
|
|
|
|
|
|
|
|
|
|
m_vecQuads[PositiveY][regY].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Z
|
|
|
|
|
if(m_funcIsQuadNeededCallback(currentVoxel, negZVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
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 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)
|
|
|
|
|
{
|
|
|
|
|
m_vecQuads[NegativeZ][regZ].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_vecQuads[PositiveZ][regZ].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
m_vecQuads[NegativeZ][regZ].push_back(Quad(v0, v1, v2, v3));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(m_funcIsQuadNeededCallback(negZVoxel, currentVoxel, material))
|
|
|
|
|
{
|
|
|
|
|
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 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);
|
|
|
|
|
|
|
|
|
|
m_vecQuads[PositiveZ][regZ].push_back(Quad(v0, v3, v2, v1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|