/* ==========================================================================
* 작 성 자 : 이순규
* 작 성 일 : 2006.12.16
* 내    용 : 자원 관리자
* 주의사항 : 
1. 항상 마지막에 메모리 해제를 하도록 작성한다.
2. 자원에 대한 메모리 해제시 항상 자원의 RefCount를 체크한다.
3. NiNode는 한개의 NIF파일에 대응한다. 따라서 Child에 대해서 참조하는 경우는 없어야 한다.
*===========================================================================*/
#pragma once

#include "ModelInstance.h"
#include "TexturePalette.h"

NiSmartPointer(cTexturePalette);

/// 자원 관리자
class cResourceManager
{
	static cResourceManager* mSingleton;

public:
	cResourceManager();
	//cResourceManager( LPDIRECT3DDEVICE9 device );
	~cResourceManager();

	/// 지움
	void Clear();

	/// NIF 파일
	bool LoadNIF( const cString& pathName );

	/// KFM 파일
	bool LoadKFM( const cString& pathName );

	/// 엔진 텍스처 파일
	NiTexture* LoadNiTexture( const cString& pathName, bool useMipMap = true );
	void RemoveTexture( NiTexture* tex );
	//bool LoadTexture( const cString& pathName, LPDIRECT3DTEXTURE9* texture );
	//void RemoveTexture( LPDIRECT3DTEXTURE9 tex );

	/// 텍스처
	LPDIRECT3DTEXTURE9 LoadD3DTexture( const cString& pathName );

	/// 엔진 노드를 제거
	bool RemoveNiNode( const char* name );
	bool RemoveNiNode( NiNode* node );

	/// 모든 엔진 노드를 제거
	void RemoveAllNiNodes();

	/// 엔진 노드의 수를 리턴
	unsigned int GetNumNiNodes() const;

	/// 엔진 노드를 리턴
	NiNode* GetNiNode( unsigned int index ) const;
	NiNode* GetNiNode( const cString& fileName ) const;

	/// 엔진 노드를 복제
	NiNode* CloneNiNode( unsigned int index );
	NiNode* CloneNiNode( const cString& pathName );

	// KFM 파일 관리 함수들
	unsigned int AddModel( cModelInstance* model, const cString& name );
	void RemoveAllModels();

	unsigned int GetNumModels() const;
	cModelInstance* GetModel( unsigned int index ) const;
	cModelInstance* GetModel( const cString& name );

	/// 그림자 텍스처
	NiTexture* GetShadowTexture() const;

protected:
	/// 엔진 노드를 추가
	unsigned int AddNiNode( NiNode* node );

public:
	/// 단일체를 리턴
	static cResourceManager* GetSingleton();

protected:
	/// 기반 디렉토리
	cString mBaseDir;

	/// 엔진 텍스처 팔레트
	cTexturePalettePtr mNiTexturePalette;

	/// 텍스처 맵
	typedef tHashMap<cString, NiTexturePtr> cNiTextureMap;
	cNiTextureMap mNiTextureMap;

	/// 그림자 텍스처
	NiTexture* mShadowTexture;

	/// 엔진 노드 배열
	NiTObjectArray<NiNodePtr> mNiNodeArray;

	/// 엔진 노드 인덱스 맵
	typedef tHashMap<cString, unsigned int> cNiNodeIndexMap;
	cNiNodeIndexMap mNiNodeIndexMap;

	// 애니메이션을 관장하는 KFM파일을 가지는 클래스의 변형..
	NiTObjectArray<cModelInstancePtr> mModelArray;
	NiTStringPointerMap<unsigned int> mModelIndexMap;
};

inline
unsigned int cResourceManager::GetNumNiNodes() const
{
	return mNiNodeArray.GetSize();
}

inline
unsigned int cResourceManager::GetNumModels() const
{
	return mModelArray.GetSize();
}

inline
NiTexture* cResourceManager::GetShadowTexture() const
{
	return mShadowTexture;
}

inline
cResourceManager* cResourceManager::GetSingleton()
{
	return mSingleton;
}

#define RESOURCEMAN	cResourceManager::GetSingleton()
