@@ -20,26 +20,28 @@ dnl SDL_CFLAGS -- flags for SDL compilation | |||
dnl SDL_LIBS -- flags for SDL linking | |||
ac_cv_my_have_sdl="no" | |||
ac_cv_my_have_sdl2="no" | |||
ac_cv_my_have_sdl_image="no" | |||
ac_cv_my_have_sdl_mixer="no" | |||
dnl First, try the proper pkg-config check for SDL2 | |||
dnl if test "x${ac_cv_my_have_sdl}" = xno; then | |||
dnl PKG_CHECK_MODULES(SDL2, sdl2, | |||
dnl [ac_cv_my_have_sdl="yes" | |||
dnl PKG_CHECK_MODULES(SDL2MIXER, SDL2_mixer, | |||
dnl [ac_cv_my_have_sdl_mixer="yes" | |||
dnl AC_DEFINE(HAVE_SDL_MIXER_H, 1, Define to 1 to use SDL_mixer.h)], | |||
dnl [:]) | |||
dnl PKG_CHECK_MODULES(SDL2IMAGE, SDL2_image, | |||
dnl [ac_cv_my_have_sdl_image="yes" | |||
dnl AC_DEFINE(HAVE_SDL_IMAGE_H, 1, Define to 1 to use SDL_image.h)], | |||
dnl [:]) | |||
dnl SDL_CFLAGS="${SDL2_CFLAGS} ${SDL2MIXER_CFLAGS} ${SDL2IMAGE_CFLAGS}" | |||
dnl SDL_LIBS="${SDL2_LIBS} ${SDL2MIXER_LIBS} ${SDL2IMAGE_LIBS}" | |||
dnl AC_DEFINE(HAVE_SDL_H, 1, Define to 1 to use SDL.h)], | |||
dnl [:]) | |||
dnl fi | |||
if test "x${ac_cv_my_have_sdl}" = xno; then | |||
PKG_CHECK_MODULES(SDL2, sdl2, | |||
[ac_cv_my_have_sdl="yes" | |||
ac_cv_my_have_sdl2="yes" | |||
PKG_CHECK_MODULES(SDL2MIXER, SDL2_mixer, | |||
[ac_cv_my_have_sdl_mixer="yes" | |||
AC_DEFINE(HAVE_SDL_MIXER_H, 1, Define to 1 to use SDL_mixer.h)], | |||
[:]) | |||
PKG_CHECK_MODULES(SDL2IMAGE, SDL2_image, | |||
[ac_cv_my_have_sdl_image="yes" | |||
AC_DEFINE(HAVE_SDL_IMAGE_H, 1, Define to 1 to use SDL_image.h)], | |||
[:]) | |||
SDL_CFLAGS="${SDL2_CFLAGS} ${SDL2MIXER_CFLAGS} ${SDL2IMAGE_CFLAGS}" | |||
SDL_LIBS="${SDL2_LIBS} ${SDL2MIXER_LIBS} ${SDL2IMAGE_LIBS}" | |||
AC_DEFINE(HAVE_SDL_H, 1, Define to 1 to use SDL.h)], | |||
[:]) | |||
fi | |||
dnl Then, try the proper pkg-config check for SDL 1.x | |||
if test "x${ac_cv_my_have_sdl}" = xno; then | |||
@@ -105,6 +107,11 @@ else | |||
fi | |||
AM_CONDITIONAL(USE_SDL, test "x${ac_cv_my_have_sdl}" = xyes) | |||
if test "x${ac_cv_my_have_sdl2}" != xno; then | |||
AC_DEFINE(USE_SDL2, 1, Define to 1 to use SDL) | |||
fi | |||
AM_CONDITIONAL(USE_SDL2, test "x${ac_cv_my_have_sdl2}" = xyes) | |||
if test "x${ac_cv_my_have_sdl_mixer}" = xno; then | |||
AC_MSG_WARN([SDL_mixer not found]) | |||
else | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; 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 Sam Hocevar. See | |||
@@ -10,13 +10,13 @@ | |||
#include <lol/engine-internal.h> | |||
#if defined USE_SDL | |||
# if defined HAVE_SDL_SDL_H | |||
#if USE_SDL | |||
# if HAVE_SDL_SDL_H | |||
# include <SDL/SDL.h> | |||
# else | |||
# include <SDL.h> | |||
# endif | |||
# if defined USE_D3D9 | |||
# if USE_D3D9 | |||
# include <d3d9.h> | |||
# include <SDL_syswm.h> | |||
# endif | |||
@@ -25,11 +25,11 @@ | |||
#include "lolgl.h" | |||
#include "platform/sdl/sdlapp.h" | |||
#include "platform/sdl/sdlinput.h" | |||
#if defined USE_XINPUT | |||
#if USE_XINPUT | |||
# include "platform/d3d9/d3d9input.h" | |||
#endif | |||
#if defined USE_SDL && defined USE_D3D9 | |||
#if USE_SDL && USE_D3D9 | |||
HWND g_hwnd = nullptr; | |||
#endif | |||
@@ -45,7 +45,12 @@ class SdlAppData | |||
friend class SdlApp; | |||
private: | |||
int unused; | |||
#if USE_SDL2 | |||
SDL_Window *m_window; | |||
SDL_GLContext m_glcontext; | |||
#else | |||
SDL_Surface *m_window; | |||
#endif | |||
}; | |||
/* | |||
@@ -55,55 +60,77 @@ private: | |||
SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||
data(new SdlAppData()) | |||
{ | |||
#if defined USE_SDL | |||
#if USE_SDL | |||
ivec2 window_size = res; | |||
ivec2 screen_size = res; | |||
/* Initialise SDL */ | |||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) | |||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE) < 0) | |||
{ | |||
Log::Error("cannot initialise SDL: %s\n", SDL_GetError()); | |||
exit(EXIT_FAILURE); | |||
} | |||
#if USE_SDL2 | |||
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) | |||
{ | |||
Log::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); | |||
#else | |||
const SDL_VideoInfo* vidinfo = SDL_GetVideoInfo(); | |||
int screen_w = vidinfo->current_w; | |||
int screen_h = vidinfo->current_h; | |||
screen_size = ivec2(vidinfo->current_w, vidinfo->current_h); | |||
SDL_WM_SetCaption(title, nullptr); | |||
# if defined USE_D3D9 | |||
# if USE_D3D9 | |||
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 16, 0); | |||
SDL_SysWMinfo wminfo; | |||
SDL_VERSION(&wminfo.version); | |||
SDL_GetWMInfo(&wminfo); | |||
g_hwnd = wminfo.window; | |||
# elif SDL_VERSION_ATLEAST(2,0,0) | |||
TODO | |||
# else | |||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); | |||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); | |||
// TODO: when implementing fullscreen, be sure to overwrite screen_w and screen_h with the value of vidinfo after the call to SDL_SetVideoMode | |||
SDL_Surface *video = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | |||
// TODO: when implementing fullscreen, be sure to overwrite screen_w | |||
// and screen_h with the value of vidinfo after the call to | |||
// SDL_SetVideoMode. | |||
data->m_window = SDL_SetVideoMode(res.x, res.y, 0, SDL_OPENGL); | |||
# endif | |||
if (!video) | |||
if (!data->m_window) | |||
{ | |||
Log::Error("cannot create rendering window: %s\n", SDL_GetError()); | |||
SDL_Quit(); | |||
exit(EXIT_FAILURE); | |||
} | |||
SDL_WM_SetCaption(title, nullptr); | |||
res = ivec2(data->m_window->w, data->m_window->h); | |||
#endif | |||
/* Initialise everything */ | |||
Ticker::Setup(fps); | |||
Video::Setup(ivec2(video->w, video->h)); | |||
Video::Setup(res); | |||
Audio::Setup(2); | |||
/* Autoreleased objects */ | |||
# if defined USE_XINPUT | |||
#if defined USE_XINPUT | |||
/* Prefer D3d9 for joysticks on Windows, because the X360 pads are not | |||
* advertised with the proper number of axes. */ | |||
new D3d9Input(); | |||
# endif | |||
#endif | |||
new SdlInput(video->w, video->h, screen_w, screen_h); | |||
new SdlInput(res.x, res.y, screen_size.x, screen_size.y); | |||
#endif | |||
} | |||
@@ -127,23 +154,36 @@ void SdlApp::Tick() | |||
/* Tick the renderer, show the frame and clamp to desired framerate. */ | |||
Ticker::TickDraw(); | |||
#if defined USE_SDL && defined USE_D3D9 | |||
#if USE_SDL2 | |||
SDL_GL_SwapWindow(data->m_window); | |||
#elif USE_SDL && USE_D3D9 | |||
hr = d3d_dev->EndScene(); | |||
if (FAILED(hr)) | |||
Abort(); | |||
hr = d3d_dev->Present(nullptr, nullptr, nullptr, nullptr); | |||
if (FAILED(hr)) | |||
Abort(); | |||
#elif defined USE_SDL | |||
#elif USE_SDL | |||
SDL_GL_SwapBuffers(); | |||
#endif | |||
} | |||
SdlApp::~SdlApp() | |||
{ | |||
#if defined USE_SDL | |||
#if USE_SDL | |||
if (data->m_window) | |||
{ | |||
# if USE_SDL2 | |||
SDL_GL_DeleteContext(data->m_glcontext); | |||
SDL_DestroyWindow(data->m_window); | |||
# else | |||
SDL_DestroySurface(data->m_window); | |||
# endif | |||
} | |||
SDL_Quit(); | |||
#endif | |||
delete data; | |||
} | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; 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 Sam Hocevar. See | |||
@@ -76,10 +76,12 @@ SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||
: m_data(new SdlInputData(app_w, app_h, screen_w, screen_h)) | |||
#endif //USE_SDL | |||
{ | |||
#if USE_SDL | |||
#if USE_SDL && !USE_SDL2 | |||
/* Enable Unicode translation of keyboard events */ | |||
SDL_EnableUNICODE(1); | |||
#endif | |||
#if USE_SDL | |||
SDL_Init(SDL_INIT_TIMER | SDL_INIT_JOYSTICK); | |||
m_data->m_keyboard = InputDeviceInternal::CreateStandardKeyboard(); | |||
@@ -102,7 +104,11 @@ SdlInput::SdlInput(int app_w, int app_h, int screen_w, int screen_h) | |||
* - HDAPS, it's not a real joystick. | |||
* - X360 controllers, Xinput handles them better since | |||
* it won't think there is only one trigger axis. */ | |||
# if USE_SDL2 | |||
char const *name = SDL_JoystickName(sdlstick); | |||
# else | |||
char const *name = SDL_JoystickName(i); | |||
# endif | |||
if (strstr(name, "HDAPS") | |||
# if USE_XINPUT | |||
|| strstr(name, "XBOX 360 For Windows") | |||
@@ -196,10 +202,12 @@ void SdlInputData::Tick(float seconds) | |||
case SDL_MOUSEBUTTONDOWN: | |||
case SDL_MOUSEBUTTONUP: | |||
{ | |||
# if !USE_SDL2 | |||
if (event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN) | |||
m_mouse->SetKey(event.button.button - 1, event.type == SDL_MOUSEBUTTONDOWN); | |||
else | |||
m_mouse->SetAxis(4, (event.button.button != SDL_BUTTON_WHEELUP) ? (1) : (-1)); | |||
# endif | |||
// TODO: mouse wheel as axis | |||
break; | |||
} | |||
@@ -222,7 +230,11 @@ void SdlInputData::Tick(float seconds) | |||
if (InputDeviceInternal::GetMouseCapture() != m_mousecapture) | |||
{ | |||
m_mousecapture = InputDeviceInternal::GetMouseCapture(); | |||
# if USE_SDL2 | |||
SDL_SetRelativeMouseMode(m_mousecapture ? SDL_TRUE : SDL_FALSE); | |||
# else | |||
SDL_WM_GrabInput(m_mousecapture ? SDL_GRAB_ON : SDL_GRAB_OFF); | |||
# endif | |||
mouse = (ivec2)m_app / 2; | |||
SdlInputData::SetMousePos(mouse); | |||
//SDL_ShowCursor(m_mousecapture ? SDL_DISABLE : SDL_ENABLE); | |||
@@ -246,9 +258,11 @@ void SdlInputData::Tick(float seconds) | |||
//Mouse is focused, Validate the InScreen Key | |||
//Hardcoded 3, not very nice. | |||
# if !EMSCRIPTEN | |||
# if !EMSCRIPTEN && !USE_SDL2 | |||
m_mouse->SetKey(3, !!(SDL_GetAppState() & SDL_APPMOUSEFOCUS)); | |||
#else //Emscripten doesn't seem to handle SDL_APPMOUSEFOCUS | |||
#else | |||
// Emscripten doesn't seem to handle SDL_APPMOUSEFOCUS | |||
// SDL2 doesn't have SDL_APPMOUSEFOCUS either | |||
m_mouse->SetKey(3, true); | |||
#endif | |||
@@ -260,8 +274,8 @@ void SdlInputData::Tick(float seconds) | |||
m_prevmouse = mouse; | |||
# if SDL_VERSION_ATLEAST(1,3,0) | |||
Uint8 *sdlstate = SDL_GetKeyboardState(nullptr); | |||
# if USE_SDL2 | |||
Uint8 const *sdlstate = SDL_GetKeyboardState(nullptr); | |||
# else | |||
Uint8 *sdlstate = SDL_GetKeyState(nullptr); | |||
# endif | |||
@@ -285,7 +299,7 @@ ivec2 SdlInputData::GetMousePos() | |||
ivec2 ret(-1, -1); | |||
#if USE_SDL | |||
# if !EMSCRIPTEN | |||
# if !EMSCRIPTEN && !USE_SDL2 | |||
if (SDL_GetAppState() & SDL_APPMOUSEFOCUS) | |||
# endif | |||
{ | |||
@@ -298,7 +312,9 @@ ivec2 SdlInputData::GetMousePos() | |||
void SdlInputData::SetMousePos(ivec2 position) | |||
{ | |||
#if USE_SDL | |||
#if USE_SDL2 | |||
// FIXME: how do I warped mouse? | |||
#elif USE_SDL | |||
SDL_WarpMouse((uint16_t)position.x, (uint16_t)position.y); | |||
#else | |||
UNUSED(position); | |||