From 3bcaf0e01252de4ff4002a26c58e916d4c739eb3 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 24 Jun 2025 00:35:35 +0800 Subject: [PATCH] =?UTF-8?q?1.ComponentData/Component/ComponentManager?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=84=E7=A7=8DStaticHashCode/GetHashCode.?= =?UTF-8?q?=202.Component=E5=A2=9E=E5=8A=A0ChangeData=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/component/Component.h | 32 ++++++++++++++++++++++---- inc/hgl/component/MeshComponent.h | 2 ++ src/SceneGraph/component/Component.cpp | 23 ++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/inc/hgl/component/Component.h b/inc/hgl/component/Component.h index 791d3cc8..255a52e4 100644 --- a/inc/hgl/component/Component.h +++ b/inc/hgl/component/Component.h @@ -50,8 +50,19 @@ public: ComponentData()=default; virtual ~ComponentData()=default; + + virtual const size_t GetHashCode()const=0; ///<取得ComponentData的类型哈希值 + virtual const size_t GetComponentHashCode()const=0; ///<取得Component的类型哈希值 + virtual const size_t GetManagerHashCode()const=0; ///<取得ComponentManager的类型哈希值 };//struct ComponentData +#define COMPONENT_DATA_CLASS_BODY(name) static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash();} \ + static constexpr const size_t StaticComponentHashCode(){return hgl::GetTypeHash();} \ + static constexpr const size_t StaticManagerHashCode (){return hgl::GetTypeHash();} \ + const size_t GetHashCode ()const override{return name##ComponentData::StaticHashCode();} \ + const size_t GetComponentHashCode ()const override{return name##ComponentData::StaticComponentHashCode();} \ + const size_t GetManagerHashCode ()const override{return name##ComponentData::StaticManagerHashCode();} + using ComponentDataPtr=SharedPtr; /** @@ -84,7 +95,9 @@ public: Component(ComponentDataPtr,ComponentManager *); virtual ~Component(); - virtual const size_t GetHashCode()const=0; + virtual const size_t GetHashCode()const=0; ///<取得Component的类型哈希值 + virtual const size_t GetDataHashCode()const=0; ///<取得ComponentData的类型哈希值 + virtual const size_t GetManagerHashCode()const=0; ///<取得ComponentManager的类型哈希值 public: @@ -94,6 +107,10 @@ public: ComponentManager * GetManager ()const{return Manager;} ComponentDataPtr GetData ()const{return Data;} +public: + + virtual bool ChangeData(ComponentDataPtr cdp); + public: virtual Component *Duplication(); @@ -112,7 +129,9 @@ public: //事件 #define COMPONENT_CLASS_BODY(name) static name##ComponentManager *GetDefaultManager () {return name##ComponentManager::GetDefaultManager();} \ name##ComponentManager *GetManager ()const {return (name##ComponentManager *)Component::GetManager();} \ static constexpr const size_t StaticHashCode () {return hgl::GetTypeHash();} \ - const size_t GetHashCode ()const override{return name##Component::StaticHashCode();} + const size_t GetHashCode ()const override{return name##Component::StaticHashCode();} \ + const size_t GetDataHashCode ()const override{return name::ComponentData::StaticHashCode();} \ + const size_t GetManagerHashCode ()const override{return name##ComponentManager::StaticHashCode();} using ComponentSet=SortedSet; using ComponentList=ArrayList; @@ -130,8 +149,9 @@ protected: public: - virtual const size_t GetComponentHashCode()const=0; - virtual const size_t GetHashCode()const=0; + virtual const size_t GetComponentHashCode()const=0; ///<取得Component的类型哈希值 + virtual const size_t GetDataHashCode()const=0; ///<取得ComponentData的类型哈希值 + virtual const size_t GetHashCode()const=0; ///<取得ComponentManager的类型哈希值 virtual ~ComponentManager(); @@ -155,9 +175,11 @@ public: //事件 #define COMPONENT_MANAGER_CLASS_BODY(name) static name##ComponentManager * GetDefaultManager () {return GetComponentManager(true);} \ static constexpr const size_t StaticHashCode () {return hgl::GetTypeHash();} \ + static constexpr const size_t StaticDataHashCode () {return hgl::GetTypeHash();} \ static constexpr const size_t StaticComponentHashCode () {return hgl::GetTypeHash();} \ const size_t GetComponentHashCode ()const override{return name##ComponentManager::StaticComponentHashCode();} \ - const size_t GetHashCode ()const override{return name##ComponentManager::StaticHashCode();} \ + const size_t GetDataHashCode ()const override{return name##ComponentManager::StaticDataHashCode();} \ + const size_t GetHashCode ()const override{return name##ComponentManager::StaticHashCode();} bool RegistryComponentManager(ComponentManager *); ComponentManager *GetComponentManager(const size_t hash_code); diff --git a/inc/hgl/component/MeshComponent.h b/inc/hgl/component/MeshComponent.h index 1722fcad..4b38bd0c 100644 --- a/inc/hgl/component/MeshComponent.h +++ b/inc/hgl/component/MeshComponent.h @@ -34,6 +34,8 @@ public: } virtual ~MeshComponentData(); + + COMPONENT_DATA_CLASS_BODY(Mesh) };//struct MeshComponentData class MeshComponent; diff --git a/src/SceneGraph/component/Component.cpp b/src/SceneGraph/component/Component.cpp index 51e2d46d..f087d125 100644 --- a/src/SceneGraph/component/Component.cpp +++ b/src/SceneGraph/component/Component.cpp @@ -33,6 +33,29 @@ namespace hgl::graph Manager->DetachComponent(this); } + bool Component::ChangeData(ComponentDataPtr cdp) + { + if(!cdp) + { + LOG_ERROR(OS_TEXT("Component::ChangeData: invalid component data pointer.")); + return(false); + } + + if(Data==cdp) + return(true); //数据没有变化 + + ComponentData *cd=cdp.get(); + + if(cd->GetHashCode()!=GetHashCode()) //类型不对 + { + LOG_ERROR(OS_TEXT("Component::ChangeData: component data type mismatch.")); + return(false); + } + + Data=cdp; + return(true); + } + Component *Component::Duplication() { return GetManager()->CreateComponent(Data);