From 1293dfb86dee1c97e6c25046a5f80f0255fdb0ef Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Fri, 25 Nov 2022 12:58:58 +0000 Subject: [PATCH] Level renderer: Remove `level_piece_id` global `DrawFloor` now passes the piece ID into RenderTile. Previously, `DrawFloor` did not set `level_piece_id`. --- Source/engine/render/dun_render.cpp | 10 +++++----- Source/engine/render/dun_render.hpp | 3 ++- Source/engine/render/scrollrt.cpp | 28 +++++++++++++--------------- Source/engine/render/scrollrt.h | 1 - 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Source/engine/render/dun_render.cpp b/Source/engine/render/dun_render.cpp index 8186075df..4b576b5d8 100644 --- a/Source/engine/render/dun_render.cpp +++ b/Source/engine/render/dun_render.cpp @@ -1017,7 +1017,7 @@ DVL_ATTRIBUTE_HOT void RenderTileType(TileType tile, std::uint8_t *dst, int dstP } /** Returns the mask that defines what parts of the tile are opaque. */ -const std::uint32_t *GetMask(TileType tile, ArchType archType) +const std::uint32_t *GetMask(TileType tile, uint16_t levelPieceId, ArchType archType) { #ifdef _DEBUG if ((SDL_GetModState() & KMOD_ALT) != 0) { @@ -1030,12 +1030,12 @@ const std::uint32_t *GetMask(TileType tile, ArchType archType) return &WallMaskFullyTrasparent[TILE_HEIGHT - 1]; } if (archType == ArchType::Left && tile != TileType::LeftTriangle) { - if (TileHasAny(level_piece_id, TileProperties::TransparentLeft)) { + if (TileHasAny(levelPieceId, TileProperties::TransparentLeft)) { return &LeftMaskTransparent[TILE_HEIGHT - 1]; } } if (archType == ArchType::Right && tile != TileType::RightTriangle) { - if (TileHasAny(level_piece_id, TileProperties::TransparentRight)) { + if (TileHasAny(levelPieceId, TileProperties::TransparentRight)) { return &RightMaskTransparent[TILE_HEIGHT - 1]; } } @@ -1142,10 +1142,10 @@ void RenderBlackTileFull(std::uint8_t *dst, int dstPitch) } // namespace -void RenderTile(const Surface &out, Point position, LevelCelBlock levelCelBlock, ArchType archType) +void RenderTile(const Surface &out, Point position, LevelCelBlock levelCelBlock, uint16_t levelPieceId, ArchType archType) { const TileType tile = levelCelBlock.type(); - const uint32_t *mask = GetMask(tile, archType); + const uint32_t *mask = GetMask(tile, levelPieceId, archType); if (mask == nullptr) return; diff --git a/Source/engine/render/dun_render.hpp b/Source/engine/render/dun_render.hpp index bde1ddc97..f818da10d 100644 --- a/Source/engine/render/dun_render.hpp +++ b/Source/engine/render/dun_render.hpp @@ -122,9 +122,10 @@ private: * @param out Target buffer * @param position Target buffer coordinates * @param levelCelBlock The MIN block of the level CEL file. + * @param levelPieceId The piece ID (index into SOLData and DPieceMicros). * @param archType The type of arch to render. */ -void RenderTile(const Surface &out, Point position, LevelCelBlock levelCelBlock, ArchType archType); +void RenderTile(const Surface &out, Point position, LevelCelBlock levelCelBlock, uint16_t levelPieceId, ArchType archType); /** * @brief Render a black 64x31 tile ◆ diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index 378fd8e1e..6ce13de39 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -70,10 +70,6 @@ bool cel_transparency_active; * Specifies whether foliage (tile has extra content that overlaps previous tile) being rendered. */ bool cel_foliage_active = false; -/** - * Specifies the current dungeon piece ID of the level, as used during rendering of the level tiles. - */ -int level_piece_id; // DevilutionX extension. extern void DrawControllerModifierHints(const Surface &out); @@ -504,22 +500,24 @@ static void DrawDungeon(const Surface & /*out*/, Point /*tilePosition*/, Point / */ void DrawCell(const Surface &out, Point tilePosition, Point targetBufferPosition) { - level_piece_id = dPiece[tilePosition.x][tilePosition.y]; - MICROS *pMap = &DPieceMicros[level_piece_id]; - cel_transparency_active = TileHasAny(level_piece_id, TileProperties::Transparent) && TransList[dTransVal[tilePosition.x][tilePosition.y]]; - cel_foliage_active = !TileHasAny(level_piece_id, TileProperties::Solid); + const uint16_t levelPieceId = dPiece[tilePosition.x][tilePosition.y]; + MICROS *pMap = &DPieceMicros[levelPieceId]; + cel_transparency_active = TileHasAny(levelPieceId, TileProperties::Transparent) && TransList[dTransVal[tilePosition.x][tilePosition.y]]; + cel_foliage_active = !TileHasAny(levelPieceId, TileProperties::Solid); for (int i = 0; i < (MicroTileLen / 2); i++) { { const LevelCelBlock levelCelBlock { pMap->mt[2 * i] }; if (levelCelBlock.hasValue()) { - RenderTile(out, targetBufferPosition, levelCelBlock, + RenderTile(out, targetBufferPosition, + levelCelBlock, levelPieceId, i == 0 ? ArchType::Left : ArchType::None); } } { const LevelCelBlock levelCelBlock { pMap->mt[2 * i + 1] }; if (levelCelBlock.hasValue()) { - RenderTile(out, targetBufferPosition + Displacement { TILE_WIDTH / 2, 0 }, levelCelBlock, + RenderTile(out, targetBufferPosition + Displacement { TILE_WIDTH / 2, 0 }, + levelCelBlock, levelPieceId, i == 0 ? ArchType::Right : ArchType::None); } } @@ -539,17 +537,17 @@ void DrawFloor(const Surface &out, Point tilePosition, Point targetBufferPositio cel_transparency_active = false; LightTableIndex = dLight[tilePosition.x][tilePosition.y]; - const uint16_t pn = dPiece[tilePosition.x][tilePosition.y]; + const uint16_t levelPieceId = dPiece[tilePosition.x][tilePosition.y]; { - const LevelCelBlock levelCelBlock { DPieceMicros[pn].mt[0] }; + const LevelCelBlock levelCelBlock { DPieceMicros[levelPieceId].mt[0] }; if (levelCelBlock.hasValue()) { - RenderTile(out, targetBufferPosition, levelCelBlock, ArchType::Left); + RenderTile(out, targetBufferPosition, levelCelBlock, levelPieceId, ArchType::Left); } } { - const LevelCelBlock levelCelBlock { DPieceMicros[pn].mt[1] }; + const LevelCelBlock levelCelBlock { DPieceMicros[levelPieceId].mt[1] }; if (levelCelBlock.hasValue()) { - RenderTile(out, targetBufferPosition + Displacement { TILE_WIDTH / 2, 0 }, levelCelBlock, ArchType::Right); + RenderTile(out, targetBufferPosition + Displacement { TILE_WIDTH / 2, 0 }, levelCelBlock, levelPieceId, ArchType::Right); } } } diff --git a/Source/engine/render/scrollrt.h b/Source/engine/render/scrollrt.h index 7c549ae3d..a94cad15f 100644 --- a/Source/engine/render/scrollrt.h +++ b/Source/engine/render/scrollrt.h @@ -16,7 +16,6 @@ namespace devilution { extern int LightTableIndex; extern bool cel_transparency_active; extern bool cel_foliage_active; -extern int level_piece_id; extern bool AutoMapShowItems; extern bool frameflag;