StaticMeshComponentManager
This commit is contained in:
parent
a50c3ef10b
commit
44b1f13048
2
CMCore
2
CMCore
@ -1 +1 @@
|
||||
Subproject commit 3b3f6e7e12a67701e143dc0415acbef2d592083b
|
||||
Subproject commit d09fe4326ea3629434adcd034a99ebbdb8fa6c22
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;}
|
||||
|
@ -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
|
||||
|
@ -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})
|
||||
|
27
src/SceneGraph/component/StaticMeshComponentManager.cpp
Normal file
27
src/SceneGraph/component/StaticMeshComponentManager.cpp
Normal 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
|
Loading…
x
Reference in New Issue
Block a user