meshs是通过引vertexData和IndexData数据结构来构建的。每个subMesh都引用自己的IndexData。VertexData可以通过Mesh::sharedVertexData链接到mesh(在这种情况下,它可以用于所有subMesh使用)。只需设置subMesh::useSharedVertices(True))。
OGRE跟踪每个mesh的VertexData和IndexData。当OGRE关闭时,仍然存活的mesh被迭代遍历销毁。因此,重要的是每个mesh的顶点数据和索引数据指向唯一的实例,否则OGRE将尝试销毁它们两次,导致一个难以跟踪的错误。
//定义索引数据
struct IndexDataArg
{
HardwareIndexBufferSharedPtr indexBuffer;
size_t indexCount;
size_t indexStart;
};
//定义顶点数据
struct VertexDataArg
{
HardwareVertexBufferSharedPtr vertexBuffer;
VertexDeclaration* decl;
size_t vertexCount;
};
//创建共享缓存
SharingBuffer::SharingBuffer(void)
{
this->mIndexDataArg = this->CreateIndexDataArg();
this->mVertexDataArg = this->CreateVertexDataArg();
mesh = MeshManager::getSingleton().createManual("ColourCube","General");
SubMesh* sub = mesh->createSubMesh("sub");
sub->useSharedVertices = true;
mesh->sharedVertexData = new VertexData();
mesh->sharedVertexData->vertexDeclaration = this->mVertexDataArg->decl;
mesh->sharedVertexData->vertexCount = this->mVertexDataArg->vertexCount;
/// 设置vertexbuffer
VertexBufferBinding* bind = mesh->sharedVertexData->vertexBufferBinding;
bind->setBinding(0, this->mVertexDataArg->vertexBuffer);
// 设置submesh的indexData
sub->indexData->indexBuffer = this->mIndexDataArg->indexBuffer;
sub->indexData->indexCount = this->mIndexDataArg->indexCount;
sub->indexData->indexStart = 0;
/// Set bounding information (for culling)
mesh->_setBounds(AxisAlignedBox(-100,-100,-100,100,100,100));
mesh->_setBoundingSphereRadius(Math::Sqrt(3*100*100));
mesh->load();
}