diff --git a/library/PolyVoxCore/include/CubicSurfaceExtractor.inl b/library/PolyVoxCore/include/CubicSurfaceExtractor.inl index 6bf40c23..61122d9e 100644 --- a/library/PolyVoxCore/include/CubicSurfaceExtractor.inl +++ b/library/PolyVoxCore/include/CubicSurfaceExtractor.inl @@ -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); } } } diff --git a/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl b/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl index 9dc7ba1a..903db36f 100644 --- a/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl +++ b/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl @@ -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); } } } diff --git a/library/PolyVoxCore/include/SurfaceExtractor.inl b/library/PolyVoxCore/include/SurfaceExtractor.inl index debb7be1..0e7c157a 100644 --- a/library/PolyVoxCore/include/SurfaceExtractor.inl +++ b/library/PolyVoxCore/include/SurfaceExtractor.inl @@ -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; diff --git a/library/PolyVoxCore/include/SurfaceMesh.h b/library/PolyVoxCore/include/SurfaceMesh.h index 578899b0..2733ab6a 100644 --- a/library/PolyVoxCore/include/SurfaceMesh.h +++ b/library/PolyVoxCore/include/SurfaceMesh.h @@ -58,7 +58,6 @@ namespace PolyVox const std::vector& 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 m_vecVertices; std::vector 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 m_mapUsedMaterials; }; } diff --git a/library/PolyVoxCore/include/SurfaceMesh.inl b/library/PolyVoxCore/include/SurfaceMesh.inl index eee984af..ae06c04b 100644 --- a/library/PolyVoxCore/include/SurfaceMesh.inl +++ b/library/PolyVoxCore/include/SurfaceMesh.inl @@ -105,25 +105,6 @@ namespace PolyVox template void SurfaceMesh::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 - void SurfaceMesh::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 diff --git a/library/PolyVoxCore/include/VertexTypes.h b/library/PolyVoxCore/include/VertexTypes.h index 3ad7dd56..48f7cda0 100644 --- a/library/PolyVoxCore/include/VertexTypes.h +++ b/library/PolyVoxCore/include/VertexTypes.h @@ -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 m_bFlags; }; } diff --git a/library/PolyVoxCore/source/VertexTypes.cpp b/library/PolyVoxCore/source/VertexTypes.cpp index 46a89283..88473e1d 100644 --- a/library/PolyVoxCore/source/VertexTypes.cpp +++ b/library/PolyVoxCore/source/VertexTypes.cpp @@ -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(isOnGeometryEdgeX()); - unsigned int uIsOnEdgeY = static_cast(isOnGeometryEdgeY()); - unsigned int uIsOnEdgeZ = static_cast(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;