From c52dbe123d6358a5d12425ddb690bba357c88443 Mon Sep 17 00:00:00 2001 From: David Williams Date: Fri, 31 Aug 2007 19:40:51 +0000 Subject: [PATCH] Refactoring work... working on meshes --- include/SurfacePatch.h | 2 + source/PolyVoxSceneManager.cpp | 6 +- source/SurfacePatch.cpp | 143 +++++++++++++++++++++++++-------- 3 files changed, 114 insertions(+), 37 deletions(-) diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index e3963625..778c8e62 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -31,6 +31,8 @@ namespace Ogre uint m_uTrianglesAdded; uint m_uVerticesAdded; + + long int* vertexIndices; }; } diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 9f0f1c22..c5168493 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -563,10 +563,10 @@ namespace Ogre std::map result; //Used later to check if vertex has already been added - long int vertexIndices[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][10]; + //long int vertexIndices[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][10]; //uchar materialAtPosition[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1]; //FIXME - do we really need this? Can't we just get it from the volume... //bool isVertexSharedBetweenMaterials[OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1][OGRE_REGION_SIDE_LENGTH*2+1]; - memset(vertexIndices,0xFF,sizeof(vertexIndices)); //0xFF is -1 as two's complement - this may not be portable... + //memset(vertexIndices,0xFF,sizeof(vertexIndices)); //0xFF is -1 as two's complement - this may not be portable... //memset(materialAtPosition,0x00,sizeof(materialAtPosition)); //memset(isVertexSharedBetweenMaterials,0x00,sizeof(isVertexSharedBetweenMaterials)); @@ -1005,6 +1005,8 @@ namespace Ogre iterPatch->second.endDefinition(); } + //LogManager::getSingleton().logMessage("Finished Generating Mesh Data"); + return result; } diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index 7ae6fdfa..e7dc9917 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -1,4 +1,5 @@ #include "SurfacePatch.h" +#include "Constants.h" #include "OgreLogManager.h" #include "OgreStringConverter.h" @@ -14,14 +15,24 @@ namespace Ogre m_uTrianglesAdded = 0; m_uVerticesAdded = 0; + + vertexIndices = 0; + + beginDefinition(); //FIXME - we shouldn't really be calling this from the constructor. } SurfacePatch::~SurfacePatch() - { + { } void SurfacePatch::beginDefinition(void) { + vertexIndices = new long int [(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)]; + memset(vertexIndices,0xFF,sizeof(long int)*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)); //0xFF is -1 as two's complement - this may not be portable... + /*for(unsigned long ct = 0;ct < (OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1); ct ++) + { + vertexIndices[ct] = -1; + }*/ } void SurfacePatch::endDefinition(void) @@ -30,52 +41,106 @@ namespace Ogre //LogManager::getSingleton().logMessage("No of triangles present = " + StringConverter::toString(m_listTriangles.size())); //LogManager::getSingleton().logMessage("No of vertices added = " + StringConverter::toString(m_uVerticesAdded)); //LogManager::getSingleton().logMessage("No of vertices present = " + StringConverter::toString(m_setVertices.size())); + + delete vertexIndices; + vertexIndices = 0; } void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2) { + /*m_vecVertexData.push_back(v0); + m_vecIndexData.push_back(m_vecVertexData.size()-1); + m_vecVertexData.push_back(v1); + m_vecIndexData.push_back(m_vecVertexData.size()-1); + m_vecVertexData.push_back(v2); + m_vecIndexData.push_back(m_vecVertexData.size()-1);*/ + m_uTrianglesAdded++; + m_uVerticesAdded += 3; + SurfaceTriangle triangle; - m_setVertices.insert(v0); - m_uVerticesAdded++; + long int index; + unsigned int vertexScaledX; + unsigned int vertexScaledY; + unsigned int vertexScaledZ; + + vertexScaledX = static_cast((v0.position.x * 2.0) + 0.5); + vertexScaledY = static_cast((v0.position.y * 2.0) + 0.5); + vertexScaledZ = static_cast((v0.position.z * 2.0) + 0.5); + vertexScaledX %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1; + //If a vertex has not yet been added, it's index is -1 + index = vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)]; + if((index == -1)) + { + //Add the vertex + m_vecVertexData.push_back(v0); + vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)] = m_vecVertexData.size()-1; + m_vecIndexData.push_back(m_vecVertexData.size()-1); + } + else + { + //Just reuse the existing vertex + m_vecIndexData.push_back(index); + } + + vertexScaledX = static_cast((v1.position.x * 2.0) + 0.5); + vertexScaledY = static_cast((v1.position.y * 2.0) + 0.5); + vertexScaledZ = static_cast((v1.position.z * 2.0) + 0.5); + vertexScaledX %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1; + //If a vertex has not yet been added, it's index is -1 + index = vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)]; + if((index == -1)) + { + //Add the vertex + m_vecVertexData.push_back(v1); + vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)] = m_vecVertexData.size()-1; + m_vecIndexData.push_back(m_vecVertexData.size()-1); + } + else + { + //Just reuse the existing vertex + m_vecIndexData.push_back(index); + } + + vertexScaledX = static_cast((v2.position.x * 2.0) + 0.5); + vertexScaledY = static_cast((v2.position.y * 2.0) + 0.5); + vertexScaledZ = static_cast((v2.position.z * 2.0) + 0.5); + vertexScaledX %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledY %= OGRE_REGION_SIDE_LENGTH*2+1; + vertexScaledZ %= OGRE_REGION_SIDE_LENGTH*2+1; + //If a vertex has not yet been added, it's index is -1 + index = vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)]; + if((index == -1)) + { + //Add the vertex + m_vecVertexData.push_back(v2); + vertexIndices[(vertexScaledX*(OGRE_REGION_SIDE_LENGTH*2+1)*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledY*(OGRE_REGION_SIDE_LENGTH*2+1)) + (vertexScaledZ)] = m_vecVertexData.size()-1; + m_vecIndexData.push_back(m_vecVertexData.size()-1); + } + else + { + //Just reuse the existing vertex + m_vecIndexData.push_back(index); + } + + + + + /*m_setVertices.insert(v0); m_setVertices.insert(v1); - m_uVerticesAdded++; m_setVertices.insert(v2); - m_uVerticesAdded++; triangle.v0 = std::find(m_setVertices.begin(), m_setVertices.end(), v0); triangle.v1 = std::find(m_setVertices.begin(), m_setVertices.end(), v1); - triangle.v2 = std::find(m_setVertices.begin(), m_setVertices.end(), v2); - - /*triangle.v0 = std::find(m_listVertices.begin(), m_listVertices.end(), v0); - if(triangle.v0 == m_listVertices.end()) //We have to add it - { - m_listVertices.push_back(v0); - triangle.v0 = m_listVertices.end(); - triangle.v0--; - } + triangle.v2 = std::find(m_setVertices.begin(), m_setVertices.end(), v2);*/ - - triangle.v1 = std::find(m_listVertices.begin(), m_listVertices.end(), v1); - if(triangle.v1 == m_listVertices.end()) //We have to add it - { - m_listVertices.push_back(v1); - triangle.v1 = m_listVertices.end(); - triangle.v1--; - } - - - triangle.v2 = std::find(m_listVertices.begin(), m_listVertices.end(), v2); - if(triangle.v2 == m_listVertices.end()) //We have to add it - { - m_listVertices.push_back(v2); - triangle.v2 = m_listVertices.end(); - triangle.v2--; - }*/ - - m_listTriangles.push_back(triangle); + //m_listTriangles.push_back(triangle); /*triangle.v0->listTrianglesUsingThisVertex.push_back(m_listTriangles.end()); triangle.v1->listTrianglesUsingThisVertex.push_back(m_listTriangles.end()); @@ -84,8 +149,14 @@ namespace Ogre void SurfacePatch::getVertexAndIndexData(std::vector& vertexData, std::vector& indexData) { - vertexData.clear(); - indexData.clear(); + /*vertexData.clear(); + indexData.clear();*/ + + vertexData = m_vecVertexData; + indexData = m_vecIndexData; + + return; +#ifdef BLAH vertexData.resize(m_setVertices.size()); std::copy(m_setVertices.begin(), m_setVertices.end(), vertexData.begin()); @@ -160,5 +231,7 @@ namespace Ogre /*vertexData = m_vecVertexData; indexData = m_vecIndexData;*/ + +#endif } }