Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dynamic sdl2 loading from client #35

Merged
merged 3 commits into from
Dec 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion cl_dll/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ set (CLDLL_LIBRARY client)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-write-strings -DLINUX -D_LINUX -Dstricmp=strcasecmp -D_strnicmp=strncasecmp -Dstrnicmp=strncasecmp -DCLIENT_WEAPONS -DCLIENT_DLL -w")
if (GOLDSOURCE_SUPPORT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGOLDSOURCE_SUPPORT -lSDL2")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGOLDSOURCE_SUPPORT")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ldl")
endif()
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")

Expand Down
144 changes: 126 additions & 18 deletions cl_dll/input_goldsource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,90 @@
#endif

#ifdef USE_SDL2
#define ARRAYSIZE(p) ( sizeof(p) /sizeof(p[0]) )
#include <dlfcn.h>
#include <SDL2/SDL_mouse.h>
#include <SDL2/SDL_gamecontroller.h>
int (*pfnSDL_SetRelativeMouseMode)(SDL_bool);
Uint32 (*pfnSDL_GetRelativeMouseState)(int* x, int* y);
int (*pfnSDL_NumJoysticks)(void);
SDL_bool (*pfnSDL_IsGameController)(int);
SDL_GameController* (*pfnSDL_GameControllerOpen)(int);
Sint16 (*pfnSDL_GameControllerGetAxis)(SDL_GameController*, SDL_GameControllerAxis);
Uint8 (*pfnSDL_GameControllerGetButton)(SDL_GameController*, SDL_GameControllerButton);
void (*pfnSDL_JoystickUpdate)(void);
const char* (*pfnSDL_GameControllerName)(SDL_GameController*);

int safe_pfnSDL_SetRelativeMouseMode(SDL_bool mode)
{
if (pfnSDL_SetRelativeMouseMode)
return pfnSDL_SetRelativeMouseMode(mode);
return -1;
}
Uint32 safe_pfnSDL_GetRelativeMouseState(int* x, int* y)
{
if (pfnSDL_GetRelativeMouseState)
return pfnSDL_GetRelativeMouseState(x, y);
return 0;
}
int safe_pfnSDL_NumJoysticks()
{
if (pfnSDL_NumJoysticks)
return pfnSDL_NumJoysticks();
return -1;
}
SDL_bool safe_pfnSDL_IsGameController(int joystick_index)
{
if (pfnSDL_IsGameController)
return pfnSDL_IsGameController(joystick_index);
return SDL_FALSE;
}
SDL_GameController* safe_pfnSDL_GameControllerOpen(int joystick_index)
{
if (pfnSDL_GameControllerOpen)
return pfnSDL_GameControllerOpen(joystick_index);
return NULL;
}
Sint16 safe_pfnSDL_GameControllerGetAxis(SDL_GameController* gamecontroller, SDL_GameControllerAxis axis)
{
if (pfnSDL_GameControllerGetAxis)
return pfnSDL_GameControllerGetAxis(gamecontroller, axis);
return 0;
}
Uint8 safe_pfnSDL_GameControllerGetButton(SDL_GameController* gamecontroller, SDL_GameControllerButton button)
{
if (pfnSDL_GameControllerGetButton)
return pfnSDL_GameControllerGetButton(gamecontroller, button);
return 0;
}
void safe_pfnSDL_JoystickUpdate()
{
if (pfnSDL_JoystickUpdate)
pfnSDL_JoystickUpdate();
}
const char* safe_pfnSDL_GameControllerName(SDL_GameController* gamecontroller)
{
if (pfnSDL_GameControllerName)
return pfnSDL_GameControllerName(gamecontroller);
return NULL;
}

struct SDLFunction
{
void** ppfnFunc;
const char* name;
};
static SDLFunction sdlFunctions[] = {
{(void**)&pfnSDL_SetRelativeMouseMode, "SDL_SetRelativeMouseMode"},
{(void**)&pfnSDL_GetRelativeMouseState, "SDL_GetRelativeMouseState"},
{(void**)&pfnSDL_NumJoysticks, "SDL_NumJoysticks"},
{(void**)&pfnSDL_IsGameController, "SDL_IsGameController"},
{(void**)&pfnSDL_GameControllerOpen, "SDL_GameControllerOpen"},
{(void**)&pfnSDL_GameControllerGetAxis, "SDL_GameControllerGetAxis"},
{(void**)&pfnSDL_GameControllerGetButton, "SDL_GameControllerGetButton"},
{(void**)&pfnSDL_JoystickUpdate, "SDL_JoystickUpdate"},
{(void**)&pfnSDL_GameControllerName, "SDL_GameControllerName"}
};
#endif

#ifdef _WIN32
Expand Down Expand Up @@ -289,12 +371,12 @@ void IN_SetMouseMode(bool enable)
if(m_bRawInput)
{
#ifdef USE_SDL2
SDL_SetRelativeMouseMode(SDL_TRUE);
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
#endif
isMouseRelative = true;
}
#else
SDL_SetRelativeMouseMode(SDL_TRUE);
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
#endif

currentMouseMode = true;
Expand All @@ -305,15 +387,15 @@ void IN_SetMouseMode(bool enable)
if(isMouseRelative)
{
#ifdef USE_SDL2
SDL_SetRelativeMouseMode(SDL_FALSE);
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
#endif
isMouseRelative = false;
}

if (restore_spi)
SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
#else
SDL_SetRelativeMouseMode(SDL_FALSE);
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
#endif

currentMouseMode = false;
Expand Down Expand Up @@ -464,6 +546,14 @@ void GoldSourceInput::IN_Shutdown (void)
s_hMouseThreadActiveLock = (HANDLE)0;
}
#endif

#ifdef USE_SDL2
for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) {
*(sdlFunctions[j].ppfnFunc) = NULL;
}
dlclose(sdl2Lib);
sdl2Lib = NULL;
#endif
}

/*
Expand Down Expand Up @@ -623,7 +713,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
#endif
{
#ifdef USE_SDL2
SDL_GetRelativeMouseState( &deltaX, &deltaY );
safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
current_pos.x = deltaX;
current_pos.y = deltaY;
#else
Expand Down Expand Up @@ -679,14 +769,14 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
if(m_bRawInput && !isMouseRelative)
{
#ifdef USE_SDL2
SDL_SetRelativeMouseMode(SDL_TRUE);
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
#endif
isMouseRelative = true;
}
else if(!m_bRawInput && isMouseRelative)
{
#ifdef USE_SDL2
SDL_SetRelativeMouseMode(SDL_FALSE);
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
#endif
isMouseRelative = false;
}
Expand Down Expand Up @@ -815,7 +905,7 @@ void GoldSourceInput::IN_Accumulate (void)
{
#ifdef USE_SDL2
int deltaX, deltaY;
SDL_GetRelativeMouseState( &deltaX, &deltaY );
safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
mx_accum += deltaX;
my_accum += deltaY;
#else
Expand Down Expand Up @@ -869,14 +959,14 @@ void IN_StartupJoystick (void)
// assume no joystick
joy_avail = 0;
#ifdef USE_SDL2
int nJoysticks = SDL_NumJoysticks();
int nJoysticks = safe_pfnSDL_NumJoysticks();
if ( nJoysticks > 0 )
{
for ( int i = 0; i < nJoysticks; i++ )
{
if ( SDL_IsGameController( i ) )
if ( safe_pfnSDL_IsGameController( i ) )
{
s_pJoystick = SDL_GameControllerOpen( i );
s_pJoystick = safe_pfnSDL_GameControllerOpen( i );
if ( s_pJoystick )
{
//save the joystick's number of buttons and POV status
Expand All @@ -888,7 +978,7 @@ void IN_StartupJoystick (void)

// mark the joystick as available and advanced initialization not completed
// this is needed as cvars are not available during initialization
gEngfuncs.Con_Printf ("joystick found\n\n", SDL_GameControllerName(s_pJoystick));
gEngfuncs.Con_Printf ("joystick found\n\n", safe_pfnSDL_GameControllerName(s_pJoystick));
joy_avail = 1;
joy_advancedinit = 0;
break;
Expand All @@ -912,13 +1002,13 @@ int RawValuePointer (int axis)
{
default:
case JOY_AXIS_X:
return SDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTX );
return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTX );
case JOY_AXIS_Y:
return SDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTY );
return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_LEFTY );
case JOY_AXIS_Z:
return SDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTX );
return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTX );
case JOY_AXIS_R:
return SDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY );
return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY );

}
#else
Expand Down Expand Up @@ -1011,7 +1101,7 @@ void GoldSourceInput::IN_Commands (void)
#ifdef USE_SDL2
for ( i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++ )
{
if ( SDL_GameControllerGetButton( s_pJoystick, (SDL_GameControllerButton)i ) )
if ( safe_pfnSDL_GameControllerGetButton( s_pJoystick, (SDL_GameControllerButton)i ) )
{
buttonstate |= 1<<i;
}
Expand Down Expand Up @@ -1071,7 +1161,7 @@ IN_ReadJoystick
int IN_ReadJoystick (void)
{
#ifdef USE_SDL2
SDL_JoystickUpdate();
safe_pfnSDL_JoystickUpdate();
#endif
return 1;
}
Expand Down Expand Up @@ -1344,6 +1434,24 @@ void GoldSourceInput::IN_Init (void)
}
#endif

#ifdef USE_SDL2
#ifdef __APPLE__
#define SDL2_FULL_LIBNAME "libsdl2-2.0.0.dylib"
#else
#define SDL2_FULL_LIBNAME "libSDL2-2.0.so.0"
#endif
sdl2Lib = dlopen(SDL2_FULL_LIBNAME, RTLD_NOW|RTLD_LOCAL);
if (sdl2Lib) {
for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) {
*(sdlFunctions[j].ppfnFunc) = dlsym(sdl2Lib, sdlFunctions[j].name);
if (*sdlFunctions[j].ppfnFunc == NULL) {
gEngfuncs.Con_Printf("Could not load SDL2 function %s: %s\n", sdlFunctions[j].name, dlerror());
}
}
} else {
gEngfuncs.Con_Printf("Could not load SDL2: %s\n", dlerror());
}
#endif
gEngfuncs.pfnAddCommand ("force_centerview", Force_CenterView_f);
gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);

Expand Down
1 change: 1 addition & 0 deletions cl_dll/input_mouse.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class GoldSourceInput : public AbstractInput
POINT current_pos;
int old_mouse_x, old_mouse_y, mx_accum, my_accum;
int mouseinitialized;
void* sdl2Lib;
};
#endif

Expand Down