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; 
}