mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-01-12 16:07:57 +00:00
Merge pull request #35 from FreeSlave/dynamic_sdl
Dynamic sdl2 loading from client
This commit is contained in:
commit
f9267125c1
@ -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")
|
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)
|
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()
|
endif()
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
|
|
||||||
|
@ -28,8 +28,90 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
|
#define ARRAYSIZE(p) ( sizeof(p) /sizeof(p[0]) )
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <SDL2/SDL_mouse.h>
|
#include <SDL2/SDL_mouse.h>
|
||||||
#include <SDL2/SDL_gamecontroller.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
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -289,12 +371,12 @@ void IN_SetMouseMode(bool enable)
|
|||||||
if(m_bRawInput)
|
if(m_bRawInput)
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_SetRelativeMouseMode(SDL_TRUE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
#endif
|
#endif
|
||||||
isMouseRelative = true;
|
isMouseRelative = true;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
SDL_SetRelativeMouseMode(SDL_TRUE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
currentMouseMode = true;
|
currentMouseMode = true;
|
||||||
@ -305,7 +387,7 @@ void IN_SetMouseMode(bool enable)
|
|||||||
if(isMouseRelative)
|
if(isMouseRelative)
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_SetRelativeMouseMode(SDL_FALSE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
#endif
|
#endif
|
||||||
isMouseRelative = false;
|
isMouseRelative = false;
|
||||||
}
|
}
|
||||||
@ -313,7 +395,7 @@ void IN_SetMouseMode(bool enable)
|
|||||||
if (restore_spi)
|
if (restore_spi)
|
||||||
SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
|
SystemParametersInfo (SPI_SETMOUSE, 0, originalmouseparms, 0);
|
||||||
#else
|
#else
|
||||||
SDL_SetRelativeMouseMode(SDL_FALSE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
currentMouseMode = false;
|
currentMouseMode = false;
|
||||||
@ -464,6 +546,14 @@ void GoldSourceInput::IN_Shutdown (void)
|
|||||||
s_hMouseThreadActiveLock = (HANDLE)0;
|
s_hMouseThreadActiveLock = (HANDLE)0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_SDL2
|
||||||
|
for (int j=0; j<ARRAYSIZE(sdlFunctions); ++j) {
|
||||||
|
*(sdlFunctions[j].ppfnFunc) = NULL;
|
||||||
|
}
|
||||||
|
dlclose(sdl2Lib);
|
||||||
|
sdl2Lib = NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -623,7 +713,7 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_GetRelativeMouseState( &deltaX, &deltaY );
|
safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
|
||||||
current_pos.x = deltaX;
|
current_pos.x = deltaX;
|
||||||
current_pos.y = deltaY;
|
current_pos.y = deltaY;
|
||||||
#else
|
#else
|
||||||
@ -679,14 +769,14 @@ void GoldSourceInput::IN_GetMouseDelta( int *pOutX, int *pOutY)
|
|||||||
if(m_bRawInput && !isMouseRelative)
|
if(m_bRawInput && !isMouseRelative)
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_SetRelativeMouseMode(SDL_TRUE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
#endif
|
#endif
|
||||||
isMouseRelative = true;
|
isMouseRelative = true;
|
||||||
}
|
}
|
||||||
else if(!m_bRawInput && isMouseRelative)
|
else if(!m_bRawInput && isMouseRelative)
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_SetRelativeMouseMode(SDL_FALSE);
|
safe_pfnSDL_SetRelativeMouseMode(SDL_FALSE);
|
||||||
#endif
|
#endif
|
||||||
isMouseRelative = false;
|
isMouseRelative = false;
|
||||||
}
|
}
|
||||||
@ -815,7 +905,7 @@ void GoldSourceInput::IN_Accumulate (void)
|
|||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
int deltaX, deltaY;
|
int deltaX, deltaY;
|
||||||
SDL_GetRelativeMouseState( &deltaX, &deltaY );
|
safe_pfnSDL_GetRelativeMouseState( &deltaX, &deltaY );
|
||||||
mx_accum += deltaX;
|
mx_accum += deltaX;
|
||||||
my_accum += deltaY;
|
my_accum += deltaY;
|
||||||
#else
|
#else
|
||||||
@ -869,14 +959,14 @@ void IN_StartupJoystick (void)
|
|||||||
// assume no joystick
|
// assume no joystick
|
||||||
joy_avail = 0;
|
joy_avail = 0;
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
int nJoysticks = SDL_NumJoysticks();
|
int nJoysticks = safe_pfnSDL_NumJoysticks();
|
||||||
if ( nJoysticks > 0 )
|
if ( nJoysticks > 0 )
|
||||||
{
|
{
|
||||||
for ( int i = 0; i < nJoysticks; i++ )
|
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 )
|
if ( s_pJoystick )
|
||||||
{
|
{
|
||||||
//save the joystick's number of buttons and POV status
|
//save the joystick's number of buttons and POV status
|
||||||
@ -888,7 +978,7 @@ void IN_StartupJoystick (void)
|
|||||||
|
|
||||||
// mark the joystick as available and advanced initialization not completed
|
// mark the joystick as available and advanced initialization not completed
|
||||||
// this is needed as cvars are not available during initialization
|
// 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_avail = 1;
|
||||||
joy_advancedinit = 0;
|
joy_advancedinit = 0;
|
||||||
break;
|
break;
|
||||||
@ -912,13 +1002,13 @@ int RawValuePointer (int axis)
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
case JOY_AXIS_X:
|
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:
|
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:
|
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:
|
case JOY_AXIS_R:
|
||||||
return SDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY );
|
return safe_pfnSDL_GameControllerGetAxis( s_pJoystick, SDL_CONTROLLER_AXIS_RIGHTY );
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -1011,7 +1101,7 @@ void GoldSourceInput::IN_Commands (void)
|
|||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
for ( i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++ )
|
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;
|
buttonstate |= 1<<i;
|
||||||
}
|
}
|
||||||
@ -1071,7 +1161,7 @@ IN_ReadJoystick
|
|||||||
int IN_ReadJoystick (void)
|
int IN_ReadJoystick (void)
|
||||||
{
|
{
|
||||||
#ifdef USE_SDL2
|
#ifdef USE_SDL2
|
||||||
SDL_JoystickUpdate();
|
safe_pfnSDL_JoystickUpdate();
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1344,6 +1434,24 @@ void GoldSourceInput::IN_Init (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#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 ("force_centerview", Force_CenterView_f);
|
||||||
gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
|
gEngfuncs.pfnAddCommand ("joyadvancedupdate", Joy_AdvancedUpdate_f);
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ protected:
|
|||||||
POINT current_pos;
|
POINT current_pos;
|
||||||
int old_mouse_x, old_mouse_y, mx_accum, my_accum;
|
int old_mouse_x, old_mouse_y, mx_accum, my_accum;
|
||||||
int mouseinitialized;
|
int mouseinitialized;
|
||||||
|
void* sdl2Lib;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user