From edaf5aa3cad321fdb7cef5837b91634bf18f371e Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 14 Jun 2025 04:13:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=88=B6=E4=BD=9CStaticMeshC?= =?UTF-8?q?omponent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Basic/draw_triangle_use_UBO.cpp | 13 ++++++ inc/hgl/component/Component.h | 8 +++- inc/hgl/component/StaticMeshComponent.h | 4 +- src/SceneGraph/RenderFramework.cpp | 6 +++ src/SceneGraph/component/ComponentManager.cpp | 44 ++++++++++++++++--- .../component/StaticMeshComponentManager.cpp | 6 ++- 6 files changed, 71 insertions(+), 10 deletions(-) diff --git a/example/Basic/draw_triangle_use_UBO.cpp b/example/Basic/draw_triangle_use_UBO.cpp index de3ce72d..0102b7a4 100644 --- a/example/Basic/draw_triangle_use_UBO.cpp +++ b/example/Basic/draw_triangle_use_UBO.cpp @@ -5,6 +5,8 @@ #include #include +#include + using namespace hgl; using namespace hgl::graph; @@ -40,6 +42,8 @@ private: Pipeline * pipeline =nullptr; + StaticMeshComponent *sm_component=nullptr; + private: bool InitMaterial() @@ -87,7 +91,11 @@ private: SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点 + auto manager=StaticMeshComponentManager::GetDefaultManager(); + sm_component=manager->CreateStaticMeshComponent(mesh_triangle); + + scene_root->AttachComponent(sm_component); scene_root->Add(new SceneNode(mesh_triangle)); @@ -98,6 +106,11 @@ public: using WorkObject::WorkObject; + ~TestApp() + { + SAFE_CLEAR(sm_component); + } + bool Init() override { if(!InitMaterial()) diff --git a/inc/hgl/component/Component.h b/inc/hgl/component/Component.h index aa150d24..e86ddb38 100644 --- a/inc/hgl/component/Component.h +++ b/inc/hgl/component/Component.h @@ -43,7 +43,13 @@ COMPONENT_NAMESPACE_BEGIN class ComponentManager; class SceneNode; -struct ComponentData{}; +struct ComponentData +{ +public: + + ComponentData()=default; + virtual ~ComponentData()=default; +}; /** * 基础组件
diff --git a/inc/hgl/component/StaticMeshComponent.h b/inc/hgl/component/StaticMeshComponent.h index cb9a51a6..2fd10a9b 100644 --- a/inc/hgl/component/StaticMeshComponent.h +++ b/inc/hgl/component/StaticMeshComponent.h @@ -49,7 +49,9 @@ public: StaticMeshComponent *CreateStaticMeshComponent(Mesh *m) { - return CreateStaticMeshComponent(new StaticMeshComponentData(m)); + auto sm_cd=new StaticMeshComponentData(m); + + return CreateStaticMeshComponent(sm_cd); } virtual Component *CreateComponent(ComponentData *data) override; diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index d9865b3a..66f4aa0c 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -22,6 +22,9 @@ VK_NAMESPACE_BEGIN bool InitShaderCompiler(); void CloseShaderCompiler(); +void InitializeComponentManager(); +void UninitializeComponentManager(); + namespace mtl { void ClearMaterialFactory(); @@ -64,6 +67,7 @@ RenderFramework::~RenderFramework() if(RENDER_FRAMEWORK_COUNT==0) { + UninitializeComponentManager(); STD_MTL_NAMESPACE::ClearMaterialFactory(); CloseShaderCompiler(); } @@ -79,6 +83,8 @@ bool RenderFramework::Init(uint w,uint h) logger::InitLogger(app_name); InitNativeWindowSystem(); + + InitializeComponentManager(); } ++RENDER_FRAMEWORK_COUNT; diff --git a/src/SceneGraph/component/ComponentManager.cpp b/src/SceneGraph/component/ComponentManager.cpp index bd8fa063..762c9141 100644 --- a/src/SceneGraph/component/ComponentManager.cpp +++ b/src/SceneGraph/component/ComponentManager.cpp @@ -5,35 +5,65 @@ namespace hgl::graph { namespace { - tsl::robin_map component_manager_map; + using ComponentManagerMap=tsl::robin_map; + + ComponentManagerMap *component_manager_map=nullptr; }//namespace + void InitializeComponentManager() + { + if(component_manager_map) + return; + + component_manager_map=new ComponentManagerMap; + } + + void UninitializeComponentManager() + { + if(!component_manager_map) + return; + + for(auto &cm : *component_manager_map) + delete cm.second; + + delete component_manager_map; + component_manager_map=nullptr; + } + bool RegistryComponentManager(ComponentManager *cm) { if(!cm)return(false); - const size_t hash_code=cm->GetHashCode(); - - if(component_manager_map.contains(hash_code)) + if(!component_manager_map) return(false); - component_manager_map.emplace(hash_code,cm); + 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)) + if(!component_manager_map) + return(nullptr); + + if(!component_manager_map->contains(hash_code)) return(nullptr); //[]对于不存的会自行插入一个,所以不要把下面的.at改成[] - return component_manager_map.at(hash_code); + return component_manager_map->at(hash_code); } int ComponentManager::GetComponents(ArrayList &comp_list,SceneNode *node) { if(!node)return(-1); + if(comp_list.IsEmpty())return(-2); + if(!component_manager_map)return(-3); Component **cc=component_set.GetData(); diff --git a/src/SceneGraph/component/StaticMeshComponentManager.cpp b/src/SceneGraph/component/StaticMeshComponentManager.cpp index 5e6cd57b..6e93b535 100644 --- a/src/SceneGraph/component/StaticMeshComponentManager.cpp +++ b/src/SceneGraph/component/StaticMeshComponentManager.cpp @@ -6,7 +6,11 @@ COMPONENT_NAMESPACE_BEGIN StaticMeshComponentData::~StaticMeshComponentData() { - SAFE_CLEAR(mesh); + if(mesh) + { + //mesh->Release(); //外面有RenderResource管理,不需要在这里释放.但未来要考虑是增加Release函数通知这里释放了一次使用权 + mesh=nullptr; + } } Component *StaticMeshComponentManager::CreateComponent(ComponentData *data)