尝试制作StaticMeshComponent
This commit is contained in:
parent
8ee9cdc396
commit
edaf5aa3ca
@ -5,6 +5,8 @@
|
|||||||
#include<hgl/graph/PrimitiveCreater.h>
|
#include<hgl/graph/PrimitiveCreater.h>
|
||||||
#include<hgl/graph/mtl/Material2DCreateConfig.h>
|
#include<hgl/graph/mtl/Material2DCreateConfig.h>
|
||||||
|
|
||||||
|
#include<hgl/component/StaticMeshComponent.h>
|
||||||
|
|
||||||
using namespace hgl;
|
using namespace hgl;
|
||||||
using namespace hgl::graph;
|
using namespace hgl::graph;
|
||||||
|
|
||||||
@ -40,6 +42,8 @@ private:
|
|||||||
|
|
||||||
Pipeline * pipeline =nullptr;
|
Pipeline * pipeline =nullptr;
|
||||||
|
|
||||||
|
StaticMeshComponent *sm_component=nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool InitMaterial()
|
bool InitMaterial()
|
||||||
@ -87,7 +91,11 @@ private:
|
|||||||
|
|
||||||
SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点
|
SceneNode *scene_root=GetSceneRoot(); ///<取得场景根节点
|
||||||
|
|
||||||
|
auto manager=StaticMeshComponentManager::GetDefaultManager();
|
||||||
|
|
||||||
|
sm_component=manager->CreateStaticMeshComponent(mesh_triangle);
|
||||||
|
|
||||||
|
scene_root->AttachComponent(sm_component);
|
||||||
|
|
||||||
scene_root->Add(new SceneNode(mesh_triangle));
|
scene_root->Add(new SceneNode(mesh_triangle));
|
||||||
|
|
||||||
@ -98,6 +106,11 @@ public:
|
|||||||
|
|
||||||
using WorkObject::WorkObject;
|
using WorkObject::WorkObject;
|
||||||
|
|
||||||
|
~TestApp()
|
||||||
|
{
|
||||||
|
SAFE_CLEAR(sm_component);
|
||||||
|
}
|
||||||
|
|
||||||
bool Init() override
|
bool Init() override
|
||||||
{
|
{
|
||||||
if(!InitMaterial())
|
if(!InitMaterial())
|
||||||
|
@ -43,7 +43,13 @@ COMPONENT_NAMESPACE_BEGIN
|
|||||||
class ComponentManager;
|
class ComponentManager;
|
||||||
class SceneNode;
|
class SceneNode;
|
||||||
|
|
||||||
struct ComponentData{};
|
struct ComponentData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ComponentData()=default;
|
||||||
|
virtual ~ComponentData()=default;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基础组件<br>
|
* 基础组件<br>
|
||||||
|
@ -49,7 +49,9 @@ public:
|
|||||||
|
|
||||||
StaticMeshComponent *CreateStaticMeshComponent(Mesh *m)
|
StaticMeshComponent *CreateStaticMeshComponent(Mesh *m)
|
||||||
{
|
{
|
||||||
return CreateStaticMeshComponent(new StaticMeshComponentData(m));
|
auto sm_cd=new StaticMeshComponentData(m);
|
||||||
|
|
||||||
|
return CreateStaticMeshComponent(sm_cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Component *CreateComponent(ComponentData *data) override;
|
virtual Component *CreateComponent(ComponentData *data) override;
|
||||||
|
@ -22,6 +22,9 @@ VK_NAMESPACE_BEGIN
|
|||||||
bool InitShaderCompiler();
|
bool InitShaderCompiler();
|
||||||
void CloseShaderCompiler();
|
void CloseShaderCompiler();
|
||||||
|
|
||||||
|
void InitializeComponentManager();
|
||||||
|
void UninitializeComponentManager();
|
||||||
|
|
||||||
namespace mtl
|
namespace mtl
|
||||||
{
|
{
|
||||||
void ClearMaterialFactory();
|
void ClearMaterialFactory();
|
||||||
@ -64,6 +67,7 @@ RenderFramework::~RenderFramework()
|
|||||||
|
|
||||||
if(RENDER_FRAMEWORK_COUNT==0)
|
if(RENDER_FRAMEWORK_COUNT==0)
|
||||||
{
|
{
|
||||||
|
UninitializeComponentManager();
|
||||||
STD_MTL_NAMESPACE::ClearMaterialFactory();
|
STD_MTL_NAMESPACE::ClearMaterialFactory();
|
||||||
CloseShaderCompiler();
|
CloseShaderCompiler();
|
||||||
}
|
}
|
||||||
@ -79,6 +83,8 @@ bool RenderFramework::Init(uint w,uint h)
|
|||||||
logger::InitLogger(app_name);
|
logger::InitLogger(app_name);
|
||||||
|
|
||||||
InitNativeWindowSystem();
|
InitNativeWindowSystem();
|
||||||
|
|
||||||
|
InitializeComponentManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
++RENDER_FRAMEWORK_COUNT;
|
++RENDER_FRAMEWORK_COUNT;
|
||||||
|
@ -5,35 +5,65 @@ namespace hgl::graph
|
|||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
tsl::robin_map<size_t,ComponentManager *> component_manager_map;
|
using ComponentManagerMap=tsl::robin_map<size_t,ComponentManager *>;
|
||||||
|
|
||||||
|
ComponentManagerMap *component_manager_map=nullptr;
|
||||||
}//namespace
|
}//namespace
|
||||||
|
|
||||||
|
void InitializeComponentManager()
|
||||||
|
{
|
||||||
|
if(component_manager_map)
|
||||||
|
return;
|
||||||
|
|
||||||
|
component_manager_map=new ComponentManagerMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UninitializeComponentManager()
|
||||||
|
{
|
||||||
|
if(!component_manager_map)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(auto &cm : *component_manager_map)
|
||||||
|
delete cm.second;
|
||||||
|
|
||||||
|
delete component_manager_map;
|
||||||
|
component_manager_map=nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool RegistryComponentManager(ComponentManager *cm)
|
bool RegistryComponentManager(ComponentManager *cm)
|
||||||
{
|
{
|
||||||
if(!cm)return(false);
|
if(!cm)return(false);
|
||||||
|
|
||||||
const size_t hash_code=cm->GetHashCode();
|
if(!component_manager_map)
|
||||||
|
|
||||||
if(component_manager_map.contains(hash_code))
|
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
component_manager_map.emplace(hash_code,cm);
|
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);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ComponentManager *GetComponentManager(const size_t hash_code)
|
ComponentManager *GetComponentManager(const size_t hash_code)
|
||||||
{
|
{
|
||||||
if(!component_manager_map.contains(hash_code))
|
if(!component_manager_map)
|
||||||
|
return(nullptr);
|
||||||
|
|
||||||
|
if(!component_manager_map->contains(hash_code))
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
//[]对于不存的会自行插入一个,所以不要把下面的.at改成[]
|
//[]对于不存的会自行插入一个,所以不要把下面的.at改成[]
|
||||||
return component_manager_map.at(hash_code);
|
return component_manager_map->at(hash_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ComponentManager::GetComponents(ArrayList<Component *> &comp_list,SceneNode *node)
|
int ComponentManager::GetComponents(ArrayList<Component *> &comp_list,SceneNode *node)
|
||||||
{
|
{
|
||||||
if(!node)return(-1);
|
if(!node)return(-1);
|
||||||
|
if(comp_list.IsEmpty())return(-2);
|
||||||
|
if(!component_manager_map)return(-3);
|
||||||
|
|
||||||
Component **cc=component_set.GetData();
|
Component **cc=component_set.GetData();
|
||||||
|
|
||||||
|
@ -6,7 +6,11 @@ COMPONENT_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
StaticMeshComponentData::~StaticMeshComponentData()
|
StaticMeshComponentData::~StaticMeshComponentData()
|
||||||
{
|
{
|
||||||
SAFE_CLEAR(mesh);
|
if(mesh)
|
||||||
|
{
|
||||||
|
//mesh->Release(); //外面有RenderResource管理,不需要在这里释放.但未来要考虑是增加Release函数通知这里释放了一次使用权
|
||||||
|
mesh=nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component *StaticMeshComponentManager::CreateComponent(ComponentData *data)
|
Component *StaticMeshComponentManager::CreateComponent(ComponentData *data)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user