//------------------------------------------------------------------------------
// 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 ANIMATION_SET_H_
#define ANIMATION_SET_H_

#include <Animation/System/Animation.h>
#include <Core/Container/ArrayList.h>

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * アニメーションセット
 */
class AnimationSet : public Animation{
friend class AnimationManager;
public:
	//--------------------------------------------------------------------------
	// アニメーションインターフェース
	//--------------------------------------------------------------------------
	/**
	 * アニメーションの追加
	 * @param animation 追加するアニメーション
	 */
	virtual void addAnimation(Animation* animation){
		animations_.add(animation);
	}

	/**
	 * アニメーションの削除
	 * @param animation 削除するアニメーション
	 */
	virtual void removeAnimation(Animation* animation){
		animations_.removeByValue(animation);
	}

	/**
	 * アニメーション数の取得
	 * @return アニメーション数
	 */
	virtual int getAnimationCount() const{ return animations_.getCount(); }

	/**
	 * アニメーションの取得
	 * @param index インデックス
	 * @return アニメーション
	 */
	virtual Animation* getAnimation(int index) const{
		Assert(index >= 0);
		Assert(index < getAnimationCount());
		return animations_.get(index);
	}

	//--------------------------------------------------------------------------
	// バインド
	//--------------------------------------------------------------------------
	/**
	 * バインド
	 * @param scene バインド対象シーン
	 * @return 全ての下位アニメーションにバインド成功すればtrue
	 */
	virtual bool bind(Scene* scene);

	/**
	 * バインド解除
	 */
	virtual void unbind();

	//--------------------------------------------------------------------------
	// シーケンス
	//--------------------------------------------------------------------------
	/**
	 * シーケンス数の取得
	 * @return シーケンス数
	 */
	virtual int getSequenceCount() const;

	/**
	 * シーケンスの設定
	 * @param sequence 設定するシーケンス
	 * @param time 設定する時間
	 */
	virtual void setSequence(int sequence, float time = 0.f);

	/**
	 * シーケンスの取得
	 * @return シーケンス
	 */
	virtual int getSequence() const;

	//--------------------------------------------------------------------------
	// 時間
	//--------------------------------------------------------------------------
	/**
	 * 時間の設定
	 * @param time 設定する時間
	 */
	virtual void setTime(float time);

	/**
	 * 時間の取得
	 * @return 時間
	 */
	virtual float getTime() const;

	//--------------------------------------------------------------------------
	// アニメーション
	//--------------------------------------------------------------------------
	/**
	 * アニメーション
	 * @param deltaTime デルタタイム
	 * @param mask アニメーションマスク
	 * @return アニメーションが終了していればtrue
	 */
	virtual bool animate(float deltaTime, AnimationMask mask);

	/**
	 * 長さの取得
	 * @return 長さ
	 */
	virtual float getLength() const;

	/**
	 * 終了しているか
	 * @return 終了していればtrue
	 */
	virtual bool isFinished() const;

	/**
	 * ループしているか
	 * @return ループしていればtrue
	 */
	virtual bool isLooped() const;

	//--------------------------------------------------------------------------
	// コピー
	//--------------------------------------------------------------------------
	/**
	 * コピー
	 * @param dataCopyMask データコピーマスク
	 * @return コピーされたアニメーション
	 */
	virtual Animation* copy(DataCopyMask dataCopyMask = copyNone) const{
		return copyAnimationSet(dataCopyMask);
	}

	/**
	 * アニメーションセットのコピー
	 * @param dataCopyMask データコピーマスク
	 * @return コピーされたアニメーション
	 */
	virtual AnimationSet* copyAnimationSet(
		DataCopyMask dataCopyMask = copyNone) const;

	//--------------------------------------------------------------------------
	// RTTI
	//--------------------------------------------------------------------------
	/**
	 * アニメーションセットかどうか
	 * @return アニメーションセットならtrue
	 */
	virtual bool isAnimationSet() const{ return true; }

	//--------------------------------------------------------------------------
protected:
	/**
	 * コンストラクタ
	 * @param name 名前
	 * @param manager アニメーションマネージャ
	 */
	AnimationSet(String name, AnimationManager* manager);

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

private:
	// アニメーション配列
	ArrayList<Animation*> animations_;

};

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

