实现一些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; Manager=cm;
} }
virtual ~Component()=default; virtual ~Component()
{
SAFE_CLEAR(Data);
}
virtual const size_t GetHashCode()const=0;
public: public:
@ -91,12 +96,13 @@ class ComponentManager
public: public:
virtual const size_t GetComponentHashCode()const=0;
virtual const size_t GetHashCode()const=0;
virtual ~ComponentManager()=default; virtual ~ComponentManager()=default;
public: public:
virtual size_t ComponentHashCode()const=0;
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0; virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
int GetComponentCount()const{return component_set.GetCount();} int GetComponentCount()const{return component_set.GetCount();}
@ -115,4 +121,21 @@ public: //事件
virtual void OnFocusLost(){} ///<焦点丢失事件 virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件 virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager };//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 COMPONENT_NAMESPACE_END

View File

@ -16,9 +16,20 @@ class StaticMeshComponentManager:public ComponentManager
{ {
public: 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); StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
@ -37,9 +48,16 @@ public:
sm_data=reinterpret_cast<StaticMeshComponentData *>(cd); 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;} StaticMeshComponentData &GetData() {return *sm_data;}

View File

@ -1,40 +1,38 @@
#pragma once #pragma once
#include<hgl/graph/SceneNode.h> #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);
}; }
/** SceneNode *GetRootNode(){return root_node;}
* <Br> };//class SceneWorld
* }//namespace hgl::graph
*/
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

View File

@ -1,7 +1,36 @@
#include<hgl/component/Component.h> #include<hgl/component/Component.h>
#include<tsl/robin_map.h>
namespace hgl::graph 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) int ComponentManager::GetComponents(List<Component *> &comp_list,SceneNode *node)
{ {
if(!node)return(-1); if(!node)return(-1);
@ -22,9 +51,9 @@ namespace hgl::graph
void ComponentManager::UpdateComponents(const double delta_time) 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++) //for(int i=0;i<component_set.GetCount();i++)
cc[i]->Update(delta_time); // cc[i]->Update(delta_time);
} }
}//namespace hgl::graph }//namespace hgl::graph

View File

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