From c97c3ac7b185ef27df6071c6e7f51a1315436cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Thu, 15 Feb 2024 00:02:34 +0100 Subject: [PATCH 1/5] Extract `GetEntitiesModType` function --- src/game/client/components/mapimages.cpp | 39 +++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 80b3ae177..519bdb5e0 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -158,25 +158,30 @@ void CMapImages::LoadBackground(class CLayers *pLayers, class IMap *pMap) OnMapLoadImpl(pLayers, pMap); } +static EMapImageModType GetEntitiesModType(const CGameInfo &GameInfo) +{ + if(GameInfo.m_EntitiesFDDrace) + return MAP_IMAGE_MOD_TYPE_FDDRACE; + else if(GameInfo.m_EntitiesDDNet) + return MAP_IMAGE_MOD_TYPE_DDNET; + else if(GameInfo.m_EntitiesDDRace) + return MAP_IMAGE_MOD_TYPE_DDRACE; + else if(GameInfo.m_EntitiesRace) + return MAP_IMAGE_MOD_TYPE_RACE; + else if(GameInfo.m_EntitiesBW) + return MAP_IMAGE_MOD_TYPE_BLOCKWORLDS; + else if(GameInfo.m_EntitiesFNG) + return MAP_IMAGE_MOD_TYPE_FNG; + else if(GameInfo.m_EntitiesVanilla) + return MAP_IMAGE_MOD_TYPE_VANILLA; + else + return MAP_IMAGE_MOD_TYPE_DDNET; +} + IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType EntityLayerType) { - EMapImageModType EntitiesModType = MAP_IMAGE_MOD_TYPE_DDNET; - bool EntitiesAreMasked = !GameClient()->m_GameInfo.m_DontMaskEntities; - - if(GameClient()->m_GameInfo.m_EntitiesFDDrace) - EntitiesModType = MAP_IMAGE_MOD_TYPE_FDDRACE; - else if(GameClient()->m_GameInfo.m_EntitiesDDNet) - EntitiesModType = MAP_IMAGE_MOD_TYPE_DDNET; - else if(GameClient()->m_GameInfo.m_EntitiesDDRace) - EntitiesModType = MAP_IMAGE_MOD_TYPE_DDRACE; - else if(GameClient()->m_GameInfo.m_EntitiesRace) - EntitiesModType = MAP_IMAGE_MOD_TYPE_RACE; - else if(GameClient()->m_GameInfo.m_EntitiesBW) - EntitiesModType = MAP_IMAGE_MOD_TYPE_BLOCKWORLDS; - else if(GameClient()->m_GameInfo.m_EntitiesFNG) - EntitiesModType = MAP_IMAGE_MOD_TYPE_FNG; - else if(GameClient()->m_GameInfo.m_EntitiesVanilla) - EntitiesModType = MAP_IMAGE_MOD_TYPE_VANILLA; + const bool EntitiesAreMasked = !GameClient()->m_GameInfo.m_DontMaskEntities; + const EMapImageModType EntitiesModType = GetEntitiesModType(GameClient()->m_GameInfo); if(!m_aEntitiesIsLoaded[(EntitiesModType * 2) + (int)EntitiesAreMasked]) { From 29d924e061fd156d639e8a10644736c0f79b1dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 16 Mar 2024 17:52:54 +0100 Subject: [PATCH 2/5] Simplify handling of entities paths, remove unnecessary variables --- src/game/client/components/mapimages.cpp | 45 +++++++++--------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 519bdb5e0..6a8603af6 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -187,43 +187,30 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit { m_aEntitiesIsLoaded[(EntitiesModType * 2) + (int)EntitiesAreMasked] = true; - char aPath[64]; - str_format(aPath, sizeof(aPath), "%s/%s.png", m_aEntitiesPath, gs_apModEntitiesNames[EntitiesModType]); - int TextureLoadFlag = 0; if(Graphics()->HasTextureArraysSupport()) TextureLoadFlag = (Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE) | IGraphics::TEXLOAD_NO_2D_TEXTURE; CImageInfo ImgInfo; - bool ImagePNGLoaded = false; - if(Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL)) - ImagePNGLoaded = true; - else - { - bool TryDefault = true; - // try as single ddnet replacement - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET) - { - str_format(aPath, sizeof(aPath), "%s.png", m_aEntitiesPath); - if(Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL)) - { - ImagePNGLoaded = true; - TryDefault = false; - } - } + char aPath[IO_MAX_PATH_LENGTH]; + str_format(aPath, sizeof(aPath), "%s/%s.png", m_aEntitiesPath, gs_apModEntitiesNames[EntitiesModType]); + Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL); - if(!ImagePNGLoaded && TryDefault) - { - // try default - str_format(aPath, sizeof(aPath), "editor/entities_clear/%s.png", gs_apModEntitiesNames[EntitiesModType]); - if(Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL)) - { - ImagePNGLoaded = true; - } - } + // try as single ddnet replacement + if(ImgInfo.m_pData == nullptr && EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET) + { + str_format(aPath, sizeof(aPath), "%s.png", m_aEntitiesPath); + Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL); } - if(ImagePNGLoaded && ImgInfo.m_Width > 0 && ImgInfo.m_Height > 0) + // try default + if(ImgInfo.m_pData == nullptr) + { + str_format(aPath, sizeof(aPath), "editor/entities_clear/%s.png", gs_apModEntitiesNames[EntitiesModType]); + Graphics()->LoadPNG(&ImgInfo, aPath, IStorage::TYPE_ALL); + } + + if(ImgInfo.m_pData != nullptr) { const size_t PixelSize = ImgInfo.PixelSize(); const size_t BuildImageSize = (size_t)ImgInfo.m_Width * ImgInfo.m_Height * PixelSize; From f1deec2c84431db620c7a12a1cd024852d7c21cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 16 Mar 2024 17:58:48 +0100 Subject: [PATCH 3/5] Rename variables `i` to `ModType` and `n` to `LayerType` --- src/game/client/components/mapimages.cpp | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 6a8603af6..80896a726 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -219,9 +219,9 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit uint8_t *pBuildImgData = (uint8_t *)malloc(BuildImageSize); // build game layer - for(int n = 0; n < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++n) + for(int LayerType = 0; LayerType < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++LayerType) { - dbg_assert(!m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][n].IsValid(), "entities texture already loaded when it should not be"); + dbg_assert(!m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][LayerType].IsValid(), "entities texture already loaded when it should not be"); // set everything transparent mem_zero(pBuildImgData, BuildImageSize); @@ -236,10 +236,10 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit { if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_BOOST) { - if(n == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && !IsValidGameTile((int)TileIndex) && !IsValidFrontTile((int)TileIndex) && !IsValidSpeedupTile((int)TileIndex) && + if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && !IsValidGameTile((int)TileIndex) && !IsValidFrontTile((int)TileIndex) && !IsValidSpeedupTile((int)TileIndex) && !IsValidTeleTile((int)TileIndex) && !IsValidTuneTile((int)TileIndex)) ValidTile = false; - else if(n == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH) + else if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH) { if(!IsValidSwitchTile((int)TileIndex)) ValidTile = false; @@ -260,7 +260,7 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit } } - if(n == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) + if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) TileIndex = 8; int X = TileIndex % 16; @@ -274,7 +274,7 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit } } - m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][n] = Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, pBuildImgData, TextureLoadFlag, aPath); + m_aaEntitiesTextures[(EntitiesModType * 2) + (int)EntitiesAreMasked][LayerType] = Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, pBuildImgData, TextureLoadFlag, aPath); } free(pBuildImgData); @@ -322,20 +322,20 @@ void CMapImages::ChangeEntitiesPath(const char *pPath) str_format(m_aEntitiesPath, sizeof(m_aEntitiesPath), "assets/entities/%s", pPath); } - for(int i = 0; i < MAP_IMAGE_MOD_TYPE_COUNT * 2; ++i) + for(int ModType = 0; ModType < MAP_IMAGE_MOD_TYPE_COUNT * 2; ++ModType) { - if(m_aEntitiesIsLoaded[i]) + if(m_aEntitiesIsLoaded[ModType]) { - for(int n = 0; n < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++n) + for(int LayerType = 0; LayerType < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++LayerType) { - if(m_aaEntitiesTextures[i][n].IsValid()) + if(m_aaEntitiesTextures[ModType][LayerType].IsValid()) { - Graphics()->UnloadTexture(&(m_aaEntitiesTextures[i][n])); + Graphics()->UnloadTexture(&(m_aaEntitiesTextures[ModType][LayerType])); } - m_aaEntitiesTextures[i][n] = IGraphics::CTextureHandle(); + m_aaEntitiesTextures[ModType][LayerType] = IGraphics::CTextureHandle(); } - m_aEntitiesIsLoaded[i] = false; + m_aEntitiesIsLoaded[ModType] = false; } } } From 033b659570604014148bcbef3c35a16f78700579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 16 Mar 2024 18:01:17 +0100 Subject: [PATCH 4/5] Avoid unnecessary calculations for invalid tiles Only calculate offsets for valid tiles when the offsets will be used. --- src/game/client/components/mapimages.cpp | 25 +++++++++++------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 80896a726..eff8b1063 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -214,9 +214,7 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit { const size_t PixelSize = ImgInfo.PixelSize(); const size_t BuildImageSize = (size_t)ImgInfo.m_Width * ImgInfo.m_Height * PixelSize; - - uint8_t *pTmpImgData = ImgInfo.m_pData; - uint8_t *pBuildImgData = (uint8_t *)malloc(BuildImageSize); + uint8_t *pBuildImgData = static_cast(malloc(BuildImageSize)); // build game layer for(int LayerType = 0; LayerType < MAP_IMAGE_ENTITY_LAYER_TYPE_COUNT; ++LayerType) @@ -260,17 +258,18 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit } } - if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) - TileIndex = 8; - - int X = TileIndex % 16; - int Y = TileIndex / 16; - - int CopyWidth = ImgInfo.m_Width / 16; - int CopyHeight = ImgInfo.m_Height / 16; if(ValidTile) { - Graphics()->CopyTextureBufferSub(pBuildImgData, pTmpImgData, ImgInfo.m_Width, ImgInfo.m_Height, PixelSize, (size_t)X * CopyWidth, (size_t)Y * CopyHeight, CopyWidth, CopyHeight); + if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) + { + TileIndex = 8; + } + + const size_t CopyWidth = ImgInfo.m_Width / 16; + const size_t CopyHeight = ImgInfo.m_Height / 16; + const size_t OffsetX = (size_t)(TileIndex % 16) * CopyWidth; + const size_t OffsetY = (size_t)(TileIndex / 16) * CopyHeight; + Graphics()->CopyTextureBufferSub(pBuildImgData, ImgInfo.m_pData, ImgInfo.m_Width, ImgInfo.m_Height, PixelSize, OffsetX, OffsetY, CopyWidth, CopyHeight); } } @@ -291,10 +290,8 @@ IGraphics::CTextureHandle CMapImages::GetSpeedupArrow() { int TextureLoadFlag = (Graphics()->Uses2DTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE) | IGraphics::TEXLOAD_NO_2D_TEXTURE; m_SpeedupArrowTexture = Graphics()->LoadTexture("editor/speed_arrow_array.png", IStorage::TYPE_ALL, TextureLoadFlag); - m_SpeedupArrowIsLoaded = true; } - return m_SpeedupArrowTexture; } From d57a2d490eeb18bf08325d5aef5d75d933bd0f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20M=C3=BCller?= Date: Sat, 16 Mar 2024 18:03:18 +0100 Subject: [PATCH 5/5] Extract `IsValidTile` function --- src/game/client/components/mapimages.cpp | 75 ++++++++++++++---------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index eff8b1063..3b6ba76df 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -178,6 +178,48 @@ static EMapImageModType GetEntitiesModType(const CGameInfo &GameInfo) return MAP_IMAGE_MOD_TYPE_DDNET; } +static bool IsValidTile(int LayerType, bool EntitiesAreMasked, EMapImageModType EntitiesModType, int TileIndex) +{ + if(TileIndex == TILE_AIR) + return false; + if(!EntitiesAreMasked) + return true; + + if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || EntitiesModType == MAP_IMAGE_MOD_TYPE_DDRACE) + { + if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_BOOST) + { + if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && + !IsValidGameTile(TileIndex) && + !IsValidFrontTile(TileIndex) && + !IsValidSpeedupTile(TileIndex) && + !IsValidTeleTile(TileIndex) && + !IsValidTuneTile(TileIndex)) + { + return false; + } + else if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && + !IsValidSwitchTile(TileIndex)) + { + return false; + } + } + } + else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_RACE && IsCreditsTile(TileIndex)) + { + return false; + } + else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_FNG && IsCreditsTile(TileIndex)) + { + return false; + } + else if(EntitiesModType == MAP_IMAGE_MOD_TYPE_VANILLA && IsCreditsTile(TileIndex)) + { + return false; + } + return true; +} + IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType EntityLayerType) { const bool EntitiesAreMasked = !GameClient()->m_GameInfo.m_DontMaskEntities; @@ -226,39 +268,8 @@ IGraphics::CTextureHandle CMapImages::GetEntities(EMapImageEntityLayerType Entit for(int i = 0; i < 256; ++i) { - bool ValidTile = i != 0; int TileIndex = i; - if(EntitiesAreMasked) - { - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || EntitiesModType == MAP_IMAGE_MOD_TYPE_DDRACE) - { - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_BOOST) - { - if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && !IsValidGameTile((int)TileIndex) && !IsValidFrontTile((int)TileIndex) && !IsValidSpeedupTile((int)TileIndex) && - !IsValidTeleTile((int)TileIndex) && !IsValidTuneTile((int)TileIndex)) - ValidTile = false; - else if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH) - { - if(!IsValidSwitchTile((int)TileIndex)) - ValidTile = false; - } - } - } - else if((EntitiesModType == MAP_IMAGE_MOD_TYPE_RACE) && IsCreditsTile((int)TileIndex)) - { - ValidTile = false; - } - else if((EntitiesModType == MAP_IMAGE_MOD_TYPE_FNG) && IsCreditsTile((int)TileIndex)) - { - ValidTile = false; - } - else if((EntitiesModType == MAP_IMAGE_MOD_TYPE_VANILLA) && IsCreditsTile((int)TileIndex)) - { - ValidTile = false; - } - } - - if(ValidTile) + if(IsValidTile(LayerType, EntitiesAreMasked, EntitiesModType, TileIndex)) { if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_SWITCH && TileIndex == TILE_SWITCHTIMEDOPEN) {