2025-03-18 01:26:35 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include<hgl/type/DataType.h>
|
2025-03-20 02:09:50 +08:00
|
|
|
#include<hgl/type/SortedSet.h>
|
2025-03-25 01:17:18 +08:00
|
|
|
#include<hgl/type/List.h>
|
2025-03-18 01:26:35 +08:00
|
|
|
|
|
|
|
namespace hgl::graph
|
|
|
|
{
|
2025-03-20 02:09:50 +08:00
|
|
|
class ComponentManager;
|
|
|
|
class SceneNode;
|
|
|
|
|
|
|
|
struct ComponentData{};
|
|
|
|
|
2025-03-18 01:26:35 +08:00
|
|
|
/**
|
|
|
|
* 基础组件<br>
|
|
|
|
* 是一切组件的基类
|
|
|
|
*/
|
2025-03-20 02:09:50 +08:00
|
|
|
class Component
|
2025-03-18 01:26:35 +08:00
|
|
|
{
|
2025-03-20 02:09:50 +08:00
|
|
|
SceneNode * OwnerNode;
|
|
|
|
ComponentManager * Manager;
|
|
|
|
ComponentData * Data;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
Component()=delete;
|
|
|
|
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
|
|
|
|
{
|
|
|
|
OwnerNode=sn;
|
|
|
|
Data=cd;
|
|
|
|
Manager=cm;
|
|
|
|
}
|
2025-03-25 01:04:46 +08:00
|
|
|
|
2025-03-20 02:09:50 +08:00
|
|
|
virtual ~Component()=default;
|
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
public:
|
|
|
|
|
|
|
|
SceneNode * GetOwnerNode()const{return OwnerNode;}
|
|
|
|
ComponentManager * GetManager ()const{return Manager;}
|
|
|
|
ComponentData * GetData ()const{return Data;}
|
|
|
|
|
2025-03-18 01:26:35 +08:00
|
|
|
public:
|
|
|
|
|
2025-03-20 02:09:50 +08:00
|
|
|
virtual void Update(const double delta_time)=0;
|
|
|
|
|
2025-03-25 01:04:46 +08:00
|
|
|
public: //事件
|
|
|
|
|
2025-03-20 02:09:50 +08:00
|
|
|
virtual void OnFocusLost(){} ///<焦点丢失事件
|
|
|
|
virtual void OnFocusGained(){} ///<焦点获得事件
|
|
|
|
};//class Component
|
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
using ComponentSet=SortedSet<Component *>;
|
|
|
|
|
2025-03-20 02:09:50 +08:00
|
|
|
class ComponentManager
|
|
|
|
{
|
2025-03-25 01:17:18 +08:00
|
|
|
ComponentSet component_set;
|
2025-03-20 02:09:50 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
virtual ~ComponentManager()=default;
|
|
|
|
|
|
|
|
public:
|
2025-03-18 01:26:35 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
virtual size_t ComponentHashCode()const=0;
|
2025-03-18 01:26:35 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
|
2025-03-18 01:26:35 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
int GetComponentCount()const{return component_set.GetCount();}
|
2025-03-25 01:04:46 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
ComponentSet & GetComponents(){return component_set;}
|
2025-03-25 01:04:46 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
int GetComponents(List<Component *> &comp_list,SceneNode *);
|
|
|
|
|
|
|
|
virtual void UpdateComponents(const double delta_time);
|
2025-03-25 01:04:46 +08:00
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
virtual void JoinComponent(Component *c){if(!c)return;component_set.Add(c);}
|
|
|
|
virtual void UnjonComponent(Component *c){if(!c)return;component_set.Delete(c);}
|
2025-03-25 01:04:46 +08:00
|
|
|
|
|
|
|
public: //事件
|
|
|
|
|
2025-03-25 01:17:18 +08:00
|
|
|
virtual void OnFocusLost(){} ///<焦点丢失事件
|
|
|
|
virtual void OnFocusGained(){} ///<焦点获得事件
|
2025-03-20 02:09:50 +08:00
|
|
|
};//class ComponentManager
|
2025-03-18 01:26:35 +08:00
|
|
|
}//namespace hgl::graph
|