From 0e6546b51410649cb3f792315f7ed91434c526c3 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 3 Apr 2025 01:35:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=B8=80=E4=BA=9BComponent/C?= =?UTF-8?q?omponentManager=E5=AE=9A=E4=B9=89StaticHashCode/GetHashCode()..?= =?UTF-8?q?.RegistryComponentManager/GetComponentManager()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/component/Component.h | 29 ++++++++- inc/hgl/component/StaticMeshComponent.h | 26 ++++++-- inc/hgl/graph/SceneWorld.h | 60 +++++++++---------- src/SceneGraph/component/ComponentManager.cpp | 35 ++++++++++- .../component/StaticMeshComponentManager.cpp | 5 -- 5 files changed, 109 insertions(+), 46 deletions(-) diff --git a/inc/hgl/component/Component.h b/inc/hgl/component/Component.h index 61b28085..4a09ab70 100644 --- a/inc/hgl/component/Component.h +++ b/inc/hgl/component/Component.h @@ -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 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 diff --git a/inc/hgl/component/StaticMeshComponent.h b/inc/hgl/component/StaticMeshComponent.h index ba9ce6b3..134d51f9 100644 --- a/inc/hgl/component/StaticMeshComponent.h +++ b/inc/hgl/component/StaticMeshComponent.h @@ -16,9 +16,20 @@ class StaticMeshComponentManager:public ComponentManager { public: - StaticMeshComponentManager()=default; + static StaticMeshComponentManager *GetDefaultManager() + { + return GetComponentManager(true); + } - size_t ComponentHashCode()const override; + static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash();} + static constexpr const size_t StaticComponentHashCode (){return hgl::GetTypeHash();} + + 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(cd); } - virtual ~StaticMeshComponent() + virtual ~StaticMeshComponent()=default; + + static constexpr const size_t StaticHashCode() { - SAFE_CLEAR(sm_data); + return hgl::GetTypeHash(); + } + + const size_t GetHashCode()const override + { + return StaticMeshComponent::StaticHashCode(); } StaticMeshComponentData &GetData() {return *sm_data;} diff --git a/inc/hgl/graph/SceneWorld.h b/inc/hgl/graph/SceneWorld.h index 734f43f2..74dd2a9a 100644 --- a/inc/hgl/graph/SceneWorld.h +++ b/inc/hgl/graph/SceneWorld.h @@ -1,40 +1,38 @@ #pragma once + #include -namespace hgl +namespace hgl::graph { - namespace graph + class CameraData { - class CameraData + }; + + class CameraManager + { + public: + }; + + /** + * 世界场景管理器
+ * 管理一个世界场景中的所有资源与场景节点 + */ + class SceneWorld + { + SceneNode *root_node; ///<世界根节点 + + public: + + SceneWorld() { - }; + root_node=new SceneNode; + } - class CameraManager + virtual ~SceneWorld() { - public: - }; + SAFE_CLEAR(root_node); + } - /** - * 世界场景管理器
- * 管理一个世界场景中的所有资源与场景节点 - */ - 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 diff --git a/src/SceneGraph/component/ComponentManager.cpp b/src/SceneGraph/component/ComponentManager.cpp index d4c6a50e..446a4a4c 100644 --- a/src/SceneGraph/component/ComponentManager.cpp +++ b/src/SceneGraph/component/ComponentManager.cpp @@ -1,7 +1,36 @@ #include +#include namespace hgl::graph { + namespace + { + tsl::robin_map 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 &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;iUpdate(delta_time); + //for(int i=0;iUpdate(delta_time); } }//namespace hgl::graph diff --git a/src/SceneGraph/component/StaticMeshComponentManager.cpp b/src/SceneGraph/component/StaticMeshComponentManager.cpp index f6d3da02..70b91519 100644 --- a/src/SceneGraph/component/StaticMeshComponentManager.cpp +++ b/src/SceneGraph/component/StaticMeshComponentManager.cpp @@ -3,11 +3,6 @@ COMPONENT_NAMESPACE_BEGIN -size_t StaticMeshComponentManager::ComponentHashCode()const -{ - return GetTypeHash(); -} - StaticMeshComponent *StaticMeshComponentManager::CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data) { if(!psn||!data)return(nullptr);