void CaGroup::ReCreateFocusList() { if(!m_bFocusObjChanged) { // DBG_PRN("info",("focus list needn't recreate !")); return; } else { m_bFocusObjChanged=false; } CaObject*const* a = FocusObjList(); if(m_pFocusList != NULL && m_iFocusObjCount > 1 ) { free((void *)a); } m_iFocusObjCount=CalFocusObjCount(); int i=0,j=0; if(m_iFocusObjCount >1 ) { m_pFocusList=(CaObject**)malloc(m_iFocusObjCount*sizeof(CaObject*)); CaObject*const *b =ObjList(); for(i=0;i<ObjCount();i++) { if((*b)->m_bFocus) { m_pFocusList[j++]=*b; } b++; } if(m_pCurObj== NULL ) { m_pCurObj=m_pFocusList[0]; } } else if(m_iFocusObjCount == 1) { CaObject*const *b =ObjList(); if(ObjCount() == 1) { m_pFocusList=(CaObject**)&(*b); m_pCurObj=*b; } else { for(i=0;i<ObjCount();i++) { if((*b)->m_bFocus) { m_pFocusList=(CaObject**)&(*b); m_pCurObj=*b; break; } b++; } } } }
void CaGroup::Clear() { CaObject*const* old_array = ObjList(); int old_children = ObjCount(); // clear everything now, in case m_iObjCount = 0; m_pCurObj=NULL; // okay, now it is safe to destroy the children: CaObject*const* a = old_array; for (int i=old_children; i--;) { //if i == 0 break CaObject* o = *a++; if (o->m_pOwner == this && o != NULL ) { o->m_pOwner=NULL; delete o; o=NULL; }; } if (old_children > 1) free((void*)old_array); m_bFocusObjChanged=true; }
bool EScene::Load(LPCSTR map_name, bool bUndo) { u32 version = 0; if (!map_name||(0==map_name[0])) return false; xr_string full_name; full_name = map_name; ELog.Msg( mtInformation, "EScene: loading '%s'", map_name); if (FS.exist(full_name.c_str())) { CTimer T; T.Start(); // read main level IReader* F = FS.r_open(full_name.c_str()); VERIFY(F); // Version R_ASSERT (F->r_chunk(CHUNK_VERSION, &version)); if (version!=CURRENT_FILE_VERSION) { ELog.DlgMsg( mtError, "EScene: unsupported file version. Can't load Level."); UI->UpdateScene(); FS.r_close(F); return false; } // Lev. ops. IReader* LOP = F->open_chunk(CHUNK_LEVELOP); if (LOP) { m_LevelOp.Read (*LOP); LOP->close (); }else { ELog.DlgMsg (mtError, "Skipping old version of level options.\nCheck level options after loading."); } // if (F->find_chunk(CHUNK_CAMERA)) { Fvector hpb, pos; F->r_fvector3 (hpb); F->r_fvector3 (pos); EDevice.m_Camera.Set(hpb,pos); EDevice.m_Camera.SetStyle(EDevice.m_Camera.GetStyle()); } if (F->find_chunk(CHUNK_TOOLS_GUID)) { F->r (&m_GUID,sizeof(m_GUID)); } if (F->find_chunk(CHUNK_LEVEL_TAG)) { F->r_stringZ (m_OwnerName); F->r (&m_CreateTime,sizeof(m_CreateTime)); }else { m_OwnerName = ""; m_CreateTime = 0; } DWORD obj_cnt = 0; if (F->find_chunk(CHUNK_OBJECT_COUNT)) obj_cnt = F->r_u32(); SPBItem* pb = UI->ProgressStart(obj_cnt,"Loading objects..."); ReadObjectsStream (*F,CHUNK_OBJECT_LIST,OnLoadAppendObject,pb); UI->ProgressEnd (pb); SceneToolsMapPairIt _I = m_SceneTools.begin(); SceneToolsMapPairIt _E = m_SceneTools.end(); for (; _I!=_E; ++_I) { if (_I->second) { IReader* chunk = F->open_chunk(CHUNK_TOOLS_DATA+_I->first); if (chunk){ _I->second->LoadStream(*chunk); chunk->close (); }else{ if (!bUndo && _I->second->IsEnabled() && (_I->first!=OBJCLASS_DUMMY)) { LoadLevelPart (_I->second,LevelPartName(map_name,_I->first).c_str()); } } } } // snap list if (F->find_chunk(CHUNK_SNAPOBJECTS)) { shared_str buf; int cnt = F->r_u32(); if (cnt) { for (int i=0; i<cnt; ++i) { F->r_stringZ (buf); CCustomObject* O = FindObjectByName(buf.c_str(),OBJCLASS_SCENEOBJECT); if (!O) ELog.Msg(mtError,"EScene: Can't find snap object '%s'.",buf.c_str()); else m_ESO_SnapObjects.push_back(O); } } UpdateSnapList(); } Msg("EScene: %d objects loaded, %3.2f sec", ObjCount(), T.GetElapsed_sec() ); UI->UpdateScene(true); FS.r_close(F); SynchronizeObjects(); if (!bUndo) m_RTFlags.set(flRT_Unsaved|flRT_Modified,FALSE); return true; }else { ELog.Msg(mtError,"Can't find file: '%s'",map_name); } return false; }
//---------------------------------------------------- bool EScene::LoadLTX(LPCSTR map_name, bool bUndo) { DWORD version = 0; if (!map_name||(0==map_name[0])) return false; xr_string full_name; full_name = map_name; ELog.Msg( mtInformation, "EScene: loading '%s'", map_name); if (FS.exist(full_name.c_str())) { CTimer T; T.Start(); // lock main level CInifile ini(full_name.c_str()); version = ini.r_u32("version","value"); if (version!=CURRENT_FILE_VERSION) { ELog.DlgMsg( mtError, "EScene: unsupported file version. Can't load Level."); UI->UpdateScene(); return false; } m_LevelOp.ReadLTX (ini); Fvector hpb, pos; pos = ini.r_fvector3("camera","pos"); hpb = ini.r_fvector3("camera","hpb"); EDevice.m_Camera.Set(hpb,pos); EDevice.m_Camera.SetStyle(EDevice.m_Camera.GetStyle()); EDevice.m_Camera.SetStyle(EDevice.m_Camera.GetStyle()); m_GUID.LoadLTX (ini,"guid","guid"); m_OwnerName = ini.r_string("level_tag","owner"); m_CreateTime = ini.r_u32("level_tag","create_time"); SceneToolsMapPairIt _I = m_SceneTools.begin(); SceneToolsMapPairIt _E = m_SceneTools.end(); for (; _I!=_E; ++_I) { if (_I->second) { { if (!bUndo && _I->second->IsEnabled() && (_I->first!=OBJCLASS_DUMMY)) { xr_string fn = LevelPartName(map_name, _I->first).c_str(); LoadLevelPartLTX (_I->second, fn.c_str()); } } } } if(ini.section_exist("snap_objects")) { CInifile::Sect& S = ini.r_section("snap_objects"); CInifile::SectCIt Si = S.Data.begin(); CInifile::SectCIt Se = S.Data.end(); for(;Si!=Se; ++Si) { CCustomObject* O = FindObjectByName(Si->first.c_str(),OBJCLASS_SCENEOBJECT); if (!O) ELog.Msg(mtError,"EScene: Can't find snap object '%s'.",Si->second.c_str()); else m_ESO_SnapObjects.push_back(O); } UpdateSnapList(); } Msg("EScene: %d objects loaded, %3.2f sec", ObjCount(), T.GetElapsed_sec() ); UI->UpdateScene(true); SynchronizeObjects(); if (!bUndo) m_RTFlags.set(flRT_Unsaved|flRT_Modified,FALSE); return true; }else { ELog.Msg(mtError,"Can't find file: '%s'",map_name); } return false; }