Compare commits
5 Commits
Canary-1.2
...
0bf19aeb06
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bf19aeb06 | ||
|
|
91f73a4891 | ||
|
|
883d4d863a | ||
|
|
ca5de909a1 | ||
|
|
6d78e71fc7 |
@@ -3,6 +3,7 @@
|
|||||||
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageVersion Include="Alimer.Bindings.SDL" Version="3.7.1" />
|
||||||
<PackageVersion Include="Avalonia" Version="11.0.13" />
|
<PackageVersion Include="Avalonia" Version="11.0.13" />
|
||||||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.0.13" />
|
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="11.0.13" />
|
||||||
<PackageVersion Include="Avalonia.Desktop" Version="11.0.13" />
|
<PackageVersion Include="Avalonia.Desktop" Version="11.0.13" />
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon", "src\Ryuj
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "src\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.Horizon.Kernel.Generators", "src\Ryujinx.Horizon.Kernel.Generators\Ryujinx.Horizon.Kernel.Generators.csproj", "{7F55A45D-4E1D-4A36-ADD3-87F29A285AA2}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Input.SDL3", "src\Ryujinx.Input.SDL3\Ryujinx.Input.SDL3.csproj", "{3BF24278-547D-42C2-9D43-182B978F54DD}"
|
||||||
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ryujinx.HLE.Generators", "src\Ryujinx.HLE.Generators\Ryujinx.HLE.Generators.csproj", "{B575BCDE-2FD8-4A5D-8756-31CDD7FE81F0}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal", "src\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj", "{C08931FA-1191-417A-864F-3882D93E683B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ryujinx.Graphics.Metal", "src\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj", "{C08931FA-1191-417A-864F-3882D93E683B}"
|
||||||
@@ -259,6 +261,10 @@ Global
|
|||||||
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.Build.0 = Release|Any CPU
|
{81EA598C-DBA1-40B0-8DA4-4796B78F2037}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{3BF24278-547D-42C2-9D43-182B978F54DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3BF24278-547D-42C2-9D43-182B978F54DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3BF24278-547D-42C2-9D43-182B978F54DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3BF24278-547D-42C2-9D43-182B978F54DD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion
|
|||||||
return motionBackendType switch
|
return motionBackendType switch
|
||||||
{
|
{
|
||||||
MotionInputBackendType.GamepadDriver => JsonSerializer.Deserialize(ref reader, _serializerContext.StandardMotionConfigController),
|
MotionInputBackendType.GamepadDriver => JsonSerializer.Deserialize(ref reader, _serializerContext.StandardMotionConfigController),
|
||||||
|
MotionInputBackendType.Handheld => JsonSerializer.Deserialize(ref reader, _serializerContext.StandardMotionConfigController),
|
||||||
MotionInputBackendType.CemuHook => JsonSerializer.Deserialize(ref reader, _serializerContext.CemuHookMotionConfigController),
|
MotionInputBackendType.CemuHook => JsonSerializer.Deserialize(ref reader, _serializerContext.CemuHookMotionConfigController),
|
||||||
_ => throw new InvalidOperationException($"Unknown backend type {motionBackendType}"),
|
_ => throw new InvalidOperationException($"Unknown backend type {motionBackendType}"),
|
||||||
};
|
};
|
||||||
@@ -66,6 +67,7 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion
|
|||||||
switch (value.MotionBackend)
|
switch (value.MotionBackend)
|
||||||
{
|
{
|
||||||
case MotionInputBackendType.GamepadDriver:
|
case MotionInputBackendType.GamepadDriver:
|
||||||
|
case MotionInputBackendType.Handheld:
|
||||||
JsonSerializer.Serialize(writer, value as StandardMotionConfigController, _serializerContext.StandardMotionConfigController);
|
JsonSerializer.Serialize(writer, value as StandardMotionConfigController, _serializerContext.StandardMotionConfigController);
|
||||||
break;
|
break;
|
||||||
case MotionInputBackendType.CemuHook:
|
case MotionInputBackendType.CemuHook:
|
||||||
|
|||||||
@@ -9,5 +9,6 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion
|
|||||||
Invalid,
|
Invalid,
|
||||||
GamepadDriver,
|
GamepadDriver,
|
||||||
CemuHook,
|
CemuHook,
|
||||||
|
Handheld,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/Ryujinx.Input.SDL3/Ryujinx.Input.SDL3.csproj
Normal file
13
src/Ryujinx.Input.SDL3/Ryujinx.Input.SDL3.csproj
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Ryujinx.Input\Ryujinx.Input.csproj" />
|
||||||
|
<PackageReference Include="Alimer.Bindings.SDL" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
85
src/Ryujinx.Input.SDL3/SDL3MotionDriver.cs
Normal file
85
src/Ryujinx.Input.SDL3/SDL3MotionDriver.cs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
using SDL3;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Numerics;
|
||||||
|
using static SDL3.SDL3;
|
||||||
|
|
||||||
|
namespace Ryujinx.Input.SDL3
|
||||||
|
{
|
||||||
|
public unsafe class SDL3MotionDriver : IHandheld, IDisposable
|
||||||
|
{
|
||||||
|
private readonly Dictionary<SDL_SensorType, SDL_Sensor> sensors;
|
||||||
|
private bool _disposed;
|
||||||
|
|
||||||
|
public SDL3MotionDriver()
|
||||||
|
{
|
||||||
|
int result = SDL_Init(SDL_InitFlags.Sensor);
|
||||||
|
if (result < 0)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"SDL sensor initialization failed: {SDL_GetError()}");
|
||||||
|
}
|
||||||
|
sensors = SDL_GetSensors().ToArray().ToDictionary(SDL_GetSensorTypeForID, SDL_OpenSensor);
|
||||||
|
}
|
||||||
|
|
||||||
|
~SDL3MotionDriver()
|
||||||
|
{
|
||||||
|
Dispose(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Dispose(true);
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (_disposed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disposing && sensors != null)
|
||||||
|
{
|
||||||
|
foreach (var sensor in sensors.Values)
|
||||||
|
{
|
||||||
|
if (sensor != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
SDL_CloseSensor(sensor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_disposed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3 GetMotionData(MotionInputId inputType)
|
||||||
|
{
|
||||||
|
ObjectDisposedException.ThrowIf(_disposed, this);
|
||||||
|
|
||||||
|
return inputType switch
|
||||||
|
{
|
||||||
|
MotionInputId.Gyroscope => GetSensorVector(SDL_SensorType.Gyro) * 180 / MathF.PI,
|
||||||
|
MotionInputId.Accelerometer => GetSensorVector(SDL_SensorType.Accel) / SDL_STANDARD_GRAVITY,
|
||||||
|
_ => Vector3.Zero
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector3 GetSensorVector(SDL_SensorType sensorType)
|
||||||
|
{
|
||||||
|
if (!sensors.TryGetValue(sensorType, out SDL_Sensor sensor))
|
||||||
|
{
|
||||||
|
return Vector3.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
var data = stackalloc float[3];
|
||||||
|
if (SDL_GetSensorData(sensor, data, 3) < 0)
|
||||||
|
{
|
||||||
|
return Vector3.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Vector3(data[0], data[1], data[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,13 @@ using System;
|
|||||||
|
|
||||||
namespace Ryujinx.Input.HLE
|
namespace Ryujinx.Input.HLE
|
||||||
{
|
{
|
||||||
public class InputManager(IGamepadDriver keyboardDriver, IGamepadDriver gamepadDriver)
|
public class InputManager(IGamepadDriver keyboardDriver, IGamepadDriver gamepadDriver, IHandheld handheld)
|
||||||
: IDisposable
|
: IDisposable
|
||||||
{
|
{
|
||||||
public IGamepadDriver KeyboardDriver { get; } = keyboardDriver;
|
public IGamepadDriver KeyboardDriver { get; } = keyboardDriver;
|
||||||
public IGamepadDriver GamepadDriver { get; } = gamepadDriver;
|
public IGamepadDriver GamepadDriver { get; } = gamepadDriver;
|
||||||
public IGamepadDriver MouseDriver { get; private set; }
|
public IGamepadDriver MouseDriver { get; private set; }
|
||||||
|
public IHandheld Handheld { get; } = handheld;
|
||||||
|
|
||||||
public void SetMouseDriver(IGamepadDriver mouseDriver)
|
public void SetMouseDriver(IGamepadDriver mouseDriver)
|
||||||
{
|
{
|
||||||
@@ -18,7 +19,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
|
|
||||||
public NpadManager CreateNpadManager()
|
public NpadManager CreateNpadManager()
|
||||||
{
|
{
|
||||||
return new NpadManager(KeyboardDriver, GamepadDriver, MouseDriver);
|
return new NpadManager(KeyboardDriver, GamepadDriver, MouseDriver, Handheld);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TouchScreenManager CreateTouchScreenManager()
|
public TouchScreenManager CreateTouchScreenManager()
|
||||||
@@ -38,6 +39,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
KeyboardDriver?.Dispose();
|
KeyboardDriver?.Dispose();
|
||||||
GamepadDriver?.Dispose();
|
GamepadDriver?.Dispose();
|
||||||
MouseDriver?.Dispose();
|
MouseDriver?.Dispose();
|
||||||
|
Handheld?.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,12 +218,14 @@ namespace Ryujinx.Input.HLE
|
|||||||
public string Id { get; private set; }
|
public string Id { get; private set; }
|
||||||
|
|
||||||
private readonly CemuHookClient _cemuHookClient;
|
private readonly CemuHookClient _cemuHookClient;
|
||||||
|
private readonly IHandheld _handheld;
|
||||||
|
|
||||||
public NpadController(CemuHookClient cemuHookClient)
|
public NpadController(CemuHookClient cemuHookClient, IHandheld handheld)
|
||||||
{
|
{
|
||||||
State = default;
|
State = default;
|
||||||
Id = null;
|
Id = null;
|
||||||
_cemuHookClient = cemuHookClient;
|
_cemuHookClient = cemuHookClient;
|
||||||
|
_handheld = handheld;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateDriverConfiguration(IGamepadDriver gamepadDriver, InputConfig config)
|
public bool UpdateDriverConfiguration(IGamepadDriver gamepadDriver, InputConfig config)
|
||||||
@@ -287,6 +289,18 @@ namespace Ryujinx.Input.HLE
|
|||||||
|
|
||||||
if (_config is StandardControllerInputConfig controllerConfig && controllerConfig.Motion.EnableMotion)
|
if (_config is StandardControllerInputConfig controllerConfig && controllerConfig.Motion.EnableMotion)
|
||||||
{
|
{
|
||||||
|
if (controllerConfig.Motion.MotionBackend == MotionInputBackendType.Handheld)
|
||||||
|
{
|
||||||
|
Vector3 accelerometer = _handheld.GetMotionData(MotionInputId.Accelerometer);
|
||||||
|
Vector3 gyroscope = _handheld.GetMotionData(MotionInputId.Gyroscope);
|
||||||
|
|
||||||
|
accelerometer = new Vector3(accelerometer.X, -accelerometer.Z, accelerometer.Y);
|
||||||
|
gyroscope = new Vector3(gyroscope.X, -gyroscope.Z, gyroscope.Y);
|
||||||
|
|
||||||
|
_leftMotionInput.Update(accelerometer, gyroscope, (ulong)PerformanceCounter.ElapsedNanoseconds / 1000, controllerConfig.Motion.Sensitivity, (float)controllerConfig.Motion.GyroDeadzone);
|
||||||
|
_rightMotionInput = _leftMotionInput;
|
||||||
|
}
|
||||||
|
|
||||||
if (controllerConfig.Motion.MotionBackend == MotionInputBackendType.GamepadDriver)
|
if (controllerConfig.Motion.MotionBackend == MotionInputBackendType.GamepadDriver)
|
||||||
{
|
{
|
||||||
if (gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
|
if (gamepad.Features.HasFlag(GamepadFeaturesFlag.Motion))
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
private readonly IGamepadDriver _keyboardDriver;
|
private readonly IGamepadDriver _keyboardDriver;
|
||||||
private readonly IGamepadDriver _gamepadDriver;
|
private readonly IGamepadDriver _gamepadDriver;
|
||||||
private readonly IGamepadDriver _mouseDriver;
|
private readonly IGamepadDriver _mouseDriver;
|
||||||
|
private readonly IHandheld _handheld;
|
||||||
private bool _isDisposed;
|
private bool _isDisposed;
|
||||||
|
|
||||||
private List<InputConfig> _inputConfig;
|
private List<InputConfig> _inputConfig;
|
||||||
@@ -38,7 +39,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
private bool _enableMouse;
|
private bool _enableMouse;
|
||||||
private Switch _device;
|
private Switch _device;
|
||||||
|
|
||||||
public NpadManager(IGamepadDriver keyboardDriver, IGamepadDriver gamepadDriver, IGamepadDriver mouseDriver)
|
public NpadManager(IGamepadDriver keyboardDriver, IGamepadDriver gamepadDriver, IGamepadDriver mouseDriver, IHandheld handheld)
|
||||||
{
|
{
|
||||||
_controllers = new NpadController[MaxControllers];
|
_controllers = new NpadController[MaxControllers];
|
||||||
_cemuHookClient = new CemuHookClient(this);
|
_cemuHookClient = new CemuHookClient(this);
|
||||||
@@ -47,6 +48,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
_gamepadDriver = gamepadDriver;
|
_gamepadDriver = gamepadDriver;
|
||||||
_mouseDriver = mouseDriver;
|
_mouseDriver = mouseDriver;
|
||||||
_inputConfig = [];
|
_inputConfig = [];
|
||||||
|
_handheld = handheld;
|
||||||
|
|
||||||
_gamepadDriver.OnGamepadConnected += HandleOnGamepadConnected;
|
_gamepadDriver.OnGamepadConnected += HandleOnGamepadConnected;
|
||||||
_gamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected;
|
_gamepadDriver.OnGamepadDisconnected += HandleOnGamepadDisconnected;
|
||||||
@@ -139,7 +141,7 @@ namespace Ryujinx.Input.HLE
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
controller = new(_cemuHookClient);
|
controller = new(_cemuHookClient, _handheld);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid = DriverConfigurationUpdate(ref controller, inputConfigEntry);
|
bool isValid = DriverConfigurationUpdate(ref controller, inputConfigEntry);
|
||||||
|
|||||||
10
src/Ryujinx.Input/IHandheld.cs
Normal file
10
src/Ryujinx.Input/IHandheld.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace Ryujinx.Input
|
||||||
|
{
|
||||||
|
public interface IHandheld : IDisposable
|
||||||
|
{
|
||||||
|
Vector3 GetMotionData(MotionInputId gyroscope);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
"ID": "MenuBarFileOpenAppletOpenMiiApplet",
|
"ID": "MenuBarFileOpenAppletOpenMiiApplet",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Mii-Bearbeitungsapplet",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Mii Edit Applet",
|
"en_US": "Mii Edit Applet",
|
||||||
"es_ES": "Applet Editor Mii",
|
"es_ES": "Applet Editor Mii",
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
"ID": "SettingsTabSystemMemoryManagerModeSoftware",
|
"ID": "SettingsTabSystemMemoryManagerModeSoftware",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "البرنامج",
|
"ar_SA": "البرنامج",
|
||||||
"de_DE": "",
|
"de_DE": "Programme",
|
||||||
"el_GR": "Λογισμικό",
|
"el_GR": "Λογισμικό",
|
||||||
"en_US": "Software",
|
"en_US": "Software",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
"ID": "MenuBarFileOpenFromFileError",
|
"ID": "MenuBarFileOpenFromFileError",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Keine Anwendungen im ausgewählten Datei gefunden.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "No applications found in selected file.",
|
"en_US": "No applications found in selected file.",
|
||||||
"es_ES": "No se encontraron aplicaciones en el archivo seleccionado.",
|
"es_ES": "No se encontraron aplicaciones en el archivo seleccionado.",
|
||||||
@@ -376,7 +376,7 @@
|
|||||||
"ID": "MenuBarFileLoadDlcFromFolder",
|
"ID": "MenuBarFileLoadDlcFromFolder",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "DLC aus Ordner laden",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Load DLC From Folder",
|
"en_US": "Load DLC From Folder",
|
||||||
"es_ES": "Cargar DLC Desde Carpeta",
|
"es_ES": "Cargar DLC Desde Carpeta",
|
||||||
@@ -401,7 +401,7 @@
|
|||||||
"ID": "MenuBarFileLoadTitleUpdatesFromFolder",
|
"ID": "MenuBarFileLoadTitleUpdatesFromFolder",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Titel-Updates aus Ordner laden",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Load Title Updates From Folder",
|
"en_US": "Load Title Updates From Folder",
|
||||||
"es_ES": "Cargar Actualizaciones de Títulos Desde Carpeta",
|
"es_ES": "Cargar Actualizaciones de Títulos Desde Carpeta",
|
||||||
@@ -576,7 +576,7 @@
|
|||||||
"ID": "MenuBarOptionsStartGamesWithoutUI",
|
"ID": "MenuBarOptionsStartGamesWithoutUI",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Spiele ohne Benutzeroberfläche starten",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Start Games with UI Hidden",
|
"en_US": "Start Games with UI Hidden",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -589,7 +589,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Iniciar jogos ocultando a interface",
|
"pt_BR": "Iniciar jogos ocultando a interface",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Starta spel med dolt användargränssnitt",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -751,7 +751,7 @@
|
|||||||
"ID": "MenuBarActionsScanAmiiboBin",
|
"ID": "MenuBarActionsScanAmiiboBin",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Amiibo scannen (aus Bin-Datei)",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Scan An Amiibo (From Bin)",
|
"en_US": "Scan An Amiibo (From Bin)",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -851,7 +851,7 @@
|
|||||||
"ID": "MenuBarActionsInstallKeys",
|
"ID": "MenuBarActionsInstallKeys",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Schlüssel installieren",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Install Keys",
|
"en_US": "Install Keys",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
"ID": "MenuBarFileActionsInstallKeysFromFile",
|
"ID": "MenuBarFileActionsInstallKeysFromFile",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Schlüssel aus KEYS oder ZIP installieren",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Install keys from KEYS or ZIP",
|
"en_US": "Install keys from KEYS or ZIP",
|
||||||
"es_ES": "Instalar keys de KEYS o ZIP",
|
"es_ES": "Instalar keys de KEYS o ZIP",
|
||||||
@@ -901,7 +901,7 @@
|
|||||||
"ID": "MenuBarFileActionsInstallKeysFromFolder",
|
"ID": "MenuBarFileActionsInstallKeysFromFolder",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Schlüssel aus einem Verzeichnis installieren",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Install keys from a directory",
|
"en_US": "Install keys from a directory",
|
||||||
"es_ES": "Instalar keys de un directorio",
|
"es_ES": "Instalar keys de un directorio",
|
||||||
@@ -1001,7 +1001,7 @@
|
|||||||
"ID": "MenuBarActionsXCITrimmer",
|
"ID": "MenuBarActionsXCITrimmer",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "XCI-Dateien trimmen",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Trim XCI Files",
|
"en_US": "Trim XCI Files",
|
||||||
"es_ES": "Recortar archivos XCI",
|
"es_ES": "Recortar archivos XCI",
|
||||||
@@ -1226,7 +1226,7 @@
|
|||||||
"ID": "MenuBarHelpFaqAndGuides",
|
"ID": "MenuBarHelpFaqAndGuides",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "FAQ & Anleitungen",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "FAQ & Guides",
|
"en_US": "FAQ & Guides",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1251,7 +1251,7 @@
|
|||||||
"ID": "MenuBarHelpFaq",
|
"ID": "MenuBarHelpFaq",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "FAQ & Fehlerbehebung Seite",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "FAQ & Troubleshooting Page",
|
"en_US": "FAQ & Troubleshooting Page",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1276,7 +1276,7 @@
|
|||||||
"ID": "MenuBarHelpFaqTooltip",
|
"ID": "MenuBarHelpFaqTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Öffnet die FAQ- und Fehlerbehebungsseite im offiziellen Ryujinx-Wiki",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
|
"en_US": "Opens the FAQ and Troubleshooting page on the official Ryujinx wiki",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1301,7 +1301,7 @@
|
|||||||
"ID": "MenuBarHelpSetup",
|
"ID": "MenuBarHelpSetup",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Setup- und Konfigurationsanleitung",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Setup & Configuration Guide",
|
"en_US": "Setup & Configuration Guide",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1326,7 +1326,7 @@
|
|||||||
"ID": "MenuBarHelpSetupTooltip",
|
"ID": "MenuBarHelpSetupTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Öffnet die Setup- und Konfigurationsanleitung im offiziellen Ryujinx-Wiki",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
|
"en_US": "Opens the Setup & Configuration guide on the official Ryujinx wiki",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1351,7 +1351,7 @@
|
|||||||
"ID": "MenuBarHelpMultiplayer",
|
"ID": "MenuBarHelpMultiplayer",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Multiplayer (LDN/LAN) Anleitung",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Multiplayer (LDN/LAN) Guide",
|
"en_US": "Multiplayer (LDN/LAN) Guide",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1376,7 +1376,7 @@
|
|||||||
"ID": "MenuBarHelpMultiplayerTooltip",
|
"ID": "MenuBarHelpMultiplayerTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Öffnet die Multiplayer-Anleitung im offiziellen Ryujinx-Wiki",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Opens the Multiplayer guide on the official Ryujinx wiki",
|
"en_US": "Opens the Multiplayer guide on the official Ryujinx wiki",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1526,7 +1526,7 @@
|
|||||||
"ID": "GameListHeaderDeveloper",
|
"ID": "GameListHeaderDeveloper",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Entwickelt von {0}",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Developed by {0}",
|
"en_US": "Developed by {0}",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -1826,7 +1826,7 @@
|
|||||||
"ID": "GameListHeaderCompatibilityStatus",
|
"ID": "GameListHeaderCompatibilityStatus",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Kompatibilität:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Compatibility:",
|
"en_US": "Compatibility:",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -2614,7 +2614,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Extraia o RomFS de um arquivo DLC selecionado",
|
"pt_BR": "Extraia o RomFS de um arquivo DLC selecionado",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Extrahera RomFS från en vald DLC-fil",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -3062,7 +3062,7 @@
|
|||||||
"ko_KR": "XCI 파일 '{0}' 트리밍",
|
"ko_KR": "XCI 파일 '{0}' 트리밍",
|
||||||
"no_NO": "Trimming av XCI-filen '{0}'",
|
"no_NO": "Trimming av XCI-filen '{0}'",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Reduzindo arquivo XCI '{0}",
|
"pt_BR": "Reduzindo arquivo XCI '{0}'",
|
||||||
"ru_RU": "Обрезается XCI файл '{0}'",
|
"ru_RU": "Обрезается XCI файл '{0}'",
|
||||||
"sv_SE": "Optimerar XCI-filen '{0}'",
|
"sv_SE": "Optimerar XCI-filen '{0}'",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
@@ -4621,7 +4621,7 @@
|
|||||||
"zh_CN": "繁体中文(推荐)",
|
"zh_CN": "繁体中文(推荐)",
|
||||||
"zh_TW": "正體中文 (建議)"
|
"zh_TW": "正體中文 (建議)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ID": "SettingsTabSystemSystemLanguageSwedish",
|
"ID": "SettingsTabSystemSystemLanguageSwedish",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
@@ -4646,7 +4646,7 @@
|
|||||||
"zh_CN": "瑞典语",
|
"zh_CN": "瑞典语",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ID": "SettingsTabSystemSystemLanguageNorwegian",
|
"ID": "SettingsTabSystemSystemLanguageNorwegian",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
@@ -6464,7 +6464,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Ok",
|
||||||
"th_TH": "ตกลง",
|
"th_TH": "ตกลง",
|
||||||
"tr_TR": "Tamam",
|
"tr_TR": "Tamam",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -8172,6 +8172,31 @@
|
|||||||
"zh_TW": "使用與 CemuHook 相容的體感"
|
"zh_TW": "使用與 CemuHook 相容的體感"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ID": "ControllerSettingsMotionUseHandheldCompatibleMotion",
|
||||||
|
"Translations": {
|
||||||
|
"ar_SA": "استخدام الحركة المتوافقة مع Hendheld",
|
||||||
|
"de_DE": "Hendheld kompatible Bewegungssteuerung",
|
||||||
|
"el_GR": "Κίνηση συμβατή με Hendheld",
|
||||||
|
"en_US": "Use Hendheld compatible motion",
|
||||||
|
"es_ES": "Usar movimiento compatible con Hendheld",
|
||||||
|
"fr_FR": "Utiliser un capteur de mouvements Hendheld",
|
||||||
|
"he_IL": "השתמש בתנועת Hendheld תואמת ",
|
||||||
|
"it_IT": "Usa sensore compatibile con Hendheld",
|
||||||
|
"ja_JP": "Hendheld 互換モーションを使用",
|
||||||
|
"ko_KR": "Hendheld 호환 모션 사용",
|
||||||
|
"no_NO": "Bruk Hendheld kompatibel bevegelse",
|
||||||
|
"pl_PL": "Użyj ruchu zgodnego z Hendheld",
|
||||||
|
"pt_BR": "Usar sensor compatível com Hendheld",
|
||||||
|
"ru_RU": "Включить совместимость с Hendheld",
|
||||||
|
"sv_SE": "Använd Hendheld-kompatibel rörelse",
|
||||||
|
"th_TH": "ใช้การเคลื่อนไหวที่เข้ากันได้กับ Hendheld",
|
||||||
|
"tr_TR": "Hendheld uyumlu hareket kullan",
|
||||||
|
"uk_UA": "Використовувати рух, сумісний з Hendheld",
|
||||||
|
"zh_CN": "使用 Hendheld 兼容的体感协议",
|
||||||
|
"zh_TW": "使用與 Hendheld 相容的體感"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ID": "ControllerSettingsMotionControllerSlot",
|
"ID": "ControllerSettingsMotionControllerSlot",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
@@ -8364,7 +8389,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Inaktivera",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -8389,7 +8414,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Regnbåge",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -8439,7 +8464,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Färg",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -15239,7 +15264,7 @@
|
|||||||
"pl_PL": "Seria Amiibo",
|
"pl_PL": "Seria Amiibo",
|
||||||
"pt_BR": "Franquia Amiibo",
|
"pt_BR": "Franquia Amiibo",
|
||||||
"ru_RU": "Серия Amiibo",
|
"ru_RU": "Серия Amiibo",
|
||||||
"sv_SE": "",
|
"sv_SE": "Amiibo-serie",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Amiibo Serisi",
|
"tr_TR": "Amiibo Serisi",
|
||||||
"uk_UA": "Серія Amiibo",
|
"uk_UA": "Серія Amiibo",
|
||||||
@@ -18664,7 +18689,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "{0} - Informação",
|
"pt_BR": "{0} - Informação",
|
||||||
"ru_RU": "{0} - Информация",
|
"ru_RU": "{0} - Информация",
|
||||||
"sv_SE": "",
|
"sv_SE": "{0} - Information",
|
||||||
"th_TH": "{0} – ข้อมูล",
|
"th_TH": "{0} – ข้อมูล",
|
||||||
"tr_TR": "{0} - Bilgi",
|
"tr_TR": "{0} - Bilgi",
|
||||||
"uk_UA": "{0} - Інформація",
|
"uk_UA": "{0} - Інформація",
|
||||||
@@ -19739,7 +19764,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Configurações de LED",
|
"pt_BR": "Configurações de LED",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "LED-inställningar",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
@@ -21939,7 +21964,7 @@
|
|||||||
"pl_PL": "Głoś",
|
"pl_PL": "Głoś",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "Громкость",
|
"ru_RU": "Громкость",
|
||||||
"sv_SE": "",
|
"sv_SE": "Volym",
|
||||||
"th_TH": "ระดับเสียง",
|
"th_TH": "ระดับเสียง",
|
||||||
"tr_TR": "Ses",
|
"tr_TR": "Ses",
|
||||||
"uk_UA": "Гуч.",
|
"uk_UA": "Гуч.",
|
||||||
@@ -23351,7 +23376,7 @@
|
|||||||
"ID": "SettingsTabSystemVSyncModeTooltip",
|
"ID": "SettingsTabSystemVSyncModeTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Emulierte vertikale Synchronisation. \"Switch\" emuliert die 60Hz-Bildwiederholfrequenz der Switch. \"Unbounded\" ist eine unbegrenzte Bildwiederholfrequenz.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.",
|
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23376,7 +23401,7 @@
|
|||||||
"ID": "SettingsTabSystemVSyncModeTooltipCustom",
|
"ID": "SettingsTabSystemVSyncModeTooltipCustom",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Emulierte vertikale Synchronisation. \"Switch\" emuliert die 60Hz-Bildwiederholfrequenz der Switch. „Unbounded“ ist eine unbegrenzte Bildwiederholfrequenz. „Benutzerdefinierte Bildwiederholfrequenz“ emuliert die angegebene benutzerdefinierte Bildwiederholfrequenz.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.",
|
"en_US": "Emulated Vertical Sync. 'Switch' emulates the Switch's refresh rate of 60Hz. 'Unbounded' is an unbounded refresh rate. 'Custom Refresh Rate' emulates the specified custom refresh rate.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23401,7 +23426,7 @@
|
|||||||
"ID": "SettingsTabSystemEnableCustomVSyncIntervalTooltip",
|
"ID": "SettingsTabSystemEnableCustomVSyncIntervalTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Ermöglicht es dem Benutzer, eine emulierte Bildwiederholfrequenz festzulegen. In einigen Titeln kann dies die Geschwindigkeit der Spiel-Logik erhöhen oder verringern. In anderen Titeln kann dies dazu führen, dass die FPS auf ein Vielfaches der Bildwiederholfrequenz begrenzt werden oder zu unvorhersehbarem Verhalten führen. Dies ist eine experimentelle Funktion, ohne Garantien dafür, wie sich das Gameplay auswirkt. \n\nLassen Sie diese Option deaktiviert, wenn Sie sich nicht sicher sind.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.",
|
"en_US": "Allows the user to specify an emulated refresh rate. In some titles, this may speed up or slow down the rate of gameplay logic. In other titles, it may allow for capping FPS at some multiple of the refresh rate, or lead to unpredictable behavior. This is an experimental feature, with no guarantees for how gameplay will be affected. \n\nLeave OFF if unsure.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23426,7 +23451,7 @@
|
|||||||
"ID": "SettingsTabSystemCustomVSyncIntervalValueTooltip",
|
"ID": "SettingsTabSystemCustomVSyncIntervalValueTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Der Zielwert für die benutzerdefinierte Bildwiederholfrequenz.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "The custom refresh rate target value.",
|
"en_US": "The custom refresh rate target value.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23451,7 +23476,7 @@
|
|||||||
"ID": "SettingsTabSystemCustomVSyncIntervalSliderTooltip",
|
"ID": "SettingsTabSystemCustomVSyncIntervalSliderTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Die benutzerdefinierte Bildwiederholfrequenz als Prozentsatz der normalen Switch-Bildwiederholfrequenz.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.",
|
"en_US": "The custom refresh rate, as a percentage of the normal Switch refresh rate.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23476,7 +23501,7 @@
|
|||||||
"ID": "SettingsTabSystemCustomVSyncIntervalPercentage",
|
"ID": "SettingsTabSystemCustomVSyncIntervalPercentage",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Benutzerdefinierte Bildwiederholfrequenz %:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Custom Refresh Rate %:",
|
"en_US": "Custom Refresh Rate %:",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23501,7 +23526,7 @@
|
|||||||
"ID": "SettingsTabSystemCustomVSyncIntervalValue",
|
"ID": "SettingsTabSystemCustomVSyncIntervalValue",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Wert für benutzerdefinierte Bildwiederholfrequenz:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Custom Refresh Rate Value:",
|
"en_US": "Custom Refresh Rate Value:",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23551,7 +23576,7 @@
|
|||||||
"ID": "SettingsTabHotkeysToggleVSyncModeHotkey",
|
"ID": "SettingsTabHotkeysToggleVSyncModeHotkey",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "VSync-Modus umschalten:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Toggle VSync mode:",
|
"en_US": "Toggle VSync mode:",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23576,7 +23601,7 @@
|
|||||||
"ID": "SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey",
|
"ID": "SettingsTabHotkeysIncrementCustomVSyncIntervalHotkey",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Benutzerdefinierte Bildwiederholfrequenz erhöhen:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Raise custom refresh rate",
|
"en_US": "Raise custom refresh rate",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23601,7 +23626,7 @@
|
|||||||
"ID": "SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey",
|
"ID": "SettingsTabHotkeysDecrementCustomVSyncIntervalHotkey",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Benutzerdefinierte Bildwiederholfrequenz senken:",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Lower custom refresh rate:",
|
"en_US": "Lower custom refresh rate:",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23626,7 +23651,7 @@
|
|||||||
"ID": "CompatibilityListLastUpdated",
|
"ID": "CompatibilityListLastUpdated",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Zuletzt aktualisiert: {0}",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Last updated: {0}",
|
"en_US": "Last updated: {0}",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23651,7 +23676,7 @@
|
|||||||
"ID": "CompatibilityListWarning",
|
"ID": "CompatibilityListWarning",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Diese Kompatibilitätsliste könnte veraltete Einträge enthalten. Teste dennoch Spiele im \"Ingame\"-Status.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "This compatibility list might contain out of date entries.\nDo not be opposed to testing games in the \"Ingame\" status.",
|
"en_US": "This compatibility list might contain out of date entries.\nDo not be opposed to testing games in the \"Ingame\" status.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23676,7 +23701,7 @@
|
|||||||
"ID": "CompatibilityListSearchBoxWatermark",
|
"ID": "CompatibilityListSearchBoxWatermark",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Kompatibilitätseinträge durchsuchen...",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Search compatibility entries...",
|
"en_US": "Search compatibility entries...",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23726,7 +23751,7 @@
|
|||||||
"ID": "CompatibilityListOnlyShowOwnedGames",
|
"ID": "CompatibilityListOnlyShowOwnedGames",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Nur eigene Spiele anzeigen",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Only show owned games",
|
"en_US": "Only show owned games",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23751,7 +23776,7 @@
|
|||||||
"ID": "CompatibilityListPlayable",
|
"ID": "CompatibilityListPlayable",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Spielbar",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Playable",
|
"en_US": "Playable",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23776,7 +23801,7 @@
|
|||||||
"ID": "CompatibilityListIngame",
|
"ID": "CompatibilityListIngame",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Im Spiel",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Ingame",
|
"en_US": "Ingame",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23951,7 +23976,7 @@
|
|||||||
"ID": "CompatibilityListBootsTooltip",
|
"ID": "CompatibilityListBootsTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Startet, kommt aber nicht über den Titelbildschirm hinaus.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Boots but does not make it past the title screen.",
|
"en_US": "Boots but does not make it past the title screen.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -23976,7 +24001,7 @@
|
|||||||
"ID": "CompatibilityListNothingTooltip",
|
"ID": "CompatibilityListNothingTooltip",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Startet nicht oder zeigt keine Anzeichen von Aktivität.",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Does not boot or shows no signs of activity.",
|
"en_US": "Does not boot or shows no signs of activity.",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -24001,7 +24026,7 @@
|
|||||||
"ID": "ExtractAocListHeader",
|
"ID": "ExtractAocListHeader",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
"ar_SA": "",
|
"ar_SA": "",
|
||||||
"de_DE": "",
|
"de_DE": "Wähle ein DLC zum Extrahieren aus",
|
||||||
"el_GR": "",
|
"el_GR": "",
|
||||||
"en_US": "Select a DLC to Extract",
|
"en_US": "Select a DLC to Extract",
|
||||||
"es_ES": "",
|
"es_ES": "",
|
||||||
@@ -24014,7 +24039,7 @@
|
|||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "Selecione um DLC para extrair",
|
"pt_BR": "Selecione um DLC para extrair",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
"sv_SE": "",
|
"sv_SE": "Välj en DLC att extrahera",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "",
|
"uk_UA": "",
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ using Ryujinx.HLE.HOS.Services.Account.Acc;
|
|||||||
using Ryujinx.Input;
|
using Ryujinx.Input;
|
||||||
using Ryujinx.Input.HLE;
|
using Ryujinx.Input.HLE;
|
||||||
using Ryujinx.Input.SDL2;
|
using Ryujinx.Input.SDL2;
|
||||||
|
using Ryujinx.Input.SDL3;
|
||||||
using Ryujinx.SDL2.Common;
|
using Ryujinx.SDL2.Common;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -182,7 +183,7 @@ namespace Ryujinx.Headless
|
|||||||
_accountManager = new AccountManager(_libHacHorizonManager.RyujinxClient, option.UserProfile);
|
_accountManager = new AccountManager(_libHacHorizonManager.RyujinxClient, option.UserProfile);
|
||||||
_userChannelPersistence = new UserChannelPersistence();
|
_userChannelPersistence = new UserChannelPersistence();
|
||||||
|
|
||||||
_inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver());
|
_inputManager = new InputManager(new SDL2KeyboardDriver(), new SDL2GamepadDriver(), new SDL3MotionDriver());
|
||||||
|
|
||||||
GraphicsConfig.EnableShaderCache = !option.DisableShaderCache;
|
GraphicsConfig.EnableShaderCache = !option.DisableShaderCache;
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@
|
|||||||
<ProjectReference Include="..\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj" />
|
<ProjectReference Include="..\Ryujinx.Graphics.Metal\Ryujinx.Graphics.Metal.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Input\Ryujinx.Input.csproj" />
|
<ProjectReference Include="..\Ryujinx.Input\Ryujinx.Input.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Input.SDL2\Ryujinx.Input.SDL2.csproj" />
|
<ProjectReference Include="..\Ryujinx.Input.SDL2\Ryujinx.Input.SDL2.csproj" />
|
||||||
|
<ProjectReference Include="..\Ryujinx.Input.SDL3\Ryujinx.Input.SDL3.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Audio.Backends.OpenAL\Ryujinx.Audio.Backends.OpenAL.csproj" />
|
<ProjectReference Include="..\Ryujinx.Audio.Backends.OpenAL\Ryujinx.Audio.Backends.OpenAL.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Audio.Backends.SoundIo\Ryujinx.Audio.Backends.SoundIo.csproj" />
|
<ProjectReference Include="..\Ryujinx.Audio.Backends.SoundIo\Ryujinx.Audio.Backends.SoundIo.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
|
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
|||||||
public partial class GamepadInputConfig : BaseModel
|
public partial class GamepadInputConfig : BaseModel
|
||||||
{
|
{
|
||||||
public bool EnableCemuHookMotion { get; set; }
|
public bool EnableCemuHookMotion { get; set; }
|
||||||
|
public bool EnableHandheldMotion { get; set; }
|
||||||
public string DsuServerHost { get; set; }
|
public string DsuServerHost { get; set; }
|
||||||
public int DsuServerPort { get; set; }
|
public int DsuServerPort { get; set; }
|
||||||
public int Slot { get; set; }
|
public int Slot { get; set; }
|
||||||
@@ -162,7 +163,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
|||||||
EnableMotion = controllerInput.Motion.EnableMotion;
|
EnableMotion = controllerInput.Motion.EnableMotion;
|
||||||
GyroDeadzone = controllerInput.Motion.GyroDeadzone;
|
GyroDeadzone = controllerInput.Motion.GyroDeadzone;
|
||||||
Sensitivity = controllerInput.Motion.Sensitivity;
|
Sensitivity = controllerInput.Motion.Sensitivity;
|
||||||
|
EnableHandheldMotion = controllerInput.Motion.MotionBackend == MotionInputBackendType.Handheld;
|
||||||
if (controllerInput.Motion is CemuHookMotionConfigController cemuHook)
|
if (controllerInput.Motion is CemuHookMotionConfigController cemuHook)
|
||||||
{
|
{
|
||||||
EnableCemuHookMotion = true;
|
EnableCemuHookMotion = true;
|
||||||
@@ -285,7 +286,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
|||||||
config.Motion = new StandardMotionConfigController
|
config.Motion = new StandardMotionConfigController
|
||||||
{
|
{
|
||||||
EnableMotion = EnableMotion,
|
EnableMotion = EnableMotion,
|
||||||
MotionBackend = MotionInputBackendType.GamepadDriver,
|
MotionBackend = EnableHandheldMotion ? MotionInputBackendType.Handheld : MotionInputBackendType.GamepadDriver,
|
||||||
GyroDeadzone = GyroDeadzone,
|
GyroDeadzone = GyroDeadzone,
|
||||||
Sensitivity = Sensitivity,
|
Sensitivity = Sensitivity,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -18,6 +18,34 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
|
|
||||||
[ObservableProperty] private double _gyroDeadzone;
|
[ObservableProperty] private double _gyroDeadzone;
|
||||||
|
|
||||||
[ObservableProperty] private bool _enableCemuHookMotion;
|
private bool _enableCemuHookMotion;
|
||||||
|
public bool EnableCemuHookMotion
|
||||||
|
{
|
||||||
|
get => _enableCemuHookMotion;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
EnableHandheldMotion = false;
|
||||||
|
}
|
||||||
|
_enableCemuHookMotion = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _enableHandheldMotion;
|
||||||
|
public bool EnableHandheldMotion
|
||||||
|
{
|
||||||
|
get => _enableHandheldMotion;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value)
|
||||||
|
{
|
||||||
|
EnableCemuHookMotion = false;
|
||||||
|
}
|
||||||
|
_enableHandheldMotion = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,17 @@
|
|||||||
Margin="5, 0"
|
Margin="5, 0"
|
||||||
Text="{Binding GyroDeadzone, StringFormat=\{0:0.00\}}" />
|
Text="{Binding GyroDeadzone, StringFormat=\{0:0.00\}}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
<Separator
|
||||||
|
Height="1"
|
||||||
|
Margin="0,5" />
|
||||||
|
<CheckBox
|
||||||
|
Margin="5"
|
||||||
|
IsChecked="{Binding EnableHandheldMotion}">
|
||||||
|
<TextBlock
|
||||||
|
Margin="0,3,0,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale ControllerSettingsMotionUseHandheldCompatibleMotion}" />
|
||||||
|
</CheckBox>
|
||||||
<Separator
|
<Separator
|
||||||
Height="1"
|
Height="1"
|
||||||
Margin="0,5" />
|
Margin="0,5" />
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
Sensitivity = config.Sensitivity,
|
Sensitivity = config.Sensitivity,
|
||||||
GyroDeadzone = config.GyroDeadzone,
|
GyroDeadzone = config.GyroDeadzone,
|
||||||
EnableCemuHookMotion = config.EnableCemuHookMotion,
|
EnableCemuHookMotion = config.EnableCemuHookMotion,
|
||||||
|
EnableHandheldMotion = config.EnableHandheldMotion,
|
||||||
};
|
};
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -58,6 +59,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
config.DsuServerHost = content._viewModel.DsuServerHost;
|
config.DsuServerHost = content._viewModel.DsuServerHost;
|
||||||
config.DsuServerPort = content._viewModel.DsuServerPort;
|
config.DsuServerPort = content._viewModel.DsuServerPort;
|
||||||
config.EnableCemuHookMotion = content._viewModel.EnableCemuHookMotion;
|
config.EnableCemuHookMotion = content._viewModel.EnableCemuHookMotion;
|
||||||
|
config.EnableHandheldMotion = content._viewModel.EnableHandheldMotion;
|
||||||
config.MirrorInput = content._viewModel.MirrorInput;
|
config.MirrorInput = content._viewModel.MirrorInput;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ using Ryujinx.HLE.HOS;
|
|||||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||||
using Ryujinx.Input.HLE;
|
using Ryujinx.Input.HLE;
|
||||||
using Ryujinx.Input.SDL2;
|
using Ryujinx.Input.SDL2;
|
||||||
|
using Ryujinx.Input.SDL3;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -109,7 +110,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
|
|
||||||
if (Program.PreviewerDetached)
|
if (Program.PreviewerDetached)
|
||||||
{
|
{
|
||||||
InputManager = new InputManager(new AvaloniaKeyboardDriver(this), new SDL2GamepadDriver());
|
InputManager = new InputManager(new AvaloniaKeyboardDriver(this), new SDL2GamepadDriver(), new SDL3MotionDriver());
|
||||||
|
|
||||||
_ = this.GetObservable(IsActiveProperty).Subscribe(it => ViewModel.IsActive = it);
|
_ = this.GetObservable(IsActiveProperty).Subscribe(it => ViewModel.IsActive = it);
|
||||||
this.ScalingChanged += OnScalingChanged;
|
this.ScalingChanged += OnScalingChanged;
|
||||||
|
|||||||
Reference in New Issue
Block a user