diff --git a/src/openrct2/paint/Painter.cpp b/src/openrct2/paint/Painter.cpp index 89c102172a..9404507fc2 100644 --- a/src/openrct2/paint/Painter.cpp +++ b/src/openrct2/paint/Painter.cpp @@ -24,6 +24,7 @@ #include "../scenes/intro/IntroScene.h" #include "../ui/UiContext.h" #include "../ui/WindowManager.h" +#include "../world/MapSelection.h" #include "../world/TileInspector.h" using namespace OpenRCT2; @@ -48,6 +49,7 @@ void Painter::Paint(IDrawingEngine& de) } else { + MapSelection::Invalidate(); VirtualFloorInvalidate(false); de.PaintWindows(); diff --git a/src/openrct2/world/MapSelection.cpp b/src/openrct2/world/MapSelection.cpp index 72dc5eea9b..75ba8fdd7b 100644 --- a/src/openrct2/world/MapSelection.cpp +++ b/src/openrct2/world/MapSelection.cpp @@ -21,6 +21,12 @@ uint8_t gMapSelectArrowDirection; std::vector gMapSelectionTiles; +static MapSelectFlags _previousMapSelectFlags; +static CoordsXY _previousMapSelectPositionA; +static CoordsXY _previousMapSelectPositionB; +static CoordsXYZ _previousMapSelectArrowPosition; +static uint8_t _previousMapSelectArrowDirection; + MapRange getMapSelectRange() { return MapRange(gMapSelectPositionA, gMapSelectPositionB); @@ -37,3 +43,50 @@ void setMapSelectRange(const CoordsXY coords) { setMapSelectRange({ coords, coords }); } + +namespace OpenRCT2::MapSelection +{ + + void Invalidate() + { + if (!_previousMapSelectFlags.has(MapSelectFlag::enable) && gMapSelectFlags.has(MapSelectFlag::enable)) + { + MapInvalidateRegion(gMapSelectPositionA, gMapSelectPositionB); + } + else if (_previousMapSelectFlags.has(MapSelectFlag::enable) && !gMapSelectFlags.has(MapSelectFlag::enable)) + { + MapInvalidateRegion(_previousMapSelectPositionA, _previousMapSelectPositionB); + } + else if ( + gMapSelectFlags.has(MapSelectFlag::enable) + && (_previousMapSelectPositionA != gMapSelectPositionA || _previousMapSelectPositionB != gMapSelectPositionB)) + { + MapInvalidateRegion(_previousMapSelectPositionA, _previousMapSelectPositionB); + MapInvalidateRegion(gMapSelectPositionA, gMapSelectPositionB); + } + + if (!_previousMapSelectFlags.has(MapSelectFlag::enableArrow) && gMapSelectFlags.has(MapSelectFlag::enableArrow)) + { + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + else if (_previousMapSelectFlags.has(MapSelectFlag::enableArrow) && !gMapSelectFlags.has(MapSelectFlag::enableArrow)) + { + MapInvalidateTile({ _previousMapSelectArrowPosition, _previousMapSelectArrowPosition.z }); + } + else if (gMapSelectFlags.has(MapSelectFlag::enableArrow) && _previousMapSelectArrowPosition != gMapSelectArrowPosition) + { + MapInvalidateTile({ _previousMapSelectArrowPosition, _previousMapSelectArrowPosition.z }); + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + else if (_previousMapSelectArrowDirection != gMapSelectArrowDirection) + { + MapInvalidateTile({ gMapSelectArrowPosition, gMapSelectArrowPosition.z }); + } + + _previousMapSelectFlags = gMapSelectFlags; + _previousMapSelectPositionA = gMapSelectPositionA; + _previousMapSelectPositionB = gMapSelectPositionB; + _previousMapSelectArrowPosition = gMapSelectArrowPosition; + _previousMapSelectArrowDirection = gMapSelectArrowDirection; + } +} // namespace OpenRCT2::MapSelection diff --git a/src/openrct2/world/MapSelection.h b/src/openrct2/world/MapSelection.h index f266d235ff..d79f3e3527 100644 --- a/src/openrct2/world/MapSelection.h +++ b/src/openrct2/world/MapSelection.h @@ -66,3 +66,8 @@ extern std::vector gMapSelectionTiles; MapRange getMapSelectRange(); void setMapSelectRange(const MapRange& range); void setMapSelectRange(const CoordsXY coords); + +namespace OpenRCT2::MapSelection +{ + void Invalidate(); +} // namespace OpenRCT2::MapSelection