//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007-2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: spot_light.hpp
//      Краткое описание: spot light
//

#ifndef DSE_GS_LIGHT_SYSTEM_SPOT_LIGHT_HPP
#define DSE_GS_LIGHT_SYSTEM_SPOT_LIGHT_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Graphic System/Light System/light_common.hpp>
#include <Darkstar/Math/sphere.hpp>

namespace gs
{
	class SpotLight
	{
	private:
		DRSLIGHTSTATE light_state;

		math::Vect3 diffuse_color;
		math::Vect3 specular_color;
		math::Vect3 ambient_color;

		float attenuation;
		float range;

		float phi, theta;
		float cos_phi2, cos_theta2, cos_theta2_cos_phi2;

		float falloff;

		math::Sphere volume;

		math::Vect3 position;
		math::Quat orientation;

		void _recalc();
	public:
		SpotLight();
		SpotLight(const DRSLIGHTSTATE& light_state, const math::Vect3& position, const math::Quat& orientation, 
			const float range, const float phi, const float theta, 
			const math::Vect3& diffuse_color = math::Vect3(1, 1, 1), 
			const math::Vect3& specular_color = math::Vect3(1, 1, 1), 
			const math::Vect3& ambient_color = math::Vect3(0, 0, 0),
			const float falloff = 1, const float attenuation = 0);
		~SpotLight();

		void setLightState(const DRSLIGHTSTATE& new_light_state);
		const DRSLIGHTSTATE& getLightState() const;
		void toggleLightState();

		void setDiffuseColor(const math::Vect3& new_color);
		const math::Vect3& getDiffuseColor() const;
		void setAmbientColor(const math::Vect3& new_color);
		const math::Vect3& getAmbientColor() const;
		void setSpecularColor(const math::Vect3& new_color);
		const math::Vect3& getSpecularColor() const;

		void setRange(const float new_range);
		const float getRange() const;
		void setAttenuation(const float attenuation);
		const float getAttenuation() const;

		void setInnerAngle(const float new_theta);
		const float getInnerAngle() const;
		void setOuterAngle(const float new_phi);
		const float getOuterAngle() const;
		void setInnerAndOuterAngle(const float new_theta, const float new_phi);
		const float getCosPhi2() const;
		const float getCosTheta2() const;
		const float getCosTheta2CosPhi2() const;
		void setFalloff(const float new_falloff);
		const float getFalloff() const;

		const math::Sphere& getVolume() const;

		const math::Vect3& getPosition() const;
		void setPosition(const math::Vect3& new_position);

		const math::Quat& getOrientation() const;
		void setOrientation(const math::Quat& new_orientation);
	};
};

#include <Darkstar/Graphic System/Light System/spot_light.inl>

#endif

