1
1
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2
2
// See the LICENCE file in the repository root for full licence text.
3
3
4
- #nullable disable
5
-
4
+ using System . Linq ;
5
+ using osu . Framework ;
6
6
using osu . Framework . Allocation ;
7
7
using osu . Framework . Configuration ;
8
+ using osu . Framework . Extensions ;
8
9
using osu . Framework . Graphics ;
9
10
using osu . Framework . Localisation ;
10
11
using osu . Framework . Platform ;
11
12
using osu . Game . Configuration ;
13
+ using osu . Game . Graphics . UserInterface ;
12
14
using osu . Game . Localisation ;
15
+ using osu . Game . Overlays . Dialog ;
13
16
14
17
namespace osu . Game . Overlays . Settings . Sections . Graphics
15
18
{
16
19
public partial class RendererSettings : SettingsSubsection
17
20
{
18
21
protected override LocalisableString Header => GraphicsSettingsStrings . RendererHeader ;
19
22
23
+ private bool automaticRendererInUse ;
24
+
20
25
[ BackgroundDependencyLoader ]
21
- private void load ( FrameworkConfigManager config , OsuConfigManager osuConfig )
26
+ private void load ( FrameworkConfigManager config , OsuConfigManager osuConfig , IDialogOverlay ? dialogOverlay , OsuGame ? game , GameHost host )
22
27
{
23
- // NOTE: Compatability mode omitted
28
+ var renderer = config . GetBindable < RendererType > ( FrameworkSetting . Renderer ) ;
29
+ automaticRendererInUse = renderer . Value == RendererType . Automatic ;
30
+
31
+ SettingsEnumDropdown < RendererType > rendererDropdown ;
32
+
24
33
Children = new Drawable [ ]
25
34
{
35
+ rendererDropdown = new RendererSettingsDropdown
36
+ {
37
+ LabelText = GraphicsSettingsStrings . Renderer ,
38
+ Current = renderer ,
39
+ Items = host . GetPreferredRenderersForCurrentPlatform ( ) . OrderBy ( t => t ) ,
40
+ Keywords = new [ ] { @"compatibility" , @"directx" } ,
41
+ } ,
26
42
// TODO: this needs to be a custom dropdown at some point
27
43
new SettingsEnumDropdown < FrameSync >
28
44
{
@@ -41,6 +57,55 @@ private void load(FrameworkConfigManager config, OsuConfigManager osuConfig)
41
57
Current = osuConfig . GetBindable < bool > ( OsuSetting . ShowFpsDisplay )
42
58
} ,
43
59
} ;
60
+
61
+ renderer . BindValueChanged ( r =>
62
+ {
63
+ if ( r . NewValue == host . ResolvedRenderer )
64
+ return ;
65
+
66
+ // Need to check startup renderer for the "automatic" case, as ResolvedRenderer above will track the final resolved renderer instead.
67
+ if ( r . NewValue == RendererType . Automatic && automaticRendererInUse )
68
+ return ;
69
+
70
+ dialogOverlay ? . Push ( new ConfirmDialog ( GraphicsSettingsStrings . ChangeRendererConfirmation , ( ) => game ? . AttemptExit ( ) , ( ) =>
71
+ {
72
+ renderer . Value = automaticRendererInUse ? RendererType . Automatic : host . ResolvedRenderer ;
73
+ } ) ) ;
74
+ } ) ;
75
+
76
+ // TODO: remove this once we support SDL+android.
77
+ if ( RuntimeInfo . OS == RuntimeInfo . Platform . Android )
78
+ {
79
+ rendererDropdown . Items = new [ ] { RendererType . Automatic , RendererType . OpenGLLegacy } ;
80
+ rendererDropdown . SetNoticeText ( "New renderer support for android is coming soon!" , true ) ;
81
+ }
82
+ }
83
+
84
+ private partial class RendererSettingsDropdown : SettingsEnumDropdown < RendererType >
85
+ {
86
+ protected override OsuDropdown < RendererType > CreateDropdown ( ) => new RendererDropdown ( ) ;
87
+
88
+ protected partial class RendererDropdown : DropdownControl
89
+ {
90
+ private RendererType hostResolvedRenderer ;
91
+ private bool automaticRendererInUse ;
92
+
93
+ [ BackgroundDependencyLoader ]
94
+ private void load ( FrameworkConfigManager config , GameHost host )
95
+ {
96
+ var renderer = config . GetBindable < RendererType > ( FrameworkSetting . Renderer ) ;
97
+ automaticRendererInUse = renderer . Value == RendererType . Automatic ;
98
+ hostResolvedRenderer = host . ResolvedRenderer ;
99
+ }
100
+
101
+ protected override LocalisableString GenerateItemText ( RendererType item )
102
+ {
103
+ if ( item == RendererType . Automatic && automaticRendererInUse )
104
+ return LocalisableString . Interpolate ( $ "{ base . GenerateItemText ( item ) } ({ hostResolvedRenderer . GetDescription ( ) } )") ;
105
+
106
+ return base . GenerateItemText ( item ) ;
107
+ }
108
+ }
44
109
}
45
110
}
46
111
}
0 commit comments