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

	NOM DU FICHIER :CEditeurObjet.h

	DESCRIPTION :	Ce fichier contient la déclaration de la classe de base 
					(virtuelle pure) de tous les objets/obstacles dans l'éditeur.


	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylène Denis & Jean-François Pérusse

	DATE DE CRÉATION : 2004-3-17

	MISES À JOUR :

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

#ifndef CEDITEUROBJET_H
#define CEDITEUROBJET_H

#include "vector2f.h"

#define TAILLE_TUILE 0.5f //En mètres
enum type_editeurobjet { EDITEUROBJET_NONE,EDITEUROBJET_TROU, EDITEUROBJET_DEPART_UP,
			 EDITEUROBJET_DEPART_RIGHT,EDITEUROBJET_DEPART_DOWN,
			 EDITEUROBJET_DEPART_LEFT, EDITEUROBJET_TRAPPE,
			 EDITEUROBJET_TROUDEAU,
			 EDITEUROBJET_BANDE_N, EDITEUROBJET_BANDE_NE,
			 EDITEUROBJET_BANDE_E, EDITEUROBJET_BANDE_SE,
			 EDITEUROBJET_END };

class CEditeurObjet
{
    vector2f Position; //Par rapport au centre
    
protected:
    float Width; //En mètres
    float Height; //En mètres
    
public:
    // Constructeur
    CEditeurObjet(const vector2f& pos = vector2f(0,0), float w = 0, float h = 0) : Position(pos) { Width = w; Height = h; }
    
    float GetWidth() const { return Width; }
    void SetWidth(float Width) { this->Width = Width; }
    float GetHeight() const { return Height; }
    void SetHeight(float Height) { this->Height = Height; }
    
    vector2f getPosition() const { return Position; }
    void setPosition(const vector2f& newpos) { Position = newpos; }
    
    // Fonction retournant le type de l'objet
    virtual type_editeurobjet GetType() const = 0;
    
    // Fonction affichant l'objet.  Si ADetruire est vrai, elle l'affiche
    // comme si on essayait de l'enlever
    virtual void Affiche(bool ADetruire = false) const = 0;
    
    // Fonction qui retourne une copie identique nouvellement allouée
    // de l'objet
    virtual CEditeurObjet* GetNewCopy() const = 0;
    
    // Fonction qui retourne vrai si la souris est au-dessus de l'objet
    virtual bool MouseOver(float MouseX, float MouseY) const = 0;
    
    // Fonctions sur le rectangle entourant l'objet
    //Positions sur le glWidget
    float GetLeft() const;
    float GetRight() const;
    float GetTop() const;
    float GetBottom() const;
    //Détermine si la souris est dans le rectangle
    bool MouseOverRectangle(float MouseX, float MouseY) const;
    
    // Fonction statique qui charge les textures, s'il y a lieu
    static bool ChargeTextures();
    // Fonction statique qui décharge les textures, s'il y a lieu
    static bool DechargeTextures();
    
    static CEditeurObjet* CreerObjet(type_editeurobjet Type, const vector2f& Pos);
};

#endif  // CEDITEUROBJET_H
