#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);
};