/*****************************************************************************
 *
 *  Copyright (C) 2003 Cédric Brégardis <cedric.bregardis@free.fr>
 *
 *  This file is part of BRIQUOLO
 *
 *  BRIQUOLO is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  BRIQUOLO is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with BRIQUOLO; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *****************************************************************************/
#ifndef MOGL_FENETREKIT
#define MOGL_FENETREKIT

#include "MOGL_Action.h"
#include "MOGL_Fenetre.h"
#include "MOGL_Univers.h"
#include "MOGL_Facade.h"
#include "MOGL_Camera.h"
#include "MOGL_Texte.h"
#include "MOGL_GestionnaireTexture.h"

/**
 * Cet objet a pour but de fournir les objets de base nécessaires à une utilisation de base de MOGL.
 * Les objets constuits sont :
 * - MOGL_Fenetre qui représente la fenêtre d'affichage (640x480x16 en mode fenêtré)
 * - MOGL_Univers qui représente l'univers à représenter (vide)
 * - MOGL_Facade qui représente une facade (sur laquelle est affiché le nombre de FPS)
 * - MOGL_GestionnaireTexture qui représente un gestionnaire de texture (vide)
 * .
 * Un paramétrage de base est effectué afin que les objets soit directement utilisable sans précaution particuliaire.
 * En outre une connection <i>MOGL_Signal/MOGL_Action</i> est effectuée afin de diriger la caméra à l'aide du clavier
 * et de la souris :
 * - La souris pour tourner la caméra.
 * - Les flèches du clavier pour déplacer la caméra (haut->avancer ; bas->reculer ; gauche->déplacement sur la gauche ; droite->déplacement sur la droite).
 * .
 * Les objets construits sont accessibles avec les méthodes GetFenetre(), GetUnivers(), GetFacade(), GetCamera(), GetGestionnaireTexture().
 * La construction de l'objet MOGL_FenetreKit se fait de la manière habituelle. Par contre la méthode Initialiser() doit être appelée
 * avant la plupart des méthodes de MOGL (cf MOGL_Fenetre::Initialiser()).
 */
class MOGL_FenetreKit: public MOGL_Action
{
  protected:
    MOGL_Fenetre _Fenetre;
    MOGL_Univers _Univers;
    MOGL_Facade _Facade;
    MOGL_Camera _Camera;
    MOGL_Texte _TexteFPS;
    MOGL_GestionnaireTexture _GestionnaireTexture;

    // MOGL_Action
    void Idle();
    void Clavier(SDL_keysym * key);
    void DeplacementSouris(SDL_MouseMotionEvent * p_Event);

  public:
    /** 
     * Constructeur.
     * 
     * @param p_Titre : titre de la fenètre
     */
    
    MOGL_FenetreKit(char * p_Titre=NULL);

    /**
       Permet d'initialiser la fenêtre d'affichage ainsi que tout l'environnement MOGL.
       Cette initialisation doit être effectuée avant la plupart des opérations pouvant être effectuées par MOGL
       (chargement de texture...)
       @return <i>true</i> s'il n'y a pas eu de problème, et <i>false</i> sinon.
    */
    bool Initialiser();

    /**
       Permet de Lancer la boucle d'évènement de MOGL. La méthode ne redonne la main que lorsque la boucle d'évènement est terminée,
       ce qui signifie que l'exécution de MOGL est achevée.
       @return <i>true</i> s'il n'y a pas eu de problème, <i>false</i> sinon.
    */
    bool LancerBoucle();

    MOGL_Fenetre * GetFenetre();
    MOGL_Univers * GetUnivers();
    MOGL_Facade * GetFacade();
    MOGL_Camera * GetCamera();
    MOGL_GestionnaireTexture * GetGestionnaireTexture();
};

#endif
