#include "ModelManager.hpp" #include "Log/Log.hpp" ModelManager::owner_counter::owner_counter(const owner_counter& other) : counter(other.counter.load()), model(other.model) { } unsigned int ModelManager::FNV1aHash(const char* buf) { unsigned int h_val = 0x811c9dc5; while (*buf) { h_val ^= static_cast(*buf++); h_val *= 0x01000193; } return h_val; } ModelManager::~ModelManager() { models.clear(); } ModelManager::StaticModel* ModelManager::LoadModel(const std::string& name) { if (name.empty()) return nullptr; unsigned int hash = FNV1aHash(name.c_str()); auto counter = models.find(hash); if (counter != models.cend()) { ++counter->second.counter; return counter->second.model; } Loging::Log("Load new model: " + name); // Load model_data owner_counter new_counter; new_counter.counter.store(1); new_counter.model = new StaticModel(); models.try_emplace(hash, new_counter); return new_counter.model; } void ModelManager::FreeModel(const std::string& name) { if (name.empty()) return; unsigned int hash = FNV1aHash(name.c_str()); auto counter = models.find(hash); --counter->second.counter; StaticModel* model = counter->second.model; if (counter->second.counter.load() == 0) { models.erase(hash); delete model; } }