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_;
};
|