/* 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(); } }