#ifndef MADMAP
#define MADMAP 1
#include "Area.h"
#include "MarbleTriangle.h"
#include "MadUtility.h"
using namespace std;
//=======================MadMap====================
//Mappa del gioco, composta da una griglia di Tile
//=================================================
class MadMap
{
public:
//===================================
//Posizione di partenza della pallina
//===================================
Area Start;
//===================================
//Area della mappa visualizzata con
//un diverso colore
//===================================
Area Colored;
//===================================
//indica se la mappa è valida o no
//===================================
bool Meaningful;
//===================================
//vettore di pos di partenza dei nemici //notaaaaaaaa
//===================================
Area Enemys[MAXENEMY ];
//===================================
//Matrice di Tile. <br>
//contiene tutte le altezze delle
//piastrelle della mappa
//===================================
MadTile Map[MAXMAP][MAXMAP] ;
//======================
//vettore id Texture
//======================
GLuint ti[MAXMAP];
//========================================
//Le Normali per ogni triangoli delle tile
//========================================
Point3f Nl[MAXMAP][MAXMAP][4];
//========================================
//Vettore con i nomi delle texture
//========================================
char Tex[MAXMAP][120];
//========================================
//id delle texture dei nemici
//========================================
int TexEnemy;
//===========================================
//numero delle texture utilizzate dalla mappa
//===========================================
int numtex;
//===================================
//Dimenzione della matrice
//(Dim.X)x(Dim.Z)
//===================================
coord Dim;
private:
//==========================================
//serve per definire la texture per la Tile
//==========================================
Area Default;
//==========================================
//serve per definire la texture per il muro <br>
// di dislivello tra le Tile
//==========================================
Area Wall;
public:
//===================Costruttore============================
//costruisce una mappa non valida
//==========================================================
MadMap();
//===================Costruttore============================
//costruisce una mappa valida di grandezza (SizeX)x(SizeZ)
//dove l'altezza di ogni tile è DEFAULT_Y e l'are Goal e
//lo Start non sono indicati <br>
// <br>
//Parametri <br>
//SizeX: grandezza X della mappa <br>
//SizeZ: grandezza Z della mappa
//==========================================================
MadMap(int SizeX,int SizeZ);
/**Distruttore*/
~MadMap(){};
//===================Draw===================================
//Disegna la mappa nell'ambiente OpenGl. <br>
// <br>
//Parametri <br>
//option: WIREFRAME disegna la mappa a
// "fil di ferro" colorato <br>
// SOLID disegna la mappa "Solida" senza texture <br>
// TEXTURED disgna la mappa "solida" con texture <br>
//==========================================================
void Draw(int option);
//===================DrawWall===============================
//Disegna un muro <br>
// <br>
//Parametri <br>
//x,y: le coordinate della tile nella mappa <br>
//side: lato nella tile (NORTH, SOUTH , EAST, WEST) <br>
//option: WIREFRAME, SOLID, TEXTURED <br>
//==========================================================
void DrawWall(int x,int z,int side,int option);
//===================DrawTile===============================
//Disegna un tile <br>
// <br>
//Parametri <br>
//x,y: le coordinate della tile nella mappa <br>
//option: WIREFRAME, SOLID, TEXTURED <br>
//==========================================================
void DrawTile(int x,int z, int option);
//===================XMLWrite===============================
//Salva la mappa in un file di formato XML <br>
// <br>
//Parametri <br>
//fp : puntatore al file per il salvataggio
//==========================================================
void XMLWrite(FILE *fp);
//===================XMLRead================================
//Costruisce la mappa attraverso un documento XML <br>
// <br>
//Parametri <br>
//xml : puntatore ad un oggetto xml
//==========================================================
void XMLRead(vcg::Xml &xml);
/**non implementato*/
void reSize(int SizeX,int SizeZ);
//===================getY===================================
//restituisce l'altezza (Y) nel punto X, Z nella mappa
// se non appartiene alla mappa valore restituito -200
//==========================================================
double getY(double X, double Z);
//==========================================================
//restituisce il triangolo della tile in riferimento alle
//coordinate X, Z
//==========================================================
void getTriangle(double X, double Z, MarbleTriangle *currentTriangle );
//===================setY===================================
//cambia il valore a Y del campo(NO,NE,SO,SE) della tile più
// vicina al punto nella mappa indicato da X e Z
//==========================================================
void setY(double X, double Z, double Y);
//===================copy===================================
//permette di copiare in map_copy l'area definita dalle
//coordinate first e last
//==========================================================
void copy ( MadMap *map , coord first , coord last);
//===================copy===================================
//permette di l'intera MadMap in map_copy
//==========================================================
void copy (MadMap *map);
//===================paste==================================
//cambio l'area nella mappa definita dalle coordinate first
// e last con la mappa contenuta in map_paste
//==========================================================
void paste ( MadMap *map , coord first , coord last );
//===================merge==================================
//aggiungo nell'area nella mappa definita dalle coordinate
// first e last la mappa contenuta in map_paste
//==========================================================
void merge ( MadMap *map , coord first , coord last );
//===================upTile=================================
//alza la tile alle coordinate X, Y nella mappa di un
// altezza Y
//==========================================================
void upTile(int X,int Z,double Y);
//===================zeroTile===============================
//pone ad un'altezza k la tile alle coordinate X, Y
//==========================================================
void zeroTile(int X,int Z,double k);
//===================PickElement============================
//PickElement nella Mappa. <br>
// <br>
//valore restituito. <br>
//se >-1 <br>
// allora un intero dove il modulo 100 è la coordinata X
// della tile "pickata" <br>
//mentre la divisione intera per 100 è la coordinata Z
//della tile "pickata" <br>
//se =-1 nessuna tile! <br>
// <br>
//Parametri <br>
//x:coordinata x della vista x su cui fare la pick <br>
//y: coordinata y della vista su cui fare la pick <br>
//option: specifica se il disegno avviene tramite
// WIREFRAME o SOLID
//==========================================================
int PickElement(int x, int y, int option);
//======================InitTexture=========================
//inizializza le texture di tutte le aree della mappa
//==========================================================
void InitTexture(void);
//======================setColoredArea======================
//definisce con le coordinate a, b l'area colorata
//diversamentea all'interno della mappa
//==========================================================
void setColoredArea(coord a, coord b);
//======================isColored===========================
//verifica se il punto x, z nella mappa è nell'area
//colorata <br>
//valore restituito: true se appartiene all'area colorata,
//false altrimenti
//==========================================================
bool isColored(double x, double z);
//=====================getColoredGravity====================
//restituisce il valore della
// gravità nell'area colorata nella mappa
//==========================================================
int getColoredGravity();
//=====================getColoredAttrito====================
//restituisce il valore del
// Attrito nell'area colorata nella mappa
//==========================================================
int getColoredAttrito();
//=====================getColoredTexWall====================
//restituisce il valore del
// id della texture del muro nell'area colorata nella mappa
//==========================================================
int getColoredTexWall();
//=====================getColoredTexTile=====================
//restituisce il valore del
// id della texture delle tile nell'area colorata nella mappa
//===========================================================
int getColoredTexTile();
//=====================CalcNorm==============================
//Calcola le normali della mappa. il risultati in Nl
//===========================================================
void CalcNorm();
//=====================intersect=============================
//Verifica se il segmento definito dai punti (x1,y1,z1) e
// (x2,y2,z2) intersechi con la mappa.
// se si restuisce TRUE
// se no FALSE
//===========================================================
bool intersect(float x1,float y1,float z1,float x2, float y2,float z2);
};
#endif