#ifndef VOLUMEN_H
#define VOLUMEN_H

#include <Common.h>
#include <QObject>
#include <QGLWidget>
#include <string>
#include <QtGui>
#include <QtOpenGL>

#include "lut.h"
#include "material.h"
#include "raig.h"
#include <camera.h>
#include <llum.h>
#include <objecte.h>

using namespace std;

QT_BEGIN_NAMESPACE


QT_END_NAMESPACE

class volumen : public Objecte
{
      // Q_OBJECT

public:
    volumen(char*);
    volumen(char *,int anch,int alt,int profu,QString tipoUns);

    ~volumen();

    explicit volumen();

    void toGPU(QGLShaderProgram *program);
    // Pintat amb la GPU
    void draw(QGLShaderProgram *program);

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

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

    void make();
    void draw(GLdouble dx, GLdouble dy, GLdouble dz);

    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();
    void setVoxel(int i, int j, int k , float v);
    float getVoxel(int i, int j, int k);
    void setVoxelMask(int i, int j, int k , float v);
    float getVoxelMask(int i, int j, int k);
    float getVoxelEnable(int i, int j, int k);


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

    Lut *colores;

    float planox,planoy,planoz;
    int anchura, altura, profundidad;
    float tnear, tfar;
    float maxVal,minVal;


    GLuint lista;
    int uns;

    FILE *f1;
    char *imagen;
    char *nombreFichero;
    char *unsCS;
    float *voxels,*enablevoxels;
    float *mask;
    float *enablemask, *disablemask;
    unsigned char *capas;

    int NumVoxelsMon;

    vec4  *points;
    vec3  *normals;
    vec4  *colors;

    int hit;

    float* getVoxels();
    float* getMask();
    Material* getPrimari();
    void activamask(bool p);
    void onlyMask(bool p);

    Material *materialPrimari;
    Material *materialSecundari;
    void showLut();

public slots:

    QList<char *> obtenerEtiqueta();
    char *getImagen();
    const char *getFichero();

    int getAnchura();
    int getAltura();
    int getProfundidad();
    QString getTipoUns();
    void setImagen(char *im);
    void setFichero(char *fi);
    void setAnchura(int an);
    void setAltura(int al);
    void setProfundidad(int pro);
    void setTipoUns(char *unsC);


private:

    float getVoxelDirecto(int voxel);

    //bool intersecta(Raig *raig, Capsa3D cub, float t0, float t1);

   // vec4 calculIluminacioFTB(Capsa3D cub, Raig raig, int colorMode, Llum *llum);

   // vec4 getColorActual(int mode, float v, int i, int j, int k, Llum *llum, vec4 colorMax);
    void setVoxel2(int i, int j, int k ,float v);


//    Raig *raig;

    float UMBRAL_SATURACIO;
    float UMBRAL_OPACITAT;



    //Camera camera;

    static const int GS_MODE = 0;
    static const int LUT_MODE = 1;
    static const int PHONG_MODE = 2;
    static const int MIP_MODE = 3;
    static const int MIDA_MODE = 4;

    QList<char*> etiquetas;
    QList<float> listaVoxels;

    Raig* raig;
};

#endif // VOLUMEN_H
