From 62a5eeebbcc42e56084b6c2f1ae447092eb285d3 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Mon, 7 Aug 2023 21:18:43 +0300 Subject: [PATCH] Fixed rendering priority of battlefield background obstacles --- client/battle/BattleObstacleController.cpp | 28 +++++++++++++++------- client/battle/BattleRenderer.h | 3 +-- client/battle/BattleSiegeController.cpp | 4 +--- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/client/battle/BattleObstacleController.cpp b/client/battle/BattleObstacleController.cpp index 09f46223a..d41b09a66 100644 --- a/client/battle/BattleObstacleController.cpp +++ b/client/battle/BattleObstacleController.cpp @@ -127,13 +127,26 @@ void BattleObstacleController::obstaclePlaced(const std::vectorcb->battleGetAllObstacles()) + for(auto & obstacle : owner.curInt->cb->battleGetAllObstacles()) { - if(oi->obstacleType == CObstacleInstance::ABSOLUTE_OBSTACLE) + if(obstacle->obstacleType == CObstacleInstance::ABSOLUTE_OBSTACLE) { - auto img = getObstacleImage(*oi); + auto img = getObstacleImage(*obstacle); if(img) - canvas.draw(img, Point(oi->getInfo().width, oi->getInfo().height)); + canvas.draw(img, Point(obstacle->getInfo().width, obstacle->getInfo().height)); + } + + if (obstacle->obstacleType == CObstacleInstance::USUAL) + { + if (obstacle->getInfo().isForegroundObstacle) + continue; + + auto img = getObstacleImage(*obstacle); + if(img) + { + Point p = getObstaclePosition(img, *obstacle); + canvas.draw(img, p); + } } } } @@ -148,11 +161,10 @@ void BattleObstacleController::collectRenderableObjects(BattleRenderer & rendere if (obstacle->obstacleType == CObstacleInstance::MOAT) continue; - bool isForeground = obstacle->obstacleType == CObstacleInstance::USUAL && obstacle->getInfo().isForegroundObstacle; + if (obstacle->obstacleType == CObstacleInstance::USUAL && !obstacle->getInfo().isForegroundObstacle) + continue; - auto layer = isForeground ? EBattleFieldLayer::OBSTACLES_FG : EBattleFieldLayer::OBSTACLES_BG; - - renderer.insert(layer, obstacle->pos, [this, obstacle]( BattleRenderer::RendererRef canvas ){ + renderer.insert(EBattleFieldLayer::OBSTACLES, obstacle->pos, [this, obstacle]( BattleRenderer::RendererRef canvas ){ auto img = getObstacleImage(*obstacle); if(img) { diff --git a/client/battle/BattleRenderer.h b/client/battle/BattleRenderer.h index fa5d4e15f..0dbab110b 100644 --- a/client/battle/BattleRenderer.h +++ b/client/battle/BattleRenderer.h @@ -16,12 +16,11 @@ class BattleInterface; enum class EBattleFieldLayer { // confirmed ordering requirements: - OBSTACLES_BG = 0, CORPSES = 0, WALLS = 1, HEROES = 2, STACKS = 2, // after corpses, obstacles, walls - OBSTACLES_FG = 3, // after stacks + OBSTACLES = 3, // after stacks STACK_AMOUNTS = 3, // after stacks, obstacles, corpses EFFECTS = 4, // after obstacles, battlements }; diff --git a/client/battle/BattleSiegeController.cpp b/client/battle/BattleSiegeController.cpp index 46852849c..63d5bd9e5 100644 --- a/client/battle/BattleSiegeController.cpp +++ b/client/battle/BattleSiegeController.cpp @@ -307,15 +307,13 @@ void BattleSiegeController::collectRenderableObjects(BattleRenderer & renderer) renderer.insert( EBattleFieldLayer::STACKS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ owner.stacksController->showStack(canvas, getTurretStack(wallPiece)); }); - renderer.insert( EBattleFieldLayer::OBSTACLES_FG, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ + renderer.insert( EBattleFieldLayer::OBSTACLES, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ showWallPiece(canvas, wallPiece); }); } renderer.insert( EBattleFieldLayer::WALLS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ showWallPiece(canvas, wallPiece); }); - - } }