#ifndef POINT_3D_HPP
#define POINT_3D_HPP

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

// Classe mère
#include "Math.hpp"
#include "Vector3D.hpp"


namespace USpeedGameEngine
{

class Math::Point3D
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        float x;        //!< Composante X du vecteur
        float y;        //!< Composante Y du vecteur
        float z;        //!< Composante Z du vecteur

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeurs
        Point3D();
        Point3D(float pX, float pY, float pZ);
        // Destructeur par défaut
        ~Point3D();

        // Accesseur aux 3 composantes du point
        void getValues(float *pX, float *pY, float *pZ);
        // Définition des 3 composantes du point
        void setValues(float pX, float pY, float pZ);

        // Modification des composantes du point pour utiliser des valeurs arrondies (précision définie par Math::Epsilon)
        void round();
        // Version négative du point
        void negate();
        // Calcul la distance entre le point courant et le point spécifié
        double distance(Math::Point3D *point) const;
        // Calcul la distance au carré (d²) entre le point courant et le point spécifié
        double distanceSquared(Math::Point3D *point) const;
        // Translation du point selon un vecteur
        void translate(Math::Vector3D *vector);

        ///////////////
        // Opérateur //
        ///////////////
        Math::Point3D operator+(const Math::Point3D &p) const;
        Math::Point3D operator-(const Math::Point3D &p) const;
        Math::Point3D operator*(const float scale) const;
        Math::Point3D operator-(void) const;
        Math::Point3D operator+(const Math::Vector3D &vector) const;
        Math::Point3D& operator+=(const Math::Vector3D &vector);
        Math::Point3D& operator=(const Math::Point3D &p);
        Math::Point3D& operator+=(const Math::Point3D &p);
        Math::Point3D& operator-=(const Math::Point3D &p);
        Math::Point3D& operator*=(const float scale);
        bool operator==(const Math::Point3D &p) const;
        bool operator!=(const Math::Point3D &p) const;
    protected :
    private :

};

}        // Fin "namespace USpeedGameEngine"

#endif
