sdl: use exp scale for rumble power

Better sensitivity for low power values.
Issue #707
This commit is contained in:
Flyinghead 2022-07-28 10:47:42 +02:00
parent 9070c246d4
commit 55600c40a9
1 changed files with 6 additions and 2 deletions

View File

@ -189,6 +189,10 @@ public:
return GamepadDevice::gamepad_axis_input(code, value);
}
u16 getRumbleIntensity(float power) {
return (u16)std::min(power * 65535.f / std::pow(1.06f, 100.f - rumblePower), 65535.f);
}
void rumble(float power, float inclination, u32 duration_ms) override
{
if (rumbleEnabled)
@ -196,7 +200,7 @@ public:
vib_inclination = inclination * power;
vib_stop_time = os_GetSeconds() + duration_ms / 1000.0;
Uint16 intensity = (Uint16)std::min(power * rumblePower * 65535.f / 100.f, 65535.f);
u16 intensity = getRumbleIntensity(power);
SDL_JoystickRumble(sdl_joystick, intensity, intensity, duration_ms);
}
}
@ -211,7 +215,7 @@ public:
vib_inclination = 0;
else
{
Uint16 intensity = (Uint16)std::min(vib_inclination * rem_time * 65535.f * rumblePower / 100.f, 65535.f);
u16 intensity = getRumbleIntensity(vib_inclination * rem_time);
SDL_JoystickRumble(sdl_joystick, intensity, intensity, rem_time);
}
}