
#ifndef TPERSO_H_INCLUDED
#define TPERSO_H_INCLUDED

/*
OBJET       classe d'un perso gltf

DATE        04/2025

AUTEUR      philippe Thebaud

COMMENTAIRE
*/

#include <GL/glew.h>
#include <string>

#include "../ECO/OUtils.h"
#include "../ECO/OMesh_gltf.h"
#include "../ECO/OMesh_obj.h"
#include "../ECO/defered/ODshGeo.h"
#include "../ECO/defered/ODshFreeze.h"
#include "../ECO/shader/OShLight.h" // utilisé à la place de OShImage3d

#include "common_perso.h"
#include "Tobjet.h"
#include "Tbillfire.h"



class Tperso
{
public:
	Tperso();
	~Tperso();

	void        anim_start(int index, int loop = 1);
	void        anim_start(std::string name, int loop = 1);
	void        anim_stop();

	void        create(std::string flux);

	void        draw(ODshGeo& dshGeo, ODshFreeze& dshFreeze);
	void        draw(OShLight& shLight, OVec3_f& camDir);
	void        draw_emissive(OShGlow& shGlow);

	std::string getCode();
	OMesh_gltf& getMesh();
	OMat4&      getModel();
	bool        getSelect();

	bool        setEquipement(Tobjet& refObjet);
    bool        setEquipement(Tobjet* ptObjet);
	void        setEquipement_no(int emplacement);
	void        setSelect();
	void        setState(int value);

private:

    void        _composition();

	void        _draw(ODshGeo& dshGeo);
	//void        _draw_fire();
    void        _draw_freeze(ODshFreeze& dshFreeze);
    void        _draw_ko(ODshGeo& dshGeo);

    void        _setModel();

private:

    std::string m_code, m_path, m_file;
    int         m_cull_face;

    OMat4       m_model;
    OVec3_f     m_pos;
    OVec3_f     m_rot;
    OVec3_f     m_scale;    // à eviter
    std::vector<OMat4> m_anim_axis; // les axes d'animations > pour emissive = évite de recalculer, évite les décalages

    // crane   main-gauche main-droite
    // casque  bouclier    arme
    struct s_attache
    {
        Tobjet*     pt_objet; // null = vide, sinon equipé
        int         ref_axe;
        OVec3_f     decal_pos;
        OVec3_f     decal_rot;

        s_attache()
        {
            pt_objet = nullptr;
            ref_axe = -1;
        }
    };

    // etat du perso : ici un seul à la fois
    int         m_state_type;
    float       m_state_delay, m_state_rot;
    OMesh_obj   mesh_ko;
    Tbillfire   billfire;
    bool        m_select;

    struct s_emissive
    {
        float max; float value;
        s_emissive() {max = 0.0f; value = 0.0f;}
    };
    std::vector<s_emissive> m_emissive; // (partie) energie_possible energie_actuelle

public:
    // simplifie les acces
    OMesh_gltf  mesh;
    s_attache   attache[MAX_ATTACHE];
    //s_trajet    trajet; // route du perso / nom different pour ne pas confondre
    //
    //s_attribut  attribut;
    //s_att_tempo attTempo;
    //s_attCombat attCombat;
};

#endif
