Skip to content

Commit

Permalink
reuse iconHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
rt committed Dec 14, 2018
1 parent aba4707 commit aa85f9d
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 23 deletions.
4 changes: 2 additions & 2 deletions rts/Game/Game.cpp
Expand Up @@ -503,7 +503,7 @@ void CGame::LoadDefs(LuaParser* defsParser)

{
loadscreen->SetLoadMessage("Loading Radar Icons");
icon::iconHandler = new icon::CIconHandler();
icon::iconHandler.Init();
}
{
ScopedOnceTimer timer("Game::LoadDefs (Sound)");
Expand Down Expand Up @@ -831,7 +831,7 @@ void CGame::KillMisc()
void CGame::KillRendering()
{
LOG("[Game::%s][1]", __func__);
spring::SafeDelete(icon::iconHandler);
icon::iconHandler.Kill();
spring::SafeDelete(geometricObjects);
worldDrawer.Kill();
}
Expand Down
7 changes: 3 additions & 4 deletions rts/Lua/LuaUnsyncedCtrl.cpp
Expand Up @@ -1690,7 +1690,7 @@ int LuaUnsyncedCtrl::AddUnitIcon(lua_State* L)
const float size = luaL_optnumber(L, 3, 1.0f);
const float dist = luaL_optnumber(L, 4, 1.0f);
const bool radAdjust = luaL_optboolean(L, 5, false);
lua_pushboolean(L, icon::iconHandler->AddIcon(iconName, texName,
lua_pushboolean(L, icon::iconHandler.AddIcon(iconName, texName,
size, dist, radAdjust));
return 1;
}
Expand All @@ -1701,8 +1701,7 @@ int LuaUnsyncedCtrl::FreeUnitIcon(lua_State* L)
if (CLuaHandle::GetHandleSynced(L))
return 0;

const string iconName = luaL_checkstring(L, 1);
lua_pushboolean(L, icon::iconHandler->FreeIcon(iconName));
lua_pushboolean(L, icon::iconHandler.FreeIcon(luaL_checkstring(L, 1)));
return 1;
}

Expand Down Expand Up @@ -2179,7 +2178,7 @@ int LuaUnsyncedCtrl::SetUnitDefIcon(lua_State* L)
if (ud == nullptr)
return 0;

ud->iconType = icon::iconHandler->GetIcon(luaL_checksstring(L, 2));
ud->iconType = icon::iconHandler.GetIcon(luaL_checksstring(L, 2));

// set decoys to the same icon
if (ud->decoyDef != nullptr)
Expand Down
32 changes: 21 additions & 11 deletions rts/Rendering/IconHandler.cpp
Expand Up @@ -9,15 +9,14 @@
#include <cmath>

#include "Rendering/GL/myGL.h"
#include "Rendering/GL/VertexArray.h"
#include "System/Log/ILog.h"
#include "Lua/LuaParser.h"
#include "Textures/Bitmap.h"
#include "System/Exceptions.h"

namespace icon {

CIconHandler* iconHandler = nullptr;
CIconHandler iconHandler;

static CIconData dummyIconData[CIconHandler::ICON_DATA_OFFSET];

Expand All @@ -27,12 +26,21 @@ static CIconData dummyIconData[CIconHandler::ICON_DATA_OFFSET];
// CIconHandler
//

CIconHandler::~CIconHandler()
void CIconHandler::Kill()
{
glDeleteTextures(1, &defTexID);

defTexID = 0;
numIcons = 0;

dummyIconData[ SAFETY_DATA_IDX] = {};
dummyIconData[DEFAULT_DATA_IDX] = {};

iconMap.clear();

for (CIconData& id: iconData) {
id = {};
}
}


Expand All @@ -53,6 +61,7 @@ bool CIconHandler::LoadIcons(const std::string& filename)

for (const std::string& iconName : iconNames) {
const LuaTable iconTable = iconTypes.SubTable(iconName);

AddIcon(
iconName,
iconTable.GetString("bitmap", ""),
Expand Down Expand Up @@ -214,7 +223,8 @@ CIcon::CIcon()
{
CIconData* data = nullptr;

if (iconHandler != nullptr) {
// use default data if handler is initialized
if (iconHandler.defTexID != 0) {
data = &dummyIconData[dataIdx = CIconHandler::DEFAULT_DATA_IDX];
} else {
data = &dummyIconData[dataIdx = CIconHandler::SAFETY_DATA_IDX];
Expand All @@ -226,28 +236,28 @@ CIcon::CIcon()

CIcon::CIcon(unsigned int idx)
{
iconHandler->GetIconDataMut(dataIdx = idx)->Ref();
iconHandler.GetIconDataMut(dataIdx = idx)->Ref();
}

CIcon::CIcon(const CIcon& icon)
{
iconHandler->GetIconDataMut(dataIdx = icon.dataIdx)->Ref();
iconHandler.GetIconDataMut(dataIdx = icon.dataIdx)->Ref();
}

CIcon::~CIcon()
{
// NB: icons can outlive the handler
UnRefData(iconHandler);
UnRefData(&iconHandler);
}


CIcon& CIcon::operator=(const CIcon& icon)
{
if (dataIdx != icon.dataIdx) {
CIconData* iconData = iconHandler->GetIconDataMut(dataIdx);
CIconData* iconData = iconHandler.GetIconDataMut(dataIdx);

iconData->UnRef();
iconData = iconHandler->GetIconDataMut(dataIdx = icon.dataIdx);
iconData = iconHandler.GetIconDataMut(dataIdx = icon.dataIdx);
iconData->Ref();
}

Expand All @@ -262,8 +272,8 @@ void CIcon::UnRefData(CIconHandler* ih) {
dataIdx = CIconHandler::SAFETY_DATA_IDX;
}

const CIconData* CIcon::operator->() const { return iconHandler->GetIconData(dataIdx); }
const CIconData* CIcon::GetIconData() const { return iconHandler->GetIconData(dataIdx); }
const CIconData* CIcon::operator->() const { return iconHandler.GetIconData(dataIdx); }
const CIconData* CIcon::GetIconData() const { return iconHandler.GetIconData(dataIdx); }



Expand Down
8 changes: 5 additions & 3 deletions rts/Rendering/IconHandler.h
Expand Up @@ -97,10 +97,12 @@ namespace icon {
friend class CIcon;

public:
CIconHandler() { LoadIcons("gamedata/icontypes.lua"); }
~CIconHandler();
CIconHandler() = default;
CIconHandler(const CIconHandler&) = delete; // no-copy

void Init() { LoadIcons("gamedata/icontypes.lua"); }
void Kill();

bool AddIcon(
const std::string& iconName,
const std::string& texName,
Expand Down Expand Up @@ -150,7 +152,7 @@ namespace icon {
std::array<CIconData, 2048> iconData;
};

extern CIconHandler* iconHandler;
extern CIconHandler iconHandler;
}

#endif // ICON_HANDLER_H
4 changes: 2 additions & 2 deletions rts/Rendering/UnitDrawer.cpp
Expand Up @@ -717,7 +717,7 @@ void CUnitDrawer::DrawUnitIcon(CUnit* unit, GL::RenderDataBufferTC* buffer, bool
const icon::CIconData* iconData = nullptr;

if (useDefaultIcon) {
iconData = icon::iconHandler->GetDefaultIconData();
iconData = icon::iconHandler.GetDefaultIconData();
} else {
iconData = unit->unitDef->iconType.GetIconData();
}
Expand Down Expand Up @@ -1580,7 +1580,7 @@ inline const icon::CIconData* GetUnitIcon(const CUnit* unit) {
return (unitDef->iconType.GetIconData());

if ((losStatus & LOS_INRADAR) != 0)
iconData = icon::iconHandler->GetDefaultIconData();
iconData = icon::iconHandler.GetDefaultIconData();

return iconData;
}
Expand Down
2 changes: 1 addition & 1 deletion rts/Sim/Units/UnitDef.cpp
Expand Up @@ -477,7 +477,7 @@ UnitDef::UnitDef(const LuaTable& udTable, const std::string& unitName, int id)
category = CCategoryHandler::Instance()->GetCategories(udTable.GetString("category", ""));
noChaseCategory = CCategoryHandler::Instance()->GetCategories(udTable.GetString("noChaseCategory", ""));

iconType = icon::iconHandler->GetIcon(udTable.GetString("iconType", "default"));
iconType = icon::iconHandler.GetIcon(udTable.GetString("iconType", "default"));

shieldWeaponDef = nullptr;
stockpileWeaponDef = nullptr;
Expand Down

0 comments on commit aa85f9d

Please sign in to comment.