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);