From bbd95f1910692289bb08316055f0833f3ac9b055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 27 Nov 2021 15:37:12 +0200 Subject: [PATCH] Move painting for Fountain entity --- src/openrct2/entity/Fountain.cpp | 44 ++++++++++++++++++++++- src/openrct2/entity/Fountain.h | 2 +- src/openrct2/paint/sprite/Paint.Misc.cpp | 45 ------------------------ 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/src/openrct2/entity/Fountain.cpp b/src/openrct2/entity/Fountain.cpp index 0c93e0cc19..e0ece95800 100644 --- a/src/openrct2/entity/Fountain.cpp +++ b/src/openrct2/entity/Fountain.cpp @@ -11,6 +11,7 @@ #include "../Game.h" #include "../core/DataSerialiser.h" +#include "../paint/Paint.h" #include "../scenario/Scenario.h" #include "../world/Footpath.h" #include "../world/Map.h" @@ -393,6 +394,47 @@ void JumpingFountain::Serialise(DataSerialiser& stream) stream << Iteration; } -void JumpingFountain::Paint() const +void JumpingFountain::Paint(paint_session* session, int32_t imageDirection) const { + // TODO: Move into sprites.h + constexpr uint32_t JumpingFountainSnowBaseImage = 23037; + constexpr uint32_t JumpingFountainWaterBaseImage = 22973; + + rct_drawpixelinfo& dpi = session->DPI; + if (dpi.zoom_level > 0) + { + return; + } + + uint16_t height = z + 6; + imageDirection = imageDirection / 8; + + // Fountain is firing anti clockwise + bool reversed = (FountainFlags & FOUNTAIN_FLAG::DIRECTION); + // Fountain rotation + bool rotated = (sprite_direction / 16) & 1; + bool isAntiClockwise = (imageDirection / 2) & 1; // Clockwise or Anti-clockwise + + // These cancel each other out + if (reversed != rotated) + { + isAntiClockwise = !isAntiClockwise; + } + + uint32_t baseImageId = (FountainType == JumpingFountainType::Snow) ? JumpingFountainSnowBaseImage + : JumpingFountainWaterBaseImage; + uint32_t imageId = baseImageId + imageDirection * 16 + frame; + constexpr std::array antiClockWiseBoundingBoxes = { + CoordsXY{ -COORDS_XY_STEP, -3 }, + CoordsXY{ 0, -3 }, + }; + constexpr std::array clockWiseBoundingBoxes = { + CoordsXY{ -COORDS_XY_STEP, 3 }, + CoordsXY{ 0, 3 }, + }; + + auto bb = isAntiClockwise ? antiClockWiseBoundingBoxes : clockWiseBoundingBoxes; + + PaintAddImageAsParentRotated( + session, imageDirection, imageId, 0, 0, 32, 1, 3, height, bb[imageDirection & 1].x, bb[imageDirection & 1].y, height); } diff --git a/src/openrct2/entity/Fountain.h b/src/openrct2/entity/Fountain.h index 20258c7b02..fa7cf9d3d0 100644 --- a/src/openrct2/entity/Fountain.h +++ b/src/openrct2/entity/Fountain.h @@ -35,7 +35,7 @@ struct JumpingFountain : EntityBase void Update(); static void StartAnimation(JumpingFountainType newType, const CoordsXY& newLoc, const TileElement* tileElement); void Serialise(DataSerialiser& stream); - void Paint() const; + void Paint(paint_session* session, int32_t imageDirection) const; private: JumpingFountainType GetType() const; diff --git a/src/openrct2/paint/sprite/Paint.Misc.cpp b/src/openrct2/paint/sprite/Paint.Misc.cpp index d439c508b6..10caf5580b 100644 --- a/src/openrct2/paint/sprite/Paint.Misc.cpp +++ b/src/openrct2/paint/sprite/Paint.Misc.cpp @@ -90,48 +90,3 @@ template<> void PaintEntity(paint_session* session, const ExplosionFlare* flare, uint32_t imageId = 22896 + (flare->frame / 256); PaintAddImageAsParent(session, imageId, { 0, 0, flare->z }, { 1, 1, 0 }); } - -constexpr uint32_t JumpingFountainSnowBaseImage = 23037; -constexpr uint32_t JumpingFountainWaterBaseImage = 22973; - -template<> void PaintEntity(paint_session* session, const JumpingFountain* jumpingFountain, int32_t imageDirection) -{ - rct_drawpixelinfo* dpi = &session->DPI; - if (dpi->zoom_level > 0) - { - return; - } - - if (jumpingFountain == nullptr) - return; - uint16_t height = jumpingFountain->z + 6; - int32_t ebx = imageDirection / 8; - - // Fountain is firing anti clockwise - bool reversed = (jumpingFountain->FountainFlags & FOUNTAIN_FLAG::DIRECTION); - // Fountain rotation - bool rotated = (jumpingFountain->sprite_direction / 16) & 1; - bool isAntiClockwise = (ebx / 2) & 1; // Clockwise or Anti-clockwise - - // These cancel each other out - if (reversed != rotated) - { - isAntiClockwise = !isAntiClockwise; - } - - uint32_t baseImageId = (jumpingFountain->FountainType == JumpingFountainType::Snow) ? JumpingFountainSnowBaseImage - : JumpingFountainWaterBaseImage; - uint32_t imageId = baseImageId + ebx * 16 + jumpingFountain->frame; - constexpr std::array antiClockWiseBoundingBoxes = { - CoordsXY{ -COORDS_XY_STEP, -3 }, - CoordsXY{ 0, -3 }, - }; - constexpr std::array clockWiseBoundingBoxes = { - CoordsXY{ -COORDS_XY_STEP, 3 }, - CoordsXY{ 0, 3 }, - }; - - auto bb = isAntiClockwise ? antiClockWiseBoundingBoxes : clockWiseBoundingBoxes; - - PaintAddImageAsParentRotated(session, ebx, imageId, 0, 0, 32, 1, 3, height, bb[ebx & 1].x, bb[ebx & 1].y, height); -}