#ifndef VIDEO_RENDER_HPP
#define VIDEO_RENDER_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 Video::Render
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :

    /***************
    * Les méthodes *
    ***************/
    public :

        //! A IMPLÉMENTER : Destructeur par défaut.
        virtual ~Render() { };
        //! A IMPLÉMENTER : Initialisation du moteur de rendu.
        virtual bool init() = 0;
        //! A IMPLÉMENTER : Libération du moteur de rendu.
        virtual void clean() = 0;
        //! A IMPLÉMENTER : Prépare l'affichage avant de tracer les polygones.
        virtual void prepareDraw() = 0;
        //! A IMPLÉMENTER : Achève les traitements pour l'affichage après avoir tracé les polygones.
        virtual void finishDraw() = 0;
        //! A IMPLÉMENTER : Changement de la vue.
        virtual void changeViewport(int width, int height) = 0;
        //! A IMPLÉMENTER : Changement de la perspective.
        virtual void changePerspective(float pFov, float pAspect, float dNear, float dFar) = 0;

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

        ////////////////
        // Accesseurs //
        ////////////////
        //! A IMPLÉMENTER : Retourne la focale de la perspective.
        virtual float getFov() = 0;
        //! A IMPLÉMENTER : Retourne l'aspect ratio de la perspective.
        virtual float getAspectRatio() = 0;

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

};

}        // Fin "namespace USpeedGameEngine"

#endif
