diff options
author | scrawl <scrawl@baseoftrash.de> | 2013-04-23 22:47:21 +0200 |
---|---|---|
committer | scrawl <scrawl@baseoftrash.de> | 2013-04-23 22:47:57 +0200 |
commit | 44ac0a7c1856bf463f18ed435d554574745d4c50 (patch) | |
tree | be2514c60f109819f551f639ae7c93bbe761e873 | |
parent | a608e7ed06883ebc2b0ae09702bc133ffc2b1095 (diff) |
Use one vertex buffer for all UV coordinatesopenmw-0.23.0
-rw-r--r-- | components/nifogre/mesh.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/components/nifogre/mesh.cpp b/components/nifogre/mesh.cpp index c0a7af5c30..6d940deed3 100644 --- a/components/nifogre/mesh.cpp +++ b/components/nifogre/mesh.cpp @@ -260,13 +260,24 @@ void NIFMeshLoader::createSubMesh(Ogre::Mesh *mesh, const Nif::NiTriShape *shape // Texture UV coordinates size_t numUVs = data->uvlist.size(); - for(size_t i = 0;i < numUVs;i++) + if (numUVs) { - vbuf = hwBufMgr->createVertexBuffer(Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2), - srcVerts.size(), Ogre::HardwareBuffer::HBU_STATIC); - vbuf->writeData(0, vbuf->getSizeInBytes(), &data->uvlist[i][0], true); + size_t elemSize = Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT2); + + for(size_t i = 0; i < numUVs; i++) + decl->addElement(nextBuf, elemSize*i, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, i); + + vbuf = hwBufMgr->createVertexBuffer(decl->getVertexSize(nextBuf), srcVerts.size(), + Ogre::HardwareBuffer::HBU_STATIC); + + std::vector<Ogre::Vector2> allUVs; + allUVs.reserve(srcVerts.size()*numUVs); + for (size_t vert = 0; vert<srcVerts.size(); ++vert) + for(size_t i = 0; i < numUVs; i++) + allUVs.push_back(data->uvlist[i][vert]); + + vbuf->writeData(0, elemSize*srcVerts.size()*numUVs, &allUVs[0], true); - decl->addElement(nextBuf, 0, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES, i); bind->setBinding(nextBuf++, vbuf); } |