summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscrawl <scrawl@baseoftrash.de>2013-04-23 22:47:21 +0200
committerscrawl <scrawl@baseoftrash.de>2013-04-23 22:47:57 +0200
commit44ac0a7c1856bf463f18ed435d554574745d4c50 (patch)
treebe2514c60f109819f551f639ae7c93bbe761e873
parenta608e7ed06883ebc2b0ae09702bc133ffc2b1095 (diff)
Use one vertex buffer for all UV coordinatesopenmw-0.23.0
-rw-r--r--components/nifogre/mesh.cpp21
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);
}