#ifndef CUB_H
#define CUB_H

#include <Common.h>
#include <QGLShaderProgram>

#include <objecte.h>
#include <stdio.h>
#include <lut.h>
#include <llum.h>
#include <camera.h>
#include <llum.h>

class Cub : public Objecte
{
  public:
       Cub();
      Cub(float anchura, float altura, float profundidad);
      Cub(int an, int al, int profu, GLfloat x0, GLfloat y0, GLfloat z0);
      ~Cub();
      void make();
      void toGPU(QGLShaderProgram *program);
      void draw(QGLShaderProgram *program);
      // Trasllada un objecte
      void translate(double x, double y, double z);

      void addListaVoxels(float x,float y,float z,float v,float i);

      void openVolumen(int a, int al, int p, QString t);

      void setLut(const char *nF);
      void abrirVolumen();

      float getVoxel(int i, int j, int k);
      void setVoxel(int i, int j, int k , float v);

      float getVoxelMask(int i, int j, int k);
      void setVoxelMask(int i, int j, int k , float v);

      GLubyte* raycastingCPU(Camera cam, Capsa3D cub, float opacitat, float saturacio, float sampling, int colorMode, Llum *llum,float crem);

      void initMaterialsVolum(QGLShaderProgram *program);
      void setLoadedLUT(Lut *LUT);

      Capsa3D calculCapsa3D();

  private:

      void genQuads(float x, float y, float z);
      void vertex(float x, float y, float z);
      void quad( int a, int b, int c, int d );

      int a; // amplada
      int h; // alcada
      int p; // profunditat
      static const int NumVerticesC = 4*6; //4 vertex * 6 cares
      point4 vertices[8]; // 8 vertexs del cub
      color4 vertex_colors[8]; // 8 colors RGBA associats a cada vertex
      point4 verticesTex[8];

      // numero de punts de la triangulacio (6 cares*(2 triangles/cara)*3 vertexs/triangle)
//      static const int NumVerticesC = 36;// inicialitzat a cada subclasse


      // Vertexs i colors que es passaran a la GPU
      point4 points[NumVerticesC]; // punts dels triangles
      color4 colors[NumVerticesC]; // color en cada cara
      vec4 tex_coords3D[NumVerticesC];
      int Index; // index de control del numero de vertexs a posar a la GPU



};

#endif // CUB_H
