diff --git a/src/openrct2-ui/title/TitleSequencePlayer.cpp b/src/openrct2-ui/title/TitleSequencePlayer.cpp index b536e37740..7702d2c98c 100644 --- a/src/openrct2-ui/title/TitleSequencePlayer.cpp +++ b/src/openrct2-ui/title/TitleSequencePlayer.cpp @@ -311,6 +311,9 @@ namespace OpenRCT2::Title } else { + // Inhibit viewport rendering while we're loading + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, true); + ReportProgress(0); auto parkImporter = ParkImporter::Create(path); @@ -338,6 +341,9 @@ namespace OpenRCT2::Title GetContext()->CloseProgress(); } + // Reset viewport rendering inhibition + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, false); + gLoadKeepWindowsOpen = false; return success; } @@ -360,6 +366,9 @@ namespace OpenRCT2::Title } else { + // Inhibit viewport rendering while we're loading + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, true); + ReportProgress(0); bool isScenario = ParkImporter::ExtensionIsScenario(hintPath); auto parkImporter = ParkImporter::Create(hintPath); @@ -387,6 +396,10 @@ namespace OpenRCT2::Title Console::Error::WriteLine("Unable to load park: %s", hintPath.c_str()); GetContext()->CloseProgress(); } + + // Reset viewport rendering inhibition + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, false); + gLoadKeepWindowsOpen = false; return success; } diff --git a/src/openrct2-ui/windows/Main.cpp b/src/openrct2-ui/windows/Main.cpp index d452b384de..604bd9bab1 100644 --- a/src/openrct2-ui/windows/Main.cpp +++ b/src/openrct2-ui/windows/Main.cpp @@ -48,10 +48,6 @@ static Widget _mainWidgets[] = { void OnDraw(DrawPixelInfo& dpi) override { - // Skip viewport render during preloader - if (GetContext()->GetActiveScene() == GetContext()->GetPreloaderScene()) - return; - ViewportRender(dpi, viewport, { { dpi.x, dpi.y }, { dpi.x + dpi.width, dpi.y + dpi.height } }); } diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 32acf5e055..e23396795f 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -671,7 +671,7 @@ namespace OpenRCT2 if (!gOpenRCT2Headless && forceDraw) { _uiContext->ProcessMessages(); - WindowUpdateAll(); + WindowInvalidateByClass(WindowClass::ProgressWindow); Draw(); } } @@ -766,6 +766,9 @@ namespace OpenRCT2 parkImporter = ParkImporter::CreateS6(*_objectRepository); } + // Inhibit viewport rendering while we're loading + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, true); + OpenProgress(asScenario ? STR_LOADING_SCENARIO : STR_LOADING_SAVED_GAME); SetProgress(0, 100, STR_STRING_M_PERCENT, true); @@ -785,6 +788,9 @@ namespace OpenRCT2 parkImporter->Import(gameState); SetProgress(100, 100, STR_STRING_M_PERCENT, true); + // Reset viewport rendering inhibition + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, false); + gScenarioSavePath = path; gCurrentLoadedPath = path; gFirstTimeSaving = true; @@ -935,6 +941,7 @@ namespace OpenRCT2 } CloseProgress(); + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, false); return false; } diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index c5bce15049..e8c293fdc5 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -927,6 +927,9 @@ void ViewportRotateAll(int32_t direction) */ void ViewportRender(DrawPixelInfo& dpi, const Viewport* viewport, const ScreenRect& screenRect) { + if (viewport->flags & VIEWPORT_FLAG_RENDERING_INHIBITED) + return; + auto [topLeft, bottomRight] = screenRect; if (bottomRight.x <= viewport->pos.x) @@ -1018,6 +1021,9 @@ static void ViewportPaint(const Viewport* viewport, DrawPixelInfo& dpi, const Sc PROFILED_FUNCTION(); const uint32_t viewFlags = viewport->flags; + if (viewFlags & VIEWPORT_FLAG_RENDERING_INHIBITED) + return; + uint32_t width = screenRect.GetWidth(); uint32_t height = screenRect.GetHeight(); const uint32_t bitmask = viewport->zoom >= ZoomLevel{ 0 } ? 0xFFFFFFFF & (viewport->zoom.ApplyTo(0xFFFFFFFF)) : 0xFFFFFFFF; diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index e6994bb5d2..530c3ba4cf 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -66,6 +66,7 @@ enum : uint32_t VIEWPORT_FLAG_INVISIBLE_SUPPORTS = (1u << 29), VIEWPORT_FLAG_INDEPEDENT_ROTATION = (1u << 30), + VIEWPORT_FLAG_RENDERING_INHIBITED = (1u << 31), }; enum class VisibilityKind diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 19f9e0bb48..a942583e01 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -101,6 +101,19 @@ void WindowVisitEach(std::function func) } } +void WindowSetFlagForAllViewports(uint32_t viewportFlag, bool enabled) +{ + WindowVisitEach([&](WindowBase* w) { + if (w->viewport != nullptr) + { + if (enabled) + w->viewport->flags |= viewportFlag; + else + w->viewport->flags &= ~viewportFlag; + } + }); +} + /** * * rct2: 0x006ED7B0 diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index a017c71f3c..2d5cff3e5f 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -491,6 +491,8 @@ extern bool gDisableErrorWindowSound; std::list>::iterator WindowGetIterator(const WindowBase* w); void WindowVisitEach(std::function func); +void WindowSetFlagForAllViewports(uint32_t viewportFlag, bool enabled); + void WindowDispatchUpdateAll(); void WindowUpdateAllViewports(); void WindowUpdateAll(); diff --git a/src/openrct2/scenes/preloader/PreloaderScene.cpp b/src/openrct2/scenes/preloader/PreloaderScene.cpp index 346c52d06b..1dd085e9d1 100644 --- a/src/openrct2/scenes/preloader/PreloaderScene.cpp +++ b/src/openrct2/scenes/preloader/PreloaderScene.cpp @@ -41,6 +41,7 @@ void PreloaderScene::Load() gameStateInitAll(GetGameState(), DEFAULT_MAP_SIZE); ViewportInitAll(); ContextOpenWindow(WindowClass::MainWindow); + WindowSetFlagForAllViewports(VIEWPORT_FLAG_RENDERING_INHIBITED, true); WindowResizeGui(ContextGetWidth(), ContextGetHeight()); // Reset screen