
#include "Tdeco.h"

// -----------------------
// --- le constructeur ---
// -----------------------

Tdeco::Tdeco()
{
	//
}

// ----------------------
// --- le destructeur ---
// ----------------------

Tdeco::~Tdeco()
{
    //
}

// --------------------
// --- les méthodes ---
// --------------------

// px py pz rx ry rz sx sy sz
void Tdeco::addModel(std::string flux)
{
    std::vector<std::string> strList;
    size_t idx = m_pos.size();
    OVec3_f rot, scale;

    ECO_strCut(strList, flux, ' ');

    m_pos.push_back(OVec3_f());
    m_rot.push_back(OVec3_f());
    m_scale.push_back(OVec3_f());
    m_model.push_back(OMat4());
    m_model_multi.push_back(OMat4());

	m_pos[idx].x = ECO_strToFloat(strList[0]);
	m_pos[idx].y = ECO_strToFloat(strList[1]);
	m_pos[idx].z = ECO_strToFloat(strList[2]);
	m_rot[idx].x = ECO_strToFloat(strList[3]);
	m_rot[idx].y = ECO_strToFloat(strList[4]);
	m_rot[idx].z = ECO_strToFloat(strList[5]);
    m_scale[idx].x = ECO_strToFloat(strList[6]);
	m_scale[idx].y = ECO_strToFloat(strList[7]);
	m_scale[idx].z = ECO_strToFloat(strList[8]);

    _setModel(idx);
    //setSelect(idx, true);
}

// code path file 1 / 0 0 0 0 0 0 1 1 1 /
void Tdeco::create(std::string flux)
{
    std::vector<std::string> strList;
    size_t idx = 0;

    ECO_strCut(strList, flux, ' ');

    // ---

    m_pos.push_back(OVec3_f());
    m_rot.push_back(OVec3_f());
    m_scale.push_back(OVec3_f());
    m_model.push_back(OMat4());
    m_model_multi.push_back(OMat4());

    // ---

	m_code = strList[0];
	m_path = strList[1];
	m_file = strList[2];
	m_cull_face = ECO_strToInt(strList[3]);
	// 4
	m_pos[idx].x = ECO_strToFloat(strList[5]);
	m_pos[idx].y = ECO_strToFloat(strList[6]);
	m_pos[idx].z = ECO_strToFloat(strList[7]);
	m_rot[idx].x = ECO_strToFloat(strList[8]);
	m_rot[idx].y = ECO_strToFloat(strList[9]);
	m_rot[idx].z = ECO_strToFloat(strList[10]);
    m_scale[idx].x = ECO_strToFloat(strList[11]);
	m_scale[idx].y = ECO_strToFloat(strList[12]);
	m_scale[idx].z = ECO_strToFloat(strList[13]);
    // 14

    // ---

    _composition();
    _setModel(idx);
}

void Tdeco::_composition()
{
    std::string file;

    OMesh_obj::P_setPath(PATH_MESH);

    if (m_path != "null")
    {
        file = m_path + m_file;
    }
    else
    {
        file = m_file;
    }
    if (!mesh.create(file))
    {
        ECO_error_set("echec chargement %s >Tdeco::_composition", m_file.c_str());
        //return;
    }

}



void Tdeco::draw(ODshGeo& dshGeo)
{
    // si besoin => actualisez ici
    //mesh.setModelMulti(m_model_multi);

    dshGeo.enable();
        dshGeo.setMulti(true);

    if (m_cull_face)
        glEnable(GL_CULL_FACE);
    else
        glDisable(GL_CULL_FACE);

    for (size_t i_par = 0; i_par < mesh.getPart_size(); i_par++)
    {
        dshGeo.setTextures( mesh.getId_diffuseMap(i_par), mesh.getId_normalMap(i_par), mesh.getId_specularMap(i_par));
        mesh.draw_multi(i_par);
    }
    mesh.end_draw_part();

    dshGeo.setMulti(false);
}

void Tdeco::draw_emissive(OShGlow& shGlow)
{
    // activer > glDepthFunc(GL_EQUAL); finir par glDepthFunc(GL_LESS);

    shGlow.enable();
        shGlow.setMulti(true);

    if (m_cull_face)
        glEnable(GL_CULL_FACE);
    else
        glDisable(GL_CULL_FACE);

    //glDepthFunc(GL_EQUAL);
    for (size_t i_par = 0; i_par < mesh.getPart_size(); i_par++)
    {
        // color rgb et a = energie
        if (mesh.getEmissive(i_par).a > 0.0f)
        {
            shGlow.setTexture( mesh.getId_emissiveMap(i_par) );
            mesh.draw_multi(i_par);
        }
    }
    mesh.end_draw_part();

    shGlow.setMulti(false);
}





uint32_t Tdeco::getId_diffuseMap(size_t i_par)
{
    return mesh.getId_diffuseMap(i_par);
}

uint32_t Tdeco::getId_normalMap(size_t i_par)
{
    return mesh.getId_normalMap(i_par);
}

OMat4& Tdeco::getModel(size_t idx)
{
    return m_model[idx];
}

size_t Tdeco::getPart_size()
{
    return mesh.getPart_size();
}

bool Tdeco::getSelect()
{
    return false; // m_select;
}





void Tdeco::_setModel(size_t idx)
{
    m_model[idx].loadIdentity();
    m_model[idx].translate(m_pos[idx]);
    m_model[idx].rotate(m_rot[idx].z, 0,0,1);
    m_model[idx].rotate(m_rot[idx].y, 0,1,0);
    m_model[idx].rotate(m_rot[idx].x, 1,0,0);
    m_model[idx].scale(m_scale[idx]);

    m_model_multi[idx] = m_model[idx];
    m_model_multi[idx].transpose(); // mat4 'horizontale'

    mesh.setModelMulti(m_model_multi);
}



