ULRE/inc/hgl/component/Component.h

142 lines
4.3 KiB
C
Raw Normal View History

#pragma once
#include<hgl/type/DataType.h>
#include<hgl/type/SortedSet.h>
2025-05-04 19:33:04 +08:00
#include<hgl/type/ArrayList.h>
/**
* Component/Data/Manager
*
* AMD FidelityFX
*
* AMD FidelityFX中Component存放于Entity下SceneNode
* Entity还是SceneNodeComponent的管理
2025-06-04 00:10:27 +08:00
* AMD FidelityFX中的SceneScene
*
* ComponentData是每个Component的数据Component或是其它模块提供数据
* ComponentManager是Component的管理器Component的创建
*
2025-06-04 00:10:27 +08:00
* AMD FidelityFX一样ComponentManager与Scene基本无关
2025-04-01 01:11:32 +08:00
* World之中
2025-06-04 00:10:27 +08:00
* Scene密切相关的Component它对应的Manager才会出现在Scene中CameraManager/LightManager
2025-04-01 01:11:32 +08:00
* StaticMeshComponent之类的纯资源型就会是独立存在的
*
* Component是组件的基类
*
*
* RenderComponent是可渲染组件的基类Component
*
* PrimitiveComponent是图元组件的基类RenderComponent
* Component都必须是一个有3D空间的几何图元
* PrimitiveComponent提供数据进行计算
*
* StaticMeshComponent是静态网格组件PrimitiveComponent实现
*
*/
#define COMPONENT_NAMESPACE hgl::graph
#define COMPONENT_NAMESPACE_BEGIN namespace COMPONENT_NAMESPACE {
#define COMPONENT_NAMESPACE_END }
COMPONENT_NAMESPACE_BEGIN
2025-04-01 01:11:32 +08:00
class ComponentManager;
class SceneNode;
2025-04-01 01:11:32 +08:00
struct ComponentData{};
2025-04-01 01:11:32 +08:00
/**
* <br>
*
*/
class Component
{
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentData * Data;
2025-04-01 01:11:32 +08:00
public:
2025-04-01 01:11:32 +08:00
Component()=delete;
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{
OwnerNode=sn;
Data=cd;
Manager=cm;
}
virtual ~Component()
{
SAFE_CLEAR(Data);
}
virtual const size_t GetHashCode()const=0;
2025-04-01 01:11:32 +08:00
public:
2025-04-01 01:11:32 +08:00
SceneNode * GetOwnerNode()const{return OwnerNode;}
ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;}
2025-04-01 01:11:32 +08:00
public:
2025-04-01 01:11:32 +08:00
//virtual void Update(const double delta_time)=0;
2025-04-01 01:11:32 +08:00
public: //事件
2025-04-01 01:11:32 +08:00
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class Component
2025-04-01 01:11:32 +08:00
using ComponentSet=SortedSet<Component *>;
2025-04-01 01:11:32 +08:00
class ComponentManager
{
ComponentSet component_set;
2025-04-01 01:11:32 +08:00
public:
virtual const size_t GetComponentHashCode()const=0;
virtual const size_t GetHashCode()const=0;
2025-04-01 01:11:32 +08:00
virtual ~ComponentManager()=default;
2025-04-01 01:11:32 +08:00
public:
2025-06-12 03:01:50 +08:00
virtual Component * CreateComponent(ComponentData *)=0;
2025-04-01 01:11:32 +08:00
int GetComponentCount()const{return component_set.GetCount();}
2025-04-01 01:11:32 +08:00
ComponentSet & GetComponents(){return component_set;}
2025-04-23 00:27:43 +08:00
int GetComponents(ArrayList<Component *> &comp_list,SceneNode *);
2025-04-01 01:11:32 +08:00
virtual void UpdateComponents(const double delta_time);
2025-04-23 00:27:43 +08:00
virtual void AttachComponent(Component *c){if(!c)return;component_set.Add(c);}
virtual void DetachComponent(Component *c){if(!c)return;component_set.Delete(c);}
2025-04-01 01:11:32 +08:00
public: //事件
2025-04-01 01:11:32 +08:00
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
bool RegistryComponentManager(ComponentManager *);
ComponentManager *GetComponentManager(const size_t hash_code);
template<typename T> inline T *GetComponentManager(bool create_default=true)
{
T *cm=(T *)GetComponentManager(T::StaticHashCode());
if(!cm&&create_default)
{
cm=new T;
RegistryComponentManager(cm);
}
return cm;
}
COMPONENT_NAMESPACE_END