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