#ifndef PHYSIC_STATE_HPP
#define PHYSIC_STATE_HPP

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

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

#include "Physic.hpp"

namespace USpeedGameEngine
{

class Physic::PhysicState
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        void *object;                   //!< Informations sur l'objet (contient "shape" et "motion")
        void *shape;                    //!< Informations sur la forme de l'objet à considérer
        void *motion;                   //!< Informations sur la mobilité

        bool loaded;                    //!< L'état de chargement de l'état physique
        float mass;                     //!< La masse de l'objet
        USGE_Float3 position;           //!< La position de l'objet
        USGE_Float3 rotation;           //!< L'orientation de l'objet
        USGE_Float3 linearVelocity;     //!< Mouvement de translation de l'objet
        USGE_Float3 angularVelocity;    //!< Mouvement de rotation de l'objet

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur par défaut
        PhysicState();
        // Destructeur par défaut
        ~PhysicState();

        //////////////////////////
        // Les formes possibles //
        //////////////////////////
        // Chargement de l'état physique selon un modèle parallèlépipèdique
        bool loadBox(USGE_Float3 dim);
        // Chargement de l'état physique selon un modèle sphérique
        bool loadSphere(float radius);
        // Chargement de l'état physique selon un modèle cônique
        bool loadCone(float radius, float height);
        // Chargement de l'état physique selon un modèle de capsule
        bool loadCapsule(float radius, float height);
        // Chargement de l'état physique selon un modèle cylindrique
        //bool loadCylinder(USGE_Float3 ???);

        // Remise à zéro de l'état de l'objet
        void unload();
        void unload(bool resetState);
        // Permet de savoir si l'objet est chargé (valide pour une utilisation)
        bool isLoaded();

        // Sauvegarde de l'état physique actuel.
        void saveState();
        void saveState(bool unload);

        ////////////////////////////////////////////
        // Affectations : à faire avant le "load" //
        ////////////////////////////////////////////
        // Définition de la position initiale (x, y, z)
        void setPosition(USGE_Float3 position);
        void setPosition(float x, float y, float z);
        // Définition de la rotation d'Euler initiale selon x, y et z
        void setRotation(USGE_Float3 rotation);
        void setRotation(float x, float y, float z);
        // Définition de la masse initiale
        void setMass(float mass);
        // Définition de la vitesse initial (linéaire et angulaire)
        void setVelocity(USGE_Float3 linear, USGE_Float3 angular);

        ////////////////
        // Accesseurs //
        ////////////////
        // Récupération de la position (x, y, z)
        void getPosition(USGE_Float3 *position);
        void getPosition(float *x, float *y, float *z);
        // Récupération de la rotation d'Euler selon x, y et z
        void getRotation(USGE_Float3 *rotation);
        void getRotation(float *x, float *y, float *z);
        // Retourne le pointeur vers le "object" de l'objet physique
        void *getObject();

    protected :
    private :
        // Chargement de l'état physique du modèle.
        bool load();
};

}        // Fin "namespace USpeedGameEngine"

#endif
