From a57e1d749a0371627cb3970a93670d73e823cf82 Mon Sep 17 00:00:00 2001 From: David Williams Date: Sat, 8 Jan 2011 16:14:52 +0000 Subject: [PATCH] Got carried away with the cleaning up and removed some stuff that is still needed by Thermite. Would be nice to remove it in the future though. --- .../include/CubicSurfaceExtractor.inl | 24 +++++++++---------- .../CubicSurfaceExtractorWithNormals.inl | 24 +++++++++---------- library/PolyVoxCore/include/SurfaceMesh.h | 6 +++++ library/PolyVoxCore/include/SurfaceMesh.inl | 14 +++++++++++ 4 files changed, 44 insertions(+), 24 deletions(-) diff --git a/library/PolyVoxCore/include/CubicSurfaceExtractor.inl b/library/PolyVoxCore/include/CubicSurfaceExtractor.inl index 61122d9e..6bf40c23 100644 --- a/library/PolyVoxCore/include/CubicSurfaceExtractor.inl +++ b/library/PolyVoxCore/include/CubicSurfaceExtractor.inl @@ -90,13 +90,13 @@ namespace PolyVox if(currentVoxelIsSolid > negXVoxelIsSolid) { - m_meshCurrent->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(v1,v3,v2); } else { - m_meshCurrent->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(v1,v2,v3); } } @@ -114,13 +114,13 @@ namespace PolyVox if(currentVoxelIsSolid > negYVoxelIsSolid) { - m_meshCurrent->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(v1,v2,v3); } else { - m_meshCurrent->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(v1,v3,v2); } } @@ -138,13 +138,13 @@ namespace PolyVox if(currentVoxelIsSolid > negZVoxelIsSolid) { - m_meshCurrent->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(v1,v3,v2); } else { - m_meshCurrent->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(v1,v2,v3); } } } diff --git a/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl b/library/PolyVoxCore/include/CubicSurfaceExtractorWithNormals.inl index 903db36f..9dc7ba1a 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->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(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->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(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->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(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->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(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->addTriangle(v0,v2,v1); - m_meshCurrent->addTriangle(v1,v2,v3); + m_meshCurrent->addTriangleCubic(v0,v2,v1); + m_meshCurrent->addTriangleCubic(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->addTriangle(v0,v1,v2); - m_meshCurrent->addTriangle(v1,v3,v2); + m_meshCurrent->addTriangleCubic(v0,v1,v2); + m_meshCurrent->addTriangleCubic(v1,v3,v2); } } } diff --git a/library/PolyVoxCore/include/SurfaceMesh.h b/library/PolyVoxCore/include/SurfaceMesh.h index 2733ab6a..578899b0 100644 --- a/library/PolyVoxCore/include/SurfaceMesh.h +++ b/library/PolyVoxCore/include/SurfaceMesh.h @@ -58,6 +58,7 @@ 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; @@ -84,6 +85,11 @@ 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 ae06c04b..e2433040 100644 --- a/library/PolyVoxCore/include/SurfaceMesh.inl +++ b/library/PolyVoxCore/include/SurfaceMesh.inl @@ -105,6 +105,19 @@ 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); + } + } + + template + void SurfaceMesh::addTriangleCubic(uint32_t index0, uint32_t index1, uint32_t index2) { m_vecTriangleIndices.push_back(index0); m_vecTriangleIndices.push_back(index1); @@ -124,6 +137,7 @@ namespace PolyVox m_vecVertices.clear(); m_vecTriangleIndices.clear(); m_vecLodRecords.clear(); + m_mapUsedMaterials.clear(); } template