StaticMeshComponentManager

This commit is contained in:
2025-04-01 01:11:32 +08:00
parent a50c3ef10b
commit 44b1f13048
8 changed files with 105 additions and 65 deletions

View File

@@ -11,10 +11,16 @@
*
* AMD FidelityFX中Component存放于Entity下而我方中与其类似的定义为SceneNode。
* 不管是Entity还是SceneNode它们都提供空间变换以及子节点、Component的管理。
* 而AMD FidelityFX中的Scene类似于我方的SceneWorld用于储存一个场景世界的根节点及其它世界唯一数据。
*
* ComponentData是每个Component的数据用于向Component或是其它模块提供数据。
* ComponentManager是Component的管理器用于管理Component的创建、销毁、更新等。
*
* 需要注意的是同AMD FidelityFX一样大部分ComponentManager与SceneWorld基本无关。
* 因为同样的数据可能出现在多个World之中。
* 仅有那些与SceneWorld密切相关的Component它对应的Manager才会出现在SceneWorld中比如CameraManager/LightManager。
* 而如StaticMeshComponent之类的纯资源型就会是独立存在的。
*
* Component是组件的基类所有组件都从这里派生。
*
*
@@ -34,80 +40,79 @@
COMPONENT_NAMESPACE_BEGIN
class ComponentManager;
class SceneNode;
class ComponentManager;
class SceneNode;
struct ComponentData{};
struct ComponentData{};
/**
* 基础组件<br>
* 是一切组件的基类
*/
class Component
/**
* 基础组件<br>
* 是一切组件的基类
*/
class Component
{
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentData * Data;
public:
Component()=delete;
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentData * Data;
OwnerNode=sn;
Data=cd;
Manager=cm;
}
public:
virtual ~Component()=default;
Component()=delete;
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{
OwnerNode=sn;
Data=cd;
Manager=cm;
}
public:
virtual ~Component()=default;
SceneNode * GetOwnerNode()const{return OwnerNode;}
ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;}
public:
public:
SceneNode * GetOwnerNode()const{return OwnerNode;}
ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;}
//virtual void Update(const double delta_time)=0;
public:
public: //事件
virtual void Update(const double delta_time)=0;
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class Component
public: //事件
using ComponentSet=SortedSet<Component *>;
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class Component
class ComponentManager
{
ComponentSet component_set;
using ComponentSet=SortedSet<Component *>;
public:
class ComponentManager
{
ComponentSet component_set;
virtual ~ComponentManager()=default;
public:
public:
virtual ~ComponentManager()=default;
virtual size_t ComponentHashCode()const=0;
public:
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
virtual size_t ComponentHashCode()const=0;
int GetComponentCount()const{return component_set.GetCount();}
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
ComponentSet & GetComponents(){return component_set;}
int GetComponentCount()const{return component_set.GetCount();}
int GetComponents(List<Component *> &comp_list,SceneNode *);
ComponentSet & GetComponents(){return component_set;}
virtual void UpdateComponents(const double delta_time);
int GetComponents(List<Component *> &comp_list,SceneNode *);
virtual void JoinComponent(Component *c){if(!c)return;component_set.Add(c);}
virtual void UnjonComponent(Component *c){if(!c)return;component_set.Delete(c);}
virtual void UpdateComponents(const double delta_time);
virtual void JoinComponent(Component *c){if(!c)return;component_set.Add(c);}
virtual void UnjonComponent(Component *c){if(!c)return;component_set.Delete(c);}
public: //事件
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
public: //事件
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
COMPONENT_NAMESPACE_END

View File

@@ -12,7 +12,8 @@ class PrimitiveComponent:public RenderComponent
{
public:
PrimitiveComponent()=default;
PrimitiveComponent(SceneNode *psn,ComponentData *cd,ComponentManager *cm)
:RenderComponent(psn,cd,cm){}
virtual ~PrimitiveComponent()=default;
};//class PrimitiveComponent

View File

@@ -11,7 +11,8 @@ class RenderComponent: public Component
{
public:
RenderComponent()=default;
RenderComponent(SceneNode *psn,ComponentData *cd,ComponentManager *cm)
:Component(psn,cd,cm){}
virtual ~RenderComponent()=default;
};//class RenderComponent

View File

@@ -10,7 +10,7 @@ struct StaticMeshComponentData:public ComponentData
Renderable *renderable;
};//struct StaticMeshComponentData
class StaticMeshComponent:public PrimitiveComponent;
class StaticMeshComponent;
class StaticMeshComponentManager:public ComponentManager
{
@@ -18,12 +18,11 @@ public:
StaticMeshComponentManager()=default;
size_t ComponentHashCode()const override;
StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
virtual Component *CreateComponent(SceneNode *psn,ComponentData *data) override
{
return CreateStaticMeshComponent(psn,reinterpret_cast<StaticMeshComponentData *>(data));
}
virtual Component *CreateComponent(SceneNode *psn,ComponentData *data) override;
};//class StaticMeshComponentManager
class StaticMeshComponent:public PrimitiveComponent
@@ -40,7 +39,7 @@ public:
virtual ~StaticMeshComponent()
{
SAFE_CLEAR(sm_Data);
SAFE_CLEAR(sm_data);
}
StaticMeshComponentData &GetData() {return *sm_data;}

View File

@@ -24,12 +24,17 @@ namespace hgl
public:
public:
SceneWorld()
{
root_node=new SceneNode;
}
virtual ~SceneWorld()
{
SAFE_CLEAR(root_node);
}
SceneNode *GetRootNode() { return root_node; }
};//class SceneWorld
}//namespace graph
}//namespace hgl