//------------------------------------------------------------------------------
// 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 TEXT_SCENE_LOADER_H_
#define TEXT_SCENE_LOADER_H_

namespace Lamp{

class TextReader;
class TargaLoader;
class StreamTokenizer;
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 TextureManager;
class PictureManager;
class Picture;

//------------------------------------------------------------------------------
/**
 * テキストシーンローダ
 */
class TextSceneLoader{
public:
	/**
	 * コンストラクタ
	 */
	TextSceneLoader();

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

	/**
	 * ロード
	 * @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 textReader テキストリーダ
	 * @param scene ロード先シーン
	 * @param basePath ベースパス
	 */
	virtual void load(TextReader* textReader, Scene* scene,
		const String& basePath = "");

	/**
	 * ロード
	 * @param textReader テキストリーダ
	 * @param scene ロード先シーン
	 * @param rootNode ロード先ルートノード
	 * @param basePath ベースパス
	 */
	virtual void load(TextReader* textReader, Scene* scene,
		SceneNode* rootNode, const String& basePath = "");

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

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

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリストの読み込み
	 */
	virtual void readSceneNodeList();

	/**
	 * シーンノードの読み込み
	 * @param name 名前
	 */
	virtual void readSceneNode(const String& name);

	/**
	 * レベルオブディティールシーンノードの読み込み
	 * @param name 名前
	 */
	virtual void readLODSceneNode(const String& name);

	//--------------------------------------------------------------------------
	// ライト
	//--------------------------------------------------------------------------
	/**
	 * ライトリストの読み込み
	 */
	virtual void readLightList();

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

	/**
	 * アンビエントライトの読み込み
	 * @param name 名前
	 */
	virtual void readAmbientLight(const String& name);

	/**
	 * ディレクショナルライトの読み込み
	 * @param name 名前
	 */
	virtual void readDirectionalLight(const String& name);

	/**
	 * ポイントライトの読み込み
	 * @param name 名前
	 */
	virtual void readPointLight(const String& name);

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * モデルリストの読み込み
	 */
	virtual void readModelList();

	/**
	 * 標準モデルの読み込み
	 * @param name 名前
	 */
	virtual void readStandardModel(const String& name);

	/**
	 * キャラクタモデルの読み込み
	 * @param name 名前
	 */
	virtual void readCharacterModel(const String& name);

	/**
	 * ボーンの読み込み
	 * @param model 読込先モデル
	 * @param name 名前
	 */
	virtual void readBone(CharacterModel* model, const String& name);

	//--------------------------------------------------------------------------
	// メッシュ
	//--------------------------------------------------------------------------
	/**
	 * メッシュリストの読み込み
	 */
	virtual void readMeshList();

	/**
	 * 剛体メッシュの読み込み
	 * @param name 名前
	 */
	virtual void readRigidMesh(const String& name);

	/**
	 * キャラクタメッシュの読み込み
	 * @param name 名前
	 */
	virtual void readCharacterMesh(const String& name);

	//--------------------------------------------------------------------------
	// メッシュデータ
	//--------------------------------------------------------------------------
	/**
	 * メッシュデータリストの読み込み
	 */
	virtual void readMeshDataList();

	/**
	 * メッシュデータの読み込み
	 * @param name 名前
	 */
	virtual void readMeshData(const String& name);

	//--------------------------------------------------------------------------
	// マテリアル
	//--------------------------------------------------------------------------
	/**
	 * マテリアルリストの読み込み
	 */
	virtual void readMaterialList();

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

	/**
	 * 基本マテリアルの読み込み
	 * @param name 名前
	 */
	virtual void readBasicMaterial(const String& name);

	//--------------------------------------------------------------------------
	// テクスチャ
	//--------------------------------------------------------------------------
	/**
	 * テクスチャリストの読み込み
	 */
	virtual void readTextureList();

	/**
	 * サーフェーステクスチャの読み込み
	 * @param name 名前
	 */
	virtual void readSurfaceTexture(const String& name);

	//--------------------------------------------------------------------------
	// ピクチャ
	//--------------------------------------------------------------------------
	/**
	 * ピクチャリストの読み込み
	 */
	virtual void readPictureList();

	/**
	 * 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);

	//--------------------------------------------------------------------------
	// シーンノードリンク
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリンクリストの読み込み
	 */
	virtual void readSceneNodeLinkList();

	/**
	 * シーンノードリンクの読み込み
	 * @param name 名前
	 */
	virtual void readSceneNodeLink(const String& name);

	//--------------------------------------------------------------------------
	// モデルリンク
	//--------------------------------------------------------------------------
	/**
	 * モデルリンクリストの読み込み
	 */
	virtual void readModelLinkList();

	/**
	 * モデルリンクの読み込み
	 * @param name 名前
	 */
	virtual void readModelLink(const String& name);

	//--------------------------------------------------------------------------
	// メッシュリンク
	//--------------------------------------------------------------------------
	/**
	 * メッシュリンクリストの読み込み
	 */
	virtual void readMeshLinkList();

	/**
	 * メッシュリンクの読み込み
	 * @param name 名前
	 */
	virtual void readMeshLink(const String& name);

	//--------------------------------------------------------------------------
	// マテリアルリンク
	//--------------------------------------------------------------------------
	/**
	 * マテリアルリンクリストの読み込み
	 */
	virtual void readMaterialLinkList();

	/**
	 * 基本マテリアルリンクの読み込み
	 * @param name 名前
	 */
	virtual void readBasicMaterialLink(const String& name);

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

	/**
	 * テクスチャリンクの読み込み
	 * @param name 名前
	 */
	virtual void readTextureLink(const String& name);

	//--------------------------------------------------------------------------
	// 値の読み込み
	//--------------------------------------------------------------------------
	/**
	 * bool値の読み込み
	 * @return bool値
	 */
	virtual bool readBool();

	/**
	 * u_char値の読み込み
	 * @return u_char値
	 */
	virtual u_char readUChar();

	/**
	 * u_short値の読み込み
	 * @return u_short値
	 */
	virtual u_short readUShort();

	/**
	 * int値の読み込み
	 * @return int値
	 */
	virtual int readInt();

	/**
	 * u_int値の読み込み
	 * @return u_int値
	 */
	virtual u_int readUInt();

	/**
	 * float値の読み込み
	 * @return float値
	 */
	virtual float readFloat();

	/**
	 * Vector3値の読み込み
	 * @return Vector3値
	 */
	virtual Vector3 readVector3();

	/**
	 * Matrix34値の読み込み
	 * @return Matrix34値
	 */
	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();

	//--------------------------------------------------------------------------
	// ユーティリティ
	//--------------------------------------------------------------------------
	/**
	 * トークンの読み込み
	 * @param caller 呼び出し元
	 */
	virtual String readToken(const String& caller);

	/**
	 * 指定ワードの読み飛ばし
	 * @param word 読み飛ばすワード
	 */
	virtual void skipWord(const String& word);

	/**
	 * チャンクを開く
	 */
	virtual void openChunk(){ skipWord("{"); }

	/**
	 * チャンクを閉じる
	 */
	virtual void closeChunk(){ skipWord("}"); }

	/**
	 * チャンクの読み飛ばし
	 */
	virtual void skipChunk();

	//--------------------------------------------------------------------------
	// メンバ
	//--------------------------------------------------------------------------
	/// ベースパス
	String basePath_;
	/// トークナイザ
	StreamTokenizer* tokenizer_;
	/// シーン
	Scene* scene_;
	/// ルートノード
	SceneNode* rootNode_;
	/// シーンノードマネージャ
	SceneNodeManager* sceneNodeManager_;
	/// ライトマネージャ
	LightManager* lightManager_;
	/// モデルマネージャ
	ModelManager* modelManager_;
	/// メッシュマネージャ
	MeshManager* meshManager_;
	/// メッシュデータマネージャ
	MeshDataManager* meshDataManager_;
	/// マテリアルマネージャ
	MaterialManager* materialManager_;
	/// テクスチャマネージャ
	TextureManager* textureManager_;
	/// ピクチャマネージャ
	PictureManager* pictureManager_;

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

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

};

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