/* I made this a separate source file because Raylib has some quirks regarding Windows compilation. And I also suppose because it has some state of its own. */ #include "controller.h" // 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) { XINPUT_VIBRATION state = {}; state.wLeftMotorSpeed = (unsigned)(strength * 65535.0f); state.wRightMotorSpeed = (unsigned)(strength * 65535.0f); if (XInputSetState(0, &state) == 0){ timer = FIXED_POINT_ONE * duration; } } void poll_rumble(f32 dt) { if(timer <= 0) return; fx32 delta = FIXED_POINT_ONE * dt; timer -= delta; if(timer <= 0){ stop_rumble(); } } void stop_rumble(void) { timer = 0; XINPUT_VIBRATION state = {}; state.wLeftMotorSpeed = 0; state.wRightMotorSpeed = 0; }