StaticMeshComponentManager

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

2
CMCore

@ -1 +1 @@
Subproject commit 3b3f6e7e12a67701e143dc0415acbef2d592083b
Subproject commit d09fe4326ea3629434adcd034a99ebbdb8fa6c22

View File

@ -11,10 +11,16 @@
*
* AMD FidelityFX中Component存放于Entity下SceneNode
* Entity还是SceneNodeComponent的管理
* AMD FidelityFX中的SceneSceneWorld
*
* 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

View File

@ -294,7 +294,9 @@ set(COMPONENT_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/component)
SET(COMPONENT_FILES ${COMPONENT_INCLUDE_PATH}/Component.h
${COMPONENT_INCLUDE_PATH}/RenderComponent.h
${COMPONENT_INCLUDE_PATH}/PrimitiveComponent.h
${COMPONENT_INCLUDE_PATH}/StaticMeshComponent.h
component/ComponentManager.cpp
component/StaticMeshComponentManager.cpp
)
SOURCE_GROUP("Component" FILES ${COMPONENT_FILES})

View File

@ -0,0 +1,27 @@
#include<hgl/component/StaticMeshComponent.h>
#include<hgl/graph/SceneNode.h>
COMPONENT_NAMESPACE_BEGIN
size_t StaticMeshComponentManager::ComponentHashCode()const
{
return GetTypeHash<StaticMeshComponentManager>();
}
StaticMeshComponent *StaticMeshComponentManager::CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data)
{
if(!psn||!data)return(nullptr);
StaticMeshComponent *smc=new StaticMeshComponent(psn,data,this);
psn->AddComponent(smc);
return smc;
}
Component *StaticMeshComponentManager::CreateComponent(SceneNode *psn,ComponentData *data)
{
return CreateStaticMeshComponent(psn,reinterpret_cast<StaticMeshComponentData *>(data));
}
COMPONENT_NAMESPACE_END