Compare commits

...

8 Commits

Author SHA1 Message Date
TheLastRar
99ecb0b60f SDLInput: Set BPM legacy Nintendo layout when migrating non-Xbox layout binds 2025-04-12 12:25:19 -04:00
TheLastRar
cfc7e45020 FSUI: Add option to use legacy SDL2 Nintendo layout 2025-04-12 12:25:19 -04:00
TheLastRar
0307d064ad MSBuild: Update QtUi includes 2025-04-12 12:24:18 -04:00
TheLastRar
89cd824c70 MSBuild: Improve QtMoc tasks 2025-04-12 12:24:18 -04:00
TheLastRar
1066e8a5e9 MSBuild: Adjust how MSBuild handles Qt ui files 2025-04-12 12:24:18 -04:00
JordanTheToaster
d2c31df106 GS/HW: Mask 16bit colours when blending is disabled 2025-04-12 01:50:37 +02:00
PCSX2 Bot
a56ffee8f7 [ci skip] Qt: Update Base Translation. 2025-04-11 02:10:28 +02:00
JordanTheToaster
7c798126e3 GameDB: Fix broken FMVs in Clock Tower 3 2025-04-10 18:47:28 -04:00
16 changed files with 1608 additions and 1436 deletions

View File

@@ -17537,6 +17537,8 @@ SLES-51619:
name: "Clock Tower 3"
region: "PAL-M5"
compat: 5
gameFixes:
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
SLES-51620:
name: "Black and Bruised"
region: "PAL-M5"
@@ -30036,6 +30038,8 @@ SLKA-25051:
name: "Clock Tower 3"
region: "NTSC-K"
compat: 5
gameFixes:
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
SLKA-25052:
name: "Air Ranger 2 - Rescue Helicopter"
region: "NTSC-K"
@@ -40428,6 +40432,8 @@ SLPM-65221:
name-en: "Clock Tower 3"
region: "NTSC-J"
compat: 5
gameFixes:
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
SLPM-65222:
name: "遊戯王真デュエルモンスターズⅡ 継承されし記憶 [コナミ殿堂セレクション]"
name-sort: "ゆうぎおうしんでゅえるもんすたーず2 けいしょうされしきおく [こなみでんどうせれくしょん]"
@@ -52313,6 +52319,8 @@ SLPM-74416:
name-sort: "くろっくたわー3 [PlayStation2 the Best]"
name-en: "Clock Tower 3 [PlayStation2 the Best]"
region: "NTSC-J"
gameFixes:
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
SLPM-74420:
name: "頭文字D Special Stage [PlayStation2 the Best]"
name-sort: "いにしゃるD すぺしゃる すてーじ [PlayStation2 the Best]"
@@ -64595,6 +64603,8 @@ SLUS-20633:
name: "Clock Tower 3"
region: "NTSC-U"
compat: 5
gameFixes:
- SoftwareRendererFMVHack # Fixes brightness and striped lines in FMVs.
SLUS-20634:
name: "Summer Heat Beach Volleyball"
region: "NTSC-U"

View File

@@ -852,6 +852,8 @@ void ps_color_clamp_wrap(inout float3 C)
else if (PS_COLCLIP == 1 || PS_HDR == 1)
C = (float3)((int3)C & (int3)0xFF);
}
else if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0)
C = (float3)((int3)C & (int3)0xF8);
}
void ps_blend(inout float4 Color, inout float4 As_rgba, float2 pos_xy)

View File

@@ -775,6 +775,8 @@ void ps_color_clamp_wrap(inout vec3 C)
C = vec3(ivec3(C) & ivec3(0xFF));
#endif
#elif PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0
C = vec3(ivec3(C) & ivec3(0xF8));
#endif
}

View File

@@ -1045,6 +1045,8 @@ void ps_color_clamp_wrap(inout vec3 C)
C = vec3(ivec3(C) & ivec3(0xFF));
#endif
#elif PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0
C = vec3(ivec3(C) & ivec3(0xF8));
#endif
}

View File

@@ -59,23 +59,37 @@
<Delete Files="@(ResFiles->'$(QtToolOutDir)qrc_%(Filename).cpp')" />
</Target>
<!--Passes all .ui files to uic and puts output in the build directory-->
<ItemGroup>
<UiFiles Include="$(MSBuildProjectDirectory)\**\*.ui" />
</ItemGroup>
<!--Passes .ui files to uic and puts output in the build directory-->
<!--We need to create tlogs so that VS knows the ui files are used-->
<!--See https://learn.microsoft.com/en-us/visualstudio/extensibility/visual-cpp-project-extensibility?view=vs-2022#tlog-files-->
<Target Name="QtUi"
BeforeTargets="ClCompile"
Inputs="@(UiFiles)"
Condition="'@(QtUi)'!=''"
Outputs="@(UiFiles->'$(QtToolOutDir)ui_%(Filename).h')">
<Message Text="uic %(UiFiles.Filename)" Importance="High" />
Condition="'@(QtUi)'!=''">
<Error Condition="!$(QtDirValid)" Text="Qt directory non-existent (download/extract the zip)" />
<MakeDir Directories="$(QtToolOutDir)" />
<Exec Command="&quot;$(QtHostBinDir)uic.exe&quot; &quot;%(UiFiles.FullPath)&quot; -o &quot;$(QtToolOutDir)ui_%(UiFiles.Filename).h&quot;" />
</Target>
<!--Setup metadata for following tasks-->
<ItemGroup>
<QtUi>
<Message>uic %(Filename)</Message>
<Command>
"$(QtHostBinDir)uic.exe" "%(FullPath)" -o "$(QtToolOutDir)ui_%(Filename).h"
</Command>
<Outputs>$(QtToolOutDir)ui_%(Filename).h</Outputs>
</QtUi>
</ItemGroup>
<Target Name="QtUiClean">
<Delete Files="@(UiFiles->'$(QtToolOutDir)ui_%(Filename).h')" />
<!--Helper for dealing with tlogs-->
<!--https://learn.microsoft.com/en-us/visualstudio/msbuild/getoutofdateitems-task?view=vs-2022-->
<GetOutOfDateItems Sources="@(QtUi)"
OutputsMetadataName="Outputs"
CommandMetadataName="Command"
TLogDirectory="$(TLogLocation)"
TLogNamePrefix="QtUi">
<Output TaskParameter="OutOfDateSources" ItemName="OutOfDateQtUi"/>
</GetOutOfDateItems>
<CustomBuild Condition="'@(OutOfDateQtUi)'!=''"
Sources="@(OutOfDateQtUi)" />
</Target>
<!--Compile files needed to MOC and output in the build directory-->
@@ -88,7 +102,7 @@
<Target Name="QtMoc"
BeforeTargets="ClCompile"
Condition="'@(QtMoc)'!=''"
Inputs="%(QtMoc.Identity);%(QtMoc.AdditionalDependencies);$(MSBuildProjectFile)"
Inputs="%(QtMoc.Identity);$(QtHostBinDir)moc.exe"
Outputs="$(QtToolOutDir)%(QtMoc.RelativeDir)moc_%(QtMoc.Filename).cpp">
<Message Text="moc %(QtMoc.Filename) $(QtToolOutDir)%(QtMoc.RelativeDir)moc_%(QtMoc.Filename).cpp" Importance="High" />
<Error Condition="!$(QtDirValid)" Text="Qt directory non-existent (download/extract the zip)" />
@@ -97,7 +111,7 @@
</Target>
<ItemGroup>
<MocOutputs Include="$(QtToolOutDir)moc_*.cpp" />
<MocOutputs Include="$(QtToolOutDir)**/moc_*.cpp" />
</ItemGroup>
<Target Name="QtMocClean">
<Delete Files="@(MocOutputs)" />

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CleanDependsOn>QtResourceClean;QtUiClean;QtMocClean;QtTsClean;$(CleanDependsOn)</CleanDependsOn>
<CleanDependsOn>QtResourceClean;QtMocClean;QtTsClean;$(CleanDependsOn)</CleanDependsOn>
<!--
<ComputeLinkInputsTargets>$(ComputeLinkInputsTargets);QtComputeMocOutput;</ComputeLinkInputsTargets>
<ComputeLibInputsTargets>$(ComputeLibInputsTargets);QtComputeMocOutput;</ComputeLibInputsTargets>

View File

@@ -4,10 +4,10 @@
<ItemType Name="QtUi" DisplayName="Qt User Interface File" />
<ItemType Name="QtMoc" DisplayName="Qt Meta Object File" />
<ItemType Name="QtTs" DisplayName="Qt Translation File" />
<ContentType Name="QtUi" DisplayName="Qt User Interface Compiler" />
<ContentType Name="QtResource" DisplayName="Qt Resource Compiler" />
<ContentType Name="QtMoc" DisplayName="Qt Meta Object Compiler" />
<ContentType Name="QtTs" DisplayName="Qt Translation Compiler" />
<ContentType Name="QtResource" DisplayName="Qt Resource Compiler" ItemType="QtResource" />
<ContentType Name="QtUi" DisplayName="Qt User Interface Compiler" ItemType = "QtUi"/>
<ContentType Name="QtMoc" DisplayName="Qt Meta Object Compiler" ItemType="QtMoc" />
<ContentType Name="QtTs" DisplayName="Qt Translation Compiler" ItemType="QtTs" />
<FileExtension Name="*.qrc" ContentType="QtResource" />
<FileExtension Name="*.ui" ContentType="QtUi" />
<FileExtension Name="*.ts" ContentType="QtTs" />

File diff suppressed because it is too large Load Diff

View File

@@ -351,208 +351,85 @@
</ClCompile>
</ItemGroup>
<ItemGroup>
<QtUi Include="MainWindow.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="GameList\EmptyGameListWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="GameList\GameListWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\SettingsWindow.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GameListSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\BIOSSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\EmulationSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\AdvancedSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GameFixSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\InputBindingDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerSettingsWindow.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\AudioSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\DEV9DnsHostDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\DEV9SettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GameSummaryWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="AutoUpdaterDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="CoverDownloadDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\AchievementLoginDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\AchievementSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\AnalysisOptionsDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\DebuggerWindow.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\DisassemblyWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\RegisterWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui">
<FileType>Document</FileType>
</QtUi>
</ItemGroup>
<ItemGroup>
<QtUi Include="SetupWizardDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="AboutDialog.ui" />
<QtUi Include="AutoUpdaterDialog.ui" />
<QtUi Include="CoverDownloadDialog.ui" />
<QtUi Include="Debugger\AnalysisOptionsDialog.ui" />
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui" />
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui" />
<QtUi Include="Debugger\DebuggerWindow.ui" />
<QtUi Include="Debugger\DisassemblyWidget.ui" />
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui" />
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui" />
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui" />
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui" />
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui" />
<QtUi Include="Debugger\RegisterWidget.ui" />
<QtUi Include="Debugger\StackWidget.ui" />
<QtUi Include="Debugger\SymbolTree\NewSymbolDialog.ui" />
<QtUi Include="Debugger\SymbolTree\SymbolTreeWidget.ui" />
<QtUi Include="Debugger\ThreadWidget.ui" />
<QtUi Include="GameList\EmptyGameListWidget.ui" />
<QtUi Include="GameList\GameListWidget.ui" />
<QtUi Include="MainWindow.ui" />
<QtUi Include="Settings\AchievementLoginDialog.ui" />
<QtUi Include="Settings\AchievementSettingsWidget.ui" />
<QtUi Include="Settings\AdvancedSettingsWidget.ui" />
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui" />
<QtUi Include="Settings\AudioSettingsWidget.ui" />
<QtUi Include="Settings\AudioStretchSettingsDialog.ui" />
<QtUi Include="Settings\BIOSSettingsWidget.ui" />
<QtUi Include="Settings\ControllerBindingWidget.ui" />
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui" />
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui" />
<QtUi Include="Settings\ControllerBindingWidget_Jogcon.ui" />
<QtUi Include="Settings\ControllerBindingWidget_Negcon.ui" />
<QtUi Include="Settings\ControllerBindingWidget_Popn.ui" />
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui" />
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui" />
<QtUi Include="Settings\ControllerMacroEditWidget.ui" />
<QtUi Include="Settings\ControllerMacroWidget.ui" />
<QtUi Include="Settings\ControllerMappingSettingsDialog.ui" />
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui" />
<QtUi Include="Settings\ControllerSettingsWindow.ui" />
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui" />
<QtUi Include="Settings\DebugSettingsWidget.ui" />
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui" />
<QtUi Include="Settings\DEV9DnsHostDialog.ui" />
<QtUi Include="Settings\DEV9SettingsWidget.ui" />
<QtUi Include="Settings\EmulationSettingsWidget.ui" />
<QtUi Include="Settings\FolderSettingsWidget.ui" />
<QtUi Include="Settings\GameCheatSettingsWidget.ui" />
<QtUi Include="Settings\GameFixSettingsWidget.ui" />
<QtUi Include="Settings\GameListSettingsWidget.ui" />
<QtUi Include="Settings\GamePatchDetailsWidget.ui" />
<QtUi Include="Settings\GamePatchSettingsWidget.ui" />
<QtUi Include="Settings\GameSummaryWidget.ui" />
<QtUi Include="Settings\GraphicsSettingsWidget.ui" />
<QtUi Include="Settings\InputBindingDialog.ui" />
<QtUi Include="Settings\InterfaceSettingsWidget.ui" />
<QtUi Include="Settings\MemoryCardConvertDialog.ui" />
<QtUi Include="Settings\MemoryCardCreateDialog.ui" />
<QtUi Include="Settings\MemoryCardSettingsWidget.ui" />
<QtUi Include="Settings\PatchDetailsWidget.ui" />
<QtUi Include="Settings\SettingsWindow.ui" />
<QtUi Include="Settings\USBBindingWidget_Buzz.ui" />
<QtUi Include="Settings\USBBindingWidget_DenshaCon.ui" />
<QtUi Include="Settings\USBBindingWidget_DrivingForce.ui" />
<QtUi Include="Settings\USBBindingWidget_Gametrak.ui" />
<QtUi Include="Settings\USBBindingWidget_GTForce.ui" />
<QtUi Include="Settings\USBBindingWidget_GunCon2.ui" />
<QtUi Include="Settings\USBBindingWidget_RealPlay.ui" />
<QtUi Include="Settings\USBBindingWidget_RyojouhenCon.ui" />
<QtUi Include="Settings\USBBindingWidget_ShinkansenCon.ui" />
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui" />
<QtUi Include="Settings\USBDeviceWidget.ui" />
<QtTs Include="Translations\pcsx2-qt_en.ts">
<FileType>Document</FileType>
</QtTs>
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\DebugSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GameCheatSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\GamePatchSettingsWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_Buzz.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_DenshaCon.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_DrivingForce.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_Gametrak.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_GTForce.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_GunCon2.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_RealPlay.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_RyojouhenCon.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_ShinkansenCon.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\USBDeviceWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\ControllerMacroWidget.ui">
<FileType>Document</FileType>
</QtUi>
<None Include="Debugger\SymbolTree\NewSymbolDialog.ui" />
<None Include="Debugger\SymbolTree\SymbolTreeWidget.ui" />
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
<FileType>Document</FileType>
</QtUi>
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
<FileType>Document</FileType>
</QtUi>
<None Include="Settings\ControllerBindingWidget_Popn.ui" />
<None Include="Settings\ControllerMappingSettingsDialog.ui" />
<None Include="Settings\FolderSettingsWidget.ui" />
<QtUi Include="SetupWizardDialog.ui" />
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui" />
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Import Project="$(SolutionDir)common\vsprops\QtCompile.targets" />

View File

@@ -735,107 +735,32 @@
</QtResource>
</ItemGroup>
<ItemGroup>
<QtUi Include="mainwindow.ui" />
<QtUi Include="Settings\BIOSSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
<Filter>Debugger\Breakpoints</Filter>
</QtUi>
<QtUi Include="Settings\EmulationSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui">
<Filter>Debugger\Breakpoints</Filter>
</QtUi>
<QtUi Include="Settings\GameListSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
<Filter>Debugger\Docking</Filter>
</QtUi>
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
<Filter>Debugger\Docking</Filter>
</QtUi>
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Settings\SettingsWindow.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Settings\AdvancedSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Settings\GameFixSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\SymbolTree\NewSymbolDialog.ui">
<Filter>Debugger\SymbolTree</Filter>
</QtUi>
<QtUi Include="Settings\InputBindingDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerSettingsWindow.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GameSummaryWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DEV9DnsHostDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DEV9SettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="GameList\EmptyGameListWidget.ui">
<Filter>GameList</Filter>
</QtUi>
<QtUi Include="GameList\GameListWidget.ui">
<Filter>GameList</Filter>
</QtUi>
<QtUi Include="AutoUpdaterDialog.ui" />
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
<Filter>Tools\Input Recording</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMacroWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AchievementSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AchievementLoginDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="CoverDownloadDialog.ui" />
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
<Filter>Tools\Input Recording</Filter>
</QtUi>
<QtUi Include="Settings\USBDeviceWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugSettingsWidget.ui">
<Filter>Settings</Filter>
<QtUi Include="Debugger\SymbolTree\SymbolTreeWidget.ui">
<Filter>Debugger\SymbolTree</Filter>
</QtUi>
<QtUi Include="Debugger\AnalysisOptionsDialog.ui">
<Filter>Debugger</Filter>
@@ -849,19 +774,141 @@
<QtUi Include="Debugger\RegisterWidget.ui">
<Filter>Debugger</Filter>
</QtUi>
<QtUi Include="Debugger\StackWidget.ui">
<Filter>Debugger</Filter>
</QtUi>
<QtUi Include="Debugger\ThreadWidget.ui">
<Filter>Debugger</Filter>
</QtUi>
<QtUi Include="GameList\EmptyGameListWidget.ui">
<Filter>GameList</Filter>
</QtUi>
<QtUi Include="GameList\GameListWidget.ui">
<Filter>GameList</Filter>
</QtUi>
<QtUi Include="Settings\AchievementLoginDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AchievementSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AdvancedSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\BIOSSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_DualShock2.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Guitar.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Jogcon.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Negcon.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerBindingWidget_Popn.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerGlobalSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerLEDSettingsDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMacroEditWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMacroWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMappingSettingsDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerMouseSettingsDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\ControllerSettingsWindow.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugAnalysisSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DebugUserInterfaceSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DEV9DnsHostDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\DEV9SettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\EmulationSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\FolderSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GameCheatSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GameFixSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GameListSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GamePatchDetailsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GamePatchSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="SetupWizardDialog.ui" />
<QtUi Include="Settings\GameSummaryWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\GraphicsSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\InputBindingDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\InterfaceSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardConvertDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardCreateDialog.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\MemoryCardSettingsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\PatchDetailsWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\SettingsWindow.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\USBBindingWidget_Buzz.ui">
<Filter>Settings</Filter>
</QtUi>
@@ -892,50 +939,20 @@
<QtUi Include="Settings\USBBindingWidget_TranceVibrator.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioExpansionSettingsDialog.ui">
<QtUi Include="Settings\USBDeviceWidget.ui">
<Filter>Settings</Filter>
</QtUi>
<QtUi Include="Settings\AudioStretchSettingsDialog.ui">
<Filter>Settings</Filter>
<QtUi Include="Tools\InputRecording\InputRecordingViewer.ui">
<Filter>Tools\Input Recording</Filter>
</QtUi>
<QtUi Include="Debugger\Breakpoints\BreakpointDialog.ui">
<Filter>Debugger\Breakpoints</Filter>
<QtUi Include="Tools\InputRecording\NewInputRecordingDlg.ui">
<Filter>Tools\Input Recording</Filter>
</QtUi>
<QtUi Include="Debugger\Breakpoints\BreakpointWidget.ui">
<Filter>Debugger\Breakpoints</Filter>
</QtUi>
<QtUi Include="Debugger\Memory\SavedAddressesWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Debugger\Memory\MemoryViewWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Debugger\Memory\MemorySearchWidget.ui">
<Filter>Debugger\Memory</Filter>
</QtUi>
<QtUi Include="Debugger\Docking\LayoutEditorDialog.ui">
<Filter>Debugger\Docking</Filter>
</QtUi>
<QtUi Include="Debugger\Docking\NoLayoutsWidget.ui">
<Filter>Debugger\Docking</Filter>
</QtUi>
</ItemGroup>
<ItemGroup>
<None Include="Settings\FolderSettingsWidget.ui">
<Filter>Settings</Filter>
</None>
<None Include="Settings\ControllerBindingWidget_Popn.ui">
<Filter>Settings</Filter>
</None>
<None Include="Settings\ControllerMappingSettingsDialog.ui">
<Filter>Settings</Filter>
</None>
<None Include="Debugger\SymbolTree\NewSymbolDialog.ui">
<Filter>Debugger\SymbolTree</Filter>
</None>
<None Include="Debugger\SymbolTree\SymbolTreeWidget.ui">
<Filter>Debugger\SymbolTree</Filter>
</None>
<QtUi Include="AboutDialog.ui" />
<QtUi Include="AutoUpdaterDialog.ui" />
<QtUi Include="CoverDownloadDialog.ui" />
<QtUi Include="MainWindow.ui" />
<QtUi Include="SetupWizardDialog.ui" />
</ItemGroup>
<ItemGroup>
<QtTs Include="Translations\pcsx2-qt_en.ts">

View File

@@ -890,28 +890,31 @@ struct PSMain
void ps_color_clamp_wrap(thread float4& C)
{
// When dithering the bottom 3 bits become meaningless and cause lines in the picture so we need to limit the color depth on dithered items
if (!SW_BLEND && !(PS_DITHER > 0 && PS_DITHER < 3) && !PS_FBMASK)
return;
// When dithering the bottom 3 bits become meaningless and cause lines in the picture
// so we need to limit the color depth on dithered items
if (SW_BLEND || (PS_DITHER > 0 && PS_DITHER < 3) || PS_FBMASK)
{
if (PS_DST_FMT == FMT_16 && PS_BLEND_MIX == 0 && PS_ROUND_INV)
C.rgb += 7.f; // Need to round up, not down since the shader will invert
if (PS_DST_FMT == FMT_16 && PS_BLEND_MIX == 0 && PS_ROUND_INV)
C.rgb += 7.f; // Need to round up, not down since the shader will invert
// Correct the Color value based on the output format
if (PS_COLCLIP == 0 && PS_HDR == 0)
C.rgb = clamp(C.rgb, 0.f, 255.f); // Standard Clamp
// Correct the Color value based on the output format
if (!PS_COLCLIP && !PS_HDR)
C.rgb = clamp(C.rgb, 0.f, 255.f); // Standard Clamp
// FIXME rouding of negative float?
// compiler uses trunc but it might need floor
// FIXME rouding of negative float?
// compiler uses trunc but it might need floor
// Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy
// GS: Color = 1, Alpha = 255 => output 1
// GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875
if (PS_DST_FMT == FMT_16 && PS_DITHER < 3 && (PS_BLEND_MIX == 0 || PS_DITHER))
// Warning: normally blending equation is mult(A, B) = A * B >> 7. GPU have the full accuracy
// GS: Color = 1, Alpha = 255 => output 1
// GPU: Color = 1/255, Alpha = 255/255 * 255/128 => output 1.9921875
// In 16 bits format, only 5 bits of colors are used. It impacts shadows computation of Castlevania
if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && (PS_BLEND_MIX == 0 || PS_DITHER))
C.rgb = float3(short3(C.rgb) & 0xF8);
else if (PS_COLCLIP == 1 || PS_HDR == 1)
C.rgb = float3(short3(C.rgb) & 0xFF);
}
else if (PS_DST_FMT == FMT_16 && PS_DITHER != 3 && PS_BLEND_MIX == 0 && PS_BLEND_HW == 0)
C.rgb = float3(short3(C.rgb) & 0xF8);
else if (PS_COLCLIP || PS_HDR)
C.rgb = float3(short3(C.rgb) & 0xFF);
}
template <typename T>

View File

@@ -237,7 +237,7 @@ namespace FullscreenUI
static void DrawAboutWindow();
static void OpenAboutWindow();
static void GetStandardSelectionFooterText(SmallStringBase& dest, bool back_instead_of_cancel);
static void ApplyConfirmSetting(const SettingsInterface* bsi = nullptr);
static void ApplyLayoutSettings(const SettingsInterface* bsi = nullptr);
static MainWindowType s_current_main_window = MainWindowType::None;
static PauseSubMenu s_current_pause_submenu = PauseSubMenu::None;
@@ -543,10 +543,11 @@ void ImGuiFullscreen::GetFileSelectorHelpText(SmallStringBase& dest)
if (IsGamepadInputSource())
{
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
ImGuiFullscreen::CreateFooterTextString(
dest, std::array{
std::make_pair(ICON_PF_DPAD_UP_DOWN, FSUI_VSTR("Change Selection")),
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Parent Directory")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Parent Directory")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Cancel")),
});
@@ -585,7 +586,7 @@ void ImGuiFullscreen::GetInputDialogHelpText(SmallStringBase& dest)
}
}
void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
void FullscreenUI::ApplyLayoutSettings(const SettingsInterface* bsi)
{
ImGuiIO& io = ImGui::GetIO();
SmallString swap_mode;
@@ -594,12 +595,43 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
else
swap_mode = Host::GetBaseSmallStringSettingValue("UI", "SwapOKFullscreenUI", "auto");
// Check Nintendo Setting
SmallString sdl2_nintendo_mode;
if (bsi)
sdl2_nintendo_mode = bsi->GetSmallStringValue("UI", "SDL2NintendoLayout", "false");
else
sdl2_nintendo_mode = Host::GetBaseSmallStringSettingValue("UI", "SDL2NintendoLayout", "false");
const InputLayout layout = ImGuiFullscreen::GetGamepadLayout();
if (sdl2_nintendo_mode == "true" || (sdl2_nintendo_mode == "auto") && layout == InputLayout::Nintendo)
{
// Apply
ImGuiManager::SwapGamepadNorthWest(true);
// Check swap_mode if A/B should also be swapped
if (swap_mode == "auto")
{
io.ConfigNavSwapGamepadButtons = true;
return;
}
}
else
ImGuiManager::SwapGamepadNorthWest(false);
if (swap_mode == "true")
io.ConfigNavSwapGamepadButtons = true;
else if (swap_mode == "false")
io.ConfigNavSwapGamepadButtons = false;
else if (swap_mode == "auto")
{
// Check gamepad
if (layout == InputLayout::Nintendo)
{
io.ConfigNavSwapGamepadButtons = true;
return;
}
// Check language
if (Host::LocaleCircleConfirm())
{
@@ -629,14 +661,6 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
}
}
// Check gamepad
const InputLayout layout = ImGuiFullscreen::GetGamepadLayout();
if (layout == InputLayout::Nintendo)
{
io.ConfigNavSwapGamepadButtons = true;
return;
}
// X is confirm
io.ConfigNavSwapGamepadButtons = false;
return;
@@ -648,12 +672,12 @@ void FullscreenUI::ApplyConfirmSetting(const SettingsInterface* bsi)
void FullscreenUI::LocaleChanged()
{
ApplyConfirmSetting();
ApplyLayoutSettings();
}
void FullscreenUI::GamepadLayoutChanged()
{
ApplyConfirmSetting();
ApplyLayoutSettings();
}
//////////////////////////////////////////////////////////////////////////
@@ -670,7 +694,7 @@ bool FullscreenUI::Initialize()
ImGuiFullscreen::SetTheme(Host::GetBaseStringSettingValue("UI", "FullscreenUITheme", "Dark"));
ImGuiFullscreen::UpdateLayoutScale();
ApplyConfirmSetting();
ApplyLayoutSettings();
if (!ImGuiManager::AddFullscreenFontsIfMissing() || !ImGuiFullscreen::Initialize("fullscreenui/placeholder.png") || !LoadResources())
{
@@ -741,7 +765,7 @@ void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config)
if (old_config.FullpathToBios() != EmuConfig.FullpathToBios())
{
MTGS::RunOnGSThread([]() {
ApplyConfirmSetting();
ApplyLayoutSettings();
});
}
}
@@ -1411,11 +1435,12 @@ void FullscreenUI::DrawLandingWindow()
if (IsGamepadInputSource())
{
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
SetFullscreenFooterText(std::array{
std::make_pair(ICON_PF_SELECT_SHARE, FSUI_VSTR("About")),
std::make_pair(ICON_PF_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Game List")),
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Toggle Fullscreen")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Game List")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Toggle Fullscreen")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Exit")),
});
@@ -1484,9 +1509,10 @@ void FullscreenUI::DrawStartGameWindow()
if (IsGamepadInputSource())
{
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
SetFullscreenFooterText(std::array{
std::make_pair(ICON_PF_DPAD_LEFT_RIGHT, FSUI_VSTR("Navigate")),
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Load Global State")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Load Global State")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Select")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Back")),
});
@@ -3424,7 +3450,40 @@ void FullscreenUI::DrawInterfaceSettingsPage()
SettingsInterface* bsi = GetEditingSettingsInterface(false);
bsi->SetStringValue("UI", "SwapOKFullscreenUI", swap_values[index]);
SetSettingsChanged(bsi);
ApplyConfirmSetting(bsi);
ApplyLayoutSettings(bsi);
}
CloseChoiceDialog();
});
}
const SmallString nintendo_mode = bsi->GetSmallStringValue("UI", "SDL2NintendoLayout", "false");
size_t nintendo_index = std::size(swap_values);
for (size_t i = 0; i < std::size(swap_values); i++)
{
if (nintendo_mode == swap_values[i])
{
nintendo_index = i;
break;
}
}
swap_summery.format(FSUI_FSTR("Swaps both {}/{} (When Swap OK/Cancel is set to automatic) and {}/{} buttons"), ICON_PF_BUTTON_CROSS, ICON_PF_BUTTON_CIRCLE, ICON_PF_BUTTON_SQUARE, ICON_PF_BUTTON_TRIANGLE);
if (MenuButtonWithValue(FSUI_ICONSTR(ICON_FA_GAMEPAD, "Use Legacy Nintendo Layout in Big Picture Mode"), swap_summery.c_str(),
(nintendo_index < std::size(swap_values)) ? Host::TranslateToCString(TR_CONTEXT, swap_names[nintendo_index]) : FSUI_CSTR("Unknown")))
{
ImGuiFullscreen::ChoiceDialogOptions cd_options;
cd_options.reserve(std::size(swap_values));
for (size_t i = 0; i < std::size(swap_values); i++)
cd_options.emplace_back(Host::TranslateToString(TR_CONTEXT, swap_names[i]), i == static_cast<size_t>(nintendo_index));
OpenChoiceDialog(FSUI_ICONSTR(ICON_FA_GAMEPAD, "Use Legacy Nintendo Layout in Big Picture Mode"), false, std::move(cd_options), [](s32 index, const std::string& title, bool checked) {
if (index >= 0)
{
auto lock = Host::GetSettingsLock();
SettingsInterface* bsi = GetEditingSettingsInterface(false);
bsi->SetStringValue("UI", "SDL2NintendoLayout", swap_values[index]);
SetSettingsChanged(bsi);
ApplyLayoutSettings(bsi);
}
CloseChoiceDialog();
@@ -3548,7 +3607,7 @@ void FullscreenUI::DrawBIOSSettingsPage()
SettingsInterface* bsi = GetEditingSettingsInterface(game_settings);
bsi->SetStringValue("Filenames", "BIOS", values[index].c_str());
SetSettingsChanged(bsi);
ApplyConfirmSetting(bsi);
ApplyLayoutSettings(bsi);
CloseChoiceDialog();
});
}
@@ -5977,9 +6036,10 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading)
if (IsGamepadInputSource())
{
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
SetFullscreenFooterText(std::array{
std::make_pair(ICON_PF_DPAD, FSUI_VSTR("Select State")),
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Options")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Options")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Load/Save State")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Cancel")),
});
@@ -6276,11 +6336,12 @@ void FullscreenUI::DrawGameListWindow()
if (IsGamepadInputSource())
{
const bool circleOK = ImGui::GetIO().ConfigNavSwapGamepadButtons;
const bool swapNorthWest = ImGuiManager::IsGamepadNorthWestSwapped();
SetFullscreenFooterText(std::array{
std::make_pair(ICON_PF_DPAD, FSUI_VSTR("Select Game")),
std::make_pair(ICON_PF_START, FSUI_VSTR("Settings")),
std::make_pair(ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Change View")),
std::make_pair(ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Launch Options")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_SQUARE : ICON_PF_BUTTON_TRIANGLE, FSUI_VSTR("Change View")),
std::make_pair(swapNorthWest ? ICON_PF_BUTTON_TRIANGLE : ICON_PF_BUTTON_SQUARE, FSUI_VSTR("Launch Options")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CIRCLE : ICON_PF_BUTTON_CROSS, FSUI_VSTR("Start Game")),
std::make_pair(circleOK ? ICON_PF_BUTTON_CROSS : ICON_PF_BUTTON_CIRCLE, FSUI_VSTR("Back")),
});
@@ -7715,6 +7776,7 @@ TRANSLATE_NOOP("FullscreenUI", "Shows icons in the lower-right corner of the scr
TRANSLATE_NOOP("FullscreenUI", "When enabled, each session will behave as if no achievements have been unlocked.");
TRANSLATE_NOOP("FullscreenUI", "When enabled, PCSX2 will assume all achievements are locked and not send any unlock notifications to the server.");
TRANSLATE_NOOP("FullscreenUI", "When enabled, PCSX2 will list achievements from unofficial sets. These achievements are not tracked by RetroAchievements.");
TRANSLATE_NOOP("FullscreenUI", "Sound Effects");
TRANSLATE_NOOP("FullscreenUI", "Account");
TRANSLATE_NOOP("FullscreenUI", "Logs out of RetroAchievements.");
TRANSLATE_NOOP("FullscreenUI", "Logs in to RetroAchievements.");
@@ -8127,11 +8189,16 @@ TRANSLATE_NOOP("FullscreenUI", "Enable Achievements");
TRANSLATE_NOOP("FullscreenUI", "Hardcore Mode");
TRANSLATE_NOOP("FullscreenUI", "Achievement Notifications");
TRANSLATE_NOOP("FullscreenUI", "Leaderboard Notifications");
TRANSLATE_NOOP("FullscreenUI", "Sound Effects");
TRANSLATE_NOOP("FullscreenUI", "Enable In-Game Overlays");
TRANSLATE_NOOP("FullscreenUI", "Encore Mode");
TRANSLATE_NOOP("FullscreenUI", "Spectator Mode");
TRANSLATE_NOOP("FullscreenUI", "Test Unofficial Achievements");
TRANSLATE_NOOP("FullscreenUI", "Notification Sound");
TRANSLATE_NOOP("FullscreenUI", "Select Notification Sound");
TRANSLATE_NOOP("FullscreenUI", "Unlock Sound");
TRANSLATE_NOOP("FullscreenUI", "Select Unlock Sound");
TRANSLATE_NOOP("FullscreenUI", "Leaderboard Submit Sound");
TRANSLATE_NOOP("FullscreenUI", "Select Leaderboard Submit Sound");
TRANSLATE_NOOP("FullscreenUI", "Username: {}");
TRANSLATE_NOOP("FullscreenUI", "Login token generated on {}");
TRANSLATE_NOOP("FullscreenUI", "Logout");

View File

@@ -89,6 +89,8 @@ static std::atomic_bool s_imgui_wants_keyboard{false};
static std::atomic_bool s_imgui_wants_mouse{false};
static std::atomic_bool s_imgui_wants_text{false};
static bool s_gamepad_swap_noth_west = false;
// mapping of host key -> imgui key
static std::unordered_map<u32, ImGuiKey> s_imgui_key_map;
@@ -959,7 +961,15 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, InputLayout
return false;
MTGS::RunOnGSThread(
[key = key_map[static_cast<u32>(key)], value, layout]() {
[key = key_map[static_cast<u32>(key)], value, layout]() mutable {
if (s_gamepad_swap_noth_west)
{
if (key == ImGuiKey_GamepadFaceUp)
key = ImGuiKey_GamepadFaceLeft;
else if (key == ImGuiKey_GamepadFaceLeft)
key = ImGuiKey_GamepadFaceUp;
}
ImGuiFullscreen::ReportGamepadLayout(layout);
ImGui::GetIO().AddKeyAnalogEvent(key, (value > 0.0f), value);
});
@@ -967,6 +977,16 @@ bool ImGuiManager::ProcessGenericInputEvent(GenericInputBinding key, InputLayout
return s_imgui_wants_keyboard.load(std::memory_order_acquire);
}
void ImGuiManager::SwapGamepadNorthWest(bool value)
{
s_gamepad_swap_noth_west = value;
}
bool ImGuiManager::IsGamepadNorthWestSwapped()
{
return s_gamepad_swap_noth_west;
}
void ImGuiManager::CreateSoftwareCursorTextures()
{
for (u32 i = 0; i < InputManager::MAX_POINTER_DEVICES; i++)

View File

@@ -97,6 +97,12 @@ namespace ImGuiManager
/// Called on the CPU thread when any input event fires. Allows imgui to take over controller navigation.
bool ProcessGenericInputEvent(GenericInputBinding key, InputLayout layout, float value);
/// Called to swap North/West gamepad buttons within ImGui
void SwapGamepadNorthWest(bool value);
/// Checks if the North/West gamepad buttons are swapped within ImGui
bool IsGamepadNorthWestSwapped();
/// Sets an image and scale for a software cursor. Software cursors can be used for things like crosshairs.
void SetSoftwareCursor(u32 index, std::string image_path, float image_scale, u32 multiply_color = 0xFFFFFF);
bool HasSoftwareCursor(u32 index);

View File

@@ -6,6 +6,8 @@
#include "Input/InputManager.h"
#include "Host.h"
#include "ImGui/FullscreenUI.h"
#include "common/Assertions.h"
#include "common/Console.h"
#include "common/Error.h"
@@ -700,6 +702,20 @@ std::optional<InputBindingKey> SDLInputSource::ParseKeyString(const std::string_
TRANSLATE("SDLInputSource", "As part of our upgrade to SDL3, we've had to migrate your binds\n"
"Your controller did not match the Xbox layout and may need rebinding\n"
"Please verify your controller settings and amend if required"));
// Also apply BPM setting for legacy binds
// We assume this is a Nintendo controller, BPM will check if it is
// Defer this, as we are probably under a setting lock
Host::RunOnCPUThread([] {
if (!Host::ContainsBaseSettingValue("UI", "SDL2NintendoLayout"))
{
Host::SetBaseStringSettingValue("UI", "SDL2NintendoLayout", "auto");
Host::CommitBaseSettingChanges();
// Get FSUI to recheck setting
if (FullscreenUI::IsInitialized())
FullscreenUI::GamepadLayoutChanged();
}
});
}
key.data = pos;
}

View File

@@ -3,4 +3,4 @@
/// Version number for GS and other shaders. Increment whenever any of the contents of the
/// shaders change, to invalidate the cache.
static constexpr u32 SHADER_CACHE_VERSION = 60;
static constexpr u32 SHADER_CACHE_VERSION = 61;