
#ifndef INTERFICIE_MART_H
#define INTERFICIE_MART_H

#include "Simulador_Mart.h"
#include "Tipus_Globals.h"
#include <ptime.h>
#include <pasync.h>

USING_PTYPES

typedef struct Tipus_Punt_Mapa
{
   float z;
   int color;
}TPunt_Mapa;

typedef struct Tipus_Vector_Normal
{
   float x;
   float y;
   float z;
   float x2;
   float y2;
   float z2;
}TVector_Normal;   

class Visualitzador_Mart
{
   private:
      TPunt_Mapa **mapa_grafic;      
      TPosicio PosCamara[9];
      int camera_activa;
      int amplada;
      int altura;
      unsigned char *imatge;
      int captura_fotografia;
      int camera_captura;
      int actualitzar;
      mutex mutex_pantalla;

   public:
      Visualitzador_Mart();
      ~Visualitzador_Mart();
      
      // Metode que inicia el proces de visualitzacio de la superficie de mart,
      // executant-se indefinidament fins a la fi del programa, i manegant els
      // canvis sota demanda en els metodes actualitzar_camera, capturar_pantalla,
      // i set_missatge.
      void iniciar_visualitzacio(int principal_argc, char **principal_argv);
      void inicialitzar_cameres(int num_camera, float x, float y, float z, 
                                            int orientacio, int horitzo);

      int get_camera_activa();
      void set_camera_activa(int camera);
      void set_valor_camera(int camera);

      TPosicio *get_PosCamara();

      // Metode que actualitza les coordenadades i la corresponent visualitzacio
      // de la camera indicada. El rang de cameres oscil·la entre 1 i 8.
      void actualitzar_camera(int num_camera, float x, float y, float z, 
                              int orientacio, int horitzo);

      // Metode que captura el framebuffer de la camera especificada i en guarda
      // les dades en un array de bytes que es retorna.
      // Metode que visualitza un missatge de estat del robot en la finestra de OpenGL.
      void set_Missatge(char *missatge);
      
      // Obtencio de les dimensions actuals del framebuffer de OpenGL
      int get_amplada_imatge();
      int get_altura_imatge();
      
      void set_amplada_imatge(int width);
      void set_altura_imatge(int height);
      
      int get_captura_fotografia();
      void set_captura_fotografia(int valor, int camera, unsigned char *referencia_foto);

      // El rang de cameres oscil·la entre 1 i 8.
      void capturar_pantalla(int camera);

      int get_camera_captura();
      
      int get_cameres_inicialitzades();
      
      int get_actualitzar();
      void set_actualitzar(int valor);
      
      TPunt_Mapa **get_mapa_grafic();
      //TVector_Normal **vector_normal;

};

#endif


