实现一些Component/ComponentManager定义StaticHashCode/GetHashCode()...RegistryComponentManager/GetComponentManager()

This commit is contained in:
hyzboy 2025-04-03 01:35:39 +08:00
parent 44b1f13048
commit 0e6546b514
5 changed files with 109 additions and 46 deletions

View File

@ -65,7 +65,12 @@ public:
Manager=cm;
}
virtual ~Component()=default;
virtual ~Component()
{
SAFE_CLEAR(Data);
}
virtual const size_t GetHashCode()const=0;
public:
@ -91,12 +96,13 @@ class ComponentManager
public:
virtual const size_t GetComponentHashCode()const=0;
virtual const size_t GetHashCode()const=0;
virtual ~ComponentManager()=default;
public:
virtual size_t ComponentHashCode()const=0;
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
int GetComponentCount()const{return component_set.GetCount();}
@ -115,4 +121,21 @@ public: //事件
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
bool RegistryComponentManager(ComponentManager *);
ComponentManager *GetComponentManager(const size_t hash_code);
template<typename T> inline T *GetComponentManager(bool create_default=true)
{
T *cm=(T *)GetComponentManager(T::StaticHashCode());
if(!cm&&create_default)
{
cm=new T;
RegistryComponentManager(cm);
}
return cm;
}
COMPONENT_NAMESPACE_END

View File

@ -16,9 +16,20 @@ class StaticMeshComponentManager:public ComponentManager
{
public:
StaticMeshComponentManager()=default;
static StaticMeshComponentManager *GetDefaultManager()
{
return GetComponentManager<StaticMeshComponentManager>(true);
}
size_t ComponentHashCode()const override;
static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash<StaticMeshComponentManager>();}
static constexpr const size_t StaticComponentHashCode (){return hgl::GetTypeHash<StaticMeshComponent>();}
const size_t GetComponentHashCode ()const override{return StaticMeshComponentManager::StaticComponentHashCode();}
const size_t GetHashCode ()const override{return StaticMeshComponentManager::StaticHashCode();}
public:
StaticMeshComponentManager()=default;
StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
@ -37,9 +48,16 @@ public:
sm_data=reinterpret_cast<StaticMeshComponentData *>(cd);
}
virtual ~StaticMeshComponent()
virtual ~StaticMeshComponent()=default;
static constexpr const size_t StaticHashCode()
{
SAFE_CLEAR(sm_data);
return hgl::GetTypeHash<StaticMeshComponent>();
}
const size_t GetHashCode()const override
{
return StaticMeshComponent::StaticHashCode();
}
StaticMeshComponentData &GetData() {return *sm_data;}

View File

@ -1,40 +1,38 @@
#pragma once
#include<hgl/graph/SceneNode.h>
namespace hgl
namespace hgl::graph
{
namespace graph
class CameraData
{
class CameraData
};
class CameraManager
{
public:
};
/**
* <Br>
*
*/
class SceneWorld
{
SceneNode *root_node; ///<世界根节点
public:
SceneWorld()
{
};
root_node=new SceneNode;
}
class CameraManager
virtual ~SceneWorld()
{
public:
};
SAFE_CLEAR(root_node);
}
/**
* <Br>
*
*/
class SceneWorld
{
SceneNode *root_node; ///<世界根节点
public:
SceneWorld()
{
root_node=new SceneNode;
}
virtual ~SceneWorld()
{
SAFE_CLEAR(root_node);
}
SceneNode *GetRootNode() { return root_node; }
};//class SceneWorld
}//namespace graph
}//namespace hgl
SceneNode *GetRootNode(){return root_node;}
};//class SceneWorld
}//namespace hgl::graph

View File

@ -1,7 +1,36 @@
#include<hgl/component/Component.h>
#include<tsl/robin_map.h>
namespace hgl::graph
{
namespace
{
tsl::robin_map<size_t,ComponentManager *> component_manager_map;
}//namespace
bool RegistryComponentManager(ComponentManager *cm)
{
if(!cm)return(false);
const size_t hash_code=cm->GetHashCode();
if(component_manager_map.contains(hash_code))
return(false);
component_manager_map.emplace(hash_code,cm);
return(true);
}
ComponentManager *GetComponentManager(const size_t hash_code)
{
if(!component_manager_map.contains(hash_code))
return(nullptr);
//[]对于不存的会自行插入一个,所以不要把下面的.at改成[]
return component_manager_map.at(hash_code);
}
int ComponentManager::GetComponents(List<Component *> &comp_list,SceneNode *node)
{
if(!node)return(-1);
@ -22,9 +51,9 @@ namespace hgl::graph
void ComponentManager::UpdateComponents(const double delta_time)
{
Component **cc=component_set.GetData();
//Component **cc=component_set.GetData();
for(int i=0;i<component_set.GetCount();i++)
cc[i]->Update(delta_time);
//for(int i=0;i<component_set.GetCount();i++)
// cc[i]->Update(delta_time);
}
}//namespace hgl::graph

View File

@ -3,11 +3,6 @@
COMPONENT_NAMESPACE_BEGIN
size_t StaticMeshComponentManager::ComponentHashCode()const
{
return GetTypeHash<StaticMeshComponentManager>();
}
StaticMeshComponent *StaticMeshComponentManager::CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data)
{
if(!psn||!data)return(nullptr);