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

namespace Lamp{

class TextWriter;
class Scene;
class Fog;
class SceneNodeManager;
class LightManager;
class ModelManager;
class MeshManager;
class MeshDataManager;
class MaterialManager;
class TextureManager;
class PictureManager;

class SceneNode;
class LODSceneNode;
class Light;
class AmbientLight;
class DirectionalLight;
class PointLight;
class Model;
class StandardModel;
class CharacterModel;
class Bone;
class Mesh;
class RigidMesh;
class CharacterMesh;
class MeshData;
class Material;
class BasicMaterial;
class Texture;
class SurfaceTexture;
class Picture;

//------------------------------------------------------------------------------
/**
 * テキストシーンセーバ
 */
class TextSceneSaver{
public:
	/**
	 * コンストラクタ
	 */
	TextSceneSaver();

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

	/**
	 * セーブ
	 * @param filePath ファイルパス
	 * @param scene セーブするシーン
	 */
	virtual void save(const String& filePath, Scene* scene);

	/**
	 * セーブ
	 * @param textWriter テキストライタ
	 * @param scene セーブするシーン
	 * @param basePath ベースパス
	 */
	virtual void save(TextWriter* textWriter, Scene* scene,
		const String& basePath = "");

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

	/**
	 * オブジェクトリストの書き出し
	 * @return オブジェクト数
	 */
	virtual int writeObjectList();

	/**
	 * リンクの書き出し
	 * @param objectCount オブジェクト数
	 */
	virtual void writeLink(int objectCount);

	//--------------------------------------------------------------------------
	// フォグ
	//--------------------------------------------------------------------------
	/**
	 * フォグの書き出し
	 * @param fog フォグ
	 */
	virtual void writeFog(Fog* fog);

	//--------------------------------------------------------------------------
	// シーンノード
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリストの書き出し
	 */
	virtual void writeSceneNodeList();

	/**
	 * シーンノードの書き出し
	 * @param sceneNode 書き出すシーンノード
	 */
	virtual void writeSceneNode(SceneNode* sceneNode);

	/**
	 * レベルオブディティールシーンノードの書き出し
	 * @param sceneNode 書き出すレベルオブディティールシーンノード
	 */
	virtual void writeLODSceneNode(LODSceneNode* sceneNode);

	//--------------------------------------------------------------------------
	// ライト
	//--------------------------------------------------------------------------
	/**
	 * ライトリストの書き出し
	 */
	virtual void writeLightList();

	/**
	 * ライトの書き出し
	 * @param light 書き出すライト
	 */
	virtual void writeLight(Light* light);

	/**
	 * アンビエントライトの書き出し
	 * @param light 書き出すライト
	 */
	virtual void writeAmbientLight(AmbientLight* light);

	/**
	 * ディレクショナルライトの書き出し
	 * @param light 書き出すライト
	 */
	virtual void writeDirectionalLight(DirectionalLight* light);

	/**
	 * ポイントライトの書き出し
	 * @param light 書き出すライト
	 */
	virtual void writePointLight(PointLight* light);

	//--------------------------------------------------------------------------
	// モデル
	//--------------------------------------------------------------------------
	/**
	 * モデルリストの書き出し
	 */
	virtual void writeModelList();

	/**
	 * 標準モデルの書き出し
	 * @param model 書き出すモデル
	 */
	virtual void writeStandardModel(StandardModel* model);

	/**
	 * キャラクタモデルの書き出し
	 * @param model 書き出すモデル
	 */
	virtual void writeCharacterModel(CharacterModel* model);

	/**
	 * ボーンの書き出し
	 * @param bone 書き出すボーン
	 */
	virtual void writeBone(Bone* bone);

	/**
	 * ボーンリンクの書き出し
	 * @param bone 書き出すボーン
	 */
	virtual void writeBoneLink(Bone* bone);

	//--------------------------------------------------------------------------
	// メッシュ
	//--------------------------------------------------------------------------
	/**
	 * メッシュリストの書き出し
	 */
	virtual void writeMeshList();

	/**
	 * 剛体メッシュの書き出し
	 * @param mesh 書き出すメッシュ
	 */
	virtual void writeRigidMesh(RigidMesh* mesh);

	/**
	 * キャラクタメッシュの書き出し
	 * @param mesh 書き出すメッシュ
	 */
	virtual void writeCharacterMesh(CharacterMesh* mesh);

	//--------------------------------------------------------------------------
	// メッシュデータ
	//--------------------------------------------------------------------------
	/**
	 * メッシュデータリストの書き出し
	 */
	virtual void writeMeshDataList();

	/**
	 * メッシュデータの書き出し
	 * @param meshData 書き出すメッシュデータ
	 */
	virtual void writeMeshData(MeshData* meshData);

	//--------------------------------------------------------------------------
	// マテリアル
	//--------------------------------------------------------------------------
	/**
	 * マテリアルリストの書き出し
	 */
	virtual void writeMaterialList();

	/**
	 * マテリアルの書き出し
	 * @param material 書き出すマテリアル
	 */
	virtual void writeMaterial(const Material* material);

	/**
	 * 基本マテリアルの書き出し
	 * @param material 書き出すマテリアル
	 */
	virtual void writeBasicMaterial(const BasicMaterial* material);

	//--------------------------------------------------------------------------
	// テクスチャ
	//--------------------------------------------------------------------------
	/**
	 * テクスチャリストの書き出し
	 */
	virtual void writeTextureList();

	/**
	 * サーフェーステクスチャの書き出し
	 * @param texture 書き出すテクスチャ
	 */
	virtual void writeSurfaceTexture(const SurfaceTexture* texture);

	//--------------------------------------------------------------------------
	// ピクチャ
	//--------------------------------------------------------------------------
	/**
	 * ピクチャの書き出し
	 * @param picture 書き出すピクチャ
	 */
	virtual void writePicture(const Picture* picture);

	//--------------------------------------------------------------------------
	// リンク
	//--------------------------------------------------------------------------
	/**
	 * シーンノードリンクの書き出し
	 * @param sceneNode 書き出すシーンノード
	 */
	virtual void writeSceneNodeLink(SceneNode* sceneNode);

	/**
	 * モデルリンクの書き出し
	 * @param model 書き出すモデル
	 */
	virtual void writeModelLink(const Model* model);

	/**
	 * メッシュリンクの書き出し
	 * @param mesh 書き出すメッシュ
	 */
	virtual void writeMeshLink(const Mesh* mesh);

	/**
	 * マテリアルリンクリストの書き出し
	 */
	virtual void writeMaterialLinkList();

	/**
	 * 基本マテリアルリンクの書き出し
	 * @param material 書き出すマテリアル
	 */
	virtual void writeBasicMaterialLink(const BasicMaterial* material);

	/**
	 * テクスチャリンクの書き出し
	 * @param texture 書き出すテクスチャ
	 */
	virtual void writeTextureLink(const Texture* texture);

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

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

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

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

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

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

};

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