bool Scene::SerializeObject(GameObjectPtr pObj, DataStream* pStream) { const std::string& name = pObj->GetName(); pStream->WriteString(name); const math::Matrix44& local = pObj->GetLocalTransform(); pStream->Write((void*)&local, sizeof(local)); uint16 nCom = pObj->GetComponentCount(); pStream->WriteInt16(nCom - 1); for(int i = 0; i < nCom; ++i) { GameObjectComponentPtr pCom = pObj->GetComponent(i); pStream->WriteString(pCom->GetName()); if(false == pCom->Serialize(pStream)) { logger() << "failed to save component: " << pCom->GetName() << "\n"; return false; } } uint16 nChild = 0; GameObjectPtr pChild = pObj->GetFirstChild(); while(pChild) { ++nChild; pChild = pChild->GetNextNode(); } pStream->WriteInt16(nChild); pChild = pObj->GetFirstChild(); while(pChild) { if(false == SerializeObject(pChild, pStream)) { return false; } pChild = pChild->GetNextNode(); } return true; }
void CMainFrame::OnComponentMenu(UINT nID) { using namespace engine; ExtPackage::ComponentClass* pClass = FindClassByMenuID(nID); GameObjectPtr pObj = Project::Instance()->GetSelObject(); if(pObj->GetComponent(pClass->m_name) != GameObjectComponentPtr()) { CString str = pClass->m_name.c_str() + CString(L" can only be added once per object"); MessageBox(str, L"Component Error", MB_ICONERROR); return; } GameObjectComponentPtr pCom = Project::Instance()->CreateGameObjectComponent(pClass->m_name); pObj->AddComponent(pCom); UpdatePropGrid(pObj); return; }