mirror of
https://github.com/glfw/glfw.git
synced 2025-10-03 05:11:01 +00:00
add windows gamepad rumble implementation
This commit is contained in:
parent
e65de2941c
commit
a630f36d00
@ -5348,6 +5348,37 @@ GLFWAPI const char* glfwGetGamepadName(int jid);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);
|
GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state);
|
||||||
|
|
||||||
|
/*! @brief Sets the specified gamepad's vibration effect intensity.
|
||||||
|
*
|
||||||
|
* This function sends vibration data to the specified Xbox-like gamepad.
|
||||||
|
*
|
||||||
|
* Vibration intensity is a value between 0.0 and 1.0 inclusive, where 0.0 is no
|
||||||
|
* vibration, and 1.0 is maximum vibration. It is set separately for the
|
||||||
|
* gamepad's low frequency and high frequency rumble motors.
|
||||||
|
*
|
||||||
|
* If the specified gamepad is not present or does not support the rumble
|
||||||
|
* effect, this function will return `GLFW_FALSE` but will not generate an
|
||||||
|
* error.
|
||||||
|
*
|
||||||
|
* @param[in] jid The [joystick](@ref joysticks) to vibrate.
|
||||||
|
* @param[in] slowMotorSpeed The low frequency rumble intensity.
|
||||||
|
* @param[in] fastMotorSpeed The high frequency rumble intensity.
|
||||||
|
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is
|
||||||
|
* connected, or the joystick does not support the rumble effect.
|
||||||
|
*
|
||||||
|
* @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref
|
||||||
|
* GLFW_INVALID_ENUM.
|
||||||
|
*
|
||||||
|
* @thread_safety This function must only be called from the main thread.
|
||||||
|
*
|
||||||
|
* @sa @ref gamepad
|
||||||
|
* @sa @ref glfwUpdateGamepadMappings
|
||||||
|
* @sa @ref glfwJoystickIsGamepad
|
||||||
|
*
|
||||||
|
* @ingroup input
|
||||||
|
*/
|
||||||
|
GLFWAPI int glfwSetGamepadRumble(int jid, float slowMotorSpeed, float fastMotorSpeed);
|
||||||
|
|
||||||
/*! @brief Sets the clipboard to the specified string.
|
/*! @brief Sets the clipboard to the specified string.
|
||||||
*
|
*
|
||||||
* This function sets the system clipboard to the specified, UTF-8 encoded
|
* This function sets the system clipboard to the specified, UTF-8 encoded
|
||||||
|
28
src/input.c
28
src/input.c
@ -1312,6 +1312,34 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)
|
|||||||
return GLFW_TRUE;
|
return GLFW_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLFWAPI int glfwSetGamepadRumble(int jid, float slowMotorSpeed, float fastMotorSpeed)
|
||||||
|
{
|
||||||
|
_GLFWjoystick* js;
|
||||||
|
|
||||||
|
assert(jid >= GLFW_JOYSTICK_1);
|
||||||
|
assert(jid <= GLFW_JOYSTICK_LAST);
|
||||||
|
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE);
|
||||||
|
|
||||||
|
if (jid < 0 || jid > GLFW_JOYSTICK_LAST)
|
||||||
|
{
|
||||||
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid joystick ID %i", jid);
|
||||||
|
return GLFW_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
js = _glfw.joysticks + jid;
|
||||||
|
if (!js->present)
|
||||||
|
return GLFW_FALSE;
|
||||||
|
|
||||||
|
slowMotorSpeed = slowMotorSpeed < 0.0f ? 0.0f : slowMotorSpeed;
|
||||||
|
slowMotorSpeed = slowMotorSpeed > 1.0f ? 1.0f : slowMotorSpeed;
|
||||||
|
|
||||||
|
fastMotorSpeed = fastMotorSpeed < 0.0f ? 0.0f : fastMotorSpeed;
|
||||||
|
fastMotorSpeed = fastMotorSpeed > 1.0f ? 1.0f : fastMotorSpeed;
|
||||||
|
|
||||||
|
return _glfwPlatformSetGamepadRumble(js, slowMotorSpeed, fastMotorSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI void glfwSetClipboardString(GLFWwindow* handle, const char* string)
|
GLFWAPI void glfwSetClipboardString(GLFWwindow* handle, const char* string)
|
||||||
{
|
{
|
||||||
assert(string != NULL);
|
assert(string != NULL);
|
||||||
|
@ -628,6 +628,7 @@ const char* _glfwPlatformGetClipboardString(void);
|
|||||||
|
|
||||||
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);
|
int _glfwPlatformPollJoystick(_GLFWjoystick* js, int mode);
|
||||||
void _glfwPlatformUpdateGamepadGUID(char* guid);
|
void _glfwPlatformUpdateGamepadGUID(char* guid);
|
||||||
|
int _glfwPlatformSetGamepadRumble(_GLFWjoystick* js, float slowMotorSpeed, float fastMotorSpeed);
|
||||||
|
|
||||||
uint64_t _glfwPlatformGetTimerValue(void);
|
uint64_t _glfwPlatformGetTimerValue(void);
|
||||||
uint64_t _glfwPlatformGetTimerFrequency(void);
|
uint64_t _glfwPlatformGetTimerFrequency(void);
|
||||||
|
@ -128,6 +128,8 @@ static GLFWbool loadLibraries(void)
|
|||||||
GetProcAddress(_glfw.win32.xinput.instance, "XInputGetCapabilities");
|
GetProcAddress(_glfw.win32.xinput.instance, "XInputGetCapabilities");
|
||||||
_glfw.win32.xinput.GetState = (PFN_XInputGetState)
|
_glfw.win32.xinput.GetState = (PFN_XInputGetState)
|
||||||
GetProcAddress(_glfw.win32.xinput.instance, "XInputGetState");
|
GetProcAddress(_glfw.win32.xinput.instance, "XInputGetState");
|
||||||
|
_glfw.win32.xinput.SetState = (PFN_XInputSetState)
|
||||||
|
GetProcAddress(_glfw.win32.xinput.instance, "XInputSetState");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -753,3 +753,16 @@ void _glfwPlatformUpdateGamepadGUID(char* guid)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _glfwPlatformSetGamepadRumble(_GLFWjoystick* js, float slowMotorSpeed, float fastMotorSpeed)
|
||||||
|
{
|
||||||
|
if (js->win32.device)
|
||||||
|
return GLFW_FALSE;
|
||||||
|
|
||||||
|
XINPUT_VIBRATION effect;
|
||||||
|
ZeroMemory(&effect, sizeof(XINPUT_VIBRATION));
|
||||||
|
|
||||||
|
effect.wLeftMotorSpeed = (WORD)(65535.0f * slowMotorSpeed);
|
||||||
|
effect.wRightMotorSpeed = (WORD)(65535.0f * fastMotorSpeed);
|
||||||
|
|
||||||
|
return (int) (XInputSetState(js->win32.index, &effect) == ERROR_SUCCESS);
|
||||||
|
}
|
@ -222,8 +222,10 @@ typedef DWORD (WINAPI * PFN_timeGetTime)(void);
|
|||||||
// xinput.dll function pointer typedefs
|
// xinput.dll function pointer typedefs
|
||||||
typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
|
typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
|
||||||
typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
|
typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
|
||||||
|
typedef DWORD (WINAPI * PFN_XInputSetState)(DWORD,XINPUT_VIBRATION*);
|
||||||
#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities
|
#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities
|
||||||
#define XInputGetState _glfw.win32.xinput.GetState
|
#define XInputGetState _glfw.win32.xinput.GetState
|
||||||
|
#define XInputSetState _glfw.win32.xinput.SetState
|
||||||
|
|
||||||
// dinput8.dll function pointer typedefs
|
// dinput8.dll function pointer typedefs
|
||||||
typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
|
typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
|
||||||
@ -357,6 +359,7 @@ typedef struct _GLFWlibraryWin32
|
|||||||
HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
PFN_XInputGetCapabilities GetCapabilities;
|
PFN_XInputGetCapabilities GetCapabilities;
|
||||||
PFN_XInputGetState GetState;
|
PFN_XInputGetState GetState;
|
||||||
|
PFN_XInputSetState SetState;
|
||||||
} xinput;
|
} xinput;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user