#ifndef SURFACE_2D_HPP
#define SURFACE_2D_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

// Les types "USpeed Game Engine"
#include "Core/CoreTypes.hpp"
#include "Material/Material.hpp"
#include "Object3D/Object3D.hpp"

namespace USpeedGameEngine
{

class Surface2D : public Object3D
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        float xSize;    //!< Pourcentage (>= 0) de la hauteur de la surface (par rapport à la taille de l'écran) pour obtenir la largeur de la surface
        float ySize;    //!< Pourcentage (>= 0) de la hauteur de la surface (par rapport à la taille de l'écran) pour obtenir la hauteur de la surface
        float xPos;     //!< Position X de la surface (en pourcentage de l'écran) : entre -1.0f et 1.0f.
        float yPos;     //!< Position Y de la surface (en pourcentage de l'écran) : entre -1.0f et 1.0f.
        float xCenter;  //!< Décallage X par rapport au bord haut gauche du centre de rotation (et de positionnement) de la surface
        float yCenter;  //!< Décallage Y par rapport au bord haut gauche du centre de rotation (et de positionnement) de la surface

    /***************
    * Les méthodes *
    ***************/
    public :
        // Destructeur par défaut.
        ~Surface2D();
        // Constructeur par défaut.
        Surface2D();
        // Retourne valeur du rapport "largeur/hauteur" de la zone de rendu (l'écran).
        static float screenRatio();

        ////////////////////////
        // Fonctions héritées //
        ////////////////////////
        // Permet de définir la translation à effectuer sur modèle avant le rendu.
        void setTranslation(USGE_Float3 const &trans, bool add, bool computeSurface);
        void setTranslation(USGE_Float3 const &trans, bool add);
        void setTranslation(USGE_Float3 const &trans);
        // Remise à zéro de l'instance de la classe.
        void clear();

        //////////////////
        // Fonctions 2D //
        //////////////////
       // Modification du centre/pivot.
        void setCenter(float x, float y, bool computeSurface);
        void setCenter(float x, float y);
        // Modification de la taille de la surface.
        void setSize(float x, float y, bool computeSurface);
        void setSize(float x, float y);
        // Modification de la position de la surface.
        void setPosition(float x, float y, bool computeSurface);
        void setPosition(float x, float y);
        // Modifications des coordonnées de texture.
        void setTexturePart(float xStart, float yStart, float xEnd, float yEnd);
        // Calcul et détermination de la surface à partir des paramètres fournis.
        void applyParameters();

        /////////////////
        // Chargements //
        /////////////////
        // Chargement d'une surface ayant la taille de la zone de rendu (hors mouvement de caméra).
        bool loadSurface();

    protected :
    private :
        // Effectue les transformations directes de l'objet courant en tant que parent lors du rendu d'un enfant
        void processParentTransform(struct StructParentAttach *anchor);
};

}        // Fin "namespace USpeedGameEngine"

#endif
