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 * AMD FidelityFX中Component存放于Entity下SceneNode
* Entity还是SceneNodeComponent的管理 * Entity还是SceneNodeComponent的管理
* AMD FidelityFX中的SceneSceneWorld
* *
* ComponentData是每个Component的数据Component或是其它模块提供数据 * ComponentData是每个Component的数据Component或是其它模块提供数据
* ComponentManager是Component的管理器Component的创建 * ComponentManager是Component的管理器Component的创建
* *
* AMD FidelityFX一样ComponentManager与SceneWorld基本无关
* World之中
* SceneWorld密切相关的Component它对应的Manager才会出现在SceneWorld中CameraManager/LightManager
* StaticMeshComponent之类的纯资源型就会是独立存在的
*
* Component是组件的基类 * Component是组件的基类
* *
* *
@ -34,80 +40,79 @@
COMPONENT_NAMESPACE_BEGIN COMPONENT_NAMESPACE_BEGIN
class ComponentManager; class ComponentManager;
class SceneNode; class SceneNode;
struct ComponentData{}; struct ComponentData{};
/** /**
* <br> * <br>
* *
*/ */
class Component class Component
{
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentData * Data;
public:
Component()=delete;
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{ {
SceneNode * OwnerNode; OwnerNode=sn;
ComponentManager * Manager; Data=cd;
ComponentData * Data; Manager=cm;
}
public: virtual ~Component()=default;
Component()=delete; public:
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{
OwnerNode=sn;
Data=cd;
Manager=cm;
}
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;} //virtual void Update(const double delta_time)=0;
ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;}
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(){} ///<焦点丢失事件 class ComponentManager
virtual void OnFocusGained(){} ///<焦点获得事件 {
};//class Component ComponentSet component_set;
using ComponentSet=SortedSet<Component *>; public:
class ComponentManager virtual ~ComponentManager()=default;
{
ComponentSet component_set;
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); public: //事件
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
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
COMPONENT_NAMESPACE_END COMPONENT_NAMESPACE_END

View File

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

View File

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

View File

@ -10,7 +10,7 @@ struct StaticMeshComponentData:public ComponentData
Renderable *renderable; Renderable *renderable;
};//struct StaticMeshComponentData };//struct StaticMeshComponentData
class StaticMeshComponent:public PrimitiveComponent; class StaticMeshComponent;
class StaticMeshComponentManager:public ComponentManager class StaticMeshComponentManager:public ComponentManager
{ {
@ -18,12 +18,11 @@ public:
StaticMeshComponentManager()=default; StaticMeshComponentManager()=default;
size_t ComponentHashCode()const override;
StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data); StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
virtual Component *CreateComponent(SceneNode *psn,ComponentData *data) override virtual Component *CreateComponent(SceneNode *psn,ComponentData *data) override;
{
return CreateStaticMeshComponent(psn,reinterpret_cast<StaticMeshComponentData *>(data));
}
};//class StaticMeshComponentManager };//class StaticMeshComponentManager
class StaticMeshComponent:public PrimitiveComponent class StaticMeshComponent:public PrimitiveComponent
@ -40,7 +39,7 @@ public:
virtual ~StaticMeshComponent() virtual ~StaticMeshComponent()
{ {
SAFE_CLEAR(sm_Data); SAFE_CLEAR(sm_data);
} }
StaticMeshComponentData &GetData() {return *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);
}
public: SceneNode *GetRootNode() { return root_node; }
};//class SceneWorld };//class SceneWorld
}//namespace graph }//namespace graph
}//namespace hgl }//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 SET(COMPONENT_FILES ${COMPONENT_INCLUDE_PATH}/Component.h
${COMPONENT_INCLUDE_PATH}/RenderComponent.h ${COMPONENT_INCLUDE_PATH}/RenderComponent.h
${COMPONENT_INCLUDE_PATH}/PrimitiveComponent.h ${COMPONENT_INCLUDE_PATH}/PrimitiveComponent.h
${COMPONENT_INCLUDE_PATH}/StaticMeshComponent.h
component/ComponentManager.cpp component/ComponentManager.cpp
component/StaticMeshComponentManager.cpp
) )
SOURCE_GROUP("Component" FILES ${COMPONENT_FILES}) 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