/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================
  
	NOM DU FICHIER :glJeuWidget.h
	
	DESCRIPTION :	Implémentation de la classe gérant le QTWidget
	
	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
	
	DATE DE CRÉATION : 2004-3-16
	
	MISES À JOUR :
	
===============================================================================*/
#ifndef GLJEUWIDGET_H
#define GLJEUWIDGET_H

#include <qgl.h>
#include <qwidget.h>
#include <qevent.h>

#include "CTerrain.h"
#include "CPartie.h"
#include "CFont.h"
#include <GL/glut.h>
#include <GL/gl.h>	
#include <GL/glu.h>


#define BUTTON_DOWN true
#define BUTTON_UP false
#define KEYDOWN true
#define KEYUP false


class glJeuWidget : public QGLWidget
{
    Q_OBJECT
    
public:
    //Constructeurs et destructeurs
    glJeuWidget(QWidget* parent, const char* nom);
    ~glJeuWidget();
    
    CPartie const* getPartie() const;
    void setPartie(CPartie*);
    bool getMode3d() const;
    
    void StartCalcTimer(); //On commence à gérer les collisions
    void StopCalcTimer(); //La balle est arrêtée et on ne gère plus les collisions
    void StartMessageTimer();
    void StopMessageTimer();
    void setMessage(const QString& Mes);
    const QString& getMessage();
    bool getMode3D() const;
    
    //Zoom in, zoom out, pan
    virtual void resizeGL(int w, int h, int delta);
    void PanLeft();
    void PanRight();
    void PanUp();
    void PanDown();
    void PanIn();
    void PanOut();
    void StrafeLeft();
    void StrafeRight();
    void StrafeUp();
    void StrafeDown();
    
public slots:
    
    void ChangeMode();
    void setBallCam(bool BallCam);
    
protected:
    virtual void initializeGL();
    virtual void paintGL();
    virtual void resizeGL(int w, int h);
    virtual void mousePressEvent(QMouseEvent * e);
    virtual void mouseReleaseEvent(QMouseEvent * e);
    virtual void mouseMoveEvent(QMouseEvent * e);
    virtual void wheelEvent(QWheelEvent * e);
    virtual void keyPressEvent(QKeyEvent * e);
    virtual void keyReleaseEvent(QKeyEvent * e);
    
private:
    virtual void timerEvent(QTimerEvent * T);
    int CalcTimer;
    int MessageTimer;
    int BirdSoundTimer;
    int IdleTimer;
    int SoleilTimer;
    void idle(void);
    CPartie* Partie;
    QString Message;
    bool Mode3D;
    bool BallCam;
    int Pers;
    double eyex, eyey, eyez;
    double ax, ay, az;
    double tempx, tempy;
    double alpha;
    double beta;
    CFont Police;
    void AfficheSoleil();
    void AfficheLune();  
    void AfficheFlare();
    float PosSoleil[3];
    float AngleSoleil;
    float CouleurSoleil[4];
    float CouleurAmbianteG;
    float CouleurAmbianteB;
    float AlphaJourNuit;
    float lDepth[1];
    float AncientDepth[2];   
    static CPngTexture TexSky;
    static CPngTexture TexStars;
    static CPngTexture TexLune;
    static CPngTexture TexFlare;
    static CPngTexture TexShine;
    
    float SkyAngle1;
    float SkyAngle2;
    float SpeedAngle1;
    float SpeedAngle2;
    
    bool Processing;
    
public:
signals:
    void BallStoped();
    // signal qui est envoyé quand la souris est appuyée ou relâchée
    void MouseClick(Qt::ButtonState, bool, float, float);
    // signal qui est envoyé quand la souris est déplacée
    void MouseMove(Qt::ButtonState, float, float);
    // signal qui est envoye avec la roulette de la souris
    void MouseRoll(int);
    void KeyPress(int, bool);
    // signal qui est envoye quand le widget se redessine
    void PaintMessage();
};
#endif
