//------------------------------------------------------------------------------
// 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_ANIMATION_LOADER_H_
#define TEXT_ANIMATION_LOADER_H_

namespace Lamp{

class TextReader;
class StreamTokenizer;
class AnimationManager;
class VectorInterpolator;
class RotationInterpolator;

//------------------------------------------------------------------------------
/**
 * テキストアニメーションローダ
 */
class TextAnimationLoader{
public:
	/**
	 * コンストラクタ
	 */
	TextAnimationLoader();

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

	/**
	 * ロード
	 * @param filePath ファイルパス
	 * @param manager ロード先アニメーションマネージャ
	 */
	virtual void load(const String& filePath, AnimationManager* manager);

	/**
	 * ロード
	 * @param textReader テキストリーダ
	 * @param manager ロード先アニメーションマネージャ
	 */
	virtual void load(TextReader* textReader, AnimationManager* manager);

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

	//--------------------------------------------------------------------------
	// アニメーションセット
	//--------------------------------------------------------------------------
	/**
	 * アニメーションセットリストの読み込み
	 */
	virtual void readAnimationSetList();

	/**
	 * アニメーションセットの読み込み
	 * @param name 名前
	 */
	virtual void readAnimationSet(const String& name);

	//--------------------------------------------------------------------------
	// カメラ
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションの読み込み
	 * @param name 名前
	 */
	virtual void readCameraAnimation(const String& name);

	/**
	 * カメラアニメーションデータの読み込み
	 * @param name 名前
	 */
	virtual void readCameraAnimationData(const String& name);

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードアニメーションの読み込み
	 * @param name 名前
	 */
	virtual void readSceneNodeAnimation(const String& name);

	/**
	 * シーンノードアニメーションデータの読み込み
	 * @param name 名前
	 */
	virtual void readSceneNodeAnimationData(const String& name);

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * キャラクタモデルアニメーションの読み込み
	 * @param name 名前
	 */
	virtual void readCharacterModelAnimation(const String& name);

	/**
	 * キャラクタモデルアニメーションデータの読み込み
	 * @param name 名前
	 */
	virtual void readCharacterModelAnimationData(const String& name);

	//--------------------------------------------------------------------------
	// アニメーションセットリンク
	//--------------------------------------------------------------------------
	/**
	 * アニメーションセットリンクリストの読み込み
	 */
	virtual void readAnimationSetLinkList();

	/**
	 * アニメーションセットリンクの読み込み
	 * @param name 名前
	 */
	virtual void readAnimationSetLink(const String& name);

	//--------------------------------------------------------------------------
	// カメラアニメーションリンク
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションリンクリスト読み込み
	 */
	virtual void readCameraLinkList();

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

	//--------------------------------------------------------------------------
	// キャラクタモデルアニメーションリンク
	//--------------------------------------------------------------------------
	/**
	 * キャラクタモデルアニメーションリンクリスト読み込み
	 */
	virtual void readCharacterModelLinkList();

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

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

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

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

	/**
	 * Quaternion値の読み込み
	 * @return Quaternion値
	 */
	virtual Quaternion readQuaternion();

	//--------------------------------------------------------------------------
	// ベクトル補間の読み込み
	//--------------------------------------------------------------------------
	/**
	 * ベクトル補間の読み込み
	 * @return ベクトル補間
	 */
	virtual VectorInterpolator* readVectorInterpolator();

	/**
	 * ベクトル定数補間の読み込み
	 * @return ベクトル定数補間
	 */
	virtual VectorInterpolator* readVectorConstantInterpolator();

	/**
	 * ベクトル配列補間の読み込み
	 * @return ベクトル配列補間
	 */
	virtual VectorInterpolator* readVectorArrayInterpolator();

	/**
	 * ベクトル線形補間の読み込み
	 * @return ベクトル線形補間
	 */
	virtual VectorInterpolator* readVectorLinearInterpolator();

	//--------------------------------------------------------------------------
	// 回転補間の読み込み
	//--------------------------------------------------------------------------
	/**
	 * 回転補間の読み込み
	 * @return 回転補間
	 */
	virtual RotationInterpolator* readRotationInterpolator();

	/**
	 * 回転定数補間の読み込み
	 * @return 回転定数補間
	 */
	virtual RotationInterpolator* readRotationConstantInterpolator();

	/**
	 * オイラー回転配列補間の読み込み
	 * @return オイラー回転配列補間
	 */
	virtual RotationInterpolator* readEulerArrayInterpolator();

	/**
	 * 四元数回転配列補間の読み込み
	 * @return 四元数回転配列補間
	 */
	virtual RotationInterpolator* readQuaternionArrayInterpolator();

	/**
	 * 四元数回転線形補間の読み込み
	 * @return 四元数回転線形補間
	 */
	virtual RotationInterpolator* readQuaternionLinearInterpolator();

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

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

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

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

	//--------------------------------------------------------------------------
	// メンバ
	//--------------------------------------------------------------------------
	/// トークナイザ
	StreamTokenizer* tokenizer_;
	/// アニメーションマネージャ
	AnimationManager* manager_;

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

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

};

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