/*****************************************************************************
 *
 *  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_LENSFLARE
#define MOGL_LENSFLARE

#ifdef _WIN32
        #include <windows.h>
        #include <windowsx.h>
#endif
#include <GL/gl.h>
#include <GL/glu.h>

#include "MOGL_ElementArbre.h"

/**
   Classe de base de gestion d'un lens flare.
   Elle propose un ensemble de méthodes permettant de représenter les différentes parties d'un lens flare.
   Un lens flare doit donc spécialiser cette classe en implémentant la méthode _GenererLensFlare();
   Les attributs #_xPos, #_yPos, et #_zPos représente la source du lens flare, et #_Intensite représente
   son intensité. Ces valeurs doivent être utilisés pour générer le lens flare.
 */
class MOGL_LensFlare: public MOGL_ElementArbre
{
  protected:
        /**
           Méthode appelée pour générer le lens flare. Il s'agit de la méthode principale d'implémentation d'un lens flare.
           Elle utilise les méthodes _DessinnerRectangle() et _DessinnerRectangleTailleFixe().
         */
        virtual void _GenererLensFlare()=0;

        /**
           Permet de dessiner un carré d'une texture déterminée. Un lens flare est formé d'une série de carré.
           @param p_Texture : texture à plaquer sur le carré. Toute la texture est utilisée.
           @param p_CentreX : coordonnée x du centre du carré.
           @param p_CentreY : coordonnée y du centre du carre.
           @param p_CentreZ : coordonnée z du centre du carre.
           @param p_Position : position de la partie du lens flare. Doit être compris entre 0 et 1. 1 correspond à l'origine du lens flare
                           (donc la source de lumière) et 0 correspond au centre de l'écran. Les autres valeurs sont ditribuées
                                                   linéairement entres ces deux positions.
           @param p_Taille : taille du carre.
           @param p_Couleur : couleur.
         */
        void _DessinerCarre(MOGL_Texture * p_Texture, float p_CentreX, float p_CentreY, float p_CentreZ, 
                                                float p_Position, float p_Taille, const MOGL_Struct_Couleur & p_Couleur);

        /**
           Permet de dessiner un carré d'une texture déterminée et de taille fixe. Un lens flare est formé d'une série de carré.
           Ici, la taille du carré ne dépend pas de ses coordonnées.
           @param p_Texture : texture à plaquer sur le carré. Toute la texture est utilisée.
           @param p_CentreX : coordonnée x du centre du carré.
           @param p_CentreY : coordonnée y du centre du carre.
           @param p_CentreZ : coordonnée z du centre du carre.
           @param p_Position : position de la partie du lens flare. Doit être compris entre 0 et 1. 1 correspond à l'origine du lens flare
                           (donc la source de lumière) et 0 correspond au centre de l'écran. Les autres valeurs sont ditribuées
                                                   linéairement entres ces deux positions.
           @param p_Taille : taille du carre en pourcentage de la largeur de la fenêtre (par exemple une valeur de 25 donne un carré
                         dont la taille est le quart de la largeur de l'écran).
           @param p_Couleur : couleur.
         */
        void _DessinerCarreTailleFixe(MOGL_Texture * p_Texture, float p_CentreX, float p_CentreY, float p_CentreZ, 
                                                                  float p_Position, float p_Taille, const MOGL_Struct_Couleur & p_Couleur);

        MOGL_MatriceTransformation _MatriceFinale;
        /**
           Position de la source de lumière à l'origine du lens flare.
         */
        float _xPos, _yPos, _zPos;

        /**
           Intensité du lens flare. Il s'agit en fait du cosinus de l'angle formé par la direction
           de la caméra et la direction de la source de lumière par rapport à la camera.
         */
        float _Intensite;

        /**
           Afficheur utilisé pour afficher le lens flare.
           Normalement, il ne devrait pas être utilisé dans une utilisation normale.
         */
        MOGL_Afficheur * _Afficheur;
        
        
  public:
        /**
           Constructeur par défaut
         */
        MOGL_LensFlare();

        void TnL(MOGL_Afficheur * p_Afficheur);
};

#endif
