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

#include <Collision/System/StaticCollisionLeaf.h>

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * 静的球コリジョン
 */
class StaticSphereCollision : public StaticCollisionLeaf{
friend class CollisionScene;
public:
	//--------------------------------------------------------------------------
	// 交差
	//--------------------------------------------------------------------------
	/**
	 * 球交差
	 * @param result 交差結果
	 * @param sphere 球
	 * @param collisionMask コリジョンマスク
	 */
	virtual void intersection(IntersectionResult* result, const Sphere& sphere,
		u_int collisionMask = 0xffffffff);

	/**
	 * 球コリジョン交差
	 * @param result 交差結果
	 * @param sphere 球コリジョン
	 * @param collisionMask コリジョンマスク
	 */
	virtual void intersection(IntersectionResult* result,
		StaticSphereCollision* sphere, u_int collisionMask = 0xffffffff);

	//--------------------------------------------------------------------------
	// 球
	//--------------------------------------------------------------------------
	/**
	 * 球の設定
	 * @param sphere 設定する球
	 */
	inline void setSphere(const Sphere& sphere){
		sphere_ = sphere;
		setChanged(true);
	}

	/**
	 * 球の設定
	 * @param center 設定する中心
	 * @param radius 設定する半径
	 */
	inline void setSphere(const Vector3& center, float radius){
		sphere_.set(center, radius);
		setChanged(true);
	}

	/**
	 * 球の取得
	 * @return ローカル座標の球
	 */
	virtual const Sphere& getSphere() const{ return sphere_; }

	//--------------------------------------------------------------------------
	/**
	 * ワールド球の取得
	 * @return ワールド座標の球
	 */
	virtual const Sphere& getWorldSphere(){
		Assert(isGlobalEnabled());
		return worldSphere_;
	}

	//--------------------------------------------------------------------------
	/**
	 * 中心の設定
	 * @param center 設定する中心
	 */
	inline void setCenter(const Vector3& center){
		sphere_.setCenter(center);
		setChanged(true);
	}

	/**
	 * 中心の取得
	 * @return 中心
	 */
	inline const Vector3& getCenter() const{ return sphere_.getCenter(); }

	//--------------------------------------------------------------------------
	/**
	 * 半径の設定
	 * @param radius 設定する半径
	 */
	inline void setRadius(float radius){
		sphere_.setRadius(radius);
		setChanged(true);
	}

	/**
	 * 半径の取得
	 * @return 半径
	 */
	inline float getRadius() const{ return sphere_.getRadius(); }

	//--------------------------------------------------------------------------
	// コピー
	//--------------------------------------------------------------------------
	/**
	 * コピー
	 * @return コピーされたコリジョンオブジェクト
	 */
	virtual CollisionObject* copy() const{
		return copyStaticSphereCollision();
	}

	/**
	 * コリジョンリーフのコピー
	 * @return コピーされたコリジョンリーフ
	 */
	virtual CollisionLeaf* copyCollisionLeaf() const{
		return copyStaticSphereCollision();
	}

	/**
	 * 静的コリジョンリーフのコピー
	 * @return コピーされた静的コリジョンリーフ
	 */
	virtual StaticCollisionLeaf* copyStaticCollisionLeaf() const{
		return copyStaticSphereCollision();
	}

	/**
	 * 静的球コリジョンのコピー
	 * @return コピーされた静的球コリジョン
	 */
	virtual StaticSphereCollision*
		copyStaticSphereCollision() const;

	//--------------------------------------------------------------------------
	// RTTI
	//--------------------------------------------------------------------------
	/**
	 * 静的球コリジョンかどうか
	 * @return 静的球コリジョンならtrue
	 */
	virtual bool isStaticSphereCollision() const{ return true; }

protected:
	//--------------------------------------------------------------------------
	// 生成、破棄
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 * @param name 名前
	 * @param scene シーン
	 */
	StaticSphereCollision(const String& name, CollisionScene* scene);

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

	//--------------------------------------------------------------------------
	// 走査
	//--------------------------------------------------------------------------
	/**
	 * 走査
	 * @param parentMatrix 親行列
	 * @param parentEnabled 親が有効か
	 * @param parentScaled 親がスケールを使用しているか
	 * @param parentChanged 親に変更があったか
	 */
	virtual void traverseImplement(const Matrix34& parentMatrix,
		bool parentEnabled, bool parentScaled, bool parentChanged);

private:
	//--------------------------------------------------------------------------
	// 球
	Sphere sphere_;
	// ワールド球
	Sphere worldSphere_;

};

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