void MeshMergeTool::addMesh(Ogre::MeshPtr mesh) { SkeletonPtr meshSkel = mesh->getSkeleton(); if (meshSkel.isNull() && mesh->hasSkeleton()) { meshSkel = SkeletonManager::getSingleton().getByName(mesh->getSkeletonName()); } if (meshSkel.isNull() && !mBaseSkeleton.isNull()) { throw std::logic_error( "Some meshes have a skeleton, but others have none, cannot merge."); } if (!meshSkel.isNull() && mBaseSkeleton.isNull() && !mMeshes.empty()) { throw std::logic_error( "Some meshes have a skeleton, but others have none, cannot merge."); } if (!meshSkel.isNull() && mBaseSkeleton.isNull() && mMeshes.empty()) { mBaseSkeleton = meshSkel; print("Set: base skeleton (" + mBaseSkeleton->getName()+")", V_HIGH); } if (meshSkel != mBaseSkeleton) { throw std::logic_error( "Some meshes have a skeleton, but others have none, cannot merge."); } mMeshes.push_back(mesh); }
//------------------------------------------------------------------------------------------------ void StaticMeshToShapeConverter::addMesh(const Ogre::MeshPtr &mesh, const Ogre::Matrix4 &transform) { // Each entity added need to reset size and radius // next time getRadius and getSize are asked, they're computed. mBounds = Ogre::Vector3(-1,-1,-1); mBoundRadius = -1; //_entity = entity; //_node = (SceneNode*)(_entity->getParentNode()); mTransform = transform; if (mesh->hasSkeleton ()) Ogre::LogManager::getSingleton().logMessage("MeshToShapeConverter::addMesh : Mesh " + mesh->getName () + " as skeleton but added to trimesh non animated"); if (mesh->sharedVertexData) { VertexIndexToShape::addStaticVertexData (mesh->sharedVertexData); } for(unsigned int i = 0;i < mesh->getNumSubMeshes();++i) { Ogre::SubMesh *sub_mesh = mesh->getSubMesh(i); if (!sub_mesh->useSharedVertices) { VertexIndexToShape::addIndexData(sub_mesh->indexData, mVertexCount); VertexIndexToShape::addStaticVertexData (sub_mesh->vertexData); } else { VertexIndexToShape::addIndexData (sub_mesh->indexData); } } }
Ogre::Mesh* EC_Mesh::PrepareMesh(const std::string& mesh_name, bool clone) { if (!ViewEnabled()) return 0; if (renderer_.expired()) return 0; RendererPtr renderer = renderer_.lock(); Ogre::MeshManager& mesh_mgr = Ogre::MeshManager::getSingleton(); Ogre::MeshPtr mesh = mesh_mgr.getByName(SanitateAssetIdForOgre(mesh_name)); // For local meshes, mesh will not get automatically loaded until used in an entity. Load now if necessary if (mesh.isNull()) { try { mesh_mgr.load(mesh_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); mesh = mesh_mgr.getByName(mesh_name); } catch (Ogre::Exception& e) { LogError("Could not load mesh " + mesh_name + ": " + std::string(e.what())); return 0; } } // If mesh is still null, must abort if (mesh.isNull()) { LogError("Mesh " + mesh_name + " does not exist"); return 0; } if (clone) { try { mesh = mesh->clone(renderer->GetUniqueObjectName("EC_Mesh_clone")); mesh->setAutoBuildEdgeLists(false); cloned_mesh_name_ = mesh->getName(); } catch (Ogre::Exception& e) { LogError("Could not clone mesh " + mesh_name + ":" + std::string(e.what())); return 0; } } if (mesh->hasSkeleton()) { Ogre::SkeletonPtr skeleton = Ogre::SkeletonManager::getSingleton().getByName(mesh->getSkeletonName()); if (skeleton.isNull() || skeleton->getNumBones() == 0) { LogDebug("Mesh " + mesh_name + " has a skeleton with 0 bones. Disabling the skeleton."); mesh->setSkeletonName(""); } } return mesh.get(); }
Ogre::MeshPtr loadMesh(const Ogre::String& meshName, const Ogre::String& groupName, const Ogre::String& baseResourceName, const Ogre::String& baseGroupName) { // Load the mesh Ogre::MeshPtr mesh = loadCorrelativeResource( meshName, groupName, baseResourceName, baseGroupName, Ogre::MeshManager::getSingleton()); if (mesh.isNull()) { OGRE_EXCEPT(Ogre::Exception::ERR_ITEM_NOT_FOUND, "Unable to load mesh " + meshName, "loadMesh"); } // Try to resolve skeleton resource if (mesh->hasSkeleton() && mesh->getSkeleton().isNull()) { // resolve correlative with mesh Ogre::SkeletonPtr skeleton = loadCorrelativeResource( mesh->getSkeletonName(), groupName, mesh->getName(), mesh->getGroup(), Ogre::SkeletonManager::getSingleton()); if (skeleton.isNull()) { // resolve correlative with base resource skeleton = loadCorrelativeResource( mesh->getSkeletonName(), groupName, baseResourceName, baseGroupName, Ogre::SkeletonManager::getSingleton()); } if (skeleton.isNull()) { OGRE_EXCEPT(Ogre::Exception::ERR_ITEM_NOT_FOUND, "Unable to load skeleton " + mesh->getSkeletonName() + " for mesh " + mesh->getName(), "loadMesh"); } // Set to the actual name mesh->setSkeletonName(skeleton->getName()); } return mesh; }
const std::string& EC_Mesh::GetSkeletonName() const { static std::string empty_name; if (!entity_) return empty_name; else { Ogre::MeshPtr mesh = entity_->getMesh(); if (!mesh->hasSkeleton()) return empty_name; Ogre::SkeletonPtr skel = mesh->getSkeleton(); if (skel.isNull()) return empty_name; return skel->getName(); } }
//------------------------------------------------------------------------------------------------ void AnimatedMeshToShapeConverter::addMesh(const Ogre::MeshPtr &mesh, const Ogre::Matrix4 &transform) { // Each entity added need to reset size and radius // next time getRadius and getSize are asked, they're computed. mBounds = Ogre::Vector3(-1.0f , -1.0f, -1.0f); mBoundRadius = -1.0f; //_entity = entity; //_node = (SceneNode*)(_entity->getParentNode()); mTransform = transform; assert(mesh->hasSkeleton()); if (mesh->sharedVertexData) { VertexIndexToShape::addAnimatedVertexData(mesh->sharedVertexData, NULL, &mesh->sharedBlendIndexToBoneIndexMap); } for (unsigned int i = 0; i < mesh->getNumSubMeshes(); ++i) { Ogre::SubMesh *sub_mesh = mesh->getSubMesh(i); if (!sub_mesh->useSharedVertices) { VertexIndexToShape::addIndexData(sub_mesh->indexData, mVertexCount); VertexIndexToShape::addAnimatedVertexData(sub_mesh->vertexData, NULL, &sub_mesh->blendIndexToBoneIndexMap); } else { VertexIndexToShape::addIndexData(sub_mesh->indexData); } } }