2025-03-25 01:17:18 +08:00
|
|
|
|
#include<hgl/component/Component.h>
|
2025-04-03 01:35:39 +08:00
|
|
|
|
#include<tsl/robin_map.h>
|
2025-06-15 00:49:23 +08:00
|
|
|
|
#include<hgl/type/String.h>
|
|
|
|
|
#include<hgl/log/LogInfo.h>
|
2025-03-25 01:17:18 +08:00
|
|
|
|
|
|
|
|
|
namespace hgl::graph
|
|
|
|
|
{
|
2025-04-03 01:35:39 +08:00
|
|
|
|
namespace
|
|
|
|
|
{
|
2025-06-14 04:13:49 +08:00
|
|
|
|
using ComponentManagerMap=tsl::robin_map<size_t,ComponentManager *>;
|
|
|
|
|
|
|
|
|
|
ComponentManagerMap *component_manager_map=nullptr;
|
2025-04-03 01:35:39 +08:00
|
|
|
|
}//namespace
|
|
|
|
|
|
2025-06-14 04:13:49 +08:00
|
|
|
|
void InitializeComponentManager()
|
|
|
|
|
{
|
|
|
|
|
if(component_manager_map)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
component_manager_map=new ComponentManagerMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UninitializeComponentManager()
|
|
|
|
|
{
|
|
|
|
|
if(!component_manager_map)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
for(auto &cm : *component_manager_map)
|
|
|
|
|
delete cm.second;
|
|
|
|
|
|
|
|
|
|
delete component_manager_map;
|
|
|
|
|
component_manager_map=nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-03 01:35:39 +08:00
|
|
|
|
bool RegistryComponentManager(ComponentManager *cm)
|
|
|
|
|
{
|
|
|
|
|
if(!cm)return(false);
|
|
|
|
|
|
2025-06-14 04:13:49 +08:00
|
|
|
|
if(!component_manager_map)
|
|
|
|
|
return(false);
|
|
|
|
|
|
2025-04-03 01:35:39 +08:00
|
|
|
|
const size_t hash_code=cm->GetHashCode();
|
|
|
|
|
|
2025-06-14 04:13:49 +08:00
|
|
|
|
if(component_manager_map->contains(hash_code))
|
2025-04-03 01:35:39 +08:00
|
|
|
|
return(false);
|
|
|
|
|
|
2025-06-14 04:13:49 +08:00
|
|
|
|
component_manager_map->emplace(hash_code,cm);
|
2025-04-03 01:35:39 +08:00
|
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ComponentManager *GetComponentManager(const size_t hash_code)
|
|
|
|
|
{
|
2025-06-14 04:13:49 +08:00
|
|
|
|
if(!component_manager_map)
|
|
|
|
|
return(nullptr);
|
|
|
|
|
|
|
|
|
|
if(!component_manager_map->contains(hash_code))
|
2025-04-03 01:35:39 +08:00
|
|
|
|
return(nullptr);
|
|
|
|
|
|
2025-06-14 18:47:54 +08:00
|
|
|
|
//tsl::robin_map的[]对于不存在的会自行插入一个,所以不要把下面的.at改成[]
|
2025-06-14 04:13:49 +08:00
|
|
|
|
return component_manager_map->at(hash_code);
|
2025-04-03 01:35:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-15 00:49:23 +08:00
|
|
|
|
ComponentManager::~ComponentManager()
|
|
|
|
|
{
|
|
|
|
|
for(auto *c:component_set)
|
|
|
|
|
{
|
|
|
|
|
c->OnDetach(nullptr);
|
|
|
|
|
|
|
|
|
|
//Component::~Component()函数会再次调用ComponentManager->DetachComponent,其中会执行component_set的删除,整个流程就会出现问题。
|
|
|
|
|
//所以这里先OnDetachManager掉Component中的Manager属性,然后再执行删除
|
|
|
|
|
c->OnDetachManager(this);
|
|
|
|
|
|
|
|
|
|
LOG_INFO(AnsiString("~ComponentManager delete ")+AnsiString::numberOf(c->GetUniqueID()));
|
|
|
|
|
delete c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int ComponentManager::GetComponents(ComponentList &comp_list,SceneNode *node)
|
2025-03-25 01:17:18 +08:00
|
|
|
|
{
|
|
|
|
|
if(!node)return(-1);
|
2025-06-14 04:13:49 +08:00
|
|
|
|
if(comp_list.IsEmpty())return(-2);
|
|
|
|
|
if(!component_manager_map)return(-3);
|
2025-03-25 01:17:18 +08:00
|
|
|
|
|
|
|
|
|
int result=0;
|
|
|
|
|
|
2025-06-15 00:49:23 +08:00
|
|
|
|
for(auto cc:component_set)
|
|
|
|
|
if(cc->GetOwnerNode()==node)
|
2025-03-25 01:17:18 +08:00
|
|
|
|
{
|
2025-06-15 00:49:23 +08:00
|
|
|
|
comp_list.Add(cc);
|
2025-03-25 01:17:18 +08:00
|
|
|
|
++result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ComponentManager::UpdateComponents(const double delta_time)
|
|
|
|
|
{
|
2025-04-03 01:35:39 +08:00
|
|
|
|
//Component **cc=component_set.GetData();
|
2025-03-25 01:17:18 +08:00
|
|
|
|
|
2025-04-03 01:35:39 +08:00
|
|
|
|
//for(int i=0;i<component_set.GetCount();i++)
|
|
|
|
|
// cc[i]->Update(delta_time);
|
2025-03-25 01:17:18 +08:00
|
|
|
|
}
|
|
|
|
|
}//namespace hgl::graph
|