#pragma once
#include "MadUtility.h"
#include "MadMap.h"
#include "marbletriangle.h"
#define M_PI 3.14159265358979323846
#define G -160.0
#define VELOCITA_DI_MORTE 3500
#define ATTRITONORMALE 7 //norma del vettore attrito relativo alla tile standard da dimenzionare
#define ATTRITOGHIACCIO 2
#define ATTRITOSABBIA 20
#define RAGGIO_SENSORIALE 7
using namespace std;
using namespace vcg;

//==============MarbleSphere============
//Sfera la classe "base" per le palline
//======================================
class MarbleSphere
{


public:

//=====================================================
//Angolo di rotazione in funzione della velocita 
//===================================================== 
float angolo_rotazione;

//=====================================================
//settore circolare che corrisponde ad un grado di 
//rotazione della sfera
//===================================================== 
float lung_arco_per_grado; 

//=====================================================
//asse di rotazione in funzione della direzione 
//di spostamento
//===================================================== 
Point3f vettore_rotazione;

//=====================================================
//posizione del centro della palla
//===================================================== 
Point3f vet_posizione;  

//=====================================================
//vettore velocita' del passo precedente
//===================================================== 
Point3f vet_velocita;

//=====================================================
//norma del vettore velocita' del passo precedente
//===================================================== 
float normavel;

//=====================================================
//vettore attrito in funzione della direzione e norma 
//della velocita
//===================================================== 
Point3f vet_compon_vel_attrito;

//=====================================================
//vettore determinato dalla componente di controllo
//(mouse ,intelligenza,...)
//===================================================== 
Point3f vet_compon_controllo;

//=====================================================
//vettore gravita
//===================================================== 
Point3f vet_compon_vel_gravita;

//=====================================================
//vettore reazione al piano
//===================================================== 
Point3f vet_compon_vel_reazione;

//=====================================================
//vettore velocita' risultante a partire dalla 
//precedente e da tutte le componenti calcolate
//nel passo attuale
//===================================================== 
Point3f vel_risultante;  

//=====================================================
//triangolo su cui si trova la pallina 
//=====================================================  
MarbleTriangle triangolo; 

//=====================================================
//texture
//=====================================================
UINT ti;

//=====================================================
//indica se la sfera e' a contatto con la mappa
//e la mappa e' orizzontale
//=====================================================
bool tocca_mappa_piana;

//=====================================================
////indica se la sfera e' a contatto con la mappa
//e la mappa e' inclinata
//=====================================================
bool tocca_mappa_inclinata;

//=====================================================
//norma del vettore attrito da sottrarre alla norma 
//della velocita' risultante 
//=====================================================
float norma_attrito;  

//=====================================================
//vettore posizione del frame precedente per il calcolo
//del collision detection
//=====================================================
Point3f old_vet_pos; 

//=====================================================
//per memorizzare il valore dell'attrito della tile su
//cui si trova la sfera
//=====================================================
int attrito;

//=====================================================
//vettore posizione risultante
//=====================================================
Point3f vet_pos_ris;

//=====================================================
//norma del vettore posizione risultante
//=====================================================
float normavettpos;

//=====================================================
//lunghezza dello spostamento
//=====================================================
float normapos;

//=====================================================
//indica se la palla e' viva 
//=====================================================
bool palla_viva ; 

//=====================================================
//var che determina i casi di morte della della draw
//=====================================================
int  muro_di_morte ;

public:

//=================init_posizione=====================
//inizializza il vettore posizione a partire dalle<br>
//  coordinate della tile start della mappa       <br>
//====================================================  
void init_posizione(float x, float y, float z); 


//=================Draw===============================
//disegno della sfera e gestione dei casi di morte<br>
//====================================================
void Draw(int option);


//=================Rotate=============================
//rotazione della sfera                           <br>
//====================================================
void Rotate(float dt);


//=================Update=============================
//calcolo della fisica e del collision det        <br>
//====================================================
void Update (MadMap *mp, float dt);


//=================CreateSphere=======================
//disegna una sfera centrata in c di raggio r     <br>
// e n numero  di poligoni                        <br>
//====================================================
void CreateSphere(Point3f c,double r,int n);


//===================MarbleSphere=====================
//Costruttore Oggetto                             <br>
//====================================================
MarbleSphere(void);


//===================~MarbleSphere====================
//Distruttore Oggetto                             <br>
//====================================================
~MarbleSphere(void);


//===================setTexture=======================
//Inizializza e setta l'ambiente per il texturing <br>
//====================================================
void setTexture(char *str);

};