// // Lol Engine // // Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> // // Lol Engine is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What the Fuck You Want // to Public License, Version 2, as published by the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #include <lol/engine-internal.h> #if LOL_USE_SDL # if HAVE_SDL2_SDL_H # include <SDL2/SDL.h> # elif HAVE_SDL_SDL_H # include <SDL/SDL.h> # else # include <SDL.h> # endif #endif #include "lolgl.h" #include "platform/sdl/sdlapp.h" #include "platform/sdl/sdlinput.h" #if LOL_USE_XINPUT # include "platform/d3d9/d3d9input.h" #endif namespace lol { /* * SDL App display implementation class */ class SdlAppDisplayData { friend class SdlAppDisplay; private: #if LOL_USE_SDL SDL_Window *m_window; SDL_GLContext m_glcontext; #endif }; /* * Public SdlApp class */ SdlAppDisplay::SdlAppDisplay(char const *title, ivec2 res) : data(new SdlAppDisplayData()) { #if LOL_USE_SDL ivec2 window_size = res; ivec2 screen_size = res; /* Initialise SDL */ if (!SDL_WasInit(0)) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE) < 0) { msg::error("cannot initialise SDL: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } } #if LOL_USE_SDL /* This seems to fix the swap context bug. * However, perfs warning have been may occur. */ SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); data->m_window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, window_size.x, window_size.y, SDL_WINDOW_OPENGL); if (!data->m_window) { msg::error("cannot create rendering window: %s\n", SDL_GetError()); SDL_Quit(); exit(EXIT_FAILURE); } SDL_GetWindowSize(data->m_window, &res.x, &res.y); data->m_glcontext = SDL_GL_CreateContext(data->m_window); #endif /* Initialise everything */ Video::Setup(res); //TODO ?? Should it be here ? #endif } SdlAppDisplay::~SdlAppDisplay() { #if LOL_USE_SDL if (data->m_window) { SDL_GL_DeleteContext(data->m_glcontext); SDL_DestroyWindow(data->m_window); } #endif delete data; } void SdlAppDisplay::SetResolution(ivec2 resolution) { #if LOL_USE_SDL SDL_SetWindowSize(data->m_window, resolution.x, resolution.y); #endif } void SdlAppDisplay::SetPosition(ivec2 position) { #if LOL_USE_SDL SDL_SetWindowPosition(data->m_window, position.x, position.y); #endif } void SdlAppDisplay::Enable() { #if LOL_USE_SDL //TODO: Should we do that: ? SDL_GL_MakeCurrent(data->m_window, data->m_glcontext); #endif } void SdlAppDisplay::Disable() { #if LOL_USE_SDL SDL_GL_SwapWindow(data->m_window); #endif } #if LOL_USE_SDL int SceneDisplay::GetPhysicalCount() { return SDL_GetNumVideoDisplays(); } const char* SceneDisplay::GetPhysicalName(int index) { return SDL_GetDisplayName(index); } #endif /* * SDL App implementation class */ class SdlAppData { friend class SdlApp; private: #if LOL_USE_SDL SDL_Window *m_window; SDL_GLContext m_glcontext; #endif }; /* * Public SdlApp class */ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : data(new SdlAppData()) { UNUSED(title); #if LOL_USE_SDL ivec2 window_size = res; ivec2 screen_size = res; /* Initialise everything */ Ticker::Setup(fps); audio::init(); /* Autoreleased objects */ #if defined LOL_USE_XINPUT /* Prefer D3d9 for joysticks on Windows, because the X360 pads are not * advertised with the proper number of axes. */ new D3d9Input(); #endif new SdlInput(res.x, res.y, screen_size.x, screen_size.y); #endif } void SdlApp::ShowPointer(bool show) { #if LOL_USE_SDL SDL_ShowCursor(show ? 1 : 0); #endif } void SdlApp::Tick() { /* Tick the renderer, show the frame and clamp to desired framerate. */ Ticker::tick_draw(); } SdlApp::~SdlApp() { #if LOL_USE_SDL SDL_Quit(); #endif delete data; } } /* namespace lol */