include/glbackend_sdl.hpp
aa70ce7e
 /// Guards
 
 #ifdef  GLBACKEND_SDL
 #ifndef GLBACKEND_SDL_HPP_
 #define GLBACKEND_SDL_HPP_
 
 
 /// Includes
 
 #include <array>
 #include <string>
 
 #include <glbackend.hpp>
 
 // #include <SDL2/SDL.h>
 #include <SDL2/SDL_keyboard.h>
 #include <SDL2/SDL_mouse.h>
 #include <SDL2/SDL_scancode.h>
 #include <SDL2/SDL_stdinc.h>
 #include <SDL2/SDL_timer.h>
 #include <SDL2/SDL_video.h>
 
 
 /// Class definition
 
 class GLBackendSDL final : public GLBackend
 {
 
 public:
 
     //// Special member functions
 
     explicit GLBackendSDL(
         std::string const & title,
         std::array<int, 2>  size        = {0, 0},
         std::array<int, 2>  version     = {0, 0},
         int                 samples     = 0,
         bool                fullscreen  = false,
         bool                transparent = false
     );
     ~GLBackendSDL();
     GLBackendSDL(GLBackendSDL &&) noexcept;
     GLBackendSDL(GLBackendSDL const &) = delete;
     GLBackendSDL & operator=(GLBackendSDL &&) = delete;
     GLBackendSDL & operator=(GLBackendSDL const &) = delete;
 
     //// Context
 
     void current() override;
 
     //// Render loop
 
     void swap() override;
 
     void events() override;
 
     bool running() const override;
     bool running(bool running) override;
 
     float time() const override;
     float time(float time) override;
 
     //// Input and output
 
     void lock(bool lock) override;
 
     bool key   (std::string const & key)    const override;
     bool button(int                 button) const override;
 
     //// Debug
 
     std::string debug_info() const override;
 
 protected:
 
     //// Special member functions
 
     void destroy_();
 
 protected:
 
     //// Context
 
     SDL_Window    * window_;
     SDL_GLContext   context_;
 
     //// Render loop
 
     bool  running_;
     float time_;
 
 };
 
 
 /// Inline definitions
 
 inline void GLBackendSDL::current()
 {
     SDL_GL_MakeCurrent(window_, context_);
 }
 
 inline void GLBackendSDL::swap()
 {
     SDL_GL_SwapWindow(window_);
 }
 
 inline bool GLBackendSDL::running(bool running)
 {
     running_ = running;
     return running;
 }
 
 inline bool GLBackendSDL::running() const
 {
     return running_;
 }
 
 inline float GLBackendSDL::time() const
 {
     // return (float)SDL_GetTicks() / 1000.0F - time_;
     return
         (float)SDL_GetPerformanceCounter() /
         (float)SDL_GetPerformanceFrequency()
         - time_;
 }
 
 inline float GLBackendSDL::time(float time)
 {
     // time_ = (float)SDL_GetTicks() / 1000.0F - time;
     time_ =
         (float)SDL_GetPerformanceCounter() /
         (float)SDL_GetPerformanceFrequency()
         - time;
     return time;
 }
 
 inline void GLBackendSDL::lock(bool lock)
 {
     SDL_SetRelativeMouseMode(lock ? SDL_TRUE : SDL_FALSE);
 }
 
 inline bool GLBackendSDL::key(std::string const & key) const
 {
     auto * keys = SDL_GetKeyboardState(nullptr);
     if (key == "Enter")
         return keys[SDL_SCANCODE_RETURN];
     else if (key == "Control")
         return keys[SDL_SCANCODE_RCTRL] || keys[SDL_SCANCODE_LCTRL];
     else if (key == "Shift")
         return keys[SDL_SCANCODE_RSHIFT] || keys[SDL_SCANCODE_LSHIFT];
     else if (key == "Alt")
         return keys[SDL_SCANCODE_RALT] || keys[SDL_SCANCODE_LALT];
     else
         return keys[SDL_GetScancodeFromName(key.c_str())];
 }
 
 inline bool GLBackendSDL::button(int button) const
 {
     return SDL_GetMouseState(nullptr, nullptr) & (Uint32)SDL_BUTTON(button);
 }
 
 
 /// Guards
 
 #endif
 #endif