From de0fbbd8e22d9a9798d35d343af3b9446f92551a Mon Sep 17 00:00:00 2001 From: mix Date: Mon, 28 Apr 2025 21:36:30 +0100 Subject: [PATCH] Revert "Fix sprite culling glitching by culling sprites at full column width" This reverts commit b5c925da3676e9601d12f80918e1507c2985ee4a. --- src/openrct2/paint/Paint.cpp | 49 ++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index e2d653d13f..2f13fdf333 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -103,23 +103,40 @@ static void PaintSessionAddPSToQuadrant(PaintSession& session, PaintStruct* ps) session.QuadrantFrontIndex = std::max(session.QuadrantFrontIndex, paintQuadrantIndex); } -static constexpr bool imageWithinColumn(const ScreenCoordsXY& imagePos, const G1Element& g1, const DrawPixelInfo& dpi) +static constexpr bool ImageWithinDPI(const ScreenCoordsXY& imagePos, const G1Element& g1, const DrawPixelInfo& dpi) { - const int32_t left = imagePos.x + g1.x_offset; - const int32_t right = left + g1.width; + int32_t left = imagePos.x + g1.x_offset; + int32_t bottom = imagePos.y + g1.y_offset; - const int32_t columnWidth = dpi.zoom_level.ApplyInversedTo(kCoordsXYStep); - const int32_t alignedX = floor2(dpi.x, columnWidth); - - // check if a sprite is within the full unclipped column width - // culling sprites outside the clipped column causes sorting differences between invalidation blocks - // not culling sprites outside the full column width also causes a different kind of glitching - - if (dpi.zoom_level.ApplyInversedTo(right) <= alignedX) - return false; - if (dpi.zoom_level.ApplyInversedTo(left) >= alignedX + columnWidth) - return false; + int32_t right = left + g1.width; + int32_t top = bottom + g1.height; + // mber: It is possible to use only the bottom else block here if you change <= and >= to simply < and >. + // However, since this is used to cull paint structs, I'd prefer to keep the condition strict and calculate + // the culling differently for minifying and magnifying. + auto zoom = dpi.zoom_level; + if (zoom > ZoomLevel{ 0 }) + { + if (right <= dpi.WorldX()) + return false; + if (top <= dpi.WorldY()) + return false; + if (left >= dpi.WorldX() + dpi.WorldWidth()) + return false; + if (bottom >= dpi.WorldY() + dpi.WorldHeight()) + return false; + } + else + { + if (zoom.ApplyInversedTo(right) <= dpi.x) + return false; + if (zoom.ApplyInversedTo(top) <= dpi.y) + return false; + if (zoom.ApplyInversedTo(left) >= dpi.x + dpi.width) + return false; + if (zoom.ApplyInversedTo(bottom) >= dpi.y + dpi.height) + return false; + } return true; } @@ -167,7 +184,7 @@ static PaintStruct* CreateNormalPaintStruct( const auto imagePos = Translate3DTo2DWithZ(session.CurrentRotation, swappedRotCoord); - if (!imageWithinColumn(imagePos, *g1, session.DPI)) + if (!ImageWithinDPI(imagePos, *g1, session.DPI)) { return nullptr; } @@ -215,7 +232,7 @@ static PaintStruct* CreateNormalPaintStructHeight( const auto imagePos = Translate3DTo2DWithZ(session.CurrentRotation, swappedRotCoord); - if (!imageWithinColumn(imagePos, *g1, session.DPI)) + if (!ImageWithinDPI(imagePos, *g1, session.DPI)) { return nullptr; }