If you want to use SDL2 instead of GLFW to create a system interface, use this class instead:
Complete Source Code:
Main.cpp
#include "Main.h"
#include "System_SDL2.h"
#include "Renderer_OpenGL.h"
int main(int argc, char* argv[])
{
//System_GLFW& system = System_GLFW::Instance();
System_SDL2& system = System_SDL2::Instance();
return Main::Instance(&system).MainLoop();
}
// ...
System_SDL2.h
#pragma once
#include "System.h"
#include <GL/glew.h>
#include <SDL2/SDL.h>
class System_SDL2 : public System
{
public:
// singelton
static System_SDL2& Instance(unsigned int width = 0, unsigned int height = 0);
virtual ~System_SDL2();
// update 1 frame
virtual void Update();
// window
virtual void SwapBuffers() const;
virtual bool IsCloseRequested() const;
virtual void SetWindowTitle(const std::string& name);
private:
virtual void SetupInputMap();
SDL_Window* m_window{ nullptr };
SDL_GLContext m_context;
bool m_close{ false };
System_SDL2(unsigned int width, unsigned int height);
// NOT ALLOWED TO BE COPIED OR ASSIGNED TO
System_SDL2(const System_SDL2& other) = delete;
System_SDL2& operator=(const System_SDL2& other) = delete;
};
System_SDL2.cpp
#include "System_SDL2.h"
#include <iostream>
InputState sdl_events_catched_globally;
System_SDL2::System_SDL2(unsigned int width, unsigned int height)
{
SDL_Init(SDL_INIT_EVERYTHING);
if (width == 0 || height == 0)
{
width = 1200;
height = 900;
}
unsigned int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE;
m_window = SDL_CreateWindow("OpenGL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, flags);
m_context = SDL_GL_CreateContext(m_window);
SDL_GL_MakeCurrent(m_window, m_context);
// initialize GLEW
if (glewInit() != GLEW_OK)
exit(EXIT_FAILURE);
// map SDL keys and mouse buttons to indices
SetupInputMap();
// initial values
Update();
}
System_SDL2 & System_SDL2::Instance(unsigned int width, unsigned int height)
{
static System_SDL2 instance(width, height);
return instance;
}
System_SDL2::~System_SDL2()
{
SDL_GL_DeleteContext(m_context);
SDL_DestroyWindow(m_window);
SDL_Quit();
}
void System_SDL2::Update()
{
// window
SDL_GetWindowPosition(m_window, &m_windowpos.x, &m_windowpos.y);
SDL_GetWindowSize(m_window, &m_windowsize.x, &m_windowsize.y);
// process events
SDL_Event e;
while (SDL_PollEvent(&e))
{
switch (e.type)
{
case SDL_QUIT:
m_close = true;
break;
case SDL_WINDOWEVENT:
if (e.window.windowID == SDL_GetWindowID(m_window))
{
switch (e.window.event)
{
case SDL_WINDOWEVENT_SIZE_CHANGED:
//std::cout << "window resized to " << e.window.data1 << " x " << e.window.data2 << std::endl;
break;
default:
break;
}
}
break;
case SDL_MOUSEMOTION:
sdl_events_catched_globally.cursor.position.x = e.motion.x;
sdl_events_catched_globally.cursor.position.y = m_windowsize.y - e.motion.y;
break;
case SDL_MOUSEBUTTONUP:
sdl_events_catched_globally.cursor.button[m_mousebuttonindex[e.button.button]] = false;
break;
case SDL_MOUSEBUTTONDOWN:
sdl_events_catched_globally.cursor.button[m_mousebuttonindex[e.button.button]] = true;
break;
case SDL_MOUSEWHEEL:
sdl_events_catched_globally.cursor.scroll = e.wheel.y;
break;
case SDL_KEYUP:
sdl_events_catched_globally.keyboard.key[m_keyindex[e.key.keysym.sym]] = false;
break;
case SDL_KEYDOWN:
sdl_events_catched_globally.keyboard.key[m_keyindex[e.key.keysym.sym]] = true;
break;
default:
break;
}
}
// input
m_previous = m_current;
m_current = sdl_events_catched_globally;
// reset scroll event
sdl_events_catched_globally.cursor.scroll = 0;
}
void System_SDL2::SwapBuffers() const
{
SDL_GL_SwapWindow(m_window);
}
bool System_SDL2::IsCloseRequested() const
{
return m_close;
}
void System_SDL2::SetWindowTitle(const std::string & name)
{
SDL_SetWindowTitle(m_window, name.c_str());
}
void System_SDL2::SetupInputMap()
{
m_keyindex[SDLK_SPACE] = KEY_SPACE;
//m_keyindex[...] = KEY_APOSTROPHE;
m_keyindex[SDLK_COMMA] = KEY_COMMA;
m_keyindex[SDLK_MINUS] = KEY_MINUS;
m_keyindex[SDLK_PERIOD] = KEY_PERIOD;
m_keyindex[SDLK_SLASH] = KEY_SLASH;
m_keyindex[SDLK_0] = KEY_0;
m_keyindex[SDLK_1] = KEY_1;
m_keyindex[SDLK_2] = KEY_2;
m_keyindex[SDLK_3] = KEY_3;
m_keyindex[SDLK_4] = KEY_4;
m_keyindex[SDLK_5] = KEY_5;
m_keyindex[SDLK_6] = KEY_6;
m_keyindex[SDLK_7] = KEY_7;
m_keyindex[SDLK_8] = KEY_8;
m_keyindex[SDLK_9] = KEY_9;
m_keyindex[SDLK_SEMICOLON] = KEY_SEMICOLON;
m_keyindex[SDLK_EQUALS] = KEY_EQUAL;
m_keyindex[SDLK_a] = KEY_A;
m_keyindex[SDLK_b] = KEY_B;
m_keyindex[SDLK_c] = KEY_C;
m_keyindex[SDLK_d] = KEY_D;
m_keyindex[SDLK_e] = KEY_E;
m_keyindex[SDLK_f] = KEY_F;
m_keyindex[SDLK_g] = KEY_G;
m_keyindex[SDLK_h] = KEY_H;
m_keyindex[SDLK_i] = KEY_I;
m_keyindex[SDLK_j] = KEY_J;
m_keyindex[SDLK_k] = KEY_K;
m_keyindex[SDLK_l] = KEY_L;
m_keyindex[SDLK_m] = KEY_M;
m_keyindex[SDLK_n] = KEY_N;
m_keyindex[SDLK_o] = KEY_O;
m_keyindex[SDLK_p] = KEY_P;
m_keyindex[SDLK_q] = KEY_Q;
m_keyindex[SDLK_r] = KEY_R;
m_keyindex[SDLK_s] = KEY_S;
m_keyindex[SDLK_t] = KEY_T;
m_keyindex[SDLK_u] = KEY_U;
m_keyindex[SDLK_v] = KEY_V;
m_keyindex[SDLK_w] = KEY_W;
m_keyindex[SDLK_x] = KEY_X;
m_keyindex[SDLK_y] = KEY_Y;
m_keyindex[SDLK_z] = KEY_Z;
m_keyindex[SDLK_LEFTBRACKET] = KEY_LEFT_BRACKET;
m_keyindex[SDLK_BACKSLASH] = KEY_BACKSLASH;
m_keyindex[SDLK_RIGHTBRACKET] = KEY_RIGHT_BRACKET;
//m_keyindex[...] = KEY_GRAVE_ACCENT;
//m_keyindex[...] = KEY_WORLD_1;
//m_keyindex[...] = KEY_WORLD_2;
/* Function keys */
m_keyindex[SDLK_ESCAPE] = KEY_ESCAPE;
//m_keyindex[...] = KEY_ENTER;
m_keyindex[SDLK_TAB] = KEY_TAB;
m_keyindex[SDLK_BACKSPACE] = KEY_BACKSPACE;
m_keyindex[SDLK_INSERT] = KEY_INSERT;
m_keyindex[SDLK_DELETE] = KEY_DELETE;
m_keyindex[SDLK_RIGHT] = KEY_RIGHT;
m_keyindex[SDLK_LEFT] = KEY_LEFT;
m_keyindex[SDLK_DOWN] = KEY_DOWN;
m_keyindex[SDLK_UP] = KEY_UP;
m_keyindex[SDLK_PAGEUP] = KEY_PAGE_UP;
m_keyindex[SDLK_PAGEDOWN] = KEY_PAGE_DOWN;
m_keyindex[SDLK_HOME] = KEY_HOME;
m_keyindex[SDLK_END] = KEY_END;
m_keyindex[SDLK_CAPSLOCK] = KEY_CAPS_LOCK;
m_keyindex[SDLK_SCROLLLOCK] = KEY_SCROLL_LOCK;
//m_keyindex[...] = KEY_NUM_LOCK;
m_keyindex[SDLK_PRINTSCREEN] = KEY_PRINT_SCREEN;
m_keyindex[SDLK_PAUSE] = KEY_PAUSE;
m_keyindex[SDLK_F1] = KEY_F1;
m_keyindex[SDLK_F2] = KEY_F2;
m_keyindex[SDLK_F3] = KEY_F3;
m_keyindex[SDLK_F4] = KEY_F4;
m_keyindex[SDLK_F5] = KEY_F5;
m_keyindex[SDLK_F6] = KEY_F6;
m_keyindex[SDLK_F7] = KEY_F7;
m_keyindex[SDLK_F8] = KEY_F8;
m_keyindex[SDLK_F9] = KEY_F9;
m_keyindex[SDLK_F10] = KEY_F10;
m_keyindex[SDLK_F11] = KEY_F11;
m_keyindex[SDLK_F12] = KEY_F12;
m_keyindex[SDLK_F13] = KEY_F13;
m_keyindex[SDLK_F14] = KEY_F14;
m_keyindex[SDLK_F15] = KEY_F15;
m_keyindex[SDLK_F16] = KEY_F16;
m_keyindex[SDLK_F17] = KEY_F17;
m_keyindex[SDLK_F18] = KEY_F18;
m_keyindex[SDLK_F19] = KEY_F19;
m_keyindex[SDLK_F20] = KEY_F20;
m_keyindex[SDLK_F21] = KEY_F21;
m_keyindex[SDLK_F22] = KEY_F22;
m_keyindex[SDLK_F23] = KEY_F23;
m_keyindex[SDLK_F24] = KEY_F24;
//m_keyindex[...] = KEY_F25;
m_keyindex[SDLK_KP_0] = KEY_KP_0;
m_keyindex[SDLK_KP_1] = KEY_KP_1;
m_keyindex[SDLK_KP_2] = KEY_KP_2;
m_keyindex[SDLK_KP_3] = KEY_KP_3;
m_keyindex[SDLK_KP_4] = KEY_KP_4;
m_keyindex[SDLK_KP_5] = KEY_KP_5;
m_keyindex[SDLK_KP_6] = KEY_KP_6;
m_keyindex[SDLK_KP_7] = KEY_KP_7;
m_keyindex[SDLK_KP_8] = KEY_KP_8;
m_keyindex[SDLK_KP_9] = KEY_KP_9;
m_keyindex[SDLK_KP_DECIMAL] = KEY_KP_DECIMAL;
m_keyindex[SDLK_KP_DIVIDE] = KEY_KP_DIVIDE;
m_keyindex[SDLK_KP_MULTIPLY] = KEY_KP_MULTIPLY;
m_keyindex[SDLK_KP_MINUS] = KEY_KP_SUBTRACT;
m_keyindex[SDLK_KP_PLUS] = KEY_KP_ADD;
m_keyindex[SDLK_KP_ENTER] = KEY_KP_ENTER;
m_keyindex[SDLK_KP_EQUALS] = KEY_KP_EQUAL;
m_keyindex[SDLK_LSHIFT] = KEY_LEFT_SHIFT;
m_keyindex[SDLK_LCTRL] = KEY_LEFT_CONTROL;
m_keyindex[SDLK_LALT] = KEY_LEFT_ALT;
m_keyindex[SDLK_LGUI] = KEY_LEFT_SUPER;
m_keyindex[SDLK_RSHIFT] = KEY_RIGHT_SHIFT;
m_keyindex[SDLK_RCTRL] = KEY_RIGHT_CONTROL;
m_keyindex[SDLK_RALT] = KEY_RIGHT_ALT;
m_keyindex[SDLK_RGUI] = KEY_RIGHT_SUPER;
//m_keyindex[...] = KEY_MENU;
//m_keyindex[...] = KEY_LAST;
//m_mousebuttonindex[...] = MOUSE_BUTTON_LAST;
m_mousebuttonindex[SDL_BUTTON_LEFT] = MOUSE_BUTTON_LEFT;
m_mousebuttonindex[SDL_BUTTON_RIGHT] = MOUSE_BUTTON_RIGHT;
m_mousebuttonindex[SDL_BUTTON_MIDDLE] = MOUSE_BUTTON_MIDDLE;
//m_mousebuttonindex[...] = MOUSE_BUTTON_4;
//m_mousebuttonindex[...] = MOUSE_BUTTON_5;
//m_mousebuttonindex[...] = MOUSE_BUTTON_6;
//m_mousebuttonindex[...] = MOUSE_BUTTON_7;
//m_mousebuttonindex[...] = MOUSE_BUTTON_8;
}