diff --git a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp index b2aa60e416..b4cf70d4a7 100644 --- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp @@ -213,17 +213,20 @@ public: } protected: - void OnDrawDirtyBlock(uint32_t left, uint32_t top, uint32_t columns, uint32_t rows) override + void OnDrawDirtyBlock(int32_t left, int32_t top, int32_t right, int32_t bottom) override { if (gShowDirtyVisuals) { - uint32_t right = left + columns; - uint32_t bottom = top + rows; - for (uint32_t x = left; x < right; x++) + const auto columns = (right - left) / _invalidationGrid.getBlockWidth(); + const auto rows = (bottom - top) / _invalidationGrid.getBlockHeight(); + const auto firstRow = top / _invalidationGrid.getBlockHeight(); + const auto firstColumn = left / _invalidationGrid.getBlockWidth(); + + for (uint32_t y = 0; y < rows; y++) { - for (uint32_t y = top; y < bottom; y++) + for (uint32_t x = 0; x < columns; x++) { - SetDirtyVisualTime(x, y, kDirtyVisualTime); + SetDirtyVisualTime(firstColumn + x, firstRow + y, kDirtyVisualTime); } } } @@ -330,7 +333,7 @@ private: uint32_t GetDirtyVisualTime(uint32_t x, uint32_t y) { uint32_t result = 0; - uint32_t i = y * _dirtyGrid.BlockColumns + x; + uint32_t i = y * _invalidationGrid.getColumnCount() + x; if (_dirtyVisualsTime.size() > i) { result = _dirtyVisualsTime[i]; @@ -340,7 +343,7 @@ private: void SetDirtyVisualTime(uint32_t x, uint32_t y, uint32_t value) { - uint32_t i = y * _dirtyGrid.BlockColumns + x; + uint32_t i = y * _invalidationGrid.getColumnCount() + x; if (_dirtyVisualsTime.size() > i) { _dirtyVisualsTime[i] = value; @@ -349,10 +352,13 @@ private: void UpdateDirtyVisuals() { - _dirtyVisualsTime.resize(_dirtyGrid.BlockRows * _dirtyGrid.BlockColumns); - for (uint32_t y = 0; y < _dirtyGrid.BlockRows; y++) + const auto rows = _invalidationGrid.getRowCount(); + const auto columns = _invalidationGrid.getColumnCount(); + + _dirtyVisualsTime.resize(rows * columns); + for (uint32_t y = 0; y < rows; y++) { - for (uint32_t x = 0; x < _dirtyGrid.BlockColumns; x++) + for (uint32_t x = 0; x < columns; x++) { auto timeLeft = GetDirtyVisualTime(x, y); if (timeLeft > 0) @@ -373,19 +379,19 @@ private: float scaleY = Config::Get().general.WindowScale * renderY / static_cast(windowY); SDL_SetRenderDrawBlendMode(_sdlRenderer, SDL_BLENDMODE_BLEND); - for (uint32_t y = 0; y < _dirtyGrid.BlockRows; y++) + for (uint32_t y = 0; y < _invalidationGrid.getRowCount(); y++) { - for (uint32_t x = 0; x < _dirtyGrid.BlockColumns; x++) + for (uint32_t x = 0; x < _invalidationGrid.getColumnCount(); x++) { auto timeLeft = GetDirtyVisualTime(x, y); if (timeLeft > 0) { uint8_t alpha = static_cast(timeLeft * 5 / 2); SDL_Rect ddRect; - ddRect.x = static_cast(x * _dirtyGrid.BlockWidth * scaleX); - ddRect.y = static_cast(y * _dirtyGrid.BlockHeight * scaleY); - ddRect.w = static_cast(_dirtyGrid.BlockWidth * scaleX); - ddRect.h = static_cast(_dirtyGrid.BlockHeight * scaleY); + ddRect.x = static_cast(x * _invalidationGrid.getBlockWidth() * scaleX); + ddRect.y = static_cast(y * _invalidationGrid.getBlockHeight() * scaleY); + ddRect.w = static_cast(_invalidationGrid.getBlockWidth() * scaleX); + ddRect.h = static_cast(_invalidationGrid.getBlockHeight() * scaleY); SDL_SetRenderDrawColor(_sdlRenderer, 255, 255, 255, alpha); SDL_RenderFillRect(_sdlRenderer, &ddRect); diff --git a/src/openrct2/drawing/X8DrawingEngine.cpp b/src/openrct2/drawing/X8DrawingEngine.cpp index e36e36b3cc..476ddffab1 100644 --- a/src/openrct2/drawing/X8DrawingEngine.cpp +++ b/src/openrct2/drawing/X8DrawingEngine.cpp @@ -319,8 +319,7 @@ void X8DrawingEngine::ConfigureBits(uint32_t width, uint32_t height, uint32_t pi } } -void X8DrawingEngine::OnDrawDirtyBlock( - [[maybe_unused]] uint32_t x, [[maybe_unused]] uint32_t y, [[maybe_unused]] uint32_t columns, [[maybe_unused]] uint32_t rows) +void X8DrawingEngine::OnDrawDirtyBlock(int32_t, int32_t, int32_t, int32_t) { } @@ -334,16 +333,16 @@ void X8DrawingEngine::ConfigureDirtyGrid() void X8DrawingEngine::DrawAllDirtyBlocks() { - _invalidationGrid.traverseDirtyCells( - [this](int32_t left, int32_t top, int32_t right, int32_t bottom) { - DrawDirtyBlocks(left, top, right, bottom); - }); + _invalidationGrid.traverseDirtyCells([this](int32_t left, int32_t top, int32_t right, int32_t bottom) { + // Draw region + DrawDirtyBlocks(left, top, right, bottom); + }); } void X8DrawingEngine::DrawDirtyBlocks(int32_t left, int32_t top, int32_t right, int32_t bottom) { // Draw region - //OnDrawDirtyBlock(x, y, columns, rows); + OnDrawDirtyBlock(left, top, right, bottom); WindowDrawAll(_bitsDPI, left, top, right, bottom); } diff --git a/src/openrct2/drawing/X8DrawingEngine.h b/src/openrct2/drawing/X8DrawingEngine.h index 80ce4d4bf3..48609b02c5 100644 --- a/src/openrct2/drawing/X8DrawingEngine.h +++ b/src/openrct2/drawing/X8DrawingEngine.h @@ -117,7 +117,7 @@ namespace OpenRCT2 protected: void ConfigureBits(uint32_t width, uint32_t height, uint32_t pitch); - virtual void OnDrawDirtyBlock(uint32_t x, uint32_t y, uint32_t columns, uint32_t rows); + virtual void OnDrawDirtyBlock(int32_t left, int32_t top, int32_t right, int32_t bottom); private: void ConfigureDirtyGrid();