diff --git a/CMCore b/CMCore index 3b3f6e7e..d09fe432 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 3b3f6e7e12a67701e143dc0415acbef2d592083b +Subproject commit d09fe4326ea3629434adcd034a99ebbdb8fa6c22 diff --git a/inc/hgl/component/Component.h b/inc/hgl/component/Component.h index 19bc32fa..61b28085 100644 --- a/inc/hgl/component/Component.h +++ b/inc/hgl/component/Component.h @@ -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{}; - /** - * 基础组件
- * 是一切组件的基类 - */ - class Component +/** +* 基础组件
+* 是一切组件的基类 +*/ +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; - virtual void OnFocusLost(){} ///<焦点丢失事件 - virtual void OnFocusGained(){} ///<焦点获得事件 - };//class Component +class ComponentManager +{ + ComponentSet component_set; - using ComponentSet=SortedSet; +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 &comp_list,SceneNode *); - ComponentSet & GetComponents(){return component_set;} + virtual void UpdateComponents(const double delta_time); - int GetComponents(List &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 diff --git a/inc/hgl/component/PrimitiveComponent.h b/inc/hgl/component/PrimitiveComponent.h index fc665597..870b35ad 100644 --- a/inc/hgl/component/PrimitiveComponent.h +++ b/inc/hgl/component/PrimitiveComponent.h @@ -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 diff --git a/inc/hgl/component/RenderComponent.h b/inc/hgl/component/RenderComponent.h index 98accf42..d58b2f95 100644 --- a/inc/hgl/component/RenderComponent.h +++ b/inc/hgl/component/RenderComponent.h @@ -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 diff --git a/inc/hgl/component/StaticMeshComponent.h b/inc/hgl/component/StaticMeshComponent.h index 1ac7f82d..ba9ce6b3 100644 --- a/inc/hgl/component/StaticMeshComponent.h +++ b/inc/hgl/component/StaticMeshComponent.h @@ -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(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;} diff --git a/inc/hgl/graph/SceneWorld.h b/inc/hgl/graph/SceneWorld.h index f78f4237..734f43f2 100644 --- a/inc/hgl/graph/SceneWorld.h +++ b/inc/hgl/graph/SceneWorld.h @@ -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 diff --git a/src/SceneGraph/CMakeLists.txt b/src/SceneGraph/CMakeLists.txt index 07967caf..f706015e 100644 --- a/src/SceneGraph/CMakeLists.txt +++ b/src/SceneGraph/CMakeLists.txt @@ -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}) diff --git a/src/SceneGraph/component/StaticMeshComponentManager.cpp b/src/SceneGraph/component/StaticMeshComponentManager.cpp new file mode 100644 index 00000000..f6d3da02 --- /dev/null +++ b/src/SceneGraph/component/StaticMeshComponentManager.cpp @@ -0,0 +1,27 @@ +#include +#include + +COMPONENT_NAMESPACE_BEGIN + +size_t StaticMeshComponentManager::ComponentHashCode()const +{ + return GetTypeHash(); +} + +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(data)); +} + +COMPONENT_NAMESPACE_END