From 92f612f6755d6ba821cd43158d0c094cde671b49 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 14 Jun 2025 18:47:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BComponent/Manager=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=EF=BC=8C=E5=9C=A8WorkObject=E5=B0=81=E8=A3=85Componen?= =?UTF-8?q?t=E7=9B=B8=E5=85=B3=E6=A8=A1=E6=9D=BF=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E5=87=8F=E5=8C=96=E4=BD=BF=E7=94=A8=E9=83=A8?= =?UTF-8?q?=E5=88=86=E3=80=82=E5=BD=93=E5=89=8D=E7=89=88=E6=9C=AC=E5=8F=AF?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=EF=BC=8C=E4=B8=8B=E4=B8=80=E7=89=88=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E6=97=A7=E7=9A=84Renderable=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=88=B0StaticMeshComponent.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Basic/draw_triangle_use_UBO.cpp | 6 +-- inc/hgl/WorkObject.h | 38 +++++++++++++++++++ inc/hgl/component/StaticMeshComponent.h | 11 ++++-- src/SceneGraph/component/ComponentManager.cpp | 2 +- .../component/StaticMeshComponentManager.cpp | 4 +- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/example/Basic/draw_triangle_use_UBO.cpp b/example/Basic/draw_triangle_use_UBO.cpp index 0102b7a4..a104832b 100644 --- a/example/Basic/draw_triangle_use_UBO.cpp +++ b/example/Basic/draw_triangle_use_UBO.cpp @@ -91,11 +91,7 @@ private: SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点 - auto manager=StaticMeshComponentManager::GetDefaultManager(); - - sm_component=manager->CreateStaticMeshComponent(mesh_triangle); - - scene_root->AttachComponent(sm_component); + sm_component=CreateComponent(scene_root,mesh_triangle); //创建一个静态网格组件 scene_root->Add(new SceneNode(mesh_triangle)); diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index 555262ec..5db86956 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -122,6 +122,44 @@ namespace hgl graph::MaterialInstance *mi, graph::Pipeline *pipeline, const std::initializer_list &vad_list); + + public: //Component 相关 + + template + inline C *CreateComponent(ARGS...args) + { + auto manager=C::GetDefaultManager(); //取得默认管理器 + + if(!manager) + { + // LOG_ERROR(OS_TEXT("CreateComponent failed, no default manager!")); + return(nullptr); + } + + return manager->CreateComponent(args...); //创建组件 + } + + template + inline C *CreateComponent(graph::SceneNode *parent_node,ARGS...args) + { + if(!parent_node) + { + // LOG_ERROR(OS_TEXT("CreateComponent failed, parent node is null!")); + return(nullptr); + } + + C *c=this->CreateComponent(args...); //创建组件 + + if(!c) + { + // LOG_ERROR(OS_TEXT("CreateComponent failed, create component failed!")); + return(nullptr); + } + + parent_node->AttachComponent(c); //将组件附加到父节点 + + return c; + } };//class WorkObject /** diff --git a/inc/hgl/component/StaticMeshComponent.h b/inc/hgl/component/StaticMeshComponent.h index 2fd10a9b..30c70bf0 100644 --- a/inc/hgl/component/StaticMeshComponent.h +++ b/inc/hgl/component/StaticMeshComponent.h @@ -45,13 +45,13 @@ public: StaticMeshComponentManager()=default; - StaticMeshComponent *CreateStaticMeshComponent(StaticMeshComponentData *data); + StaticMeshComponent *CreateComponent(StaticMeshComponentData *data); - StaticMeshComponent *CreateStaticMeshComponent(Mesh *m) + StaticMeshComponent *CreateComponent(Mesh *m) { auto sm_cd=new StaticMeshComponentData(m); - return CreateStaticMeshComponent(sm_cd); + return CreateComponent(sm_cd); } virtual Component *CreateComponent(ComponentData *data) override; @@ -71,6 +71,11 @@ public: virtual ~StaticMeshComponent()=default; + static StaticMeshComponentManager *GetDefaultManager() + { + return StaticMeshComponentManager::GetDefaultManager(); + } + static constexpr const size_t StaticHashCode() { return hgl::GetTypeHash(); diff --git a/src/SceneGraph/component/ComponentManager.cpp b/src/SceneGraph/component/ComponentManager.cpp index 762c9141..e97b57a3 100644 --- a/src/SceneGraph/component/ComponentManager.cpp +++ b/src/SceneGraph/component/ComponentManager.cpp @@ -55,7 +55,7 @@ namespace hgl::graph if(!component_manager_map->contains(hash_code)) return(nullptr); - //[]对于不存的会自行插入一个,所以不要把下面的.at改成[] + //tsl::robin_map的[]对于不存在的会自行插入一个,所以不要把下面的.at改成[] return component_manager_map->at(hash_code); } diff --git a/src/SceneGraph/component/StaticMeshComponentManager.cpp b/src/SceneGraph/component/StaticMeshComponentManager.cpp index 6e93b535..37c2d554 100644 --- a/src/SceneGraph/component/StaticMeshComponentManager.cpp +++ b/src/SceneGraph/component/StaticMeshComponentManager.cpp @@ -17,10 +17,10 @@ Component *StaticMeshComponentManager::CreateComponent(ComponentData *data) { if(!data)return(nullptr); - return CreateStaticMeshComponent(reinterpret_cast(data)); + return CreateComponent(reinterpret_cast(data)); } -StaticMeshComponent *StaticMeshComponentManager::CreateStaticMeshComponent(StaticMeshComponentData *data) +StaticMeshComponent *StaticMeshComponentManager::CreateComponent(StaticMeshComponentData *data) { if(!data)return(nullptr);