/*
QtWagon: a project about 3D objects.
Science and technology promotion license applied. Third party license automatically cascaded.
Zhikai Wang/ www.heteroclinic.net 2013
You can do anything with this file or any file(s) published as part QtWagon project, given this header is kept.
*/
#ifndef __GLLIGHT
#define __GLLIGHT
#include "glMovingObject.h"
#include "camera.h"

class  glLight : public 
	camera
{
	//http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml
private:
	float data_GL_AMBIENT [4]; // (0, 0, 0, 1).
	float data_GL_DIFFUSE [4];   //  GL_LIGHT0 is (1, 1, 1, 1); (0, 0, 0, 1)
	float data_GL_SPECULAR [4]; //  GL_LIGHT0 is (1, 1, 1, 1);  other (0, 0, 0, 1)
	float data_GL_POSITION [4]; //  (0, 0, 1, 0)

	bool spotted;

	float data_GL_SPOT_DIRECTION [3];  //  (0, 0, -1)
	float data_GL_SPOT_EXPONENT; // [0,128]
	float data_GL_SPOT_CUTOFF; // [0,90] or 180

	float data_GL_CONSTANT_ATTENUATION;
	float data_GL_LINEAR_ATTENUATION;
	float data_GL_QUADRATIC_ATTENUATION ; //(1, 0, 0),
	int id; //[0-7]
public:
	//	color[0] =0.2,color[1] = 0.2,color[2] = 0.2,color[3] = 1.0;
	//glLightfv(GL_LIGHT0, GL_AMBIENT, color );
	//color[0] = 1.0,color[1] = 1.0,color[2] = 1.00,color[3] = 1.0;
	//glLightfv(GL_LIGHT0, GL_DIFFUSE,color);
	//color[0] = 1.0,color[1] = 1.0,color[2] = 1.0,color[3] = 1.0;
	//glLightfv(GL_LIGHT0, GL_SPECULAR, color );
	//color[0] = 0.0,color[1] = 0.0,color[2] = 10.0,color[3] = 0.0;

	bool glLight::isSpotted () {
		return spotted;
	}
	void  glLight::setSpotted (bool nv) {
		 spotted = nv;
	}

	glLight::glLight() {
		set_data_GL_AMBIENT(0.2f, 0.2f, 0.2f, 1.0f);
		set_data_GL_DIFFUSE(1.0f, 1.0f, 1.0f, 1.0f);
		set_data_GL_SPECULAR(1.0f, 1.0f, 1.0f, 1.0f);
		//set_data_GL_POSITION(0.0f, 0.0f, 10.0f, 0.0f);
		mathPoint<float> tmppos(0.0f, 0.0f, 10.0f);
		setPosition (tmppos);
			tmppos = getPosition();
		set_data_GL_POSITION(tmppos.getx(), tmppos.gety(), tmppos.getz(), 0.0f);




		setSpotted ( false) ;
		mathVector<float> tfrontv 
		= (*this).getFrontVectorRef();
		//set_data_GL_SPOT_DIRECTION
		set_data_GL_SPOT_DIRECTION(tfrontv.getx(),tfrontv.gety(),tfrontv.getz());
	    data_GL_SPOT_EXPONENT = 64.0f; // [0,128]
		data_GL_SPOT_CUTOFF = 180.0f; // [0,90] or 180
		data_GL_CONSTANT_ATTENUATION = 1.0f;
		data_GL_LINEAR_ATTENUATION = 0.0f;
		data_GL_QUADRATIC_ATTENUATION = 0.0f; //(1, 0, 0),
	};
	

	// ????? virtual void yaw () {}
	// ????? virtual void pitch () {}
	float glLight::get_data_GL_SPOT_EXPONENT() {
		return data_GL_SPOT_EXPONENT;
	}
	float glLight::get_data_GL_SPOT_CUTOFF() {
		return data_GL_SPOT_CUTOFF;
	}
	float glLight::get_data_CONSTANT_ATTENUATION() {
		return data_GL_CONSTANT_ATTENUATION;
	}
	float glLight::get_data_LINEAR_ATTENUATION() {
		return data_GL_LINEAR_ATTENUATION;
	}	
	float glLight::get_data_QUADRATIC_ATTENUATION() {
		return data_GL_QUADRATIC_ATTENUATION;
	}


	void glLight::get_data_GL_SPOT_EXPONENT(float nv ) {
		data_GL_SPOT_EXPONENT = nv;
	}
	void glLight::get_data_GL_SPOT_CUTOFF(float nv) {
		data_GL_SPOT_CUTOFF = nv;
	}
	void glLight::get_data_CONSTANT_ATTENUATION(float nv) {
		data_GL_CONSTANT_ATTENUATION = nv;
	}
	void glLight::get_data_LINEAR_ATTENUATION(float nv) {
		data_GL_LINEAR_ATTENUATION = nv;
	}	
	void glLight::get_data_QUADRATIC_ATTENUATION(float nv) {
		data_GL_QUADRATIC_ATTENUATION = nv;
	}


	void glLight::set_data_GL_AMBIENT(float a1, float a2, float a3, float a4) {
		data_GL_AMBIENT [0] = a1; data_GL_AMBIENT [1] = a2; data_GL_AMBIENT [2] = a3;data_GL_AMBIENT [3] = a4;
	}
	void glLight::set_data_GL_AMBIENTfv(float * av) {
		//data_GL_AMBIENT [0] = a1; data_GL_AMBIENT [1] = a2; data_GL_AMBIENT [2] = a3;data_GL_AMBIENT [3] = a4;
		set_data_GL_AMBIENT(av[0], av[1], av[2], av[3]);
	}
	float * glLight::get_data_GL_AMBIENTfv () ;
	void glLight::set_data_GL_DIFFUSE(float a1, float a2, float a3, float a4) {
		data_GL_DIFFUSE [0] = a1; data_GL_DIFFUSE [1] = a2; data_GL_DIFFUSE [2] = a3;data_GL_DIFFUSE [3] = a4;
	}
	void glLight::set_data_GL_DIFFUSEfv(float * av) {
		set_data_GL_DIFFUSE(av[0], av[1], av[2], av[3]);
	}
	float * glLight::get_data_GL_DIFFUSEfv () {
		return data_GL_DIFFUSE;
	}

	void glLight::set_data_GL_SPECULAR(float a1, float a2, float a3, float a4) {
		data_GL_SPECULAR [0] = a1; data_GL_SPECULAR [1] = a2; data_GL_SPECULAR [2] = a3;data_GL_SPECULAR [3] = a4;
	}
	void glLight::set_data_GL_SPECULARfv(float * av) {
		set_data_GL_SPECULAR(av[0], av[1], av[2], av[3]);
	}
	float * glLight::get_data_GL_SPECULARfv () {
		return data_GL_SPECULAR;
	}


    void glLight::set_data_GL_POSITION(float a1, float a2, float a3, float a4) {
		data_GL_POSITION [0] = a1; data_GL_POSITION [1] = a2; data_GL_POSITION [2] = a3;data_GL_POSITION [3] = a4;

		mathPoint<float> tmppos(a1, a2, a3);
		setPosition (tmppos);
		//tmppos = getPosition();
		//set_data_GL_POSITION(tmppos.getx(), tmppos.gety(), tmppos.getz(), 0.0f);
	}
	void glLight::set_data_GL_POSITIONfv(float * av) {
		set_data_GL_POSITION(av[0], av[1], av[2], av[3]);
	}
	float * glLight::get_data_GL_POSITIONfv () {
		mathPoint<float> tmppos = getPosition();
		data_GL_POSITION [0] =tmppos.getx(); data_GL_POSITION [1] = tmppos.gety(); data_GL_POSITION [2] = tmppos.getz();

		return data_GL_POSITION;
	}


	 void glLight::set_data_GL_SPOT_DIRECTION(float a1, float a2, float a3) {
		data_GL_SPOT_DIRECTION [0] = a1; data_GL_SPOT_DIRECTION [1] = a2; data_GL_SPOT_DIRECTION [2] = a3;
	}
	void glLight::set_data_GL_SPOT_DIRECTIONfv(float * av) {
		set_data_GL_SPOT_DIRECTION(av[0], av[1], av[2]);
	}
	float * glLight::get_data_GL_SPOT_DIRECTIONfv () {
		return data_GL_SPOT_DIRECTION;
	}



	virtual glLight::~glLight() {
	};




};
#endif 