I'm trying to create a Mesh on the fly the shares 1 vertex buffer between multiple SubMeshes which use different index buffers.
I've got it working in the sense that it renders etc, but when Ogre shutsdown it throws an exception inside VaoManager::destroyVertexBuffer because the buffer has already been destroyed.
Clearly i've done something wrong but i'm not sure what.
Does anyone have a 'bare bones' example of how to do such things?
My own attempt just modified the DynamicGeometry sample to create 1 VertexBufferPacked then 6 IndexBufferPacked (1 for each face of the cube) inside createStaticMesh.
Here's an excerpt of the relevant code:
Code: Select all
...
Ogre::VertexBufferPacked *vertexBuffer = 0;
try
{
//Create the actual vertex buffer.
vertexBuffer = vaoManager->createVertexBuffer( vertexElements, 8,
partialMesh ? Ogre::BT_DEFAULT :
Ogre::BT_IMMUTABLE,
cubeVertices, true );
}
catch( Ogre::Exception &e )
{
OGRE_FREE_SIMD( vertexBuffer, Ogre::MEMCATEGORY_GEOMETRY );
vertexBuffer = 0;
throw e;
}
for( size_t i = 0; i < 6; ++i )
{
//Create one submesh
Ogre::SubMesh *subMesh = mesh->createSubMesh();
//Now the Vao. We'll just use one vertex buffer source (multi-source not working yet)
Ogre::VertexBufferPackedVec vertexBuffers;
vertexBuffers.push_back( vertexBuffer );
Ogre::IndexBufferPacked *indexBuffer = createIndexBuffer(i); //Create the actual index buffer
Ogre::VertexArrayObject *vao = vaoManager->createVertexArrayObject(
vertexBuffers, indexBuffer, Ogre::OT_TRIANGLE_LIST );
//Each Vao pushed to the vector refers to an LOD level.
//Must be in sync with mesh->mLodValues & mesh->mNumLods if you use more than one level
subMesh->mVao[Ogre::VpNormal].push_back( vao );
//Use the same geometry for shadow casting.
subMesh->mVao[Ogre::VpShadow].push_back( vao );
//Assign a material to each face...
}
...
Kaylx