实现一些Component/ComponentManager定义StaticHashCode/GetHashCode()...RegistryComponentManager/GetComponentManager()
This commit is contained in:
parent
44b1f13048
commit
0e6546b514
@ -65,7 +65,12 @@ public:
|
||||
Manager=cm;
|
||||
}
|
||||
|
||||
virtual ~Component()=default;
|
||||
virtual ~Component()
|
||||
{
|
||||
SAFE_CLEAR(Data);
|
||||
}
|
||||
|
||||
virtual const size_t GetHashCode()const=0;
|
||||
|
||||
public:
|
||||
|
||||
@ -91,12 +96,13 @@ class ComponentManager
|
||||
|
||||
public:
|
||||
|
||||
virtual const size_t GetComponentHashCode()const=0;
|
||||
virtual const size_t GetHashCode()const=0;
|
||||
|
||||
virtual ~ComponentManager()=default;
|
||||
|
||||
public:
|
||||
|
||||
virtual size_t ComponentHashCode()const=0;
|
||||
|
||||
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
|
||||
|
||||
int GetComponentCount()const{return component_set.GetCount();}
|
||||
@ -115,4 +121,21 @@ public: //事件
|
||||
virtual void OnFocusLost(){} ///<焦点丢失事件
|
||||
virtual void OnFocusGained(){} ///<焦点获得事件
|
||||
};//class ComponentManager
|
||||
|
||||
bool RegistryComponentManager(ComponentManager *);
|
||||
ComponentManager *GetComponentManager(const size_t hash_code);
|
||||
|
||||
template<typename T> inline T *GetComponentManager(bool create_default=true)
|
||||
{
|
||||
T *cm=(T *)GetComponentManager(T::StaticHashCode());
|
||||
|
||||
if(!cm&&create_default)
|
||||
{
|
||||
cm=new T;
|
||||
|
||||
RegistryComponentManager(cm);
|
||||
}
|
||||
|
||||
return cm;
|
||||
}
|
||||
COMPONENT_NAMESPACE_END
|
||||
|
@ -16,9 +16,20 @@ class StaticMeshComponentManager:public ComponentManager
|
||||
{
|
||||
public:
|
||||
|
||||
StaticMeshComponentManager()=default;
|
||||
static StaticMeshComponentManager *GetDefaultManager()
|
||||
{
|
||||
return GetComponentManager<StaticMeshComponentManager>(true);
|
||||
}
|
||||
|
||||
size_t ComponentHashCode()const override;
|
||||
static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash<StaticMeshComponentManager>();}
|
||||
static constexpr const size_t StaticComponentHashCode (){return hgl::GetTypeHash<StaticMeshComponent>();}
|
||||
|
||||
const size_t GetComponentHashCode ()const override{return StaticMeshComponentManager::StaticComponentHashCode();}
|
||||
const size_t GetHashCode ()const override{return StaticMeshComponentManager::StaticHashCode();}
|
||||
|
||||
public:
|
||||
|
||||
StaticMeshComponentManager()=default;
|
||||
|
||||
StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
|
||||
|
||||
@ -37,9 +48,16 @@ public:
|
||||
sm_data=reinterpret_cast<StaticMeshComponentData *>(cd);
|
||||
}
|
||||
|
||||
virtual ~StaticMeshComponent()
|
||||
virtual ~StaticMeshComponent()=default;
|
||||
|
||||
static constexpr const size_t StaticHashCode()
|
||||
{
|
||||
SAFE_CLEAR(sm_data);
|
||||
return hgl::GetTypeHash<StaticMeshComponent>();
|
||||
}
|
||||
|
||||
const size_t GetHashCode()const override
|
||||
{
|
||||
return StaticMeshComponent::StaticHashCode();
|
||||
}
|
||||
|
||||
StaticMeshComponentData &GetData() {return *sm_data;}
|
||||
|
@ -1,40 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include<hgl/graph/SceneNode.h>
|
||||
|
||||
namespace hgl
|
||||
namespace hgl::graph
|
||||
{
|
||||
namespace graph
|
||||
class CameraData
|
||||
{
|
||||
class CameraData
|
||||
};
|
||||
|
||||
class CameraManager
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
||||
/**
|
||||
* 世界场景管理器<Br>
|
||||
* 管理一个世界场景中的所有资源与场景节点
|
||||
*/
|
||||
class SceneWorld
|
||||
{
|
||||
SceneNode *root_node; ///<世界根节点
|
||||
|
||||
public:
|
||||
|
||||
SceneWorld()
|
||||
{
|
||||
};
|
||||
root_node=new SceneNode;
|
||||
}
|
||||
|
||||
class CameraManager
|
||||
virtual ~SceneWorld()
|
||||
{
|
||||
public:
|
||||
};
|
||||
SAFE_CLEAR(root_node);
|
||||
}
|
||||
|
||||
/**
|
||||
* 世界场景管理器<Br>
|
||||
* 管理一个世界场景中的所有资源与场景节点
|
||||
*/
|
||||
class SceneWorld
|
||||
{
|
||||
SceneNode *root_node; ///<世界根节点
|
||||
|
||||
public:
|
||||
|
||||
SceneWorld()
|
||||
{
|
||||
root_node=new SceneNode;
|
||||
}
|
||||
|
||||
virtual ~SceneWorld()
|
||||
{
|
||||
SAFE_CLEAR(root_node);
|
||||
}
|
||||
|
||||
SceneNode *GetRootNode() { return root_node; }
|
||||
};//class SceneWorld
|
||||
}//namespace graph
|
||||
}//namespace hgl
|
||||
SceneNode *GetRootNode(){return root_node;}
|
||||
};//class SceneWorld
|
||||
}//namespace hgl::graph
|
||||
|
@ -1,7 +1,36 @@
|
||||
#include<hgl/component/Component.h>
|
||||
#include<tsl/robin_map.h>
|
||||
|
||||
namespace hgl::graph
|
||||
{
|
||||
namespace
|
||||
{
|
||||
tsl::robin_map<size_t,ComponentManager *> component_manager_map;
|
||||
}//namespace
|
||||
|
||||
bool RegistryComponentManager(ComponentManager *cm)
|
||||
{
|
||||
if(!cm)return(false);
|
||||
|
||||
const size_t hash_code=cm->GetHashCode();
|
||||
|
||||
if(component_manager_map.contains(hash_code))
|
||||
return(false);
|
||||
|
||||
component_manager_map.emplace(hash_code,cm);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
ComponentManager *GetComponentManager(const size_t hash_code)
|
||||
{
|
||||
if(!component_manager_map.contains(hash_code))
|
||||
return(nullptr);
|
||||
|
||||
//[]对于不存的会自行插入一个,所以不要把下面的.at改成[]
|
||||
return component_manager_map.at(hash_code);
|
||||
}
|
||||
|
||||
int ComponentManager::GetComponents(List<Component *> &comp_list,SceneNode *node)
|
||||
{
|
||||
if(!node)return(-1);
|
||||
@ -22,9 +51,9 @@ namespace hgl::graph
|
||||
|
||||
void ComponentManager::UpdateComponents(const double delta_time)
|
||||
{
|
||||
Component **cc=component_set.GetData();
|
||||
//Component **cc=component_set.GetData();
|
||||
|
||||
for(int i=0;i<component_set.GetCount();i++)
|
||||
cc[i]->Update(delta_time);
|
||||
//for(int i=0;i<component_set.GetCount();i++)
|
||||
// cc[i]->Update(delta_time);
|
||||
}
|
||||
}//namespace hgl::graph
|
||||
|
@ -3,11 +3,6 @@
|
||||
|
||||
COMPONENT_NAMESPACE_BEGIN
|
||||
|
||||
size_t StaticMeshComponentManager::ComponentHashCode()const
|
||||
{
|
||||
return GetTypeHash<StaticMeshComponentManager>();
|
||||
}
|
||||
|
||||
StaticMeshComponent *StaticMeshComponentManager::CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data)
|
||||
{
|
||||
if(!psn||!data)return(nullptr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user