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

namespace Lamp{

class BinaryReader;
class AnimationManager;
class VectorInterpolator;
class RotationInterpolator;

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

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

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

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

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

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

	//--------------------------------------------------------------------------
	// カメラ
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションの読み込み
	 */
	virtual void readCameraAnimation();

	/**
	 * カメラアニメーションデータの読み込み
	 */
	virtual void readCameraAnimationData();

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードアニメーションの読み込み
	 */
	virtual void readSceneNodeAnimation();

	/**
	 * シーンノードアニメーションデータの読み込み
	 */
	virtual void readSceneNodeAnimationData();

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

	/**
	 * キャラクタモデルアニメーションデータの読み込み
	 */
	virtual void readCharacterModelAnimationData();

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

	/**
	 * カメラアニメーションリンクの読み込み
	 */
	virtual void readCameraAnimationLink();

	/**
	 * シーンノードアニメーションリンクの読み込み
	 */
	virtual void readSceneNodeAnimationLink();

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

	//--------------------------------------------------------------------------
	// ベクトル補間の読み込み
	//--------------------------------------------------------------------------
	/**
	 * ベクトル補間の読み込み
	 * @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();

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

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

	/**
	 * 四元数の読み込み
	 * @return 四元数
	 */
	virtual Quaternion readQuaternion();

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

	//--------------------------------------------------------------------------
	// メンバ
	//--------------------------------------------------------------------------
	/// リーダ
	BinaryReader* reader_;
	/// アニメーションマネージャ
	AnimationManager* manager_;

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

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

};

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