#ifndef OBJECTE_H
#define OBJECTE_H

#include <QObject>
#include <vector>
#include <Common.h>
#include <QGLShaderProgram>
#include <lut.h>

typedef Common::vec4  color4;
typedef Common::vec4  point4;

using namespace std;

class Objecte : public QObject
{
    Q_OBJECT
public:
    explicit Objecte(QObject *parent = 0);
     virtual ~Objecte() {}

    // make(): omple l'estructura de points i colors de l'objecte, inicialitza NumVertices
    virtual void make() = 0;

    // Pas generic de vertexs i colors a la GPU
    virtual void toGPU(QGLShaderProgram *program) = 0;
    // Pintat amb la GPU
    virtual void draw(QGLShaderProgram *program) = 0;
    //virtual void draw(GLdouble dx, GLdouble dy, GLdouble dz);

    // Calcula la capsa 3D contenidora de l'objecte
    virtual Capsa3D calculCapsa3D()=0;

    // Trasllada un objecte
    virtual void translate(double x, double y, double z) = 0;

    virtual void addListaVoxels(float x,float y,float z,float v,float i) = 0;
    virtual void openVolumen(int a, int al, int p, QString t) = 0;
    virtual void setLut(const char *nF) = 0;
    virtual void abrirVolumen() = 0;
    virtual float getVoxel(int i, int j, int k) = 0;
    virtual void setVoxel(int i, int j, int k , float v) = 0;
    virtual float getVoxelMask(int i, int j, int k) = 0;
    virtual void setVoxelMask(int i, int j, int k , float v) = 0;


//    virtual GLubyte* raycastingCPU(Camera cam, Capsa3D cub, float opacitat, float saturacio, float sampling, int colorMode, Llum *llum,float crem) = 0;
    virtual void initMaterialsVolum(QGLShaderProgram *program) = 0;
    virtual void setLoadedLUT(Lut *LUT) = 0;

    // Sistema de coordenades d'un objecte: punt origen i eixos de rotació
    GLdouble xorig, yorig, zorig;
    int xRot;
    int yRot;
    int zRot;
    // Capsa mínima contenidora de l'objecte
    Capsa3D capsa;


};



#endif // OBJECTE_H
