void dModel::InitFromModel (const dModel& source) { while (m_skeleton.GetCount()) { RemoveSkeleton(m_skeleton.GetFirst()->GetInfo()); } while (m_meshList.GetCount()) { RemoveMesh(m_meshList.GetFirst()->GetInfo().m_mesh); } while (m_animations.GetCount()) { RemoveAnimation(m_animations.GetFirst()->GetInfo()); } for (dList<dBone*>::dListNode* node = source.m_skeleton.GetFirst(); node; node = node->GetNext()) { int stack = 1; dBone* pool[64]; dBone* parentBones[64]; parentBones[0] = NULL; dBone* rootBone = NULL; pool[0] = node->GetInfo(); while (stack) { stack --; dBone* parent = parentBones[stack]; dBone* sourceBone = pool[stack]; dBone* bone = new dBone (*sourceBone, parent); if (!rootBone) { rootBone = bone; } for (sourceBone = sourceBone->GetChild(); sourceBone; sourceBone = sourceBone->GetSibling()) { pool[stack] = sourceBone; parentBones[stack] = bone; stack ++; } } AddSkeleton(rootBone); rootBone->Release(); } for (dList<dAnimationClip*>::dListNode* node = source.m_animations.GetFirst(); node; node = node->GetNext()) { AddAnimation(node->GetInfo()); } for (dList<dMeshInstance>::dListNode* node = source.m_meshList.GetFirst(); node; node = node->GetNext()) { AddMesh(node->GetInfo().m_mesh); dMeshInstance& instance = m_meshList.GetLast()->GetInfo(); instance.m_boneID = node->GetInfo().m_boneID; if (node->GetInfo().GetModifier()) { instance.SetModifier(node->GetInfo().GetModifier()->CreateCopy (instance, *this)); } } }
void Scene::RemoveScene() { SetSelectedMesh(nullptr); for(const MeshPtr& mesh : m_meshes) { if(mesh->IsVisible()) { RemoveMesh(mesh); } } m_enableCreation(true); }
void Scene::RemoveObject() { if(m_selectedMesh != NO_INDEX) { if(m_open.empty()) { m_enableCreation(true); } RemoveMesh(m_meshes[m_selectedMesh]); SetSelectedMesh(nullptr); } }
bool OgreMeshResource::SetData(Foundation::AssetPtr source) { if (!source) { OgreRenderingModule::LogError("Null source asset data pointer"); return false; } if (!source->GetSize()) { OgreRenderingModule::LogError("Zero sized mesh asset"); return false; } try { if (ogre_mesh_.isNull()) { ogre_mesh_ = Ogre::MeshManager::getSingleton().createManual( id_, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); if (ogre_mesh_.isNull()) { OgreRenderingModule::LogError("Failed to create mesh " + id_); return false; } ogre_mesh_->setAutoBuildEdgeLists(false); } Ogre::DataStreamPtr stream(new Ogre::MemoryDataStream((void*)source->GetData(), source->GetSize(), false)); Ogre::MeshSerializer serializer; serializer.importMesh(stream, ogre_mesh_.getPointer()); // Generate tangents to mesh try { unsigned short src, dest; if (!ogre_mesh_->suggestTangentVectorBuildParams(Ogre::VES_TANGENT, src, dest)) ogre_mesh_->buildTangentVectors(Ogre::VES_TANGENT, src, dest); } catch (...) {} // Generate extremity points to submeshes, 1 should be enough try { for(uint i = 0; i < ogre_mesh_->getNumSubMeshes(); ++i) { Ogre::SubMesh *smesh = ogre_mesh_->getSubMesh(i); if (smesh) smesh->generateExtremes(1); } } catch (...) {} // Assign default materials that won't complain original_materials_.clear(); for (uint i = 0; i < ogre_mesh_->getNumSubMeshes(); ++i) { Ogre::SubMesh* submesh = ogre_mesh_->getSubMesh(i); if (submesh) { original_materials_.push_back(submesh->getMaterialName()); submesh->setMaterialName("UnlitTextured"); } } } catch (Ogre::Exception &e) { OgreRenderingModule::LogError("Failed to create mesh " + id_ + ": " + std::string(e.what())); RemoveMesh(); return false; } OgreRenderingModule::LogDebug("Ogre mesh " + id_ + " created"); return true; }
OgreMeshResource::~OgreMeshResource() { RemoveMesh(); }