www.pudn.com > notWow.rar > SceneMgr.cpp
#include "SceneMgr.h"
#include "ModelMgr.h"
#include "HeroCtrl.h"
#include "Camera.h"
extern ModelsManager g_MdlMgr;
extern HeroController g_HeroCtrl;
extern Camera g_Camera;
bool Scene::Init(LPDIRECT3DDEVICE9 pd3dDevice,const char *Name,ScriptID ID)
{
m_NPCMgr.Init();
return m_Map.Init(pd3dDevice,Name,"Sky.jpg",ID);
}
void Scene::Free()
{
m_NPCMgr.Free();
m_Map.Free();
}
void Scene::Update(float fTime)
{
// Update Char state
for(int i = 0 ; i < m_NPCMgr.m_NPCs.size() ; ++ i)
{
m_NPCMgr.m_NPCs[i].Update(fTime);
}
m_Map.Update();
// Cull NPC here!
}
// Need fix
void Scene::Render()
{
m_Map.Render();
//list::iterator Itr;
//for(Itr = m_Map.m_ObjectsList.begin(); Itr != m_Map.m_ObjectsList.end() ; Itr ++)
//{
// Itr->Render(g_Camera.GetViewProj());
//}
for(int i = 0 ; i < m_NPCMgr.m_NPCs.size() ; ++ i)
{
m_NPCMgr.m_NPCs[i].Render(g_Camera.GetViewProj());
}
}
bool Scene::OnCreate()
{
return true;
}
void Scene::OnDestory()
{
}
bool Scene::OnReset()
{
return m_Map.Reset();
}
void Scene::OnLost()
{
m_Map.Lost();
}
SceneID ScenesManager::AddScene(const char* Name,ScriptID ID)
{
map::iterator Itr;
Itr = m_NameMap.find(Name);
if(Itr == m_NameMap.end())
{
SceneID id = m_MinPos;
Scene *pScene = new Scene;
if(!pScene->Init(m_pd3dDevice,Name,ID))
{
delete pScene;
return -1;
}
if(id == m_Scenes.size())
{
m_MinPos ++;
m_Scenes.push_back(pScene);
m_RefCounters.push_back(1);
}
else
{
m_Scenes[id] = pScene;
m_RefCounters[id] = 1;
short i = id + 1;
while(i < m_Scenes.size())
{
if(m_Scenes[i] == NULL)
{
break;
}
}
m_MinPos = i;
}
m_NameMap.insert(make_pair(Name,id));
m_nScenes ++;
return id;
}
else
{
m_RefCounters[Itr->second] ++;
return Itr->second;
}
}
void ScenesManager::Delete(SceneID id)
{
if(id < 0 || id >= m_Scenes.size())
return ;
if(m_Scenes[id] == NULL)
return ;
if(m_RefCounters[id] > 1)
{
m_RefCounters[id] --;
}
else
{
m_RefCounters[id] = 0;
m_Scenes[id]->Free();
delete m_Scenes[id];
m_Scenes[id] = NULL;
if(id < m_MinPos)
m_MinPos = id;
m_nScenes --;
for(map::iterator Itr = m_NameMap.begin() ; Itr != m_NameMap.end() ; Itr ++)
{
if(Itr->second == id)
{
m_NameMap.erase(Itr);
return;
}
}
}
}
void ScenesManager::Init(LPDIRECT3DDEVICE9 pd3dDevice)
{
Free();
m_pd3dDevice = pd3dDevice;
}
void ScenesManager::Free()
{
for(int i = 0 ; i < m_Scenes.size(); ++ i)
{
if(m_Scenes[i] == NULL)
continue;
m_Scenes[i]->Free();
delete m_Scenes[i];
m_Scenes[i] = NULL;
}
m_Scenes.clear();
m_RefCounters.clear();
m_nScenes = 0;
m_MinPos = 0;
m_NameMap.clear();
m_pd3dDevice = NULL;
m_CurSceneID = -1;
}
void ScenesManager::OnDestory()
{
}
bool ScenesManager::OnCreate()
{
return true;
}
void ScenesManager::OnLost()
{
for(int i = 0 ; i < m_Scenes.size(); ++ i)
{
m_Scenes[i]->OnLost();
}
}
bool ScenesManager::OnReset()
{
for(int i = 0 ; i < m_Scenes.size(); ++ i)
{
m_Scenes[i]->OnReset();
}
return true;
}