I have a situation where I need to load three meshes to make up a single entity. Each part has it's own texture/material so I believe I need to be using a submesh. I also need this entity to move, thus it won't be static. I found some code on the wiki:
Code: Select all
std::string m_ModelId = "MergedMesh";
Ogre::MeshPtr m_BaseMesh = MeshManager::getSingleton().createManual( m_ModelId, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
//Lets add some submeshes
std::vector< MeshPtr >::iterator itr = m_Meshes.begin();
std::vector< MeshPtr >::iterator itr_e = m_Meshes.end();
for( ; itr !=itr_e; ++itr )
{
Mesh::SubMeshIterator mesh_itr = source->getSubMeshIterator();
SubMesh *in = 0, *out = 0;
VertexBoneAssignment vbass;
while( mesh_itr.hasMoreElements())
{
in = mesh_itr.getNext();
out = m_BaseMesh->createSubMesh();
out->indexData = in->indexData->clone();
out->mLodFaceList = in->mLodFaceList;
out->operationType = in->operationType;
out->parent = m_BaseMesh.get();
out->useSharedVertices = false;
out->vertexData = in->vertexData->clone();
out->clearBoneAssignments();
for( size_t i = 0; i < in->vertexData->vertexCount; ++i )
{
vbass.vertexIndex = i;
vbass.weight = 1.0f;
out->addBoneAssignment(vbass);
}
}
}
Code: Select all
Mesh::SubMeshIterator mesh_itr = source->getSubMeshIterator();
I have already tested each mesh individually, and can get them to load just fine, it's only when I'm trying to merge them that nothing shows.
This is the modded version of the above that I'm using:
Code: Select all
//code to test and create entity based off of sub-meshes
//vector of meshes
std::vector< MeshPtr > m_Meshes;
//define meshes
m_Meshes.push_back(MeshManager::getSingleton().load("TestUnit.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME));
m_Meshes.push_back(MeshManager::getSingleton().load("TestUnit2.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME));
m_Meshes.push_back(MeshManager::getSingleton().load("TestUnit3.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME));
std::string m_ModelId = "MergedMesh";
Ogre::MeshPtr m_BaseMesh = MeshManager::getSingleton().createManual(m_ModelId, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
//Lets add some submeshes
std::vector< MeshPtr >::iterator itr = m_Meshes.begin();
std::vector< MeshPtr >::iterator itr_e = m_Meshes.end();
int i = 0;
for (; itr != itr_e; ++itr)
{
Mesh::SubMeshIterator mesh_itr = m_Meshes[i]->getSubMeshIterator();
i++;
SubMesh *in = 0, *out = 0;
VertexBoneAssignment vbass;
while (mesh_itr.hasMoreElements())
{
in = mesh_itr.getNext();
out = m_BaseMesh->createSubMesh();
out->indexData = in->indexData->clone();
out->mLodFaceList = in->mLodFaceList;
out->operationType = in->operationType;
out->parent = m_BaseMesh.get();
out->useSharedVertices = false;
out->vertexData = in->vertexData->clone();
out->clearBoneAssignments();
for (size_t i = 0; i < in->vertexData->vertexCount; ++i)
{
vbass.vertexIndex = i;
vbass.weight = 1.0f;
out->addBoneAssignment(vbass);
}
}
}
Entity* ent = mSceneMgr->createEntity("entName", m_BaseMesh->getName());
//code here is temporary and only ment as a test for the modelers
//Entity* testEntity = mSceneMgr->createEntity("cc", source->getName());
//testEntity->setMaterialName("TestMat");
SceneNode* thisSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
thisSceneNode->setPosition(100, 100, 100);
thisSceneNode->attachObject(ent);
WWJD