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

	NOM DU FICHIER :CEditeurBande.cpp

	DESCRIPTION :	Implémentation de la classe EditeurBande, qui sont les 
                        murets sur le terrain

	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Perusse

	DATE DE CRÉATION : 2004-3-16

	MISES À JOUR :

===============================================================================*/

#include "CEditeurBande.h"
#include <GL/glut.h>
#include <cmath>
#ifndef M_PI
#define M_PI (3.14159265358979323846264338327950288419716939937510)
#endif

CPngTexture CEditeurBande::TextureBande;




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::CEditeurBande

  Description :	Constructeur

  Paramètres :
	 const vector2f& pos : Position de l'objet
	 type_editeurobjet t : Type de départ

  Valeur retournée :	Aucune (constructeur) : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
CEditeurBande::CEditeurBande(const vector2f& pos, type_editeurobjet t)
    : CEditeurObjet(pos, 0.1f, 0.5f), leType(t)
{
    mince = Width;
    longueur = Height;
    
    float lesin = sin(angle() * M_PI / 180.0f );
    float lecos = cos(angle() * M_PI / 180.0f );
    
    Width = mince*fabs(lecos) + longueur*lesin;
    Height = mince*lesin + longueur*fabs(lecos);
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::GetType

  Description :	Fonction qui retourne le type de l'objet

  Paramètres :

  Valeur retournée :	type_editeurobjet : Type de l'objet

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
type_editeurobjet CEditeurBande::GetType() const
{
    return leType;
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::Affiche

  Description :	Fonction affichant l'objet

  Paramètres :
	 bool ADetruire : Si ADetruire est vrai, elle l'affiche comme 
					  si on essaie d'enlever l'objet

  Valeur retournée :	void : 

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CEditeurBande::Affiche(bool ADetruire) const
{
    glEnable(GL_TEXTURE_2D);
    glColor3f(1,1,1);
    glBindTexture(GL_TEXTURE_2D, TextureBande.GetID());
    
    glPushMatrix();
    glTranslatef(getPosition().GetPosX(), getPosition().GetPosY(), 0);
    glRotatef(angle(), 0, 0, -1);
    
    float Left, Right, Bottom, Top;
    Left = - mince / 2 / TAILLE_TUILE;
    Right = + mince / 2 / TAILLE_TUILE;
    Bottom = - longueur / 2 / TAILLE_TUILE;
    Top = + longueur / 2 / TAILLE_TUILE;
    
    glBegin(GL_QUADS);
    glTexCoord2i(0, 1); glVertex2f(Left,  Bottom);
    glTexCoord2i(1, 1); glVertex2f(Right, Bottom);
    glTexCoord2i(1, 0); glVertex2f(Right, Top);
    glTexCoord2i(0, 0); glVertex2f(Left, Top);
    glEnd();
    
    glDisable(GL_TEXTURE_2D);
    
    glPopMatrix();
    
    if (ADetruire)
    {
	glColor4f(1.0f,0.0f,0.0f,0.7f);
	glBegin(GL_QUADS);
	glVertex2f(getPosition().GetPosX()-Width/2.0f/TAILLE_TUILE,
		   getPosition().GetPosY()-Height/2.0f/TAILLE_TUILE);
	glVertex2f(getPosition().GetPosX()+Width/2.0f/TAILLE_TUILE,
		   getPosition().GetPosY()-Height/2.0f/TAILLE_TUILE);
	glVertex2f(getPosition().GetPosX()+Width/2.0f/TAILLE_TUILE,
		   getPosition().GetPosY()+Height/2.0f/TAILLE_TUILE);
	glVertex2f(getPosition().GetPosX()-Width/2.0f/TAILLE_TUILE,
		   getPosition().GetPosY()+Height/2.0f/TAILLE_TUILE);
	glEnd();
    }
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::GetNewCopy

  Description :	Fonction qui retourne une copie identique nouvellement allouée de l'objet

  Paramètres :

  Valeur retournée :	CEditeurObjet* : Pointeur vers la copie nouvellement allouée

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
CEditeurObjet* CEditeurBande::GetNewCopy() const
{
    return new CEditeurBande(getPosition(), leType);
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::MouseOver

  Description :	Fonction qui retourne vrai si la souris est au-dessus de l'objet

  Paramètres :
	 float MouseX : Position en X de la souris
	 float MouseY : Position en Y de la souris

  Valeur retournée :	bool : vrai si la souris est au-dessus de l'objet

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool CEditeurBande::MouseOver(float MouseX, float MouseY) const
{
    return ( ( MouseX > GetLeft()) && (MouseX < GetRight()) &&
	     ( MouseY > GetBottom() ) && (MouseY < GetTop()) );
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::ChargeTextures

  Description :	Fonction qui charge les textures

  Paramètres :

  Valeur retournée :	bool : retourne vrai si la texture est bien chargée

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool CEditeurBande::ChargeTextures()
{
    return (TextureBande.LoadPNG("editeur/images/bande.png") != 0);
}




/*------------------------------------------------------------------
  Fonction :	CEditeurBande::DechargeTextures

  Description :	Fonction qui décharge les textures

  Paramètres :

  Valeur retournée :	bool : vrai

  Par : 2004-3-17 Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse
  MAJ: 
------------------------------------------------------------------*/
bool CEditeurBande::DechargeTextures()
{
    TextureBande.Unload();
    return true;
}
