//------------------------------------------------------------------------------
// 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_COLLISION_LOADER_H_
#define TEXT_COLLISION_LOADER_H_

namespace Lamp{

class TextReader;
class StreamTokenizer;
class CollisionScene;
class CollisionNode;

//------------------------------------------------------------------------------
/**
 * テキストコリジョンローダ
 */
class TextCollisionLoader{
public:
	/**
	 * コンストラクタ
	 */
	TextCollisionLoader();

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

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

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

	/**
	 * ロード
	 * @param textReader テキストリーダ
	 * @param scene ロード先シーン
	 */
	virtual void load(TextReader* textReader, CollisionScene* scene);

	/**
	 * ロード
	 * @param textReader テキストリーダ
	 * @param scene ロード先シーン
	 * @param node ロード先ノード
	 */
	virtual void load(TextReader* textReader, CollisionScene* scene,
		CollisionNode* node);

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

	//--------------------------------------------------------------------------
	// コリジョンノード
	//--------------------------------------------------------------------------
	/**
	 * コリジョンノードリストの読み込み
	 */
	virtual void readCollisionNodeList();

	/**
	 * コリジョンノードの読み込み
	 * @param name 名前
	 */
	virtual void readCollisionNode(const String& name);

	//--------------------------------------------------------------------------
	// コリジョンリーフ
	//--------------------------------------------------------------------------
	/**
	 * コリジョンリーフリストの読み込み
	 */
	virtual void readCollisionLeafList();

	/**
	 * 静的球コリジョンの読み込み
	 * @param name 名前
	 */
	virtual void readStaticSphere(const String& name);

	/**
	 * 静的変形メッシュコリジョンの読み込み
	 * @param name 名前
	 */
	virtual void readStaticDeformedMesh(const String& name);

	//--------------------------------------------------------------------------
	// コリジョンリンク
	//--------------------------------------------------------------------------
	/**
	 * コリジョンリンクリストの読み込み
	 */
	virtual void readCollisionLinkList();

	/**
	 * コリジョンリンクの読み込み
	 * @param name 名前
	 */
	virtual void readCollisionLink(const String& name);

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

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

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

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

	/**
	 * 三角の読み込み
	 * @return 三角
	 */
	virtual Triangle readTriangle();

	//--------------------------------------------------------------------------
	// ユーティリティ
	//--------------------------------------------------------------------------
	/**
	 * トークンの読み込み
	 * @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();

	//--------------------------------------------------------------------------
	// メンバ
	//--------------------------------------------------------------------------
	/// トークナイザ
	StreamTokenizer* tokenizer_;
	/// シーン
	CollisionScene* scene_;
	/// ルートノード
	CollisionNode* rootNode_;

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

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

};

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