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

#include <Graphics/SceneNode/SceneLeaf.h>

namespace Lamp{

class GlobalLight;
class LocalLight;
class AmbientLight;
class DirectionalLight;
class PointLight;

//------------------------------------------------------------------------------
/**
 * ライト
 */
class Light : public SceneLeaf{
friend class SceneObjectManagerTemplate<Light>;
friend class LightManager;
public:
	//--------------------------------------------------------------------------
	/**
	 * コピー
	 * @return コピーされたライト
	 */
	virtual Light* copyLight() const = 0;

	/**
	 * 破棄
	 * @param light 破棄するライト
	 * @return 破棄したオブジェクト数
	 */
	static int destroy(Light* light);

	//--------------------------------------------------------------------------
	/**
	 * ライト色の設定
	 * @param color ライト色
	 */
	virtual void setColor(const Color3f& color) = 0;

	/**
	 * ライト色の取得
	 * @return ライト色
	 */
	virtual Color3f getColor() const = 0;

	//--------------------------------------------------------------------------
	/**
	 * 輝度の取得
	 * @return 輝度
	 */
	virtual float getLuminance() const{ return getColor().getLuminance(); }

	//--------------------------------------------------------------------------
	/**
	 * ライトマスクの設定
	 * @param lightMask ライトマスク
	 */
	virtual void setLightMask(u_int lightMask){ lightMask_ = lightMask; }

	/**
	 * ライトマスクの取得
	 * @return ライトマスク
	 */
	virtual u_int getLightMask() const{ return lightMask_; }

	//--------------------------------------------------------------------------
	// RTTI
	//--------------------------------------------------------------------------
	/**
	 * ライトかどうか
	 * @return ライトならtrue
	 */
	virtual bool isLight() const{ return true; }

	//--------------------------------------------------------------------------
	/**
	 * グローバルライトかどうか
	 * @return グローバルライトならtrue
	 */
	virtual bool isGlobalLight() const{ return false; }

	/**
	 * グローバルライトへのキャスト
	 * @return グローバルライト。型が違えばNULLを返す。
	 */
	virtual GlobalLight* castGlobalLight() const{
		if(isGlobalLight()){ return (GlobalLight*)this; }
		return NULL;
	}

	//--------------------------------------------------------------------------
	/**
	 * ローカルライトかどうか
	 * @return ローカルライトならtrue
	 */
	virtual bool isLocalLight() const{ return false; }

	/**
	 * ローカルライトへのキャスト
	 * @return ローカルライト。型が違えばNULLを返す。
	 */
	virtual LocalLight* castLocalLight() const{
		if(isLocalLight()){ return (LocalLight*)this; }
		return NULL;
	}

	//--------------------------------------------------------------------------
	/**
	 * アンビエントライトかどうか
	 * @return アンビエントライトならtrue
	 */
	virtual bool isAmbientLight() const{ return false; }

	/**
	 * アンビエントライトへのキャスト
	 * @return アンビエントライト。型が違えばNULLを返す。
	 */
	virtual AmbientLight* castAmbientLight() const{
		if(isAmbientLight()){ return (AmbientLight*)this; }
		return NULL;
	}

	//--------------------------------------------------------------------------
	/**
	 * ディレクショナルライトかどうか
	 * @return ディレクショナルライトならtrue
	 */
	virtual bool isDirectionalLight() const{ return false; }

	/**
	 * ディレクショナルライトへのキャスト
	 * @return ディレクショナルライト。型が違えばNULLを返す。
	 */
	virtual DirectionalLight* castDirectionalLight() const{
		if(isDirectionalLight()){ return (DirectionalLight*)this; }
		return NULL;
	}

	//--------------------------------------------------------------------------
	/**
	 * ポイントライトかどうか
	 * @return ポイントライトならtrue
	 */
	virtual bool isPointLight() const{ return false; }

	/**
	 * ポイントライトへのキャスト
	 * @return ポイントライト。型が違えばNULLを返す。
	 */
	virtual PointLight* castPointLight() const{
		if(isPointLight()){ return (PointLight*)this; }
		return NULL;
	}

	//--------------------------------------------------------------------------
protected:
	/**
	 * コンストラクタ
	 * @param name 名前
	 * @param scene シーン
	 */
	Light(const String& name, Scene* scene);

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

	/**
	 * ライトの値コピー
	 * @param destination コピー先ライト
	 */
	virtual void copyLightValue(Light* destination) const;

	//--------------------------------------------------------------------------
private:
	// ライトマスク
	u_int lightMask_;

};

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

