1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-02-02 03:35:09 +01:00

Revert "Fix sprite culling glitching by culling sprites at full column width"

This reverts commit b5c925da36.
This commit is contained in:
mix
2025-04-28 21:36:30 +01:00
parent b2fda2d0cb
commit de0fbbd8e2

View File

@@ -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;
}