mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-22 23:33:04 +01:00
Introduce VIEWPORT_FLAG_RENDERING_INHIBITED
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 } });
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -101,6 +101,19 @@ void WindowVisitEach(std::function<void(WindowBase*)> 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
|
||||
|
||||
@@ -491,6 +491,8 @@ extern bool gDisableErrorWindowSound;
|
||||
std::list<std::shared_ptr<WindowBase>>::iterator WindowGetIterator(const WindowBase* w);
|
||||
void WindowVisitEach(std::function<void(WindowBase*)> func);
|
||||
|
||||
void WindowSetFlagForAllViewports(uint32_t viewportFlag, bool enabled);
|
||||
|
||||
void WindowDispatchUpdateAll();
|
||||
void WindowUpdateAllViewports();
|
||||
void WindowUpdateAll();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user