diff options
| author | Uneven Prankster <unevenprankster@protonmail.com> | 2023-10-15 21:28:29 -0300 |
|---|---|---|
| committer | Uneven Prankster <unevenprankster@protonmail.com> | 2023-10-15 21:28:29 -0300 |
| commit | 1c0cc775732201f4c4d3ee0d6772be786b3b4aa1 (patch) | |
| tree | f5d692d046868261275c7430a624c3ea9ed75d3d /src/gunner/rumble.c | |
| parent | a89f892640cf12f75c7ce18e6e88c70a8d3965ed (diff) | |
A lot has certainly happened!
Diffstat (limited to 'src/gunner/rumble.c')
| -rw-r--r-- | src/gunner/rumble.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/gunner/rumble.c b/src/gunner/rumble.c new file mode 100644 index 0000000..dca4f08 --- /dev/null +++ b/src/gunner/rumble.c @@ -0,0 +1,52 @@ +/* +NOTE FOR SPELUNKERS: this requires linking to xinput1_4 AFAIK +*/ + +// Windows stuff starts // +typedef struct _XINPUT_VIBRATION { + unsigned wLeftMotorSpeed; + unsigned wRightMotorSpeed; +} XINPUT_VIBRATION; +unsigned int XInputSetState(unsigned int dwUserIndex, XINPUT_VIBRATION *pVibration); +// Windows stuff ends // + +static fx32 timer = 0; + +void set_rumble(f32 duration, f32 strength) +{ + // If game code is surpassing this something is wrong!! + assert(strength >= 0.f && strength <= 1.f); + + XINPUT_VIBRATION state = {}; + state.wLeftMotorSpeed = (unsigned)(strength * 65535.0f); + state.wRightMotorSpeed = (unsigned)(strength * 65535.0f); + + if (XInputSetState(0, &state) == 0){ + timer = FP_TO_FIXED(duration); + } +} + +void stop_rumble(void) +{ + timer = 0; + + XINPUT_VIBRATION state = {}; + state.wLeftMotorSpeed = 0; + state.wRightMotorSpeed = 0; + XInputSetState(0, &state); +} + +void poll_rumble(f32 dt) +{ + // Early return + if(timer <= 0) + return; + + fx32 delta = FP_TO_FIXED(dt); + + timer -= delta; + if(timer <= 0){ + stop_rumble(); + } +} + |
