using Ryujinx.Common.Memory;
using System.Runtime.CompilerServices;
namespace Ryujinx.Input
{
///
/// A snapshot of a .
///
public struct GamepadStateSnapshot
{
// NOTE: Update Array size if JoystickInputId is changed.
private Array3> _joysticksState;
// NOTE: Update Array size if GamepadInputId is changed.
private Array28 _buttonsState;
///
/// Create a new instance of .
///
/// The joysticks state
/// The buttons state
public GamepadStateSnapshot(Array3> joysticksState, Array28 buttonsState)
{
_joysticksState = joysticksState;
_buttonsState = buttonsState;
}
///
/// Check if a given input button is pressed.
///
/// The button id
/// True if the given button is pressed
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool IsPressed(GamepadButtonInputId inputId) => _buttonsState[(int)inputId];
///
/// Set the state of a given button.
///
/// The button id
/// The state to assign for the given button.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetPressed(GamepadButtonInputId inputId, bool value) => _buttonsState[(int)inputId] = value;
///
/// Get the values of a given input joystick.
///
/// The stick id
/// The values of the given input joystick
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public (float, float) GetStick(StickInputId inputId)
{
var result = _joysticksState[(int)inputId];
return (result[0], result[1]);
}
///
/// Set the values of a given input joystick.
///
/// The stick id
/// The x axis value
/// The y axis value
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetStick(StickInputId inputId, float x, float y)
{
_joysticksState[(int)inputId][0] = x;
_joysticksState[(int)inputId][1] = y;
}
}
}