#include "ColorCube.h"
static unsigned int s_nbColorCubes=0;

// Constructeur et Destructeur
ColorCube::ColorCube()
{
    // Incrémentation du nombre de cubes
    s_nbColorCubes++;

    // Vertices
    float verticesTmp[42] = {0.0f,0.0f,1.0f,   1.0f,1.0f,1.0f,   1.0f,0.0f,1.0f,  1.0f,0.0f,0.0f,  0.0f,0.0f,1.0f,  0.0f,0.0f,0.0f,        0.0f,1.0f,0.0f,
                        1.0f,0.0f,0.0f,    1.0f,1.0f,0.0f,    1.0f,1.0f,1.0f,    0.0f,1.0f,0.0f,    0.0f,1.0f,1.0f,    0.0f,0.0f,1.0f,      1.0f,1.0f,1.0f};
    for(int i(0); i < 42; i++)
        m_vertices[i] = verticesTmp[i];

    // Couleurs
    float couleursTmp[42] = {1.0,1.0,0.0,     1.0,0.0,0.0,   1.0,0.0,0.0,   0.0,0.0,1.0,    1.0,1.0,0.0,     0.0,1.0,0.0,           0.0,1.0,0.0,
                            0.0,0.0,1.0,      0.0,0.0,1.0,      1.0,0.0,0.0,      0.0,1.0,0.0,      1.0,1.0,0.0,      1.0,1.0,0.0,     1.0,0.0,0.0};
    for (int i(0); i<42; i++)
        m_couleurs[i] = couleursTmp[i];
}


ColorCube::ColorCube(float taille, float red, float green, float blue)
{
    // Incrémentation du nombre de cubes
    s_nbColorCubes++;

    // Vertices
    float verticesTmp[42] = {0.f,0.0f,taille,   taille,taille,taille,   taille,0.0f,taille,  taille,0.0f,0.0f,  0.0f,0.0f,taille,  0.0f,0.0f,0.0f,        0.0f,taille,0.0f,
                        taille,0.0f,0.0f,    taille,taille,0.0f,    taille,taille,taille,    0.0f,taille,0.0f,    0.0f,taille,taille,    0.0f,0.0f,taille,      taille,taille,taille};
    for(int i(0); i < 42; i++)
        m_vertices[i] = verticesTmp[i];

    // Couleurs
    setColor(red,green,blue);
}


ColorCube::~ColorCube()
{
    s_nbColorCubes--;
}


// Méthodes
void ColorCube::setColor(float red, float green, float blue)
{
    // Attribution des couleurs
    for(int i(0); i < 42; i++)
    {
        switch (i%3)
        {
            case 0:
                m_couleurs[i] = red;
                break;
            case 1:
                m_couleurs[i] = green;
                break;
            case 2:
                m_couleurs[i] = blue;
                break;
        }
    }
}

void ColorCube::afficher()
{
    // Envoi des vertices
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, m_vertices);
    glEnableVertexAttribArray(0);

    // Envoi de la couleur
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, m_couleurs);
    glEnableVertexAttribArray(1);

    // Rendu
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 14);

    // Désactivation des tableaux
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);
}

void ColorCube::move(glm::vec3 deplacement)
{
    for(int i(0); i < 42; i++)
    {
        switch (i%3)
        {
            case 0:
                m_vertices[i] += deplacement.x;
                break;
            case 1:
                m_vertices[i] += deplacement.y;
                break;
            case 2:
                m_vertices[i] += deplacement.z;
                break;
        }
    }
}

unsigned int getNbColorCubes()
{
    return s_nbColorCubes;
}

