实现了由Component实现的自我复制,而无需关心具体的Component派生类.

This commit is contained in:
hyzboy 2025-06-16 00:28:21 +08:00
parent a23654c73a
commit dd083bb82b
4 changed files with 24 additions and 14 deletions

View File

@ -50,6 +50,8 @@ public:
ComponentData()=default;
virtual ~ComponentData()=default;
virtual ComponentData *Duplication()=0;
};
/**
@ -94,7 +96,7 @@ public:
public:
virtual Component *Duplication()=0;
virtual Component *Duplication();
//virtual void Update(const double delta_time)=0;

View File

@ -22,6 +22,11 @@ public:
}
virtual ~MeshComponentData();
ComponentData *Duplication() override
{
return(new MeshComponentData(mesh));
}
};//struct MeshComponentData
class MeshComponent;
@ -75,19 +80,6 @@ public:
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

View File

@ -15,6 +15,17 @@ public:
using Component::Component;
virtual ~SceneComponent()=default;
virtual Component *Duplication() override
{
SceneComponent *sc=(SceneComponent *)Component::Duplication();
if(!sc)
return(sc);
sc->SetLocalMatrix(GetLocalMatrix());
return sc;
}
};//class SceneComponent
COMPONENT_NAMESPACE_END

View File

@ -34,4 +34,9 @@ namespace hgl::graph
SAFE_CLEAR(Data);
}
Component *Component::Duplication()
{
return GetManager()->CreateComponent(Data?Data->Duplication():nullptr);
}
}//namespace hgl::graph