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

	NOM DU FICHIER :CEditeurTerrain.h

	DESCRIPTION :	Ce fichier contient la déclaration de la classe CEditeurTerrain,
					représentant un terrain.

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

	DATE DE CRÉATION : 2004-3-17

	MISES À JOUR :

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

//Définir si l'on désire tester les coins
//#define DEBUG_CORNERS

#ifndef CEDITEURTERRAIN_H
#define CEDITEURTERRAIN_H

enum type_editeurtuile { EDITEURTUILE_NONE, EDITEURTUILE_SQUARE,
		 EDITEURTUILE_UL, EDITEURTUILE_UR, EDITEURTUILE_DR,
			 EDITEURTUILE_DL, EDITEURTUILE_END };

#define GRILLE_W 8
#define GRILLE_H 8

#include <list>
#include <fstream>
#include "CPngTexture.h"
#include "CEditeurObjet.h"
#include "vector2f.h"
#include <qpixmap.h>
#include <qimage.h>
#include "glEditeurWidget.h"

#define BORDER_WIDTH 0.1f

class CEditeurTerrain
{
    type_editeurtuile Grille[GRILLE_W+2][GRILLE_H+2];
#ifdef DEBUG_CORNERS
    bool BoolCoins[GRILLE_W+3][GRILLE_H+3];
    void RempliCoins();
#endif
    
    std::list< CEditeurObjet * > LesObjets;
    
    type_editeurtuile TuileCourante;
    CEditeurObjet* ObjetCourant; 
    //Position courante de la souris
    vector2f MousePosition;
    bool ModeEfface;
    
    static CPngTexture TexGazon;
    static CPngTexture TexBordures;
    static CPngTexture TexEfface;
    
    void AfficheBordures(vector2f Position);
    void DessineTuile(int PosX, int PosY, type_editeurtuile Type);
    void AfficheTuiles(bool Pixmap = false);
    void AfficheObjets(bool Pixmap = false);
    vector2f AssocieTuile(vector2f Position) const;
    bool BordureATracer(vector2f Position, vector2f Direction) const;
    float DepPourDroite(vector2f Position, vector2f Direction, vector2f A);
    float DepPourDiago(vector2f Position, vector2f Direction, vector2f A);
    
    //Fonctions servant  a l'affichage du preview
    
    bool Intersection(const vector2f A1, const vector2f A2, const vector2f B1, const vector2f B2) const;
    
public:
    // Contructeur par défaut
    CEditeurTerrain();
    // Contructeur par copie
    CEditeurTerrain(const CEditeurTerrain& copie);
    // Opérateur d'assignation
    const CEditeurTerrain& operator =(const CEditeurTerrain& copie);
    
    // Fonction qui charge les textures
    static bool ChargeTextures();
    static bool DechargeTextures();
    
    
    // Fonctions qui affichent
    void Affiche(bool Pixmap = false);
    static void AfficheGrille(void);
    
    
    // Fonctions pour les données
    void setTuile(int x, int y, type_editeurtuile Tuile);
    type_editeurtuile getTuile(int x, int y) const;
    void AjouteObjet(CEditeurObjet* objet);
    void AjoutObjetCourant();
    bool EnleveObjet(CEditeurObjet* objet);
    const std::list<CEditeurObjet*>& getListeObjets() const;
    
    bool ValidePositionObjet(CEditeurObjet* Objet) const;
    
    
    type_editeurtuile GetTuileCourante() const;
    void SetTuileCourante(const type_editeurtuile Tuile);
    type_editeurobjet GetObjetCourant() const;
    void SetObjetCourant(const type_editeurobjet Objet);
    
    void SetModeEfface(bool Mode) { ModeEfface = Mode; }
    
    void DrawSelection();
    void DrawEfface();
    
    void SetMousePosition(float PosX, float PosY);
    
    // Fonction pour enregistrer le trou dans un fichier
    void Enregistre(const char *NomFic, glEditeurWidget* Widget);
    // Fonction pour créer un trou à partir d'un fichier
    // Retourne vrai si la création s'est bien passée
    bool Charge(const char *NomFic);
    
    int TerrainValide();
    
    bool TrajetValide(vector2f posDepart, vector2f posTrou);
    
    void Efface();
    
};

#endif  // CEDITEURTERRAIN_H
