1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 09:32:29 +01:00

Merge pull request #24353 from ZehMatt/fix-invalidation-debug

Fix paint debug to visualize invalidation
This commit is contained in:
Matt
2025-05-08 14:46:53 +03:00
committed by GitHub

View File

@@ -30,7 +30,8 @@ using namespace OpenRCT2::Ui;
class HardwareDisplayDrawingEngine final : public X8DrawingEngine
{
private:
constexpr static uint32_t kDirtyVisualTime = 32;
constexpr static uint32_t kDirtyVisualTime = 40;
constexpr static uint32_t kDirtyRegionAlpha = 100;
std::shared_ptr<IUiContext> const _uiContext;
SDL_Window* _window = nullptr;
@@ -211,10 +212,6 @@ public:
X8DrawingEngine::EndDraw();
Display();
if (gShowDirtyVisuals)
{
UpdateDirtyVisuals();
}
}
protected:
@@ -222,8 +219,8 @@ protected:
{
if (gShowDirtyVisuals)
{
const auto columns = (right - left) / _invalidationGrid.getBlockWidth();
const auto rows = (bottom - top) / _invalidationGrid.getBlockHeight();
const auto columns = ((right - left) + (_invalidationGrid.getBlockWidth() - 1)) / _invalidationGrid.getBlockWidth();
const auto rows = ((bottom - top) + (_invalidationGrid.getBlockHeight() - 1)) / _invalidationGrid.getBlockHeight();
const auto firstRow = top / _invalidationGrid.getBlockHeight();
const auto firstColumn = left / _invalidationGrid.getBlockWidth();
@@ -231,7 +228,7 @@ protected:
{
for (uint32_t x = 0; x < columns; x++)
{
SetDirtyVisualTime(firstColumn + x, firstRow + y, kDirtyVisualTime);
SetDirtyVisualTime(firstColumn + x, firstRow + y, gCurrentRealTimeTicks + kDirtyVisualTime);
}
}
}
@@ -347,30 +344,16 @@ private:
}
void SetDirtyVisualTime(uint32_t x, uint32_t y, uint32_t value)
{
uint32_t i = y * _invalidationGrid.getColumnCount() + x;
if (_dirtyVisualsTime.size() > i)
{
_dirtyVisualsTime[i] = value;
}
}
void UpdateDirtyVisuals()
{
const auto rows = _invalidationGrid.getRowCount();
const auto columns = _invalidationGrid.getColumnCount();
_dirtyVisualsTime.resize(rows * columns);
for (uint32_t y = 0; y < rows; y++)
uint32_t i = y * _invalidationGrid.getColumnCount() + x;
if (_dirtyVisualsTime.size() > i)
{
for (uint32_t x = 0; x < columns; x++)
{
auto timeLeft = GetDirtyVisualTime(x, y);
if (timeLeft > 0)
{
SetDirtyVisualTime(x, y, timeLeft - 1);
}
}
_dirtyVisualsTime[i] = value;
}
}
@@ -388,10 +371,11 @@ private:
{
for (uint32_t x = 0; x < _invalidationGrid.getColumnCount(); x++)
{
auto timeLeft = GetDirtyVisualTime(x, y);
const auto timeEnd = GetDirtyVisualTime(x, y);
const auto timeLeft = gCurrentRealTimeTicks < timeEnd ? timeEnd - gCurrentRealTimeTicks : 0;
if (timeLeft > 0)
{
uint8_t alpha = static_cast<uint8_t>(timeLeft * 5 / 2);
uint8_t alpha = timeLeft * kDirtyRegionAlpha / kDirtyVisualTime;
SDL_Rect ddRect;
ddRect.x = static_cast<int32_t>(x * _invalidationGrid.getBlockWidth() * scaleX);
ddRect.y = static_cast<int32_t>(y * _invalidationGrid.getBlockHeight() * scaleY);