From 4c87f335ac9bd7de75550499dc7578e9c76c247f Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Mon, 18 Sep 2023 23:42:12 +0100 Subject: [PATCH] `DrawDungeon`: Move checks out of `DrawObject/Item` Avoids calling `FindObjectAtPosition` and similar pre-checks twice. --- Source/engine/render/scrollrt.cpp | 61 ++++++++++++++----------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index 33b9995c2..8505b9f55 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -436,29 +436,16 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo /** * @brief Render an object sprite * @param out Output buffer + * @param objectToDraw Dungeone object to draw * @param tilePosition dPiece coordinates * @param targetBufferPosition Output buffer coordinates * @param pre Is the sprite in the background */ -void DrawObject(const Surface &out, Point tilePosition, Point targetBufferPosition, bool pre) +void DrawObject(const Surface &out, const Object &objectToDraw, Point tilePosition, Point targetBufferPosition) { - if (LightTableIndex >= LightsMax) { - return; - } - - Object *object = FindObjectAtPosition(tilePosition); - if (object == nullptr) { - return; - } - - const Object &objectToDraw = *object; - if (objectToDraw._oPreFlag != pre) { - return; - } - const ClxSprite sprite = objectToDraw.currentSprite(); - Point screenPosition = targetBufferPosition + objectToDraw.getRenderingOffset(sprite, tilePosition); + const Point screenPosition = targetBufferPosition + objectToDraw.getRenderingOffset(sprite, tilePosition); if (&objectToDraw == ObjectUnderCursor) { ClxDrawOutlineSkipColorZero(out, 194, screenPosition, sprite); @@ -625,25 +612,17 @@ void DrawFloor(const Surface &out, Point tilePosition, Point targetBufferPositio * @param targetBufferPosition Output buffer coordinates * @param pre Is the sprite in the background */ -void DrawItem(const Surface &out, Point tilePosition, Point targetBufferPosition, bool pre) +void DrawItem(const Surface &out, int8_t itemIndex, Point targetBufferPosition) { - int8_t bItem = dItem[tilePosition.x][tilePosition.y]; - - if (bItem <= 0) - return; - - auto &item = Items[bItem - 1]; - if (item._iPostDraw == pre) - return; - + const Item &item = Items[itemIndex]; const ClxSprite sprite = item.AnimInfo.currentSprite(); const Point position = targetBufferPosition + item.getRenderingOffset(sprite); - if (stextflag == TalkID::None && (bItem - 1 == pcursitem || AutoMapShowItems)) { + if (stextflag == TalkID::None && (itemIndex == pcursitem || AutoMapShowItems)) { ClxDrawOutlineSkipColorZero(out, GetOutlineColor(item, false), position, sprite); } ClxDrawLight(out, position, sprite); if (item.AnimInfo.isLastFrame() || item._iCurs == ICURS_MAGIC_ROCK) - AddItemToLabelQueue(bItem - 1, position); + AddItemToLabelQueue(itemIndex, position); } /** @@ -736,8 +715,8 @@ void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosit DrawCell(out, tilePosition, targetBufferPosition); - int8_t bDead = dCorpse[tilePosition.x][tilePosition.y]; - int8_t bMap = dTransVal[tilePosition.x][tilePosition.y]; + const int8_t bDead = dCorpse[tilePosition.x][tilePosition.y]; + const int8_t bMap = dTransVal[tilePosition.x][tilePosition.y]; #ifdef _DEBUG if (DebugVision && IsTileLit(tilePosition)) { @@ -760,8 +739,17 @@ void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosit ClxDrawLight(out, position, sprite); } } - DrawObject(out, tilePosition, targetBufferPosition, true); - DrawItem(out, tilePosition, targetBufferPosition, true); + + const int8_t bItem = dItem[tilePosition.x][tilePosition.y]; + const Object *object = LightTableIndex < LightsMax + ? FindObjectAtPosition(tilePosition) + : nullptr; + if (object != nullptr && object->_oPreFlag) { + DrawObject(out, *object, tilePosition, targetBufferPosition); + } + if (bItem > 0 && !Items[bItem - 1]._iPostDraw) { + DrawItem(out, static_cast(bItem - 1), targetBufferPosition); + } if (TileContainsDeadPlayer(tilePosition)) { DrawDeadPlayer(out, tilePosition, targetBufferPosition); @@ -774,8 +762,13 @@ void DrawDungeon(const Surface &out, Point tilePosition, Point targetBufferPosit DrawMonsterHelper(out, tilePosition, targetBufferPosition); } DrawMissile(out, tilePosition, targetBufferPosition, false); - DrawObject(out, tilePosition, targetBufferPosition, false); - DrawItem(out, tilePosition, targetBufferPosition, false); + + if (object != nullptr && !object->_oPreFlag) { + DrawObject(out, *object, tilePosition, targetBufferPosition); + } + if (bItem > 0 && Items[bItem - 1]._iPostDraw) { + DrawItem(out, static_cast(bItem - 1), targetBufferPosition); + } if (leveltype != DTYPE_TOWN) { char bArch = dSpecial[tilePosition.x][tilePosition.y];