From a23654c73afabbf9d2cf529487d9e9e539792396 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 16 Jun 2025 00:02:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=81=A2=E5=A4=8DDuplication(SceneNode=20*)?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0MeshComponent::Duplication.?= =?UTF-8?q?..=E4=B8=8B=E4=B8=80=E6=AD=A5Component::Duplication()=E6=94=B9?= =?UTF-8?q?=E6=88=90=E7=94=B1=E5=9F=BA=E7=B1=BB=E5=AE=9E=E7=8E=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Gizmo/GizmoTest.cpp | 2 +- inc/hgl/component/Component.h | 7 +++++++ inc/hgl/component/MeshComponent.h | 32 ++++++++++++++++-------------- src/SceneGraph/scene/SceneNode.cpp | 27 ++++++++++++++----------- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/example/Gizmo/GizmoTest.cpp b/example/Gizmo/GizmoTest.cpp index 67f5c5c7..10805646 100644 --- a/example/Gizmo/GizmoTest.cpp +++ b/example/Gizmo/GizmoTest.cpp @@ -76,7 +76,7 @@ private: { SceneNode *root=GetSceneRoot(); - root->Add(sm_move); + root->Add(Duplication(sm_move)); //root.Add(Duplication(sm_rotate->GetScene())); //root.CreateSubNode(sm_scale->GetScene()); } diff --git a/inc/hgl/component/Component.h b/inc/hgl/component/Component.h index fb9aefcb..79866c91 100644 --- a/inc/hgl/component/Component.h +++ b/inc/hgl/component/Component.h @@ -94,6 +94,8 @@ public: public: + virtual Component *Duplication()=0; + //virtual void Update(const double delta_time)=0; public: //事件 @@ -105,6 +107,11 @@ public: //事件 virtual void OnFocusGained(){} ///<焦点获得事件 };//class Component +#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();} + using ComponentSet=SortedSet; using ComponentList=ArrayList; diff --git a/inc/hgl/component/MeshComponent.h b/inc/hgl/component/MeshComponent.h index 2a55bb79..62785068 100644 --- a/inc/hgl/component/MeshComponent.h +++ b/inc/hgl/component/MeshComponent.h @@ -61,31 +61,33 @@ class MeshComponent:public RenderComponent { MeshComponentData *sm_data; +public: + + COMPONENT_CLASS_BODY(Mesh) + public: MeshComponent(MeshComponentData *cd,MeshComponentManager *cm):RenderComponent(cd,cm){sm_data=cd;} virtual ~MeshComponent()=default; - static MeshComponentManager *GetDefaultManager() - { - return MeshComponentManager::GetDefaultManager(); - } - - static constexpr const size_t StaticHashCode() - { - return hgl::GetTypeHash(); - } - - const size_t GetHashCode()const override - { - return MeshComponent::StaticHashCode(); - } - MeshComponentData &GetData() {return *sm_data;} const MeshComponentData &GetData()const {return *sm_data;} Mesh *GetMesh() const{return sm_data->mesh;} + +public: + + virtual Component *Duplication() override + { + MeshComponentManager *manager=GetManager(); + + MeshComponent *mc=manager->CreateComponent(sm_data->mesh); + + mc->SetLocalMatrix(GetLocalMatrix()); + + return mc; + } };//class MeshComponent COMPONENT_NAMESPACE_END diff --git a/src/SceneGraph/scene/SceneNode.cpp b/src/SceneGraph/scene/SceneNode.cpp index e4ef267d..9ea548e0 100644 --- a/src/SceneGraph/scene/SceneNode.cpp +++ b/src/SceneGraph/scene/SceneNode.cpp @@ -4,22 +4,25 @@ namespace hgl::graph { - //SceneNode *Duplication(SceneNode *src_node) - //{ - // if(!src_node) - // return nullptr; + SceneNode *Duplication(SceneNode *src_node) + { + if(!src_node) + return nullptr; - // SceneNode *node=new SceneNode(*(SceneOrient *)src_node); + SceneNode *node=new SceneNode(*(SceneOrient *)src_node); - // node->SetRenderable(src_node->GetRenderable()); + for(SceneNode *sn:src_node->GetChildNode()) + { + node->Add(Duplication(sn)); + } - // for(SceneNode *sn:src_node->GetChildNode()) - // { - // node->Add(Duplication(sn)); - // } + for(Component *c:src_node->GetComponents()) + { + node->AttachComponent(c->Duplication()); + } - // return node; - //} + return node; + } //void SceneNode::SetRenderable(Mesh *ri) //{