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

#include <Animation/System/ObjectAnimation.h>
#include <Animation/Camera/CameraAnimationData.h>

namespace Lamp{

class Camera;

//------------------------------------------------------------------------------
/**
 * カメラアニメーション
 */
class CameraAnimation : public ObjectAnimation{
friend class AnimationManager;
public:
	//--------------------------------------------------------------------------
	// アニメーションデータ
	//--------------------------------------------------------------------------
	/**
	 * アニメーションデータの取得
	 * @return アニメーションデータ
	 */
	virtual AnimationData* getAnimationData(){ return animationData_; }

	/**
	 * アニメーションデータの取得
	 * @return アニメーションデータ
	 */
	virtual const AnimationData* getAnimationData() const{
		return animationData_;
	}

	//--------------------------------------------------------------------------
	// カメラアニメーションデータ
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションデータの設定
	 * @param animationData カメラアニメーションデータ
	 */
	virtual void setCameraAnimationData(CameraAnimationData* animationData){
		if(animationData_ != NULL){ animationData_->removeReference(); }
		animationData_ = animationData;
		if(animationData_ != NULL){ animationData_->addReference(); }
	}

	/**
	 * カメラアニメーションデータの取得
	 * @return カメラアニメーションデータ
	 */
	virtual CameraAnimationData* getCameraAnimationData(){
		return animationData_;
	}

	/**
	 * カメラアニメーションデータの取得
	 * @return カメラアニメーションデータ
	 */
	virtual const CameraAnimationData* getCameraAnimationData() const{
		return animationData_;
	}

	//--------------------------------------------------------------------------
	// バインド
	//--------------------------------------------------------------------------
	/**
	 * バインド
	 * @param scene バインド対象シーン
	 * @return 成功すればtrue
	 */
	virtual bool bind(Scene* scene);

	/**
	 * バインド
	 * @param camera バインド対象カメラ
	 * @return 成功すればtrue
	 */
	virtual bool bind(Camera* camera);

	/**
	 * バインド解除
	 */
	virtual void unbind(){ target_ = NULL; }

	/**
	 * ターゲットの取得
	 * @return ターゲット
	 */
	virtual Camera* getTarget() const{ return target_; }

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

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

	/**
	 * カメラアニメーションのコピー
	 * @param dataCopyMask データコピーマスク
	 * @return コピーされたアニメーション
	 */
	virtual CameraAnimation* copyCameraAnimation(
		DataCopyMask dataCopyMask = copyNone) const;

	//--------------------------------------------------------------------------
	// RTTI
	//--------------------------------------------------------------------------
	/**
	 * カメラアニメーションかどうか
	 * @return カメラアニメーションならtrue
	 */
	virtual bool isCameraAnimation() const{ return true; }

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

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

private:
	// アニメーションデータ
	CameraAnimationData* animationData_;
	// ターゲット
	Camera* target_;

};

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

