恢复Duplication(SceneNode *),并实现MeshComponent::Duplication...下一步Component::Duplication()改成由基类实现.

This commit is contained in:
hyzboy 2025-06-16 00:02:07 +08:00
parent dd2ee57954
commit a23654c73a
4 changed files with 40 additions and 28 deletions

View File

@ -76,7 +76,7 @@ private:
{ {
SceneNode *root=GetSceneRoot(); SceneNode *root=GetSceneRoot();
root->Add(sm_move); root->Add(Duplication(sm_move));
//root.Add(Duplication(sm_rotate->GetScene())); //root.Add(Duplication(sm_rotate->GetScene()));
//root.CreateSubNode(sm_scale->GetScene()); //root.CreateSubNode(sm_scale->GetScene());
} }

View File

@ -94,6 +94,8 @@ public:
public: public:
virtual Component *Duplication()=0;
//virtual void Update(const double delta_time)=0; //virtual void Update(const double delta_time)=0;
public: //事件 public: //事件
@ -105,6 +107,11 @@ public: //事件
virtual void OnFocusGained(){} ///<焦点获得事件 virtual void OnFocusGained(){} ///<焦点获得事件
};//class Component };//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<name##Component>();} \
const size_t GetHashCode ()const override{return name##Component::StaticHashCode();}
using ComponentSet=SortedSet<Component *>; using ComponentSet=SortedSet<Component *>;
using ComponentList=ArrayList<Component *>; using ComponentList=ArrayList<Component *>;

View File

@ -61,31 +61,33 @@ class MeshComponent:public RenderComponent
{ {
MeshComponentData *sm_data; MeshComponentData *sm_data;
public:
COMPONENT_CLASS_BODY(Mesh)
public: public:
MeshComponent(MeshComponentData *cd,MeshComponentManager *cm):RenderComponent(cd,cm){sm_data=cd;} MeshComponent(MeshComponentData *cd,MeshComponentManager *cm):RenderComponent(cd,cm){sm_data=cd;}
virtual ~MeshComponent()=default; virtual ~MeshComponent()=default;
static MeshComponentManager *GetDefaultManager()
{
return MeshComponentManager::GetDefaultManager();
}
static constexpr const size_t StaticHashCode()
{
return hgl::GetTypeHash<MeshComponent>();
}
const size_t GetHashCode()const override
{
return MeshComponent::StaticHashCode();
}
MeshComponentData &GetData() {return *sm_data;} MeshComponentData &GetData() {return *sm_data;}
const MeshComponentData &GetData()const {return *sm_data;} const MeshComponentData &GetData()const {return *sm_data;}
Mesh *GetMesh() const{return sm_data->mesh;} 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 };//class MeshComponent
COMPONENT_NAMESPACE_END COMPONENT_NAMESPACE_END

View File

@ -4,22 +4,25 @@
namespace hgl::graph namespace hgl::graph
{ {
//SceneNode *Duplication(SceneNode *src_node) SceneNode *Duplication(SceneNode *src_node)
//{ {
// if(!src_node) if(!src_node)
// return nullptr; 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()) for(Component *c:src_node->GetComponents())
// { {
// node->Add(Duplication(sn)); node->AttachComponent(c->Duplication());
// } }
// return node; return node;
//} }
//void SceneNode::SetRenderable(Mesh *ri) //void SceneNode::SetRenderable(Mesh *ri)
//{ //{