SurfaceExtractor no longer flags region and material edges.

Region/material edges no longer stored as vertex flags.
Replaced addCubicTriangle with addTriangle.
This commit is contained in:
David Williams 2011-01-06 23:00:17 +00:00
parent 3205ce6c30
commit 9310c97333
7 changed files with 27 additions and 203 deletions

View File

@ -90,13 +90,13 @@ namespace PolyVox
if(currentVoxelIsSolid > negXVoxelIsSolid)
{
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
else
{
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
}
@ -114,13 +114,13 @@ namespace PolyVox
if(currentVoxelIsSolid > negYVoxelIsSolid)
{
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
else
{
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
}
@ -138,13 +138,13 @@ namespace PolyVox
if(currentVoxelIsSolid > negZVoxelIsSolid)
{
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
else
{
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
}
}

View File

@ -67,8 +67,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ - 0.5f), Vector3DFloat(1.0f, 0.0f, 0.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(1.0f, 0.0f, 0.0f), material));
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
if(currentVoxel < plusXVoxel)
{
@ -79,8 +79,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ - 0.5f), Vector3DFloat(-1.0f, 0.0f, 0.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(-1.0f, 0.0f, 0.0f), material));
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
int plusYVoxel = m_volData->getVoxelAt(x,y+1,z).getDensity() >= VoxelType::getThreshold();
@ -93,8 +93,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ - 0.5f), Vector3DFloat(0.0f, 1.0f, 0.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, 1.0f, 0.0f), material));
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
if(currentVoxel < plusYVoxel)
{
@ -105,8 +105,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ - 0.5f), Vector3DFloat(0.0f, -1.0f, 0.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, -1.0f, 0.0f), material));
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
int plusZVoxel = m_volData->getVoxelAt(x,y,z+1).getDensity() >= VoxelType::getThreshold();
@ -119,8 +119,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY - 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, 0.0f, 1.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, 0.0f, 1.0f), material));
m_meshCurrent->addTriangleCubic(v0,v2,v1);
m_meshCurrent->addTriangleCubic(v1,v2,v3);
m_meshCurrent->addTriangle(v0,v2,v1);
m_meshCurrent->addTriangle(v1,v2,v3);
}
if(currentVoxel < plusZVoxel)
{
@ -131,8 +131,8 @@ namespace PolyVox
uint32_t v2 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY - 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, 0.0f, -1.0f), material));
uint32_t v3 = m_meshCurrent->addVertex(PositionMaterialNormal(Vector3DFloat(regX + 0.5f, regY + 0.5f, regZ + 0.5f), Vector3DFloat(0.0f, 0.0f, -1.0f), material));
m_meshCurrent->addTriangleCubic(v0,v1,v2);
m_meshCurrent->addTriangleCubic(v1,v3,v2);
m_meshCurrent->addTriangle(v0,v1,v2);
m_meshCurrent->addTriangle(v1,v3,v2);
}
}
}

View File

@ -402,25 +402,16 @@ namespace PolyVox
{
int16_t iZVolSpace = m_regSliceCurrent.getLowerCorner().getZ();
const uint16_t uZRegSpace = iZVolSpace - m_regSizeInVoxels.getLowerCorner().getZ();
//bool isZEdge = ((iZVolSpace == m_regSizeInVoxelsCropped.getLowerCorner().getZ()) || (iZVolSpace == m_regSizeInVoxelsCropped.getUpperCorner().getZ()));
bool isNegZEdge = (iZVolSpace == m_regSizeInVoxels.getLowerCorner().getZ());
bool isPosZEdge = (iZVolSpace == m_regSizeInVoxels.getUpperCorner().getZ());
//Iterate over each cell in the region
for(int16_t iYVolSpace = m_regSliceCurrent.getLowerCorner().getY(); iYVolSpace <= m_regSliceCurrent.getUpperCorner().getY(); iYVolSpace++)
{
const uint16_t uYRegSpace = iYVolSpace - m_regSizeInVoxels.getLowerCorner().getY();
//bool isYEdge = ((iYVolSpace == m_regSizeInVoxelsCropped.getLowerCorner().getY()) || (iYVolSpace == m_regSizeInVoxelsCropped.getUpperCorner().getY()));
bool isNegYEdge = (iYVolSpace == m_regSizeInVoxels.getLowerCorner().getY());
bool isPosYEdge = (iYVolSpace == m_regSizeInVoxels.getUpperCorner().getY());
for(int16_t iXVolSpace = m_regSliceCurrent.getLowerCorner().getX(); iXVolSpace <= m_regSliceCurrent.getUpperCorner().getX(); iXVolSpace++)
{
//Current position
const uint16_t uXRegSpace = iXVolSpace - m_regSizeInVoxels.getLowerCorner().getX();
//bool isXEdge = ((iXVolSpace == m_regSizeInVoxelsCropped.getLowerCorner().getX()) || (iXVolSpace == m_regSizeInVoxelsCropped.getUpperCorner().getX()));
bool isNegXEdge = (iXVolSpace == m_regSizeInVoxels.getLowerCorner().getX());
bool isPosXEdge = (iXVolSpace == m_regSizeInVoxels.getUpperCorner().getX());
//Determine the index into the edge table which tells us which vertices are inside of the surface
uint8_t iCubeIndex = pCurrentBitmask[uXRegSpace][uYRegSpace];
@ -458,13 +449,6 @@ namespace PolyVox
const uint8_t uMaterial = v000.getMaterial() | v100.getMaterial(); //Because one of these is 0, the or operation takes the max.
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, uMaterial);
//surfaceVertex.setOnGeometryEdge(isXEdge || isYEdge || isZEdge);
surfaceVertex.setOnGeometryEdgeNegX(isNegXEdge);
surfaceVertex.setOnGeometryEdgePosX(isPosXEdge);
surfaceVertex.setOnGeometryEdgeNegY(isNegYEdge);
surfaceVertex.setOnGeometryEdgePosY(isPosYEdge);
surfaceVertex.setOnGeometryEdgeNegZ(isNegZEdge);
surfaceVertex.setOnGeometryEdgePosZ(isPosZEdge);
uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex);
m_pCurrentVertexIndicesX[iXVolSpace - m_regSizeInVoxels.getLowerCorner().getX()][iYVolSpace - m_regSizeInVoxels.getLowerCorner().getY()] = uLastVertexIndex;
@ -488,13 +472,6 @@ namespace PolyVox
const uint8_t uMaterial = v000.getMaterial() | v010.getMaterial(); //Because one of these is 0, the or operation takes the max.
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, uMaterial);
//surfaceVertex.setOnGeometryEdge(isXEdge || isYEdge || isZEdge);
surfaceVertex.setOnGeometryEdgeNegX(isNegXEdge);
surfaceVertex.setOnGeometryEdgePosX(isPosXEdge);
surfaceVertex.setOnGeometryEdgeNegY(isNegYEdge);
surfaceVertex.setOnGeometryEdgePosY(isPosYEdge);
surfaceVertex.setOnGeometryEdgeNegZ(isNegZEdge);
surfaceVertex.setOnGeometryEdgePosZ(isPosZEdge);
uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex);
m_pCurrentVertexIndicesY[iXVolSpace - m_regSizeInVoxels.getLowerCorner().getX()][iYVolSpace - m_regSizeInVoxels.getLowerCorner().getY()] = uLastVertexIndex;
@ -518,13 +495,6 @@ namespace PolyVox
const uint8_t uMaterial = v000.getMaterial() | v001.getMaterial(); //Because one of these is 0, the or operation takes the max.
PositionMaterialNormal surfaceVertex(v3dPosition, v3dNormal, uMaterial);
//surfaceVertex.setOnGeometryEdge(isXEdge || isYEdge || isZEdge);
surfaceVertex.setOnGeometryEdgeNegX(isNegXEdge);
surfaceVertex.setOnGeometryEdgePosX(isPosXEdge);
surfaceVertex.setOnGeometryEdgeNegY(isNegYEdge);
surfaceVertex.setOnGeometryEdgePosY(isPosYEdge);
surfaceVertex.setOnGeometryEdgeNegZ(isNegZEdge);
surfaceVertex.setOnGeometryEdgePosZ(isPosZEdge);
uint32_t uLastVertexIndex = m_meshCurrent->addVertex(surfaceVertex);
m_pCurrentVertexIndicesZ[iXVolSpace - m_regSizeInVoxels.getLowerCorner().getX()][iYVolSpace - m_regSizeInVoxels.getLowerCorner().getY()] = uLastVertexIndex;

View File

@ -58,7 +58,6 @@ namespace PolyVox
const std::vector<VertexType>& getVertices(void) const;
void addTriangle(uint32_t index0, uint32_t index1, uint32_t index2);
void addTriangleCubic(uint32_t index0, uint32_t index1, uint32_t index2);
uint32_t addVertex(const VertexType& vertex);
void clear(void);
const bool isEmpty(void) const;
@ -85,11 +84,6 @@ namespace PolyVox
std::vector<VertexType> m_vecVertices;
std::vector<LodRecord> m_vecLodRecords;
//The set of materials which are in this mesh. Only those materials
//which cover a whole triangle are counted. Materials which only
//exist on a material boundary do not count.
std::set<uint8_t> m_mapUsedMaterials;
};
}

View File

@ -105,25 +105,6 @@ namespace PolyVox
template <typename VertexType>
void SurfaceMesh<VertexType>::addTriangle(uint32_t index0, uint32_t index1, uint32_t index2)
{
m_vecTriangleIndices.push_back(index0);
m_vecTriangleIndices.push_back(index1);
m_vecTriangleIndices.push_back(index2);
if((m_vecVertices[index0].material == m_vecVertices[index1].material) && (m_vecVertices[index0].material == m_vecVertices[index2].material))
{
m_mapUsedMaterials.insert(m_vecVertices[index0].material);
}
else
{
m_vecVertices[index0].setOnMaterialEdge(true);
m_vecVertices[index1].setOnMaterialEdge(true);
m_vecVertices[index2].setOnMaterialEdge(true);
}
}
template <typename VertexType>
void SurfaceMesh<VertexType>::addTriangleCubic(uint32_t index0, uint32_t index1, uint32_t index2)
{
m_vecTriangleIndices.push_back(index0);
m_vecTriangleIndices.push_back(index1);
@ -143,7 +124,6 @@ namespace PolyVox
m_vecVertices.clear();
m_vecTriangleIndices.clear();
m_vecLodRecords.clear();
m_mapUsedMaterials.clear();
}
template <typename VertexType>

View File

@ -32,18 +32,6 @@ freely, subject to the following restrictions:
namespace PolyVox
{
enum POLYVOXCORE_API VertexFlags
{
VF_ON_MATERIAL_EDGE,
VF_ON_GEOMETRY_EDGE_NEG_X,
VF_ON_GEOMETRY_EDGE_POS_X ,
VF_ON_GEOMETRY_EDGE_NEG_Y ,
VF_ON_GEOMETRY_EDGE_POS_Y ,
VF_ON_GEOMETRY_EDGE_NEG_Z ,
VF_ON_GEOMETRY_EDGE_POS_Z,
VF_NO_OF_FLAGS
};
class POLYVOXCORE_API PositionMaterial
{
public:
@ -56,6 +44,7 @@ namespace PolyVox
void setMaterial(float materialToSet);
void setPosition(const Vector3DFloat& positionToSet);
public:
//Nicely fits into four floats.
Vector3DFloat position;
float material;
};
@ -70,34 +59,17 @@ namespace PolyVox
float getMaterial(void) const;
const Vector3DFloat& getNormal(void) const;
const Vector3DFloat& getPosition(void) const;
//unsigned int getNoOfGeometryEdges(void) const;
bool isOnEdge(void) const;
bool isOnGeometryEdge(void) const;
bool isOnGeometryEdgeNegX(void) const;
bool isOnGeometryEdgePosX(void) const;
bool isOnGeometryEdgeNegY(void) const;
bool isOnGeometryEdgePosY(void) const;
bool isOnGeometryEdgeNegZ(void) const;
bool isOnGeometryEdgePosZ(void) const;
bool isOnMaterialEdge(void) const;
void setMaterial(float materialToSet);
void setNormal(const Vector3DFloat& normalToSet);
void setOnGeometryEdgeNegX(bool bOnRegionEdge);
void setOnGeometryEdgePosX(bool bOnRegionEdge);
void setOnGeometryEdgeNegY(bool bOnRegionEdge);
void setOnGeometryEdgePosY(bool bOnRegionEdge);
void setOnGeometryEdgeNegZ(bool bOnRegionEdge);
void setOnGeometryEdgePosZ(bool bOnRegionEdge);
void setOnMaterialEdge(bool bOnMaterialEdge);
void setPosition(const Vector3DFloat& positionToSet);
public:
//Nicely fits into seven floats, meaning we
//can squeeze in one more for material blending.
Vector3DFloat position;
Vector3DFloat normal;
float material; //FIXME: This shouldn't be float on CPU?
std::bitset<VF_NO_OF_FLAGS> m_bFlags;
};
}

View File

@ -59,63 +59,6 @@ namespace PolyVox
{
return position;
}
//Returns a value between 0-3, for how many geometry edges (X,Y,Z) this vertex is on.
/*unsigned int PositionMaterialNormal::getNoOfGeometryEdges(void) const
{
unsigned int uIsOnEdgeX = static_cast<unsigned int>(isOnGeometryEdgeX());
unsigned int uIsOnEdgeY = static_cast<unsigned int>(isOnGeometryEdgeY());
unsigned int uIsOnEdgeZ = static_cast<unsigned int>(isOnGeometryEdgeZ());
return uIsOnEdgeX + uIsOnEdgeY + uIsOnEdgeZ;
}*/
bool PositionMaterialNormal::isOnEdge(void) const
{
return (isOnMaterialEdge() || isOnGeometryEdge());
}
bool PositionMaterialNormal::isOnMaterialEdge(void) const
{
return m_bFlags[VF_ON_MATERIAL_EDGE];
}
bool PositionMaterialNormal::isOnGeometryEdge(void) const
{
return
m_bFlags [VF_ON_GEOMETRY_EDGE_NEG_X] || m_bFlags[VF_ON_GEOMETRY_EDGE_POS_X] ||
m_bFlags [VF_ON_GEOMETRY_EDGE_NEG_Y] || m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Y] ||
m_bFlags [VF_ON_GEOMETRY_EDGE_NEG_Z] || m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Z];
}
bool PositionMaterialNormal::isOnGeometryEdgeNegX(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_X];
}
bool PositionMaterialNormal::isOnGeometryEdgePosX(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_POS_X];
}
bool PositionMaterialNormal::isOnGeometryEdgeNegY(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_Y];
}
bool PositionMaterialNormal::isOnGeometryEdgePosY(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Y];
}
bool PositionMaterialNormal::isOnGeometryEdgeNegZ(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_Z];
}
bool PositionMaterialNormal::isOnGeometryEdgePosZ(void) const
{
return m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Z];
}
void PositionMaterialNormal::setMaterial(float materialToSet)
{
@ -127,41 +70,6 @@ namespace PolyVox
normal = normalToSet;
}
void PositionMaterialNormal::setOnMaterialEdge(bool bOnMaterialEdge)
{
m_bFlags[VF_ON_MATERIAL_EDGE] = bOnMaterialEdge;
}
void PositionMaterialNormal::setOnGeometryEdgeNegX(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_X] = bOnRegionEdge;
}
void PositionMaterialNormal::setOnGeometryEdgePosX(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_POS_X] = bOnRegionEdge;
}
void PositionMaterialNormal::setOnGeometryEdgeNegY(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_Y] = bOnRegionEdge;
}
void PositionMaterialNormal::setOnGeometryEdgePosY(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Y] = bOnRegionEdge;
}
void PositionMaterialNormal::setOnGeometryEdgeNegZ(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_NEG_Z] = bOnRegionEdge;
}
void PositionMaterialNormal::setOnGeometryEdgePosZ(bool bOnRegionEdge)
{
m_bFlags[VF_ON_GEOMETRY_EDGE_POS_Z] = bOnRegionEdge;
}
void PositionMaterialNormal::setPosition(const Vector3DFloat& positionToSet)
{
position = positionToSet;