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

	NOM DU FICHIER :CTerrain.h

	DESCRIPTION :	Déclaration de la classe Terrain

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

	DATE DE CRÉATION : 2004-3-16

	MISES À JOUR :

===============================================================================*/
#ifndef CTERRAIN_H
#define CTERRAIN_H

//#define DEBUG_CORNERS

#include "CObjet.h"
#include <list>
#include <fstream>
#include <cmath>
#include <iostream>
#include "CPngTexture.h"
#include "CDepart.h"
#include "CTrou.h"
#include "CTroudeau.h"

#define GRILLE_W 8
#define GRILLE_H 8

#define BORDER_WIDTH (0.05f/TAILLE_TUILE)
#define BORDER_HEIGHT (0.1f/TAILLE_TUILE)

#define TIMER_INTERVAL 25
#define DT (TIMER_INTERVAL/1000.0f)

#ifndef M_PI
#define M_PI (3.14159265358979323846264338327950288419716939937510)
#endif

#define SUBDIV 2
#define SUBTRI 1


using namespace std;

enum type_jeutuile { JEUTUILE_NONE, JEUTUILE_SQUARE, JEUTUILE_UL,
		     JEUTUILE_UR, JEUTUILE_DR, JEUTUILE_DL, JEUTUILE_END };

enum type_jeubordure {HAUT, DROIT, BAS, GAUCHE, HAUTDROIT, BASDROIT, BASGAUCHE, HAUTGAUCHE, NONE};

class CTerrain{
    public:
	CTerrain();
	~CTerrain();
	void AfficheGL();

	//Fonctions afin d'obtenir rapidement le trou et le départ
	//à l'intérieur de la liste d'objets
	CDepart* getDepart() const;
	CTrou* getTrou() const;

	//Correct?
	CBalle* getBalle() const {return Balle;}
 	void setBalle(CBalle*);

	void Avance();
	void TournerPhare();
	void AfficheLumierePhare();

  // Fonction qui charge les textures
	static bool ChargeTextures();
	static bool DechargeTextures();

	void AfficheBordures() const;
	void DessineTuile(int PosX, int PosY, type_jeutuile Type) const;
	void DiviseTuileTriangle(int Depth, CVector3f pt1, CVector3f pt2, CVector3f pt3) const;
	void AfficheTuiles() const;
	void AfficheObjets() const;
	void AfficheEnv();

	bool BallInWater() const;

	bool CCM(CBalle* balle);
	bool ColliBordu(const CVector3f& Normale, CBalle* balle);
	bool ColliBordu2(const CVector3f& Normale, CBalle* balle);
	bool ColliBordu3(const CVector3f& Normale, CBalle* balle);
	bool ColliBordu4(const CVector3f& Normale, CBalle* balle);
	bool ColliDiago(CBalle* balle, int X, int Y, CVector3f Normale);


	bool CollisionObjets(CBalle* UneBalle);
	bool CollisionObjetsLigne(CBalle* UneBalle);

	CVector3f AssocieTuile(CVector3f Position) const;
	bool BordureATracer(CVector3f Position, CVector3f Direction) const;
	float DepPourDroite(CVector3f Position, CVector3f Direction, CVector3f A) const;
	float DepPourDiago(CVector3f Position, CVector3f Direction, CVector3f A) const;
	
	bool ChargerTerrain(const char* NomFic);
	void CentreBalleDepart();

	int GetListeAffichage();
	
	void UpdateAnimations() const;

    private:
	int ListeAffichage;
	int ListLumierePhare;
	CBalle *Balle;
	//Tous les objets devant etre dessines sur le terrain
	std::list< CObjet * > LesObjets;
	//Tableau des tuiles
	type_jeutuile Grille[GRILLE_W+2][GRILLE_H+2];
	bool CoinGrille[GRILLE_W+2][GRILLE_H+2];
	void RempliCoins();

	static CPngTexture TexGazon;
	static CPngTexture TexBordures;
	static CPngTexture TexPhare;
	static CPngTexture TexFloor;
	
	float PhareX, PhareY, PhareZ;
	void ConstruitPhare(void) const;
	void ConstruitLumierePhare() const;
	
	// A ENLEVER
	friend void initializeGL(void);
	friend void idle(void);
	
	float AngleRotPhare;
};
#endif //CTERRAIN_H
