//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * バイナリシーンローダヘッダ
 * @author Junpee
 */

#ifndef BINARY_SCENE_LOADER_H_
#define BINARY_SCENE_LOADER_H_

namespace Lamp{

class BinaryReader;
class TargaLoader;
class Scene;
class SceneNodeManager;
class SceneNode;
class LightManager;
class Light;
class ModelManager;
class CharacterModel;
class MeshManager;
class MeshDataManager;
class MeshData;
class MaterialManager;
class Material;
class BasicMaterial;
class TextureManager;
class PictureManager;
class Picture;

//------------------------------------------------------------------------------
/**
 * バイナリシーンローダ
 */
class BinarySceneLoader{
public:
	/**
	 * コンストラクタ
	 */
	BinarySceneLoader();

	/**
	 * デストラクタ
	 */
	virtual ~BinarySceneLoader();

	/**
	 * ロード
	 * @param filePath ファイルパス
	 * @param scene ロード先シーン
	 */
	virtual void load(const String& filePath, Scene* scene);

	/**
	 * ロード
	 * @param filePath ファイルパス
	 * @param scene ロード先シーン
	 * @param rootNode ロード先ルートノード
	 */
	virtual void load(const String& filePath, Scene* scene,
		SceneNode* rootNode);

	/**
	 * ロード
	 * @param binaryReader バイナリリーダ
	 * @param scene ロード先シーン
	 * @param basePath ベースパス
	 */
	virtual void load(BinaryReader* binaryReader, Scene* scene,
		const String& basePath = "");

	/**
	 * ロード
	 * @param binaryReader バイナリリーダ
	 * @param scene ロード先シーン
	 * @param rootNode ロード先ルートノード
	 * @param basePath ベースパス
	 */
	virtual void load(BinaryReader* binaryReader, Scene* scene,
		SceneNode* rootNode, const String& basePath = "");

protected:
	/**
	 * ヘッダの読み込み
	 */
	virtual void readHeader();

	//--------------------------------------------------------------------------
	// フォグ
	//--------------------------------------------------------------------------
	/**
	 * フォグの読み込み
	 */
	virtual void readFog();

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readSceneNodeList(int listSize);

	/**
	 * シーンノードの読み込み
	 */
	virtual void readSceneNode();

	/**
	 * レベルオブディティールシーンノードの読み込み
	 */
	virtual void readLODSceneNode();

	//--------------------------------------------------------------------------
	// ライト
	//--------------------------------------------------------------------------
	/**
	 * ライトリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readLightList(int listSize);

	/**
	 * ライトの読み込み
	 * @param light ライト
	 */
	virtual void readLight(Light* light);

	/**
	 * アンビエントライトの読み込み
	 */
	virtual void readAmbientLight();

	/**
	 * ディレクショナルライトの読み込み
	 */
	virtual void readDirectionalLight();

	/**
	 * ポイントライトの読み込み
	 */
	virtual void readPointLight();

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * モデルリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readModelList(int listSize);

	/**
	 * 標準モデルの読み込み
	 */
	virtual void readStandardModel();

	/**
	 * キャラクタモデルの読み込み
	 */
	virtual void readCharacterModel();

	/**
	 * ボーンの読み込み
	 * @param model 読込先モデル
	 */
	virtual void readBone(CharacterModel* model);

	//--------------------------------------------------------------------------
	// メッシュ
	//--------------------------------------------------------------------------
	/**
	 * メッシュリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readMeshList(int listSize);

	/**
	 * 剛体メッシュの読み込み
	 */
	virtual void readRigidMesh();

	/**
	 * キャラクタメッシュの読み込み
	 */
	virtual void readCharacterMesh();

	//--------------------------------------------------------------------------
	// メッシュデータ
	//--------------------------------------------------------------------------
	/**
	 * メッシュデータリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readMeshDataList(int listSize);

	/**
	 * メッシュデータの読み込み
	 */
	virtual void readMeshData();

	//--------------------------------------------------------------------------
	// マテリアル
	//--------------------------------------------------------------------------
	/**
	 * マテリアルリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readMaterialList(int listSize);

	/**
	 * マテリアルの読み込み
	 * @param material マテリアル
	 */
	virtual void readMaterial(Material* material);

	/**
	 * 基本マテリアルの読み込み
	 */
	virtual void readBasicMaterial();

	//--------------------------------------------------------------------------
	// テクスチャ
	//--------------------------------------------------------------------------
	/**
	 * テクスチャリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readTextureList(int listSize);

	/**
	 * サーフェーステクスチャの読み込み
	 */
	virtual void readSurfaceTexture();

	//--------------------------------------------------------------------------
	// ピクチャ
	//--------------------------------------------------------------------------
	/**
	 * ピクチャリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readPictureList(int listSize);

	/**
	 * RGB8ビットピクチャの読み込み
	 * @param name 名前
	 * @param loader Targaローダ
	 * @return 読み込んだピクチャ
	 */
	virtual Picture* readPictureRGB8(const String& name, TargaLoader& loader);

	/**
	 * RGBA8ビットピクチャの読み込み
	 * @param name 名前
	 * @param loader Targaローダ
	 * @return 読み込んだピクチャ
	 */
	virtual Picture* readPictureRGBA8(const String& name, TargaLoader& loader);

	//--------------------------------------------------------------------------
	// シーンノードリンク
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリンクリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readSceneNodeLinkList(int listSize);

	/**
	 * シーンノードリンクの読み込み
	 */
	virtual void readSceneNodeLink();

	//--------------------------------------------------------------------------
	// モデルリンク
	//--------------------------------------------------------------------------
	/**
	 * モデルリンクリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readModelLinkList(int listSize);

	/**
	 * モデルリンクの読み込み
	 */
	virtual void readModelLink();

	//--------------------------------------------------------------------------
	// メッシュリンク
	//--------------------------------------------------------------------------
	/**
	 * メッシュリンクリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readMeshLinkList(int listSize);

	/**
	 * メッシュリンクの読み込み
	 */
	virtual void readMeshLink();

	//--------------------------------------------------------------------------
	// マテリアルリンク
	//--------------------------------------------------------------------------
	/**
	 * マテリアルリンクリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readMaterialLinkList(int listSize);

	/**
	 * 基本マテリアルリンクの読み込み
	 */
	virtual void readBasicMaterialLink();

	//--------------------------------------------------------------------------
	// テクスチャリンク
	//--------------------------------------------------------------------------
	/**
	 * テクスチャリンクリストの読み込み
	 * @param listSize リストサイズ
	 */
	virtual void readTextureLinkList(int listSize);

	/**
	 * テクスチャリンクの読み込み
	 */
	virtual void readTextureLink();

	//--------------------------------------------------------------------------
	// 値の読み込み
	//--------------------------------------------------------------------------
	/**
	 * 文字列の読み込み
	 * @return 文字列
	 */
	virtual String readString();

	/**
	 * 三次元ベクトルの読み込み
	 * @return 三次元ベクトル
	 */
	virtual Vector3 readVector3();

	/**
	 * 3×4行列の読み込み
	 * @return 3×4行列
	 */
	virtual Matrix34 readMatrix34();

	/**
	 * 三要素整数カラー値の読み込み
	 * @return 三要素整数カラー値
	 */
	virtual Color3c readColor3c();

	/**
	 * 四要素整数カラー値の読み込み
	 * @return 四要素整数カラー値
	 */
	virtual Color4c readColor4c();

	/**
	 * 三要素実数カラー値の読み込み
	 * @return 三要素実数カラー値
	 */
	virtual Color3f readColor3f();

	/**
	 * 四要素実数カラー値の読み込み
	 * @return 四要素実数カラー値
	 */
	virtual Color4f readColor4f();

	/**
	 * 二次元テクスチャ座標値の読み込み
	 * @return 二次元テクスチャ座標値
	 */
	virtual TexCoord2 readTexCoord2();

	/**
	 * 軸沿いボックスの読み込み
	 * @return 軸沿いボックス
	 */
	virtual AxisAlignedBox readAxisAlignedBox();

	/**
	 * 球の読み込み
	 * @return 球
	 */
	virtual Sphere readSphere();

	//--------------------------------------------------------------------------
	// ユーティリティ
	//--------------------------------------------------------------------------
	/**
	 * アライメントを取る
	 */
	virtual void align();

	/**
	 * IDの読み込み
	 * @return ID
	 */
	virtual String readID();

	//--------------------------------------------------------------------------
	// メンバ
	//--------------------------------------------------------------------------
	/// リーダ
	BinaryReader* reader_;
	/// 文字列バッファサイズ
	static const int stringBufferSize_ = 256;
	/// 文字列バッファ
	char stringBuffer_[stringBufferSize_];
	/// ベースパス
	String basePath_;
	/// シーン
	Scene* scene_;
	/// ルートノード
	SceneNode* rootNode_;
	/// シーンノードマネージャ
	SceneNodeManager* sceneNodeManager_;
	/// ライトマネージャ
	LightManager* lightManager_;
	/// モデルマネージャ
	ModelManager* modelManager_;
	/// メッシュマネージャ
	MeshManager* meshManager_;
	/// メッシュデータマネージャ
	MeshDataManager* meshDataManager_;
	/// マテリアルマネージャ
	MaterialManager* materialManager_;
	/// テクスチャマネージャ
	TextureManager* textureManager_;
	/// ピクチャマネージャ
	PictureManager* pictureManager_;

private:
	// コピーコンストラクタの隠蔽
	BinarySceneLoader(const BinarySceneLoader& copy);

	// 代入コピーの隠蔽
	void operator =(const BinarySceneLoader& copy);

};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of BINARY_SCENE_LOADER_H_
//------------------------------------------------------------------------------
