From e276ada7ce9c676961352efcd7260b5f01df5804 Mon Sep 17 00:00:00 2001 From: David Williams Date: Sat, 6 Oct 2007 17:28:55 +0000 Subject: [PATCH] Work on mesh generation code. --- include/SurfacePatch.h | 2 + source/SurfacePatch.cpp | 25 +++++++++++++ source/SurfacePatchRenderable.cpp | 62 +++++++------------------------ 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index 7180db17..df16f419 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -37,6 +37,8 @@ namespace Ogre bool isPolygonConvex(std::list listVertices, Vector3 normal); void addTriangle(const SurfaceVertex& v0,const SurfaceVertex& v1,const SurfaceVertex& v2); + void fillVertexAndIndexData(std::vector& vecVertices, std::vector& vecIndices); + diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index fe8ce09a..b7d9885a 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -396,4 +396,29 @@ namespace Ogre return true; } + + void SurfacePatch::fillVertexAndIndexData(std::vector& vecVertices, std::vector& vecIndices) + { + vecVertices.resize(m_listVertices.size()); + std::copy(m_listVertices.begin(), m_listVertices.end(), vecVertices.begin()); + + //vecIndices.resize(m_listTriangles.size() * 3); + for(SurfaceTriangleConstIterator iterTriangles = m_listTriangles.begin(); iterTriangles != m_listTriangles.end(); ++iterTriangles) + { + std::vector::iterator iterVertex; + SurfaceEdgeIterator edgeIter; + + edgeIter = iterTriangles->getEdge(); + iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget())); + vecIndices.push_back(iterVertex - vecVertices.begin()); + + edgeIter = edgeIter->getNextHalfEdge(); + iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget())); + vecIndices.push_back(iterVertex - vecVertices.begin()); + + edgeIter = edgeIter->getNextHalfEdge(); + iterVertex = lower_bound(vecVertices.begin(), vecVertices.end(), *(edgeIter->getTarget())); + vecIndices.push_back(iterVertex - vecVertices.begin()); + } + } } diff --git a/source/SurfacePatchRenderable.cpp b/source/SurfacePatchRenderable.cpp index f77d34c3..69034752 100644 --- a/source/SurfacePatchRenderable.cpp +++ b/source/SurfacePatchRenderable.cpp @@ -47,9 +47,13 @@ namespace Ogre void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender) { + std::vector vecVertices; + std::vector vecIndices; + patchToRender.fillVertexAndIndexData(vecVertices,vecIndices); + //Initialization stuff - mRenderOp.vertexData->vertexCount = patchToRender.getNoOfVertices(); - mRenderOp.indexData->indexCount = patchToRender.getNoOfTriangles() * 3; + mRenderOp.vertexData->vertexCount = vecVertices.size(); + mRenderOp.indexData->indexCount = vecIndices.size(); VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding; @@ -71,21 +75,13 @@ namespace Ogre mRenderOp.indexData->indexBuffer = ibuf; - std::vector vertexData; - vertexData.resize(patchToRender.getNoOfVertices()); - std::copy(patchToRender.getVerticesBegin(), patchToRender.getVerticesEnd(), vertexData.begin()); - // Drawing stuff Vector3 vaabMin(std::numeric_limits::max(),std::numeric_limits::max(),std::numeric_limits::max()); Vector3 vaabMax(0.0,0.0,0.0); - //Vector3 vaabMin2 = vertexData[0].getPosition().toOgreVector3(); - //Vector3 vaabMax2 = vertexData[vertexData.size()-1].getPosition().toOgreVector3(); - Real *prPos = static_cast(vbuf->lock(HardwareBuffer::HBL_DISCARD)); - //for(int i = 0; i < size; i++) - for(SurfaceVertexConstIterator vertexIter = patchToRender.getVerticesBegin(); vertexIter != patchToRender.getVerticesEnd(); ++vertexIter) + for(std::vector::iterator vertexIter = vecVertices.begin(); vertexIter != vecVertices.end(); ++vertexIter) { *prPos++ = vertexIter->getPosition().x/2.0f; *prPos++ = vertexIter->getPosition().y/2.0f; @@ -114,51 +110,19 @@ namespace Ogre vbuf->unlock(); - //LogManager::getSingleton().logMessage("vaabMin = " + StringConverter::toString(vaabMin ) + ", vaabMax = " + StringConverter::toString(vaabMax )); - //LogManager::getSingleton().logMessage("vaabMin2 = " + StringConverter::toString(vaabMin2) + ", vaabMax2 = " + StringConverter::toString(vaabMax2)); - vaabMin /= 2.0f; vaabMax /= 2.0f; - mBox.setExtents(vaabMin, vaabMax); - - /*std::vector verticesToSet; - std::vector indicesToSet; - patchToRender.getVertexAndIndexData(verticesToSet, indicesToSet);*/ - + unsigned short* pIdx = static_cast(ibuf->lock(HardwareBuffer::HBL_DISCARD)); - /*for(int i = 0; i < indicesToSet.size(); i++) + //for(int i = 0; i < indexData.size(); i++) + for(std::vector::iterator indexIter = vecIndices.begin(); indexIter != vecIndices.end(); ++indexIter) { - *pIdx = indicesToSet[i]; - LogManager::getSingleton().logMessage("Correct pIdx = " + StringConverter::toString(*pIdx)); + //*pIdx = indexData[i]; + *pIdx = *indexIter; pIdx++; - }*/ + } - for(SurfaceTriangleConstIterator iterTriangles = patchToRender.getTrianglesBegin(); iterTriangles != patchToRender.getTrianglesEnd(); ++iterTriangles) - { - std::vector::iterator iterVertex; - SurfaceEdgeIterator edgeIter; - - edgeIter = iterTriangles->getEdge(); - SurfaceVertexConstIterator vertexToFindIter = edgeIter->getTarget(); - SurfaceVertex vertexToFind = *vertexToFindIter; - iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - *pIdx = (iterVertex - vertexData.begin()); - //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); - pIdx++; - - edgeIter = edgeIter->getNextHalfEdge(); - iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - *pIdx = (iterVertex - vertexData.begin()); - //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); - pIdx++; - - edgeIter = edgeIter->getNextHalfEdge(); - iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - *pIdx = (iterVertex - vertexData.begin()); - //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); - pIdx++; - } ibuf->unlock(); }