#ifndef VIDEO_RENDER_PSP_HPP
#define VIDEO_RENDER_PSP_HPP

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

// C++
#include <string>

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

namespace USpeedGameEngine
{

class RenderPSP
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        bool initialized;               //!< État d'initialisation du moteur de rendu

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

        // Accès à l'instance unique de cette classe.
        static RenderPSP *getInstance();

        //////////////
        // Héritage //
        //////////////
        // Initialisation du moteur de rendu.
        bool init();
        // Libération du moteur de rendu.
        void clean();
        // Prépare l'affichage avant de tracer les polygones.
        void prepareDraw();
        // Achève les traitements pour l'affichage après avoir tracé les polygones.
        void finishDraw();
        // Changement de la vue.
        void changeViewport(int width, int height);
        // Changement de la perspective.
        void changePerspective(float pFov, float pAspect, float dNear, float dFar);

        ////////////////////////////
        // Instruction de traçage //
        ////////////////////////////
        // Démarrage du traçage.
        void start();
        void start(bool noCamera);
        // Transformation de translation.
        void translate(USGE_Float3 const &vector);
        // Transformation de rotation.
        void rotate(USGE_Float3 const &angles);
        // Transformation de rotation.
        void scale(USGE_Float3 const &ratios);
        // Modèle de rendu des zones sombres et éclairées : face ou point.
        void setShadeModel(bool vertexShader);
        // Application de la texture au modèle.
        void setMaterial(Material *material);
        // Instruction de traçage des points 3D en mode TRIANGLE.
        void render(USGE_Vertex *vertices, unsigned int count);
        // Finalisation de l'utilisation du Video::Render.
        void finish();
        // Instruction de traçage des points 3D en mode TRIANGLE avec texture etc...
        void renderFull(USGE_Vertex *vertices, unsigned int count, Material *material, Object3DParentAttach *anchor, USGE_Float3 const &vector, USGE_Float3 const &angles, USGE_Float3 const &ratios, bool vertexShader, bool noCamera);

        ////////////////
        // Accesseurs //
        ////////////////
        // Retourne la focale de la perspective.
        float getFov();
        // Retourne l'aspect ratio de la perspective.
        float getAspectRatio();

    protected :
    private :
        // Constructeur par défaut
        RenderPSP();

};

}        // Fin "namespace USpeedGameEngine"

#endif
