#include "Cabane.h"


// Permet d'éviter la ré-écriture du namespace glm::

using namespace glm;


// Constructeur et Destructeur

Cabane::Cabane(std::string const vertexShader, std::string const fragmentShader) : m_shader(vertexShader, fragmentShader),
                                                                                   m_textureMur("Textures/Mur.jpg"), m_textureToit("Textures/Toit.jpg")
{
    // Chargement du shader

    m_shader.charger();


    // Chargement des textures

    m_textureMur.charger();
    m_textureToit.charger();


    // Vertices temporaires

    float verticesTmp[] = {-5, 0, -5,   5, 0, -5,   5, 5, -5,      // Mur du Fond
                           -5, 0, -5,   -5, 5, -5,   5, 5, -5,     // Mur du Fond

                           -5, 0, -5,   -5, 0, 5,   -5, 5, 5,      // Mur Gauche
                           -5, 0, -5,   -5, 5, -5,   -5, 5, 5,     // Mur Gauche

                           5, 0, -5,   5, 0, 5,   5, 5, 5,         // Mur Droit
                           5, 0, -5,   5, 5, -5,   5, 5, 5,        // Mur Droit

                           -5, 5, -5,   5, 5, -5,   0, 6, -5,      // Combles

                           -6, 4.8, -6,   -6, 4.8, 6,   0, 6, 6,   // Toit Gauche
                           -6, 4.8, -6,   0, 6, -6,   0, 6, 6,     // Toit Gauche

                           6, 4.8, -6,   6, 4.8, 6,   0, 6, 6,     // Toit Droit
                           6, 4.8, -6,   0, 6, -6,   0, 6, 6};     // Toit Droit


    // Coordonnées de texture temporaires

    float coordTexture[] = {0, 0,   1, 0,   1, 1,        // Mur du Fond
                            0, 0,   0, 1,   1, 1,        // Mur du Fond

                            0, 0,   1, 0,   1, 1,        // Mur Gauche
                            0, 0,   0, 1,   1, 1,        // Mur Gauche

                            0, 0,   1, 0,   1, 1,        // Mur Droit
                            0, 0,   0, 1,   1, 1,        // Mur Droit

                            0, 0,   1, 0,   0.5, 0.5,    // Combles

                            0, 0,   1, 0,   1, 1,        // Toit Gauche
                            0, 0,   0, 1,   1, 1,        // Toit Gauche

                            0, 0,   1, 0,   1, 1,        // Toit Droit
                            0, 0,   0, 1,   1, 1};       // Toit Droit



    // Copie des vertices

    for(int i(0); i < 99; i++)
        m_vertices[i] = verticesTmp[i];


    // Copie des coordonnées

    for(int i(0); i < 66; i++)
        m_coordTexture[i] = coordTexture[i];
}


Cabane::~Cabane()
{

}


// Méthodes

void Cabane::afficher(glm::mat4 &projection, glm::mat4 &modelview)
{
    // Activation du shader

    glUseProgram(m_shader.getProgramID());


        // Envoi des vertices

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, m_vertices);
        glEnableVertexAttribArray(0);


        // Envoi des coordonnées de texture

        glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, m_coordTexture);
        glEnableVertexAttribArray(2);


        // Envoi des matrices

        glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "projection"), 1, GL_FALSE, value_ptr(projection));
        glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "modelview"), 1, GL_FALSE, value_ptr(modelview));


        // Verrouillage de la texture du Mur

        glBindTexture(GL_TEXTURE_2D, m_textureMur.getID());


        // Rendu

        glDrawArrays(GL_TRIANGLES, 0, 21);


        // Déverrouillage de la texture

        glBindTexture(GL_TEXTURE_2D, 0);


        // Verrouillage de la texture du Toit

        glBindTexture(GL_TEXTURE_2D, m_textureToit.getID());


        // Rendu

        glDrawArrays(GL_TRIANGLES, 21, 12);


        // Déverrouillage de la texture

        glBindTexture(GL_TEXTURE_2D, 0);


        // Désactivation des tableaux

        glDisableVertexAttribArray(2);
        glDisableVertexAttribArray(0);


    // Désactivation du shader

    glUseProgram(0);
}
