#pragma once

#include "MadMap.h"
#include "MarbleBall.h"
#include "MarbleEnemy.h"
#include "CCamera.h"
#include "Console.h"
#include <vcg/xml/xml.h>
//settaggio di init dell'ambiente opengl per la luce e i materiali
#define METALLO 0
#define VETRO 1
#define PLASTICA 2
#define LUMINOSO 3
#define DEFAULT -100
#define ROLLCONTROL 1
#define LUKECONTROL 2
#define C_UP 1000
#define C_DOWN -1000
#define C_RIGHT 100
#define C_LEFT -100

/**vista opengl del gioco*/ 
class GameView
{
public:
 /**tasto destro del mouse*/
 bool b_right;

 /**tasto sinistro del mouse*/
 bool b_left;

 /**camera della vista del gioco*/
 CCamera camera;

 /**mappa del gioco*/
 MadMap mp;

 /**pallina del gioco*/
 MarbleBall ball;

 /**nemici**/
 MarbleEnemy enemy[MAXENEMY];
 
/**angolo del camera per la rotazione intorno asse Y della pallina*/
 float k;

 /**angolo della camera per la rotazione intorno asse x/z della pallina*/
 float v;

 /**limite angolo della camera per rotazione intorno asse Y*/
 float kl;

 /**limite angolo della camera per rotazione intorno asse x/z*/
 float vl;

 /** h: distanza corrente della camera dalla pallina*/
 float h;

 /** limite della distanza della camera dalla pallina */
 float hl;

 /**delta temporale*/
 float dt;

 /** sensibilità del movimento controllo*/
 float sns;

 /**ampiezza X della vista */
 int SizeViewX;

 /**ampiezza Y della vista */
 int SizeViewY;

 /**variabile che indica se le texture della mappa nella vista sono inizializzate*/
 bool inittexture;
 
 /**tempo rimanente nel gioco in corso*/
 int conto_alla_rovescia;
    
 /**tempo iniziale del gioco in corso*/
 int time_game;
 
 /**frame per secondo*/
 int fps;

 /**numero di frame che sono stati calcolati dall'ultimo intervallo di tempo*/
 int frame;
 
 /**time iniziale dell'intervallo temporale*/
 int timebase;

 /**ultimo time dell'intervallo temporale*/
 int time;

 /**coordinate del mouse*/
 int x, y;
 
 /**vecchie coordinate del mouse*/
 int ox, oy;

 /**indica se la vista è in modalità pause*/
 bool pause;

 /**numero vite disponibili nel gioco in corso*/
 int num_vite;
 
 /**indica se la camera segue i movimenti della palla*/
 bool camerafollowball;

 /**il tipo di l'ambiente corrente : METALLO,VETRO, PLASTICA, LUMINOSO, DEFAULT*/
 int option_materiale;

 /**console usata per i menu*/
 CConsole console;
 
 /**menu corrente*/
 int menu;

 /**item corrente*/
 int item;

 /**il tipo di grafica corrente (WIREFRAME,SOLID,TEXTURED)*/
 int optionGraphics;

 /**il tipo di controllo del movimento della palla corrente:ROLLCONTROL, LUKECONTROL*/ 
 int scontrol;

 /**indice della mappa corrente*/
int currentmap;

/**il tipo di visualizzazione dei nemici corrente: ROBOT, NOROBOT*/
int optionEnemy;

//int moving;
public:
    //==================Init============================
    //Inizializza la vista del gioco
    //==================================================
    void Init(int option);
    //==================SetKey==========================
    //permette di indicare tasto premuto della tastiera nella vista
    //==================================================
    void setKey(int);
    //==================SetSKey==========================
    //permette di indicare tasto Speciale premuto della tastiera nella vista
    //==================================================
    void setSKey(int key);
    //==================SetSKeyUp==========================
    //permette di indicare tasto Speciale rilasciato della tastiera nella vista
    //==================================================
    void setSKeyUp(int key);
    //==================SetMouse==========================
    //aggiorno le coordinate del mouse nella vista
    //====================================================
    void setMouse(int cx, int cy);
    GameView(void);
    
    ~GameView(void);
    //==================Reshape============================================
    //Imposta la visualizzazione della view in base alle dimensioni (w)X(h)
    //=====================================================================
    void Reshape(int w, int h);

    //==================moveCamera===========================
    //funzione che sposta la camera
    //=======================================================
    void moveCamera(void);


    //==================Draw=================================
    //renderizza un fotogramma nella view
    //=======================================================
    int Draw(void);

    //==================moveBall==========================================
    //sposta la pallina in base al type passato.                      <br>
    //type può avere i seguenti valori:                               <br>                          
    //ROLLCONTROL: spostamento rotolamento in base movimento del mouse<br>
    //LUKECONTROL: spostamento elastico in base movimento del mouse    <br> 
    //C_UP: spostamento avanti attraverso il tasto UP                 <br>
    //C_DOWN:  spostamento indietro attraverso il tasto DOWN          <br>
    //C_LEFT: spostamento a sinistra attraverso il tasto LEFT         <br>
    //C_RIGHT:  spostamento a destra attraverso il tasto UP           <br>
    //====================================================================
    void moveBall(int type);


    //==================Update=============================
    //Aggiorna lo stato della vista 
    //=======================================================
    void Update(void);


    //==================move=============================
    //applica il movimento (camera e/o pallina)
    //=======================================================
    void move(void);

    //==================Pause=============================
    //mette in stato di pausa la vista
    //=======================================================
    void Pause(void);

    //==================TargetCamera=======================================================
    //calcola la posizione il punto di vista della camera in modo che la pallina sia sempre in vista
    //=====================================================================================
    void TargetCamera(void);

    //==================selectMenuItem=============================
    //permette di selezionare una voce nei menu                  <br>
    //menu: menu corrente                                        <br>
    //item: item selezionato                                     <br>
    //=======================================================
    void selectMenuItem(int menu, int item);

    //==================LoadMap=============================
    //carica una mappa.                                 <br>
    //map: nome della mappa                             <br>
    //=======================================================
    int  GameView::LoadMap(char *map);
};