/** * * @file mingl.h * @author Alexandre Sollier, Clément Mathieu--Drif, Alain Casali * @date Janvier 2020 * @version 2.0 * @brief La bête * **/ #ifndef MINGL_H #define MINGL_H #include #include // shared_ptr #include #include #include #include #include "graphics/idrawable.h" #include "graphics/rgbacolor.h" #include "graphics/vec2d.h" #include "event/event_manager.h" /** * @brief Classe de base de minGL 2 */ // Pour les polices et l'affichage des chaines de caractères, voir: https://www.opengl.org/resources/libraries/glut/spec3/node76.html class MinGL { public: /** * @brief KeyType_t : Représente une touche du clavier * @details C'est une paire de nombre entier naturel et booléen
*
  • L'entier naturel représente le caractère pour une touche non spéciale, * ou l'identifiant de touche pour une touche spéciale * (Voir ici pour les identifiants).
  • *
  • Le booléen indique si la touche est spéciale ou non.
* */ typedef std::pair KeyType_t; // cle, spécial /** * * @brief KeyMap_t : Map représentant des touches et leurs état (pressée ou non). * @details La clé de cette map est un @ref KeyType_t représentant une touche, et la valeur est son état. * */ typedef std::map KeyMap_t; /** * @brief Constructeur pour la classe MinGL * @param[in] name : Nom de la fenêtre * @param[in] windowSize : Taille de la fenêtre * @param[in] windowPosition : Position de la fenêtre * @param[in] backgroundColor : Couleur de fond de la fenêtre * @fn MinGL(const std::string& name, const nsGraphics::Vec2D& windowSize = nsGraphics::Vec2D(640, 480), * const nsGraphics::Vec2D& windowPosition = nsGraphics::Vec2D(128, 128), * const nsGraphics::RGBAcolor& backgroundColor = nsGraphics::KWhite); */ MinGL(const std::string& name, const nsGraphics::Vec2D& windowSize = nsGraphics::Vec2D(640, 480), const nsGraphics::Vec2D& windowPosition = nsGraphics::Vec2D(128, 128), const nsGraphics::RGBAcolor& backgroundColor = nsGraphics::KWhite); /** * @brief Destructeur de la classe MinGL * @fn ~MinGL(); */ ~MinGL(); /** * @brief Initialise la bibliothèque freeglut * @fn static void initGlut() */ static void initGlut() { int tmp = 0; glutInit(&tmp, NULL); } /** * @brief Initialise minGL et ouvre la fenêtre * @fn void initGraphic(); */ void initGraphic(); /** * @brief Ferme la fenêtre et minGL proprement * @fn void stopGraphic(); */ void stopGraphic(); /** * @brief Renvoie l'état d'une touche du clavier (pressée ou non) * @param[in] key : Touche du clavier a vérifier * @fn bool isPressed(const KeyType_t& key); */ bool isPressed(const KeyType_t& key); /** * @brief Force une touche a être relâchée * @param[in] key : Touche du clavier a relâcher * @fn void resetKey(const KeyType_t& key); */ void resetKey(const KeyType_t& key); /** * @brief Préviens minGL que la frame est terminée * @fn void finishFrame(); */ void finishFrame(); /** * @brief Efface l'écran avec la couleur de fond spécifiée * @fn void clearScreen(); */ void clearScreen(); /** * @brief Récupère le gestionnaire d'évènements minGL * @fn nsEvent::EventManager& getEventManager(); */ nsEvent::EventManager& getEventManager(); /** * @brief Récupère la couleur de fond de la fenêtre * @fn const nsGraphics::RGBAcolor& getBackgroundColor() const; */ const nsGraphics::RGBAcolor& getBackgroundColor() const; /** * @brief Règle la couleur de fond de la fenêtre * @fn void setBackgroundColor(const nsGraphics::RGBAcolor& backgroundColor); */ void setBackgroundColor(const nsGraphics::RGBAcolor& backgroundColor); /** * @brief Récupère la taille de la fenêtre * @fn nsGraphics::Vec2D getWindowSize() const; */ nsGraphics::Vec2D getWindowSize() const; /** * @brief Règle la taille de la fenêtre * @param[in] windowSize : Nouvelle taille * @fn void setWindowSize(const nsGraphics::Vec2D& windowSize); */ void setWindowSize(const nsGraphics::Vec2D& windowSize); /** * @brief Récupère la Position de la fenêtre * @fn nsGraphics::Vec2D getWindowPosition() const; */ nsGraphics::Vec2D getWindowPosition() const; /** * @brief Règle la Position de la fenêtre * @param[in] windowPosition : Nouvelle Position * @fn void setWindowPosition(const nsGraphics::Vec2D &windowPosition); */ void setWindowPosition(const nsGraphics::Vec2D &windowPosition); /** * @brief Récupère le nom de la fenêtre * @fn const std::string& getWindowName() const; */ const std::string& getWindowName() const; /** * @brief Règle le nom de la fenêtre * @param[in] windowName : Nouveau nom * @fn void setWindowName(const std::string &windowName); */ void setWindowName(const std::string &windowName); /** * @brief Retourne si la fenêtre est ouverte * @fn bool isOpen() const; */ bool isOpen() const; private: // Les données membres en tant que tel /** * @brief m_windowName : Nom de la fenêtre */ std::string m_windowName; /** * @brief m_bgColor : Couleur de fond de la fenêtre */ nsGraphics::RGBAcolor m_bgColor; /** * @brief m_keyboardMap : Map de l'état des touches du clavier */ KeyMap_t m_keyboardMap; /** * @brief m_glutWindowId : Identifiant de la fenêtre freeglut */ short m_glutWindowId = 0; /** * @brief m_eventManager : Gestionnaire d'évènements */ nsEvent::EventManager m_eventManager; /** * @brief m_windowIsOpen : Etat de la fenêtre */ bool m_windowIsOpen; // Les handlers /** * @brief Handler lié a glutReshapeFunc * @param[in] h : Nouvelle hauteur de la fenêtre * @param[in] w : Nouvelle largeur de la fenêtre * @fn void callReshape(int h, int w); */ void callReshape(int h, int w); /** * @brief Handler lié a glutDisplayFunc * @fn void callDisplay(); */ void callDisplay(); /** * @brief Handler lié a glutMouseFunc * @param[in] button : Bouton de la souris qui a généré l'évènement * @param[in] state : Nouvel état du bouton * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callMouse(int button, int state, int x = 0, int y = 0); */ void callMouse(int button, int state, int x = 0, int y = 0); /** * @brief Handler lié a glutMotionFunc * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callMotion(int x, int y); */ void callMotion(int x, int y); /** * @brief Handler lié a glutPassiveMotionFunc * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callPassiveMotion(int x, int y); */ void callPassiveMotion(int x, int y); /** * @brief Handler lié a glutKeyboardFunc * @param[in] key : Touche qui a été pressée * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callKeyboard(unsigned char key, int x = 0, int y = 0); */ void callKeyboard(unsigned char key, int x = 0, int y = 0); /** * @brief Handler lié a glutKeyboardUpFunc * @param[in] key : Touche qui a été relâchée * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callKeyboardUp(unsigned char key, int x = 0, int y = 0); */ void callKeyboardUp(unsigned char key, int x = 0, int y = 0); /** * @brief Handler lié a glutSpecialFunc * @param[in] key : Touche spéciale qui a été pressée * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callKeyboardSpecial(int key, int x = 0, int y = 0); */ void callKeyboardSpecial(int key, int x = 0, int y = 0); /** * @brief Handler lié a glutSpecialUpFunc * @param[in] key : Touche spéciale qui a été relâchée * @param[in] x : Coordonnée X du curseur * @param[in] y : Coordonnée Y du curseur * @fn void callKeyboardUpSpecial(int key, int x = 0, int y = 0); */ void callKeyboardUpSpecial(int key, int x = 0, int y = 0); /** * @brief Handler lié a glutCloseFunc * @fn void callClose(); */ void callClose(); }; // class MinGL #endif // MINGL_H