Android: Manually scale axis values instead of using motion range

This commit is contained in:
Connor McLaughlin 2021-02-05 00:39:42 +10:00
parent d0667ba32a
commit d4997c6fb9
2 changed files with 19 additions and 14 deletions

View file

@ -111,16 +111,8 @@ bool AndroidControllerInterface::HandleAxisEvent(u32 index, u32 axis, float valu
const AxisCallback& cb = m_controllers[index].axis_mapping[static_cast<u32>(axis)][AxisSide::Full];
if (cb)
{
// Extend triggers from a 0 - 1 range to a -1 - 1 range for consistency with other inputs
if (axis == 4 && axis == 5)
{
cb((value * 2.0f) - 1.0f);
}
else
{
cb(value);
}
return true;
}

View file

@ -208,6 +208,10 @@ public class EmulationSurfaceView extends SurfaceView {
return !isExternalKeyCode(keyCode);
}
private float clamp(float value, float min, float max) {
return (value < min) ? min : ((value > max) ? max : value);
}
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
final int source = event.getSource();
@ -222,12 +226,21 @@ public class EmulationSurfaceView extends SurfaceView {
final float axisValue = event.getAxisValue(mapping.deviceAxisOrButton);
float emuValue;
if (mapping.deviceMotionRange != null) {
final float transformedValue = (axisValue - mapping.deviceMotionRange.getMin()) / mapping.deviceMotionRange.getRange();
emuValue = (transformedValue * 2.0f) - 1.0f;
} else {
emuValue = axisValue;
switch (mapping.deviceAxisOrButton) {
case MotionEvent.AXIS_BRAKE:
case MotionEvent.AXIS_GAS:
case MotionEvent.AXIS_LTRIGGER:
case MotionEvent.AXIS_RTRIGGER:
// Scale 0..1 -> -1..1.
emuValue = (clamp(axisValue, 0.0f, 1.0f) * 2.0f) - 1.0f;
break;
default:
// Everything else should already by -1..1 as per Android documentation.
emuValue = clamp(axisValue, -1.0f, 1.0f);
break;
}
Log.d("EmulationSurfaceView", String.format("axis %d value %f emuvalue %f", mapping.deviceAxisOrButton, axisValue, emuValue));
if (mapping.axisMapping >= 0) {