From a83642fab2211d025504152c87fc3e1ba7cc3355 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Mon, 30 Nov 2020 15:55:23 +1000 Subject: [PATCH] Pass globals to OSDManager via ctor and new UpdateGlobals method also instantiate OSDManager in MainForm and pass it to DisplayManager because that's how we did it until recently and it's also just easier --- .../DisplayManager/DisplayManager.cs | 5 +- .../DisplayManager/OSDManager.cs | 132 ++++++++++-------- src/BizHawk.Client.EmuHawk/MainForm.cs | 5 +- 3 files changed, 84 insertions(+), 58 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs b/src/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs index c82aee755f..a05a68e1ad 100644 --- a/src/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs +++ b/src/BizHawk.Client.EmuHawk/DisplayManager/DisplayManager.cs @@ -49,14 +49,15 @@ namespace BizHawk.Client.EmuHawk private readonly Func _getIsSecondaryThrottlingDisabled; - public readonly OSDManager OSD = new OSDManager(); + public readonly OSDManager OSD; private Config GlobalConfig => GlobalWin.Config; private IEmulator GlobalEmulator => GlobalWin.Emulator; - public DisplayManager(IGL gl, PresentationPanel presentationPanel, Func getIsSecondaryThrottlingDisabled) + public DisplayManager(OSDManager osd, IGL gl, PresentationPanel presentationPanel, Func getIsSecondaryThrottlingDisabled) { + OSD = osd; _getIsSecondaryThrottlingDisabled = getIsSecondaryThrottlingDisabled; _gl = gl; diff --git a/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs b/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs index df46d359dd..ea0f7ea805 100644 --- a/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs +++ b/src/BizHawk.Client.EmuHawk/DisplayManager/OSDManager.cs @@ -38,6 +38,28 @@ namespace BizHawk.Client.EmuHawk public class OSDManager { + private Config _config; + + private IEmulator _emulator; + + private readonly InputManager _inputManager; + + private readonly IMovieSession _movieSession; + + public OSDManager(Config config, IEmulator emulator, InputManager inputManager, IMovieSession movieSession) + { + _config = config; + _emulator = emulator; + _inputManager = inputManager; + _movieSession = movieSession; + } + + public void UpdateGlobals(Config config, IEmulator emulator) + { + _config = config; + _emulator = emulator; + } + public string Fps { get; set; } public IBlitterFont MessageFont; @@ -46,8 +68,8 @@ namespace BizHawk.Client.EmuHawk MessageFont = blitter.GetFontType(nameof(MessageFont)); } - public Color FixedMessagesColor => Color.FromArgb(GlobalWin.Config.MessagesColor); - public Color FixedAlertMessageColor => Color.FromArgb(GlobalWin.Config.AlertMessageColor); + public Color FixedMessagesColor => Color.FromArgb(_config.MessagesColor); + public Color FixedAlertMessageColor => Color.FromArgb(_config.AlertMessageColor); private PointF GetCoordinates(IBlitter g, MessagePosition position, string message) { @@ -66,29 +88,29 @@ namespace BizHawk.Client.EmuHawk private string MakeFrameCounter() { - if (GlobalWin.MovieSession.Movie.IsFinished()) + if (_movieSession.Movie.IsFinished()) { var sb = new StringBuilder(); sb - .Append(GlobalWin.Emulator.Frame) + .Append(_emulator.Frame) .Append('/') - .Append(GlobalWin.MovieSession.Movie.FrameCount) + .Append(_movieSession.Movie.FrameCount) .Append(" (Finished)"); return sb.ToString(); } - if (GlobalWin.MovieSession.Movie.IsPlayingOrFinished()) + if (_movieSession.Movie.IsPlayingOrFinished()) { var sb = new StringBuilder(); sb - .Append(GlobalWin.Emulator.Frame) + .Append(_emulator.Frame) .Append('/') - .Append(GlobalWin.MovieSession.Movie.FrameCount); + .Append(_movieSession.Movie.FrameCount); return sb.ToString(); } - return GlobalWin.Emulator.Frame.ToString(); + return _emulator.Frame.ToString(); } private readonly List _messages = new List(5); @@ -134,14 +156,14 @@ namespace BizHawk.Client.EmuHawk private void DrawMessage(IBlitter g, UIMessage message, int yOffset) { - var point = GetCoordinates(g, GlobalWin.Config.Messages, message.Message); + var point = GetCoordinates(g, _config.Messages, message.Message); var y = point.Y + yOffset; // TODO: clean me up g.DrawString(message.Message, MessageFont, FixedMessagesColor, point.X, y); } public void DrawMessages(IBlitter g) { - if (!GlobalWin.Config.DisplayMessages) + if (!_config.DisplayMessages) { return; } @@ -150,13 +172,13 @@ namespace BizHawk.Client.EmuHawk if (_messages.Any()) { - if (GlobalWin.Config.StackOSDMessages) + if (_config.StackOSDMessages) { int line = 1; for (int i = _messages.Count - 1; i >= 0; i--, line++) { int yOffset = (line - 1) * 18; - if (!GlobalWin.Config.Messages.Anchor.IsTop()) + if (!_config.Messages.Anchor.IsTop()) { yOffset = 0 - yOffset; } @@ -187,19 +209,19 @@ namespace BizHawk.Client.EmuHawk public string InputStrMovie() { - return MakeStringFor(GlobalWin.MovieSession.MovieController); + return MakeStringFor(_movieSession.MovieController); } public string InputStrImmediate() { - return MakeStringFor(GlobalWin.InputManager.AutofireStickyXorAdapter); + return MakeStringFor(_inputManager.AutofireStickyXorAdapter); } public string InputPrevious() { - if (GlobalWin.MovieSession.Movie.IsPlayingOrRecording()) + if (_movieSession.Movie.IsPlayingOrRecording()) { - var state = GlobalWin.MovieSession.Movie.GetInputState(GlobalWin.Emulator.Frame - 1); + var state = _movieSession.Movie.GetInputState(_emulator.Frame - 1); if (state != null) { return MakeStringFor(state); @@ -211,11 +233,11 @@ namespace BizHawk.Client.EmuHawk public string InputStrOrAll() { - IController m = GlobalWin.InputManager.AutofireStickyXorAdapter; + IController m = _inputManager.AutofireStickyXorAdapter; - if (GlobalWin.MovieSession.Movie.IsPlayingOrRecording() && GlobalWin.Emulator.Frame > 0) + if (_movieSession.Movie.IsPlayingOrRecording() && _emulator.Frame > 0) { - m = m.Or(GlobalWin.MovieSession.Movie.GetInputState(GlobalWin.Emulator.Frame - 1)); + m = m.Or(_movieSession.Movie.GetInputState(_emulator.Frame - 1)); } return MakeStringFor(m); @@ -223,18 +245,18 @@ namespace BizHawk.Client.EmuHawk private string MakeStringFor(IController controller) { - return new Bk2InputDisplayGenerator(GlobalWin.Emulator.SystemId, controller).Generate(); + return new Bk2InputDisplayGenerator(_emulator.SystemId, controller).Generate(); } public string MakeIntersectImmediatePrevious() { - if (GlobalWin.MovieSession.Movie.IsActive()) + if (_movieSession.Movie.IsActive()) { - var m = GlobalWin.MovieSession.Movie.IsPlayingOrRecording() - ? GlobalWin.MovieSession.Movie.GetInputState(GlobalWin.Emulator.Frame - 1) - : GlobalWin.MovieSession.MovieController; + var m = _movieSession.Movie.IsPlayingOrRecording() + ? _movieSession.Movie.GetInputState(_emulator.Frame - 1) + : _movieSession.MovieController; - return MakeStringFor(GlobalWin.InputManager.AutofireStickyXorAdapter.And(m)); + return MakeStringFor(_inputManager.AutofireStickyXorAdapter.And(m)); } return ""; @@ -242,8 +264,8 @@ namespace BizHawk.Client.EmuHawk public string MakeRerecordCount() { - return GlobalWin.MovieSession.Movie.IsActive() - ? GlobalWin.MovieSession.Movie.Rerecords.ToString() + return _movieSession.Movie.IsActive() + ? _movieSession.Movie.Rerecords.ToString() : ""; } @@ -257,41 +279,41 @@ namespace BizHawk.Client.EmuHawk /// public void DrawScreenInfo(IBlitter g) { - if (GlobalWin.Config.DisplayFrameCounter && !GlobalWin.Emulator.IsNull()) + if (_config.DisplayFrameCounter && !_emulator.IsNull()) { string message = MakeFrameCounter(); - var point = GetCoordinates(g, GlobalWin.Config.FrameCounter, message); - DrawOsdMessage(g, message, Color.FromArgb(GlobalWin.Config.MessagesColor), point.X, point.Y); + var point = GetCoordinates(g, _config.FrameCounter, message); + DrawOsdMessage(g, message, Color.FromArgb(_config.MessagesColor), point.X, point.Y); - if (GlobalWin.Emulator.CanPollInput() && GlobalWin.Emulator.AsInputPollable().IsLagFrame) + if (_emulator.CanPollInput() && _emulator.AsInputPollable().IsLagFrame) { - DrawOsdMessage(g, GlobalWin.Emulator.Frame.ToString(), FixedAlertMessageColor, point.X, point.Y); + DrawOsdMessage(g, _emulator.Frame.ToString(), FixedAlertMessageColor, point.X, point.Y); } } - if (GlobalWin.Config.DisplayInput) + if (_config.DisplayInput) { - var moviePlaying = GlobalWin.MovieSession.Movie.IsPlaying(); + var moviePlaying = _movieSession.Movie.IsPlaying(); // After the last frame of the movie, we want both the last movie input and the current inputs. - var atMovieEnd = GlobalWin.MovieSession.Movie.IsFinished() && GlobalWin.MovieSession.Movie.IsAtEnd(); + var atMovieEnd = _movieSession.Movie.IsFinished() && _movieSession.Movie.IsAtEnd(); if (moviePlaying || atMovieEnd) { var input = InputStrMovie(); - var point = GetCoordinates(g, GlobalWin.Config.InputDisplay, input); - Color c = Color.FromArgb(GlobalWin.Config.MovieInput); + var point = GetCoordinates(g, _config.InputDisplay, input); + Color c = Color.FromArgb(_config.MovieInput); g.DrawString(input, MessageFont, c, point.X, point.Y); } if (!moviePlaying) // TODO: message config -- allow setting of "mixed", and "auto" { - var previousColor = Color.FromArgb(GlobalWin.Config.LastInputColor); - Color immediateColor = Color.FromArgb(GlobalWin.Config.MessagesColor); + var previousColor = Color.FromArgb(_config.LastInputColor); + Color immediateColor = Color.FromArgb(_config.MessagesColor); var autoColor = Color.Pink; var changedColor = Color.PeachPuff; //we need some kind of string for calculating position when right-anchoring, of something like that var bgStr = InputStrOrAll(); - var point = GetCoordinates(g, GlobalWin.Config.InputDisplay, bgStr); + var point = GetCoordinates(g, _config.InputDisplay, bgStr); // now, we're going to render these repeatedly, with higher-priority things overriding @@ -312,7 +334,7 @@ namespace BizHawk.Client.EmuHawk // basically we're tinting whatever is pressed because it's sticky specially // in order to achieve this we want to avoid drawing anything pink that isn't actually held down right now // so we make an AND adapter and combine it using immediate & sticky - var autoString = MakeStringFor(GlobalWin.InputManager.StickyXorAdapter.Source.Xor(GlobalWin.InputManager.AutofireStickyXorAdapter).And(GlobalWin.InputManager.AutofireStickyXorAdapter)); + var autoString = MakeStringFor(_inputManager.StickyXorAdapter.Source.Xor(_inputManager.AutofireStickyXorAdapter).And(_inputManager.AutofireStickyXorAdapter)); g.DrawString(autoString, MessageFont, autoColor, point.X, point.Y); //recolor everything that's changed from the previous input @@ -321,36 +343,36 @@ namespace BizHawk.Client.EmuHawk } } - if (GlobalWin.Config.DisplayFps && Fps != null) + if (_config.DisplayFps && Fps != null) { - var point = GetCoordinates(g, GlobalWin.Config.Fps, Fps); + var point = GetCoordinates(g, _config.Fps, Fps); DrawOsdMessage(g, Fps, FixedMessagesColor, point.X, point.Y); } - if (GlobalWin.Config.DisplayLagCounter && GlobalWin.Emulator.CanPollInput()) + if (_config.DisplayLagCounter && _emulator.CanPollInput()) { - var counter = GlobalWin.Emulator.AsInputPollable().LagCount.ToString(); - var point = GetCoordinates(g, GlobalWin.Config.LagCounter, counter); + var counter = _emulator.AsInputPollable().LagCount.ToString(); + var point = GetCoordinates(g, _config.LagCounter, counter); DrawOsdMessage(g, counter, FixedAlertMessageColor, point.X, point.Y); } - if (GlobalWin.Config.DisplayRerecordCount) + if (_config.DisplayRerecordCount) { string rerecordCount = MakeRerecordCount(); - var point = GetCoordinates(g, GlobalWin.Config.ReRecordCounter, rerecordCount); + var point = GetCoordinates(g, _config.ReRecordCounter, rerecordCount); DrawOsdMessage(g, rerecordCount, FixedMessagesColor, point.X, point.Y); } - if (GlobalWin.InputManager.ClientControls["Autohold"] || GlobalWin.InputManager.ClientControls["Autofire"]) + if (_inputManager.ClientControls["Autohold"] || _inputManager.ClientControls["Autofire"]) { var sb = new StringBuilder("Held: "); - foreach (string sticky in GlobalWin.InputManager.StickyXorAdapter.CurrentStickies) + foreach (string sticky in _inputManager.StickyXorAdapter.CurrentStickies) { sb.Append(sticky).Append(' '); } - foreach (string autoSticky in GlobalWin.InputManager.AutofireStickyXorAdapter.CurrentStickies) + foreach (string autoSticky in _inputManager.AutofireStickyXorAdapter.CurrentStickies) { sb .Append("Auto-") @@ -359,13 +381,13 @@ namespace BizHawk.Client.EmuHawk } var message = sb.ToString(); - var point = GetCoordinates(g, GlobalWin.Config.Autohold, message); + var point = GetCoordinates(g, _config.Autohold, message); g.DrawString(message, MessageFont, Color.White, point.X, point.Y); } - if (GlobalWin.MovieSession.Movie.IsActive() && GlobalWin.Config.DisplaySubtitles) + if (_movieSession.Movie.IsActive() && _config.DisplaySubtitles) { - var subList = GlobalWin.MovieSession.Movie.Subtitles.GetSubtitles(GlobalWin.Emulator.Frame); + var subList = _movieSession.Movie.Subtitles.GetSubtitles(_emulator.Frame); foreach (var sub in subList) { diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 7bf5c77599..66a458101a 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -339,7 +339,7 @@ namespace BizHawk.Client.EmuHawk { GraphicsControl = { MainWindow = true } }; - DisplayManager = new DisplayManager(GL, _presentationPanel, () => DisableSecondaryThrottling); + DisplayManager = new DisplayManager(new OSDManager(Config, Emulator, InputManager, MovieSession), GL, _presentationPanel, () => DisableSecondaryThrottling); Controls.Add(_presentationPanel); Controls.SetChildIndex(_presentationPanel, 0); @@ -2796,6 +2796,7 @@ namespace BizHawk.Client.EmuHawk InputManager.SyncControls(Emulator, MovieSession, Config); Tools.Restart(Config, Emulator, Game); ExtToolManager.Restart(Config.PathEntries); + OSD.UpdateGlobals(Config, Emulator); AddOnScreenMessage($"Config file loaded: {iniPath}"); } @@ -3772,6 +3773,7 @@ namespace BizHawk.Client.EmuHawk CurrentlyOpenRom = oaOpenrom?.Path ?? openAdvancedArgs; CurrentlyOpenRomArgs = args; OnRomChanged(); + OSD.UpdateGlobals(Config, Emulator); DisplayManager.Blank(); CreateRewinder(); @@ -3921,6 +3923,7 @@ namespace BizHawk.Client.EmuHawk Tools.Restart(Config, Emulator, Game); RewireSound(); ClearHolds(); + OSD.UpdateGlobals(Config, Emulator); InputManager.SyncControls(Emulator, MovieSession, Config); Tools.UpdateCheatRelatedTools(null, null); PauseOnFrame = null;