/// @file ObjectManager.h
#ifndef MOBJECTMANAGER_H
#define MOBJECTMANAGER_H

#include "../model/ModelMaker.h"
#include "../xml/tinyxml.h"
#include "Indicator.h"
#include <list>

using namespace std;

//만일 상수를 써야한다면 enum형을 사용하자.
/*enum {
	INDICATOR = 0
};*/

/**
	@brief 렌더링을 위한 게임오브젝트 셋

	렌더링을 효율적으로 하기위한 클래스입니다.\n
	렌더링에 필요한 모델정보를 관리하며, 렌더링될 MObject를 List형태로 보관합니다.\n
	RenderMObject덕분에 MObject는 Model을 직접가지지 않고 대신 모델타입정보만 가져도 됩니다.\n
	RenderMObject의 실제인스턴스는 ObjectManager::load에서 생성되며, 관리는 MObjectSet에서 됩니다.
*/
class RenderMObject {
	public:
		RenderMObject(){
			aModel.pVB = NULL;
			aModel.pIB = NULL;
			aModel.pTexture = NULL;
		}
		~RenderMObject(){
			if(aModel.pVB != NULL){aModel.pVB->Release(); aModel.pVB = NULL;}
			if(aModel.pIB != NULL){aModel.pIB->Release();  aModel.pIB = NULL;}
			if(aModel.pTexture != NULL){aModel.pTexture->Release(); aModel.pTexture=NULL;}
		}
		Model aModel;
		list<MObject *> listMObject;
};

/**
	@brief MObject 및 RenderMObject 모임

	MObject관련 클래스중에서 개념상 가장 큰 클래스입니다.\n
	모델정보를 가지고 있는 RenderMObject와 MObject클래스를 상속받은 실제클래스들의 정보도 보관합니다.\n
	또한 실제 MObject 및 RenderObject에 대한 관리도 합니다.\n
	MObject의 자식클래스를 추가했다면, 이 MObjectSet에도 추가해줘야합니다.\n
	생성은 ObjectManager::load에서 되며 소멸은 생성한 클래스에서 담당합니다.
*/
class MObjectSet {
	public:
		MObjectSet(){
			pRenderMObject = NULL;
			pIndicator = NULL;
		}
		~MObjectSet(){
			if(pRenderMObject != NULL){delete[] pRenderMObject; pRenderMObject = NULL;}
			if(pIndicator != NULL){delete[] pIndicator; pIndicator = NULL;}
		}

		int numRenderMObject;
		RenderMObject* pRenderMObject;
		//enable to add MObjectType
		int numIndicator;
		Indicator* pIndicator;
};

/**
	@brief 오브젝트 관리 클래스

	오브젝트를 관리하는 static 멤버함수 클래스입니다.\n
	현재 오브젝트 개념은 MObject(렌더링이 가능한 오브젝트)와 동일합니다.
*/
class ObjectManager {
	public:
		static MObjectSet* load(LayerInfo* _pLayerInfo, TiXmlNode* _pSceneNode);
		static void camera(LayerInfo* _pLayerInfo, float _fX, float _fY, float _fZ);
		static void show(LayerInfo* _pLayerInfo, RenderMObject* _pRenderMObject);
};
#endif