1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-15 11:46:56 +02:00

Fixed rendering priority of battlefield background obstacles

This commit is contained in:
Ivan Savenko 2023-08-07 21:18:43 +03:00
parent 3f6cbc6312
commit 62a5eeebbc
3 changed files with 22 additions and 13 deletions

View File

@ -127,13 +127,26 @@ void BattleObstacleController::obstaclePlaced(const std::vector<std::shared_ptr<
void BattleObstacleController::showAbsoluteObstacles(Canvas & canvas) void BattleObstacleController::showAbsoluteObstacles(Canvas & canvas)
{ {
//Blit absolute obstacles //Blit absolute obstacles
for(auto & oi : owner.curInt->cb->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) 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) if (obstacle->obstacleType == CObstacleInstance::MOAT)
continue; 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(EBattleFieldLayer::OBSTACLES, obstacle->pos, [this, obstacle]( BattleRenderer::RendererRef canvas ){
renderer.insert(layer, obstacle->pos, [this, obstacle]( BattleRenderer::RendererRef canvas ){
auto img = getObstacleImage(*obstacle); auto img = getObstacleImage(*obstacle);
if(img) if(img)
{ {

View File

@ -16,12 +16,11 @@ class BattleInterface;
enum class EBattleFieldLayer { enum class EBattleFieldLayer {
// confirmed ordering requirements: // confirmed ordering requirements:
OBSTACLES_BG = 0,
CORPSES = 0, CORPSES = 0,
WALLS = 1, WALLS = 1,
HEROES = 2, HEROES = 2,
STACKS = 2, // after corpses, obstacles, walls STACKS = 2, // after corpses, obstacles, walls
OBSTACLES_FG = 3, // after stacks OBSTACLES = 3, // after stacks
STACK_AMOUNTS = 3, // after stacks, obstacles, corpses STACK_AMOUNTS = 3, // after stacks, obstacles, corpses
EFFECTS = 4, // after obstacles, battlements EFFECTS = 4, // after obstacles, battlements
}; };

View File

@ -307,15 +307,13 @@ void BattleSiegeController::collectRenderableObjects(BattleRenderer & renderer)
renderer.insert( EBattleFieldLayer::STACKS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ renderer.insert( EBattleFieldLayer::STACKS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){
owner.stacksController->showStack(canvas, getTurretStack(wallPiece)); 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); showWallPiece(canvas, wallPiece);
}); });
} }
renderer.insert( EBattleFieldLayer::WALLS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){ renderer.insert( EBattleFieldLayer::WALLS, getWallPiecePosition(wallPiece), [this, wallPiece](BattleRenderer::RendererRef canvas){
showWallPiece(canvas, wallPiece); showWallPiece(canvas, wallPiece);
}); });
} }
} }