/*
*	position.cpp
*
*	Programmé par Hillaire Sébastien
*
*
*	Se référé au fichier en-tête .h pour plus de détail
*
*/

#include "position.h"
#include "MemoryManager/DebugNew.h"



Position::Position()
{
	pos.x=0;
	pos.y=0;
	pos.z=0;

	vx.x=1;
	vx.y=0;
	vx.z=0;

	vy.x=0;
	vy.y=1;
	vy.z=0;

	vz.x=0;
	vz.y=0;
	vz.z=1;

	alphaXZ=0;
	alphaZY=0;
}


Position::~Position()
{
}


void Position::setAlphaXZ(const float a)
{
	alphaXZ = a;
}

float Position::getAlphaXZ()
{
	return alphaXZ;
}


void Position::setAlphaZY(const float a)
{
	alphaZY = a;
}

float Position::getAlphaZY()
{
	return alphaZY;
}


void Position::setPosition(const vector3 *v)
{
	pos = *v;
}

void Position::setPosition(const float x,const float y,const float z)
{
	pos.x = x;
	pos.y = y;
	pos.z = z;
}

const vector3* Position::getPosition()
{
	return &pos;
}


const vector3* Position::getBaseX()
{
	return &vx;
}

const vector3* Position::getBaseY()
{
	return &vy;
}

const vector3* Position::getBaseZ()
{
	return &vz;
}


void Position::compute()
{
	float temp;

	//INITIALISATION
	float cos_alphaXZ = (float)cos((double)-alphaXZ);
	float sin_alphaXZ = (float)sin((double)-alphaXZ);
	float cos_alphaZY = (float)cos((double)alphaZY);
	float sin_alphaZY = (float)sin((double)alphaZY);

	// TODO : Utilisé rotate de vector3 à la place ou laissé optimisation!!!!

	//D'ABORD...
	//***rotation dans le plan ZY***//
	vx.x=1;
	vx.y=0;
	vx.z=0;

	vy.x=0;
	vy.y=cos_alphaZY;
	vy.z=sin_alphaZY;

	//z = -z pour orientation droite du repère
	/*vz.y=-sin_alphaZY;
	vz.z=cos_alphaZY;*/
	vz.x=0;
	vz.y=-sin_alphaZY;
	vz.z=cos_alphaZY;

	//PUIS...
	//***rotation dans le plan XZ***//
	vx.x= cos_alphaXZ;
	vx.y=0;
	vx.z=-sin_alphaXZ;

	temp=vy.z;
	temp= vy.z*cos_alphaXZ - vy.x*sin_alphaXZ;
	vy.x= vy.z*sin_alphaXZ + vy.x*cos_alphaXZ;
	vy.z= temp;

	temp=vz.z;
	temp= vz.z*cos_alphaXZ - vz.x*sin_alphaXZ;
	vz.x= vz.z*sin_alphaXZ + vz.x*cos_alphaXZ;
	vz.z= temp;
}


void Position::debug_render()
{
	vector3 tmp;
	glBegin(GL_LINES);
	glColor3f(1,0,0);
	glVertex3fv(&pos[0]);
	tmp = pos + vx;
	glVertex3fv(&tmp[0]);
	glColor3f(0,1,0);
	glVertex3fv(&pos[0]);
	tmp = pos + vy;
	glVertex3fv(&tmp[0]);
	glColor3f(0,0,1);
	glVertex3fv(&pos[0]);
	tmp = pos + vz;
	glVertex3fv(&tmp[0]);
	glEnd();
}


void Position::deltaAlphaXZ(const float da)
{
	alphaXZ+=da;
}

void Position::deltaAlphaZY(const float da)
{
	alphaZY+=da;
}

void Position::deltaPosition(const vector3 *v)
{
	pos = pos + *v;
}

void Position::deltaPosition(const float x,const float y,const float z)
{
	pos.x += x;
	pos.y += y;
	pos.z += z;
}


void Position::transformeIntoLocalSpace(vector3 *v,vector3 *dest)
{
	dest->x = vx.dot(v);
	dest->y = vy.dot(v);
	dest->z = vz.dot(v);
}



