diff --git a/include/SurfacePatchRenderable.h b/include/SurfacePatchRenderable.h index ccb0d870..f0a9e6db 100644 --- a/include/SurfacePatchRenderable.h +++ b/include/SurfacePatchRenderable.h @@ -10,6 +10,9 @@ namespace Ogre { + //IDEA - If profiling identifies this class as a bottleneck, we could implement a memory pooling system. + //All buffers could be powers of two, and we get the smallest one which is big enough for our needs. + //See http://www.ogre3d.org/wiki/index.php/DynamicGrowingBuffers class SurfacePatchRenderable : public SimpleRenderable { public: diff --git a/source/SurfacePatchRenderable.cpp b/source/SurfacePatchRenderable.cpp index c70e7c8d..625c5d9f 100644 --- a/source/SurfacePatchRenderable.cpp +++ b/source/SurfacePatchRenderable.cpp @@ -7,8 +7,25 @@ namespace Ogre { SurfacePatchRenderable::SurfacePatchRenderable(SurfacePatch& patchToRender, const String& material) { + //Set up what we can of the vertex data mRenderOp.vertexData = new VertexData(); + mRenderOp.vertexData->vertexStart = 0; + mRenderOp.vertexData->vertexCount = 0; + mRenderOp.operationType = RenderOperation::OT_TRIANGLE_LIST; + + //Set up what we can of the index data mRenderOp.indexData = new IndexData(); + mRenderOp.useIndexes = true; + mRenderOp.indexData->indexStart = 0; + mRenderOp.indexData->indexCount = 0; + + //Set up the vertex declaration + VertexDeclaration *decl = mRenderOp.vertexData->vertexDeclaration; + 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); + this->setMaterial(material); @@ -28,35 +45,23 @@ namespace Ogre void SurfacePatchRenderable::setGeometry(SurfacePatch& patchToRender) { - - - //LogManager::getSingleton().logMessage("In setGeometry()"); //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.vertexData->vertexCount = patchToRender.getNoOfVertices(); mRenderOp.indexData->indexCount = patchToRender.getNoOfTriangles() * 3; - //LogManager::getSingleton().logMessage("Finished initialisaing stuff"); - - 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); + + //LogManager::getSingleton().logMessage("Creating Vertex Buffer"); HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer( - decl->getVertexSize(0), + mRenderOp.vertexData->vertexDeclaration->getVertexSize(0), mRenderOp.vertexData->vertexCount, - HardwareBuffer::HBU_STATIC_WRITE_ONLY); + HardwareBuffer::HBU_STATIC_WRITE_ONLY, + false); bind->setBinding(0, vbuf); @@ -68,24 +73,20 @@ namespace Ogre HardwareBuffer::HBU_STATIC_WRITE_ONLY, // usage false); // no shadow buffer - mRenderOp.indexData->indexBuffer = ibuf; + mRenderOp.indexData->indexBuffer = ibuf; + + std::vector vertexData; + vertexData.resize(patchToRender.getNoOfVertices()); + std::copy(patchToRender.getVerticesBegin(), patchToRender.getVerticesEnd(), vertexData.begin()); // 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)); + Vector3 vaabMin = vertexData[0].getPosition().toOgreVector3(); + Vector3 vaabMax = vertexData[vertexData.size()-1].getPosition().toOgreVector3(); + Real *prPos = static_cast(vbuf->lock(HardwareBuffer::HBL_DISCARD)); - //for(int i = 0; i < size; i++) + //for(int i = 0; i < size; i++) for(SurfaceVertexConstIterator vertexIter = patchToRender.getVerticesBegin(); vertexIter != patchToRender.getVerticesEnd(); ++vertexIter) { *prPos++ = vertexIter->getPosition().x/2.0f; @@ -97,21 +98,7 @@ namespace Ogre *prPos++ = vertexIter->getNormal().z; *prPos++ = vertexIter->getAlpha(); - - 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(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(); @@ -130,11 +117,7 @@ namespace Ogre *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) { @@ -142,19 +125,19 @@ namespace Ogre SurfaceEdgeIterator edgeIter; edgeIter = iterTriangles->getEdge(); - iterVertex = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + 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 = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + 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 = find(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); + iterVertex = lower_bound(vertexData.begin(), vertexData.end(), *(edgeIter->getTarget())); *pIdx = (iterVertex - vertexData.begin()); //LogManager::getSingleton().logMessage("Wrong pIdx = " + StringConverter::toString(*pIdx)); pIdx++;