From eaf17afc10a3e694696b7c813544760ec08edddc Mon Sep 17 00:00:00 2001 From: David Williams Date: Mon, 27 Aug 2007 22:45:51 +0000 Subject: [PATCH] Refactoring work... working on meshes --- CMakeLists.txt | 2 + include/SurfacePatch.h | 7 +-- include/SurfaceTriangle.h | 17 +++---- include/SurfaceVertex.h | 51 ++++--------------- source/PolyVoxSceneManager.cpp | 5 ++ source/SurfacePatch.cpp | 90 +++++++++++++++++++++++++++------- source/SurfaceTriangle.cpp | 15 ++++++ source/SurfaceVertex.cpp | 51 +++++++++++++++++++ 8 files changed, 164 insertions(+), 74 deletions(-) create mode 100644 source/SurfaceTriangle.cpp create mode 100644 source/SurfaceVertex.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a3ad9dc6..aab5ff42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,8 @@ SET(SRC_FILES source/PolyVoxSceneManager.cpp source/SurfacePatch.cpp source/SurfacePatchRenderable.cpp + source/SurfaceTriangle.cpp + source/SurfaceVertex.cpp source/Volume.cpp source/VolumeIterator.cpp source/VolumeManager.cpp diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index 5256e06f..ad3e2c7a 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -15,10 +15,9 @@ namespace Ogre SurfacePatch(); ~SurfacePatch(); - void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); + void endDefinition(void); - /*const std::vector getVertexArray(); - const std::vector getTriangleArray();*/ + void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); void getVertexAndIndexData(std::vector& vertexData, std::vector& indexData); @@ -28,6 +27,8 @@ namespace Ogre std::vector m_vecVertexData; std::vector m_vecIndexData; + + uint m_uTrianglesAdded; }; } diff --git a/include/SurfaceTriangle.h b/include/SurfaceTriangle.h index 5c8e90db..e471cb92 100644 --- a/include/SurfaceTriangle.h +++ b/include/SurfaceTriangle.h @@ -24,10 +24,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "OgreVector3.h" -#include "SurfaceVertex.h" - namespace Ogre { + class SurfaceVertex; + class SurfaceTriangle { public: @@ -40,16 +40,11 @@ namespace Ogre std::list::iterator v1; std::list::iterator v2; - SurfaceTriangle() - { - } + SurfaceTriangle(); - SurfaceTriangle(std::list::iterator v0ToSet, std::list::iterator v1ToSet, std::list::iterator v2ToSet) - :v0(v0ToSet) - ,v1(v1ToSet) - ,v2(v2ToSet) - { - } + SurfaceTriangle(std::list::iterator v0ToSet, std::list::iterator v1ToSet, std::list::iterator v2ToSet); + + //bool operator < (const SurfaceTriangle& rhs) const; }; } diff --git a/include/SurfaceVertex.h b/include/SurfaceVertex.h index f6f61f12..1beeb3d9 100644 --- a/include/SurfaceVertex.h +++ b/include/SurfaceVertex.h @@ -26,6 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. namespace Ogre { + class SurfaceTriangle; + class SurfaceVertex { public: @@ -33,52 +35,17 @@ namespace Ogre Vector3 normal; float alpha; - SurfaceVertex() - { - } + std::list::iterator> listTrianglesUsingThisVertex; - SurfaceVertex(Vector3 positionToSet) - :position(positionToSet) - { - } + SurfaceVertex(); - SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet) - :position(positionToSet) - ,normal(normalToSet) - { - } + SurfaceVertex(Vector3 positionToSet); - bool matchesPosition(const Vector3& rhs) const - { - //return ((x == rhs.x) && (y == rhs.y) && (z == rhs.z)); - return ((position - rhs).length() < 0.01); - } + SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet); - bool operator < (const SurfaceVertex& rhs) const - { - if(position.z < rhs.position.z) - { - return true; - } - else - { - if(position.y < rhs.position.y) - { - return true; - } - else - { - if(position.x < rhs.position.x) - { - return true; - } - else - { - return false; - } - } - } - } + bool operator==(const SurfaceVertex& rhs) const; + + //bool operator < (const SurfaceVertex& rhs) const; }; } diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 6297b964..9f0f1c22 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -1000,6 +1000,11 @@ namespace Ogre result.insert(std::make_pair(materialCt, surfacePatch)); }*/ + for(std::map::iterator iterPatch = result.begin(); iterPatch != result.end(); ++iterPatch) + { + iterPatch->second.endDefinition(); + } + return result; } diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index d5cb57d3..b9558cfe 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -1,41 +1,68 @@ #include "SurfacePatch.h" +#include "OgreLogManager.h" +#include "OgreStringConverter.h" + #include namespace Ogre { SurfacePatch::SurfacePatch() { + m_listVertices.clear(); + m_listTriangles.clear(); + + m_uTrianglesAdded = 0; } SurfacePatch::~SurfacePatch() { } + void SurfacePatch::endDefinition(void) + { + //LogManager::getSingleton().logMessage("No of triangles added = " + StringConverter::toString(m_uTrianglesAdded)); + //LogManager::getSingleton().logMessage("No of triangles present = " + StringConverter::toString(m_listTriangles.size())); + //LogManager::getSingleton().logMessage("No of vertices present = " + StringConverter::toString(m_listVertices.size())); + } + void SurfacePatch::addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2) { + m_uTrianglesAdded++; + SurfaceTriangle triangle; + + 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--; + } - m_listVertices.push_back(v0); - triangle.v0 = m_listVertices.end(); - triangle.v0--; + + 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--; + } - m_listVertices.push_back(v1); - triangle.v1 = m_listVertices.end(); - triangle.v1--; - - m_listVertices.push_back(v2); - triangle.v2 = m_listVertices.end(); - triangle.v2--; + + 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_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);*/ + triangle.v0->listTrianglesUsingThisVertex.push_back(m_listTriangles.end()); + triangle.v1->listTrianglesUsingThisVertex.push_back(m_listTriangles.end()); + triangle.v2->listTrianglesUsingThisVertex.push_back(m_listTriangles.end()); } /*const std::vector SurfacePatch::getVertexArray() @@ -59,14 +86,41 @@ namespace Ogre vertexData.clear(); indexData.clear(); + vertexData.resize(m_listVertices.size()); + std::copy(m_listVertices.begin(), m_listVertices.end(), vertexData.begin()); + for(std::list::iterator iterTriangles = m_listTriangles.begin(); iterTriangles != m_listTriangles.end(); ++iterTriangles) { - vertexData.push_back(*(iterTriangles->v0)); + /*vertexData.push_back(*(iterTriangles->v0)); indexData.push_back(vertexData.size()-1); vertexData.push_back(*(iterTriangles->v1)); indexData.push_back(vertexData.size()-1); vertexData.push_back(*(iterTriangles->v2)); - indexData.push_back(vertexData.size()-1); + indexData.push_back(vertexData.size()-1);*/ + + for(uint ct = 0; ct < vertexData.size(); ++ct) + { + if(vertexData[ct] == (*(iterTriangles->v0))) + { + indexData.push_back(ct); + } + } + + for(uint ct = 0; ct < vertexData.size(); ++ct) + { + if(vertexData[ct] == (*(iterTriangles->v1))) + { + indexData.push_back(ct); + } + } + + for(uint ct = 0; ct < vertexData.size(); ++ct) + { + if(vertexData[ct] == (*(iterTriangles->v2))) + { + indexData.push_back(ct); + } + } } /*vertexData = m_vecVertexData; diff --git a/source/SurfaceTriangle.cpp b/source/SurfaceTriangle.cpp new file mode 100644 index 00000000..5cd04f00 --- /dev/null +++ b/source/SurfaceTriangle.cpp @@ -0,0 +1,15 @@ +#include "SurfaceTriangle.h" + +namespace Ogre +{ + SurfaceTriangle::SurfaceTriangle() + { + } + + SurfaceTriangle::SurfaceTriangle(std::list::iterator v0ToSet, std::list::iterator v1ToSet, std::list::iterator v2ToSet) + :v0(v0ToSet) + ,v1(v1ToSet) + ,v2(v2ToSet) + { + } +} \ No newline at end of file diff --git a/source/SurfaceVertex.cpp b/source/SurfaceVertex.cpp new file mode 100644 index 00000000..3709d5eb --- /dev/null +++ b/source/SurfaceVertex.cpp @@ -0,0 +1,51 @@ +#include "SurfaceVertex.h" + +namespace Ogre +{ + SurfaceVertex::SurfaceVertex() + { + } + + SurfaceVertex::SurfaceVertex(Vector3 positionToSet) + :position(positionToSet) + { + } + + SurfaceVertex::SurfaceVertex(Vector3 positionToSet, Vector3 normalToSet) + :position(positionToSet) + ,normal(normalToSet) + { + } + + bool SurfaceVertex::operator==(const SurfaceVertex& rhs) const + { + //We dont't check the normal here as it may not have been set. But if two vertices have the same position they should have the same normal too. + return ((position.positionEquals(rhs.position)) && (abs(alpha - rhs.alpha) < 0.01)); + } + + /*bool SurfaceVertex::operator < (const SurfaceVertex& rhs) const + { + if(position.z < rhs.position.z) + { + return true; + } + else + { + if(position.y < rhs.position.y) + { + return true; + } + else + { + if(position.x < rhs.position.x) + { + return true; + } + else + { + return false; + } + } + } + }*/ +} \ No newline at end of file