include/glbackend.hpp
583abb86
 /// Guards
17a267f2
 
 #ifndef GLBACKEND_HPP_
 #define GLBACKEND_HPP_
 
 
 /// Includes
 
 #include <array>
 #include <functional>
 #include <ostream>
 #include <string>
 #include <utility>
 #include <vector>
 
 #include <glbase.hpp>
 
 
 /// Class definition
 
 class GLBackend : public GLBase
 {
 
 public:
 
     //// Context
 
     void virtual current() = 0;
 
     //// Render loop
 
     void virtual swap() = 0;
 
     void virtual events() = 0;
 
     bool virtual running() const = 0;
     bool virtual running(bool running) = 0;
 
     float virtual time() const = 0;
     float virtual time(float time) = 0;
 
     void run(float dt_fixed = 0.0F);
 
     using CallbackUpdate   = std::function<void(float t, float dt, bool last)>;
     using CallbackRender   = std::function<void()>;
 
     GLBASE_ACCESS(CallbackUpdate,   callback_update)
     GLBASE_ACCESS(CallbackRender,   callback_render)
 
     //// Input and output
 
     using Point = std::array<GLfloat, 2>;
     using Size  = std::array<GLsizei, 2>;
 
     void virtual lock(bool lock) = 0;
 
     bool virtual key   (std::string const & key)    const = 0;
     bool virtual button(int                 button) const = 0;
 
     GLBASE_GET(Point, scroll)
     GLBASE_GET(Point, position)
     GLBASE_GET(Point, move)
     GLBASE_GET(Size,  size)
 
     using CallbackKey      = std::function<void(std::string const &)>;
     using CallbackButton   = std::function<void(int)>;
     using CallbackScroll   = std::function<void(Point)>;
     using CallbackPosition = std::function<void(Point)>;
     using CallbackMove     = std::function<void(Point)>;
     using CallbackSize     = std::function<void(Size)>;
 
     GLBASE_ACCESS(CallbackKey,      callback_key)
     GLBASE_ACCESS(CallbackButton,   callback_button)
     GLBASE_ACCESS(CallbackScroll,   callback_scroll)
     GLBASE_ACCESS(CallbackPosition, callback_position)
     GLBASE_ACCESS(CallbackMove,     callback_move)
     GLBASE_ACCESS(CallbackSize,     callback_size)
 
     //// Path
 
     GLBASE_ACCESS_GLOBAL(Path, prefix)
 
     //// TGA
 
     void tga_write(
         Path const & path
     ) const;
 
     bool tga_compare(
         Path const & path,
         bool         write_on_failed_read = false
     ) const;
 
     //// Debug
 
     std::string virtual debug_info() const;
 
 protected:
 
     //// Special member functions
 
     GLBackend();
     GLBackend(GLBackend &&) = default;
     virtual ~GLBackend() = default;
 
     void static init_();
 
     //// TGA
 
     TGA_ tga_() const;
 
     //// Debug
 
     void static debug_info_(
         std::ostream                                           & ostream,
         std::string                                      const & category,
         std::vector<std::pair<std::string, std::string>> const & values,
         char                                                     fill = '.'
     );
 
     void static GLAPIENTRY debug_gl_message_callback_(
         GLenum          source,
         GLenum          type,
         GLuint          id,
         GLenum          severity,
         GLsizei         length,
         GLchar  const * message,
         void    const * user_param
     );
 
     std::string static debug_gl_message_(std::string message);
 
 protected:
 
     //// Render loop
 
     CallbackUpdate   callback_update_;
     CallbackRender   callback_render_;
 
     //// Input and output
 
     Point scroll_;
     Point position_;
     Point move_;
     Size  size_;
 
     CallbackKey      callback_key_;
     CallbackButton   callback_button_;
     CallbackScroll   callback_scroll_;
     CallbackPosition callback_position_;
     CallbackMove     callback_move_;
     CallbackSize     callback_size_;
 
     //// Path
 
     Path static thread_local prefix_;
 
 };
 
 
583abb86
 /// Guards
17a267f2
 
 #endif