// Liquid3D - Moteur 3D C++ NDS par Morukutsu
// Surcouche de l'ulibrary de Brunni
// Version alpha 1

#include "CSceneManager.h"

namespace L3D
{
	//Constructeur/detructeur
	CSceneManager::CSceneManager()
	{
		mNodeCount = 0;
	}

	CSceneManager::~CSceneManager()
	{
		Clear();
	}

	//Ajout/Retrait de noeuds de la scene
	void CSceneManager::Push(CSceneNode* node)
	{
		//Ajoute un noeud à la liste
		//A ne pas utiliser si la liste est en train d'être parcourue
		mNodes.push_back(node);
		//Noeuds particuliefs
		if(node->mNodeType == NODETYPE_CAM)
			mCam = static_cast<CCameraNode*>(node);
	}

	void CSceneManager::Pop(CSceneNode* nod)
	{
		//Supprime directement un élement de la liste
		//A ne pas utiliser si la liste est en train d'être parcourue
		for(mNodesItor = mNodes.begin(); mNodesItor != mNodes.end (); ++mNodesItor)
		{
			if((*mNodesItor) == nod)
			{
				delete (*mNodesItor);
				mNodes.erase(mNodesItor);
				break;
			}
		}
	}

	void CSceneManager::Clear()
	{
		//Affichage de tout les noeuds dans la lste
		for(mNodesItor = mNodes.begin(); mNodesItor != mNodes.end (); ++mNodesItor)
			Pop(*mNodesItor);
	}

	//Affichage des noeuds
	void CSceneManager::Draw()
	{
		//Affichage de tout les noeuds dans la lste
		for(mNodesItor = mNodes.begin(); mNodesItor != mNodes.end (); ++mNodesItor)
			(*mNodesItor)->Draw();
	}

	//Update des noeuds
	void CSceneManager::Update()
	{
		//Affichage de tout les noeuds dans la lste
		for(mNodesItor = mNodes.begin(); mNodesItor != mNodes.end (); ++mNodesItor)
			(*mNodesItor)->Update();
	}
	
	//Gestion de la caméra
	void CSceneManager::SetupCamera()
	{
		mCam->ApplyCamera();
	}	
};