//------------------------------------------------------------------------------
// 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_SAVER_H_
#define TEXT_ANIMATION_SAVER_H_

namespace Lamp{

class TextWriter;
class AnimationManager;
class VectorInterpolator;
class VectorConstantInterpolator;
class VectorArrayInterpolator;
class VectorLinearInterpolator;
class RotationInterpolator;
class RotationConstantInterpolator;
class EulerArrayInterpolator;
class QuaternionArrayInterpolator;
class QuaternionLinearInterpolator;
class AnimationSet;
class CameraAnimation;
class CameraAnimationData;
class SceneNodeAnimation;
class SceneNodeAnimationData;
class CharacterModelAnimation;
class CharacterModelAnimationData;

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

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

	/**
	 * セーブ
	 * @param filePath ファイルパス
	 * @param manager セーブするアニメーションマネージャ
	 */
	virtual void save(const String& filePath, AnimationManager* manager);

	/**
	 * セーブ
	 * @param textWriter テキストライタ
	 * @param manager セーブするアニメーションマネージャ
	 */
	virtual void save(TextWriter* textWriter, AnimationManager* manager);

protected:
	/**
	 * ヘッダの書き出し
	 */
	virtual void writeHeader();

	/**
	 * オブジェクトのカウント
	 * @return オブジェクト数
	 */
	virtual int countObjects();

	/**
	 * アニメーションリストの書き出し
	 */
	virtual void writeAnimationList();

	/**
	 * リンクの書き出し
	 */
	virtual void writeLink();

	//--------------------------------------------------------------------------
	// アニメーションセット
	//--------------------------------------------------------------------------
	/**
	 * アニメーションセットの書き出し
	 * @param animation 書き出すアニメーションセット
	 */
	virtual void writeAnimationSet(AnimationSet* animation);

	//--------------------------------------------------------------------------
	// カメラ
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションの書き出し
	 * @param animation 書き出すカメラアニメーション
	 */
	virtual void writeCameraAnimation(CameraAnimation* animation);

	/**
	 * カメラアニメーションデータの書き出し
	 * @param data 書き出すカメラアニメーションデータ
	 */
	virtual void writeCameraAnimationData(CameraAnimationData* data);

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードアニメーションの書き出し
	 * @param animation 書き出すシーンノードアニメーション
	 */
	virtual void writeSceneNodeAnimation(SceneNodeAnimation* animation);

	/**
	 * シーンノードアニメーションデータの書き出し
	 * @param data 書き出すシーンノードアニメーションデータ
	 */
	virtual void writeSceneNodeAnimationData(SceneNodeAnimationData* data);

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * キャラクタモデルアニメーションの書き出し
	 * @param animation 書き出すキャラクタモデルアニメーション
	 */
	virtual void writeCharacterModelAnimation(
		CharacterModelAnimation* animation);

	/**
	 * キャラクタモデルアニメーションデータの書き出し
	 * @param data 書き出すキャラクタモデルアニメーションデータ
	 */
	virtual void writeCharacterModelAnimationData(
		CharacterModelAnimationData* data);

	//--------------------------------------------------------------------------
	// リンク
	//--------------------------------------------------------------------------
	/**
	 * アニメーションセットリンクの書き出し
	 * @param animation リンクを書き出すアニメーションセット
	 */
	virtual void writeAnimationSetLink(AnimationSet* animation);

	/**
	 * カメラアニメーションリンクの書き出し
	 * @param animation リンクを書き出すカメラアニメーション
	 */
	virtual void writeCameraAnimationLink(CameraAnimation* animation);

	/**
	 * シーンノードアニメーションリンクの書き出し
	 * @param animation リンクを書き出すシーンノードアニメーション
	 */
	virtual void writeSceneNodeAnimationLink(SceneNodeAnimation* animation);

	/**
	 * キャラクタモデルアニメーションリンクの書き出し
	 * @param animation リンクを書き出すキャラクタモデルアニメーション
	 */
	virtual void writeCharacterModelAnimationLink(
		CharacterModelAnimation* animation);

	//--------------------------------------------------------------------------
	// ベクトル補間
	//--------------------------------------------------------------------------
	/**
	 * ベクトル補間の書き出し
	 * @param interpolator ベクトル補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeVectorInterpolator(
		VectorInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * ベクトル定数補間の書き出し
	 * @param interpolator ベクトル定数補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeVectorConstantInterpolator(
		VectorConstantInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * ベクトル配列補間の書き出し
	 * @param interpolator ベクトル配列補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeVectorArrayInterpolator(
		VectorArrayInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * ベクトル線形補間の書き出し
	 * @param interpolator ベクトル線形補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeVectorLinearInterpolator(
		VectorLinearInterpolator* interpolator,
		const String& name, const String& tabDepth);

	//--------------------------------------------------------------------------
	// 回転補間
	//--------------------------------------------------------------------------
	/**
	 * 回転補間の書き出し
	 * @param interpolator 回転補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeRotationInterpolator(
		RotationInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * 回転定数補間の書き出し
	 * @param interpolator 回転定数補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeRotationConstantInterpolator(
		RotationConstantInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * オイラー回転配列補間の書き出し
	 * @param interpolator オイラー回転配列補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeEulerArrayInterpolator(
		EulerArrayInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * 四元数回転配列補間の書き出し
	 * @param interpolator 四元数回転配列補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeQuaternionArrayInterpolator(
		QuaternionArrayInterpolator* interpolator,
		const String& name, const String& tabDepth);

	/**
	 * 四元数回転線形補間の書き出し
	 * @param interpolator 四元数回転線形補間
	 * @param name 名前
	 * @param tabDepth タブ深度
	 */
	virtual void writeQuaternionLinearInterpolator(
		QuaternionLinearInterpolator* interpolator,
		const String& name, const String& tabDepth);

	//--------------------------------------------------------------------------
	// ユーティリティ
	//--------------------------------------------------------------------------
	/**
	 * boolの書き出し
	 */
	virtual void writeBool(bool);

	/**
	 * 線コメントの書き出し
	 */
	virtual void writeLineComment();

	/**
	 * ブロックコメントの書き出し
	 * @param blockName ブロック名
	 */
	virtual void writeBlockComment(const String& blockName);

	/// ライタ
	TextWriter* writer_;
	/// アニメーションマネージャ
	AnimationManager* manager_;

	/// アニメーションカウント
	int animationCount_;
	/// アニメーションセットカウント
	int animationSetCount_;
	/// カメラアニメーションカウント
	int cameraCount_;
	/// シーンノードアニメーションカウント
	int sceneNodeCount_;
	/// キャラクタモデルアニメーションカウント
	int characterModelCount_;

	/// アニメーションデータカウント
	int animationDataCount_;
	/// カメラアニメーションデータカウント
	int cameraDataCount_;
	/// シーンノードアニメーションデータカウント
	int sceneNodeDataCount_;
	/// キャラクタモデルアニメーションデータカウント
	int characterModelDataCount_;

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

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

};

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