diff --git a/include/SurfacePatch.h b/include/SurfacePatch.h index 51d5b59b..7180db17 100644 --- a/include/SurfacePatch.h +++ b/include/SurfacePatch.h @@ -26,15 +26,9 @@ namespace Ogre SurfaceVertexIterator getVerticesEnd(void); //Users of the class might want these for debugging or info purposes. - uint getNoOfEdges(void); - uint getNoOfTriangles(void); - uint getNoOfVertices(void); - - - - - void getVertexAndIndexData(std::vector& vertexData, std::vector& indexData); - + uint getNoOfEdges(void) const; + uint getNoOfTriangles(void) const; + uint getNoOfVertices(void) const; bool canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list listConnectedIter, bool isEdge); std::list findConnectedVertices(SurfaceVertexIterator vertexIter, bool& isEdge); diff --git a/include/SurfacePatchRenderable.h b/include/SurfacePatchRenderable.h index a4d4e42e..ccb0d870 100644 --- a/include/SurfacePatchRenderable.h +++ b/include/SurfacePatchRenderable.h @@ -4,6 +4,7 @@ #include "Ogre.h" #include +#include "SurfacePatch.h" #include "SurfaceTriangle.h" #include "SurfaceVertex.h" @@ -12,10 +13,11 @@ namespace Ogre class SurfacePatchRenderable : public SimpleRenderable { public: - SurfacePatchRenderable(const String& material = "BaseWhiteNoLighting"); + SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material = "BaseWhiteNoLighting"); ~SurfacePatchRenderable(void); - void setGeometry(std::vector verticesToSet, std::vector indicesToSet); + void updateWithNewSurfacePatch(SurfacePatch& patchToRender); + void setGeometry(SurfacePatch& patchToRender); Real getSquaredViewDepth(const Camera *cam) const; Real getBoundingRadius(void) const; diff --git a/include/SurfaceTypes.h b/include/SurfaceTypes.h index 66c71c44..c33b6f96 100644 --- a/include/SurfaceTypes.h +++ b/include/SurfaceTypes.h @@ -5,10 +5,13 @@ namespace Ogre { class SurfaceVertex; typedef std::set::iterator SurfaceVertexIterator; + typedef std::set::const_iterator SurfaceVertexConstIterator; class SurfaceTriangle; typedef std::set::iterator SurfaceTriangleIterator; + typedef std::set::const_iterator SurfaceTriangleConstIterator; class SurfaceEdge; typedef std::set::iterator SurfaceEdgeIterator; + typedef std::set::const_iterator SurfaceEdgeConstIterator; } #endif \ No newline at end of file diff --git a/source/PolyVoxSceneManager.cpp b/source/PolyVoxSceneManager.cpp index 5e2dc549..141726c8 100644 --- a/source/PolyVoxSceneManager.cpp +++ b/source/PolyVoxSceneManager.cpp @@ -279,18 +279,18 @@ namespace Ogre //for(uint meshCt = 1; meshCt < 256; ++meshCt) for(std::map::iterator iterSurfacePatch = mapSurfacePatch.begin(); iterSurfacePatch != mapSurfacePatch.end(); ++iterSurfacePatch) { - std::vector vertexData; + /*std::vector vertexData; std::vector indexData; iterSurfacePatch->second.getVertexAndIndexData(vertexData, indexData); - triangleCounter += iterSurfacePatch->second.getNoOfTriangles(); + triangleCounter += iterSurfacePatch->second.getNoOfTriangles();*/ std::map::iterator iterSurface = m_mapSurfaces[regionX][regionY][regionZ].find(iterSurfacePatch->first); if(iterSurface == m_mapSurfaces[regionX][regionY][regionZ].end()) { //We have to create the surface - SurfacePatchRenderable* surface = new SurfacePatchRenderable(materialMap->getMaterialAtIndex(iterSurfacePatch->first)); + SurfacePatchRenderable* surface = new SurfacePatchRenderable(iterSurfacePatch->second,materialMap->getMaterialAtIndex(iterSurfacePatch->first)); //surface->setGeometry(vertexData[meshCt],indexData[meshCt]); - surface->setGeometry(vertexData, indexData); + //surface->setGeometry(vertexData, indexData); m_mapSurfaces[regionX][regionY][regionZ].insert(std::make_pair(iterSurfacePatch->first,surface)); @@ -300,7 +300,8 @@ namespace Ogre { //We just update the existing surface //iterSurface->second->setGeometry(vertexData[meshCt],indexData[meshCt]); - iterSurface->second->setGeometry(vertexData, indexData); + //iterSurface->second->setGeometry(vertexData, indexData); + iterSurface->second->updateWithNewSurfacePatch(iterSurfacePatch->second); sceneNode->attachObject(iterSurface->second); } } diff --git a/source/SurfacePatch.cpp b/source/SurfacePatch.cpp index 63afd481..84c0b07d 100644 --- a/source/SurfacePatch.cpp +++ b/source/SurfacePatch.cpp @@ -53,17 +53,17 @@ namespace Ogre return m_listVertices.end(); } - uint SurfacePatch::getNoOfEdges(void) + uint SurfacePatch::getNoOfEdges(void) const { return m_listEdges.size(); } - uint SurfacePatch::getNoOfTriangles(void) + uint SurfacePatch::getNoOfTriangles(void) const { return m_listTriangles.size(); } - uint SurfacePatch::getNoOfVertices(void) + uint SurfacePatch::getNoOfVertices(void) const { return m_listVertices.size(); } @@ -132,48 +132,6 @@ namespace Ogre return edgeIter; } - void SurfacePatch::getVertexAndIndexData(std::vector& vertexData, std::vector& indexData) - { - vertexData.clear(); - indexData.clear(); - - vertexData.resize(m_listVertices.size()); - std::copy(m_listVertices.begin(), m_listVertices.end(), vertexData.begin()); - - /*LogManager::getSingleton().logMessage("----------Vertex Data----------"); - for(std::vector::iterator vertexIter = vertexData.begin(); vertexIter != vertexData.end(); ++vertexIter) - { - LogManager::getSingleton().logMessage(StringConverter::toString(vertexIter->getPosition().x) + "," + StringConverter::toString(vertexIter->getPosition().y) + "," + StringConverter::toString(vertexIter->getPosition().z)); - } - LogManager::getSingleton().logMessage("----------End Vertex Data----------");*/ - - for(SurfaceTriangleIterator iterTriangles = m_listTriangles.begin(); iterTriangles != m_listTriangles.end(); ++iterTriangles) - { - //LogManager::getSingleton().logMessage("Begin Triangle:"); - std::vector::iterator iterVertex; - SurfaceEdgeIterator edgeIter; - - edgeIter = iterTriangles->getEdge(); - //LogManager::getSingleton().logMessage("Edge Target " + StringConverter::toString(edgeIter->target->position.x) + "," + StringConverter::toString(edgeIter->target->position.y) + "," + StringConverter::toString(edgeIter->target->position.z)); - iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - //LogManager::getSingleton().logMessage(""); - //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); - indexData.push_back(iterVertex - vertexData.begin()); - - edgeIter = edgeIter->getNextHalfEdge(); - iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); - indexData.push_back(iterVertex - vertexData.begin()); - - edgeIter = edgeIter->getNextHalfEdge(); - iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); - //LogManager::getSingleton().logMessage(" " + StringConverter::toString(iterVertex->getPosition().x) + "," + StringConverter::toString(iterVertex->getPosition().y) + "," + StringConverter::toString(iterVertex->getPosition().z)); - indexData.push_back(iterVertex - vertexData.begin()); - - //LogManager::getSingleton().logMessage("End Triangle"); - } - } - bool SurfacePatch::canRemoveVertexFrom(SurfaceVertexIterator vertexIter, std::list listConnectedIter, bool isEdge) { bool allXMatch = true; diff --git a/source/SurfacePatchRenderable.cpp b/source/SurfacePatchRenderable.cpp index f6569ef5..c70e7c8d 100644 --- a/source/SurfacePatchRenderable.cpp +++ b/source/SurfacePatchRenderable.cpp @@ -1,159 +1,197 @@ #include "SurfacePatchRenderable.h" +#include "SurfaceEdge.h" #include "OgreVertexIndexData.h" namespace Ogre { - SurfacePatchRenderable::SurfacePatchRenderable(const String& material) + SurfacePatchRenderable::SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material) { - mRenderOp.vertexData = new VertexData(); - mRenderOp.indexData = new IndexData(); + mRenderOp.vertexData = new VertexData(); + mRenderOp.indexData = new IndexData(); - this->setMaterial(material); + this->setMaterial(material); + + setGeometry(patchToRender); } SurfacePatchRenderable::~SurfacePatchRenderable(void) { - delete mRenderOp.vertexData; - delete mRenderOp.indexData; + delete mRenderOp.vertexData; + delete mRenderOp.indexData; } - void SurfacePatchRenderable::setGeometry(std::vector verticesToSet, std::vector indicesToSet) + void SurfacePatchRenderable::updateWithNewSurfacePatch(SurfacePatch& patchToRender) + { + setGeometry(patchToRender); + } + + void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender) { - + + //LogManager::getSingleton().logMessage("In setGeometry()"); - // Initialization stuff - mRenderOp.vertexData->vertexCount = verticesToSet.size(); - mRenderOp.vertexData->vertexStart = 0; - mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; // OT_LINE_LIST, OT_LINE_STRIP - mRenderOp.useIndexes = true; - mRenderOp.indexData->indexStart = 0; - mRenderOp.indexData->indexCount = indicesToSet.size(); + //Initialization stuff + mRenderOp.vertexData->vertexCount = patchToRender.getNoOfVertices(); + mRenderOp.vertexData->vertexStart = 0; + mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; // OT_LINE_LIST, OT_LINE_STRIP + mRenderOp.useIndexes = true; + mRenderOp.indexData->indexStart = 0; + mRenderOp.indexData->indexCount = patchToRender.getNoOfTriangles() * 3; - //LogManager::getSingleton().logMessage("Finished initialisaing stuff"); + //LogManager::getSingleton().logMessage("Finished initialisaing stuff"); - VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration; - VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding; + VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration; + VertexBufferBinding *bind = mRenderOp.vertexData->vertexBufferBinding; - //FIXME - this should be moved to constructor? - //LogManager::getSingleton().logMessage("Creating Vertex Declaration"); - decl->removeAllElements(); - decl->addElement(0, 0, VET_FLOAT3, VES_POSITION); - decl->addElement(0, 3 * sizeof(float), VET_FLOAT3, VES_NORMAL); - decl->addElement(0, 6 * sizeof(float), VET_FLOAT1, VES_TEXTURE_COORDINATES); + //FIXME - this should be moved to constructor? + //LogManager::getSingleton().logMessage("Creating Vertex Declaration"); + decl->removeAllElements(); + decl->addElement(0, 0, VET_FLOAT3, VES_POSITION); + decl->addElement(0, 3 * sizeof(float), VET_FLOAT3, VES_NORMAL); + decl->addElement(0, 6 * sizeof(float), VET_FLOAT1, VES_TEXTURE_COORDINATES); - //LogManager::getSingleton().logMessage("Creating Vertex Buffer"); - HardwareVertexBufferSharedPtr vbuf = - HardwareBufferManager::getSingleton().createVertexBuffer( - decl->getVertexSize(0), - mRenderOp.vertexData->vertexCount, - HardwareBuffer::HBU_STATIC_WRITE_ONLY); + //LogManager::getSingleton().logMessage("Creating Vertex Buffer"); + HardwareVertexBufferSharedPtr vbuf = + HardwareBufferManager::getSingleton().createVertexBuffer( + decl->getVertexSize(0), + mRenderOp.vertexData->vertexCount, + HardwareBuffer::HBU_STATIC_WRITE_ONLY); - bind->setBinding(0, vbuf); + bind->setBinding(0, vbuf); - //LogManager::getSingleton().logMessage("Creating Index Buffer"); - HardwareIndexBufferSharedPtr ibuf = - HardwareBufferManager::getSingleton().createIndexBuffer( - HardwareIndexBuffer::IT_16BIT, // type of index - mRenderOp.indexData->indexCount, // number of indexes - HardwareBuffer::HBU_STATIC_WRITE_ONLY, // usage - false); // no shadow buffer + //LogManager::getSingleton().logMessage("Creating Index Buffer"); + HardwareIndexBufferSharedPtr ibuf = + HardwareBufferManager::getSingleton().createIndexBuffer( + HardwareIndexBuffer::IT_16BIT, // type of index + mRenderOp.indexData->indexCount, // number of indexes + HardwareBuffer::HBU_STATIC_WRITE_ONLY, // usage + false); // no shadow buffer - mRenderOp.indexData->indexBuffer = ibuf; + mRenderOp.indexData->indexBuffer = ibuf; - - // Drawing stuff - int size = verticesToSet.size(); - Vector3 vaabMin; - Vector3 vaabMax; - vaabMin.x = verticesToSet[0].getPosition().x/2.0f; - vaabMin.y = verticesToSet[0].getPosition().y/2.0f; - vaabMin.z = verticesToSet[0].getPosition().z/2.0f; - vaabMax.x = verticesToSet[0].getPosition().x/2.0f; - vaabMax.y = verticesToSet[0].getPosition().y/2.0f; - vaabMax.z = verticesToSet[0].getPosition().z/2.0f; + // Drawing stuff + //int size = verticesToSet.size(); + Vector3 vaabMin; + Vector3 vaabMax; + vaabMin.x = patchToRender.getVerticesBegin()->getPosition().x/2.0f; + vaabMin.y = patchToRender.getVerticesBegin()->getPosition().y/2.0f; + vaabMin.z = patchToRender.getVerticesBegin()->getPosition().z/2.0f; + vaabMax.x = patchToRender.getVerticesBegin()->getPosition().x/2.0f; + vaabMax.y = patchToRender.getVerticesBegin()->getPosition().y/2.0f; + vaabMax.z = patchToRender.getVerticesBegin()->getPosition().z/2.0f; - //LogManager::getSingleton().logMessage("Setting Vertex Data of size " + StringConverter::toString(size)); + //LogManager::getSingleton().logMessage("Setting Vertex Data of size " + StringConverter::toString(size)); - Real *prPos = static_cast(vbuf->lock(HardwareBuffer::HBL_DISCARD)); + Real *prPos = static_cast(vbuf->lock(HardwareBuffer::HBL_DISCARD)); - for(int i = 0; i < size; i++) - { - *prPos++ = verticesToSet[i].getPosition().x/2.0f; - *prPos++ = verticesToSet[i].getPosition().y/2.0f; - *prPos++ = verticesToSet[i].getPosition().z/2.0f; + //for(int i = 0; i < size; i++) + for(SurfaceVertexConstIterator vertexIter = patchToRender.getVerticesBegin(); vertexIter != patchToRender.getVerticesEnd(); ++vertexIter) + { + *prPos++ = vertexIter->getPosition().x/2.0f; + *prPos++ = vertexIter->getPosition().y/2.0f; + *prPos++ = vertexIter->getPosition().z/2.0f; - *prPos++ = verticesToSet[i].getNormal().x; - *prPos++ = verticesToSet[i].getNormal().y; - *prPos++ = verticesToSet[i].getNormal().z; + *prPos++ = vertexIter->getNormal().x; + *prPos++ = vertexIter->getNormal().y; + *prPos++ = vertexIter->getNormal().z; - *prPos++ = verticesToSet[i].getAlpha(); + *prPos++ = vertexIter->getAlpha(); - if(verticesToSet[i].getPosition().x < vaabMin.x) - vaabMin.x = verticesToSet[i].getPosition().x; - if(verticesToSet[i].getPosition().y < vaabMin.y) - vaabMin.y = verticesToSet[i].getPosition().y; - if(verticesToSet[i].getPosition().z < vaabMin.z) - vaabMin.z = verticesToSet[i].getPosition().z; + if(vertexIter->getPosition().x < vaabMin.x) + vaabMin.x = vertexIter->getPosition().x; + if(vertexIter->getPosition().y < vaabMin.y) + vaabMin.y = vertexIter->getPosition().y; + if(vertexIter->getPosition().z < vaabMin.z) + vaabMin.z = vertexIter->getPosition().z; - if(verticesToSet[i].getPosition().x > vaabMax.x) - vaabMax.x = verticesToSet[i].getPosition().x; - if(verticesToSet[i].getPosition().y > vaabMax.y) - vaabMax.y = verticesToSet[i].getPosition().y; - if(verticesToSet[i].getPosition().z > vaabMax.z) - vaabMax.z = verticesToSet[i].getPosition().z; - } + if(vertexIter->getPosition().x > vaabMax.x) + vaabMax.x = vertexIter->getPosition().x; + if(vertexIter->getPosition().y > vaabMax.y) + vaabMax.y = vertexIter->getPosition().y; + if(vertexIter->getPosition().z > vaabMax.z) + vaabMax.z = vertexIter->getPosition().z; + } - vbuf->unlock(); + vbuf->unlock(); - vaabMin /= 2.0f; - vaabMax /= 2.0f; + vaabMin /= 2.0f; + vaabMax /= 2.0f; - mBox.setExtents(vaabMin, vaabMax); + mBox.setExtents(vaabMin, vaabMax); - unsigned short* pIdx = static_cast(ibuf->lock(HardwareBuffer::HBL_DISCARD)); - for(int i = 0; i < indicesToSet.size(); i++) - { - *pIdx = indicesToSet[i]; - pIdx++; - /**pIdx = indicesToSet[i].v1; - pIdx++; - *pIdx = indicesToSet[i].v2; - pIdx++;*/ - } - ibuf->unlock(); + /*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++) + { + *pIdx = indicesToSet[i]; + LogManager::getSingleton().logMessage("Correct pIdx = " + StringConverter::toString(*pIdx)); + pIdx++; + }*/ + + std::vector vertexData; + vertexData.resize(patchToRender.getNoOfVertices()); + std::copy(patchToRender.getVerticesBegin(), patchToRender.getVerticesEnd(), vertexData.begin()); + + for(SurfaceTriangleConstIterator iterTriangles = patchToRender.getTrianglesBegin(); iterTriangles != patchToRender.getTrianglesEnd(); ++iterTriangles) + { + std::vector::iterator iterVertex; + SurfaceEdgeIterator edgeIter; + + edgeIter = iterTriangles->getEdge(); + iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + *pIdx = (iterVertex - vertexData.begin()); + //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); + pIdx++; + + edgeIter = edgeIter->getNextHalfEdge(); + iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + *pIdx = (iterVertex - vertexData.begin()); + //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); + pIdx++; + + edgeIter = edgeIter->getNextHalfEdge(); + iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + *pIdx = (iterVertex - vertexData.begin()); + //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); + pIdx++; + } + ibuf->unlock(); } Real SurfacePatchRenderable::getSquaredViewDepth(const Camera *cam) const { - Vector3 vMin, vMax, vMid, vDist; - vMin = mBox.getMinimum(); - vMax = mBox.getMaximum(); - vMid = ((vMin - vMax) * 0.5) + vMin; - vDist = cam->getDerivedPosition() - vMid; + Vector3 vMin, vMax, vMid, vDist; + vMin = mBox.getMinimum(); + vMax = mBox.getMaximum(); + vMid = ((vMin - vMax) * 0.5) + vMin; + vDist = cam->getDerivedPosition() - vMid; - return vDist.squaredLength(); + return vDist.squaredLength(); } Real SurfacePatchRenderable::getBoundingRadius(void) const { return Math::Sqrt((std::max)(mBox.getMaximum().squaredLength(), mBox.getMinimum().squaredLength())); - //return mRadius; + //return mRadius; } /* void Line3D::getWorldTransforms(Matrix4 *xform) const { - // return identity matrix to prevent parent transforms - *xform = Matrix4::IDENTITY; + // return identity matrix to prevent parent transforms + *xform = Matrix4::IDENTITY; } */ const Quaternion &SurfacePatchRenderable::getWorldOrientation(void) const { - return Quaternion::IDENTITY; + return Quaternion::IDENTITY; } const Vector3 &SurfacePatchRenderable::getWorldPosition(void) const { - return Vector3::ZERO; + return Vector3::ZERO; } }