/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================

	NOM DU FICHIER :CBalle.cpp

	DESCRIPTION :	Implémentation des fonctions de la classe gérant la balle

	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse

	DATE DE CRÉATION : 2004-3-16

	MISES À JOUR :

===============================================================================*/
#include "CBalle.h"
#include "CObjet.h"

#include <GL/glut.h>

GLUquadricObj *CBalle::quadric = 0;


/*------------------------------------------------------------------
  Fonction :	Balle::CBalle

  Description :	Constructeur

  Paramètres :
	 float coefRestitution : Coefficient de restitution si collision avec un objet
	 float coefAmortissement : Coefficient d'amortissement du terrain avec la balle

  Valeur retournée :	Aucune (constructeur) : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CBalle::CBalle(float coefRestitution, float coefAmortissement) : rayon(0.04267/2.0f)
{
	this->coefRestitution = coefRestitution;
	this->coefAmortissement = coefAmortissement;
	if (quadric == 0)
	{
		// ATTENTION, JAMAIS DELETEE
		quadric = gluNewQuadric();
		gluQuadricNormals( quadric, (GLenum) GLU_SMOOTH );
		gluQuadricDrawStyle( quadric, (GLenum) GLU_FILL );
   	}
	Pos.setZ(rayon/TAILLE_TUILE);
	SurTrou = false;
}

/*------------------------------------------------------------------
  Fonction :	
CBalle::CBalle

  Description :	Constructeur copie

  Paramètres :
	 const CBalle& balle : 

  Valeur retournée :	Aucune (constructeur) : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/

CBalle::CBalle(const CBalle& balle) : rayon(balle.rayon)
{
    this->Pos = balle.Pos;
    this->Direction = balle.Direction;
}


/*------------------------------------------------------------------
  Fonction :	CBalle::~CBalle

  Description :	Destructeur

  Paramètres :

  Valeur retournée :	 : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CBalle::~CBalle()
{

}


/*------------------------------------------------------------------
  Fonction :	CBalle::AfficheGL

  Description :	Affiche la balle en OpenGL

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CBalle::AfficheGL() const
{
   glPushMatrix( );

   glTranslated(Pos.GetPosX(), Pos.GetPosY(), Pos.GetPosZ() );
   float norme = Direction.GetNorm();
   if (SurTrou && norme < 8)
   {
       GLfloat mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
       GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
       GLfloat mat_shininess[] = {10.0};
       GLfloat mat_ambient[] = { 0.1, 0.1, 0.1, 1.0 };
       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
       gluSphere( quadric, 0.9f*rayon/TAILLE_TUILE, 12, 8 );
   } else {
       GLfloat mat_diffuse[] = {0.5, 0.5, 0.5, 1.0};
       GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
       GLfloat mat_shininess[] = {40.0};
       GLfloat mat_ambient[] = { 0.6, 0.6, 0.6, 1.0 };
       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
       gluSphere( quadric, rayon/TAILLE_TUILE, 12, 8 );
   }
   glPopMatrix( );
}


/*------------------------------------------------------------------
  Fonction :	CBalle::Avance

  Description :	Fait avancer la balle : x1 = xo + dx

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CBalle::Avance()
{
	Pos = Pos + (1/(float)NB_CALCS)*Direction/100.0;
}

/*------------------------------------------------------------------
  Fonction :	CBalle::Recule

  Description :	Fait reculer la balle : x1 = xo - dx

  Paramètres :

  Valeur retournée :	void : 

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CBalle::Recule()
{
	Pos = Pos - (1/(float)NB_CALCS)*Direction/100.0;
}


/*------------------------------------------------------------------
  Fonction :	CBalle::StopBall
  Description :	Fait arrêter la balle si vitesse trop petite
  Paramètres :
  Valeur retournée :	bool : balle arrêtée
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool CBalle::StopBall()
{
    if(Direction.GetNorm() < 0.5)
    {
		Direction = CVector3f(0,0,0);
		return true;
	}
	return false;
}

/*------------------------------------------------------------------
  Fonction :	CBalle::setDernierePosition
  Description :	Conserve la derniere position d'arrêt de la balle
  Paramètres :
  Valeur retournée :	
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CBalle::setDernierePosition(CVector3f Position)
{
	this->DernierePosition = Position;
}

/*------------------------------------------------------------------
  Fonction :	CBalle::getDernierePosition
  Description :	retourne la dernière position d'arrêt de la balle
  Paramètres :
  Valeur retournée :	CVector3f : derniere position d'arrêt de la balle
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CBalle::getDernierePosition()
{
	return DernierePosition;
}

/*------------------------------------------------------------------
  Fonction :	CBalle::setDerniereDirection
  Description :	Conserve la derniere direction de frappe de la balle pour les replays
  Paramètres :
  Valeur retournée :	
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CBalle::setDerniereDirection(CVector3f Direction)
{
	this->DerniereDirection = Direction;
}

/*------------------------------------------------------------------
  Fonction :	CBalle::getDerniereDirection
  Description :	retourne la dernière direction de frappe de la balle
  Paramètres :
  Valeur retournée :	CVector3f : derniere direction de frappe de la balle
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CVector3f CBalle::getDerniereDirection()
{
	return DerniereDirection;
}
