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(); }
//------------------------------------------------------------------------- void AFile::addTo( Ogre::SkeletonPtr skeleton, const String& name ) const { if( skeleton->hasAnimation( name) ) return; Ogre::Real length( ( m_frames.size() - 1 ) * FRAME_DURATION ); Ogre::Animation *anim( skeleton->createAnimation(name, length )); uint16 track_handle( 0 ); Ogre::Bone* bone( skeleton->getBone( "root" ) ); Ogre::NodeAnimationTrack* track; track = anim->createNodeTrack( track_handle++, bone ); Ogre::Real time; size_t index( 0 ); for( FrameList::const_iterator frame( m_frames.begin()) ;frame != m_frames.end(); ++frame ) { time = (index++) * FRAME_DURATION; Ogre::TransformKeyFrame* key_frame( track->createNodeKeyFrame( time ) ); key_frame->setTranslate( frame->root_translation ); setFrameRotation( key_frame, frame->root_rotation ); } for( uint32 i(0); i < m_bone_count; ++i ) { if (i + 1 >= skeleton->getNumBones()) { // TODO: Figure out why this happens/fix it LOG_ERROR("Bone " + std::to_string(i + 1) + " is out of bounds " + std::to_string(skeleton->getNumBones()) + " for: " + name + " in: " + skeleton->getName()); } else { bone = skeleton->getBone(i + 1); track = anim->createNodeTrack(track_handle++, bone); time = 0; for (FrameList::const_iterator frame(m_frames.begin()) ; frame != m_frames.end(); ++frame) { const Ogre::Vector3& rot(frame->bone_rotations[i]); Ogre::TransformKeyFrame* key_frame(track->createNodeKeyFrame(time)); setFrameRotation(key_frame, rot); time += FRAME_DURATION; } } } }