尝试制作StaticMeshComponent

This commit is contained in:
hyzboy 2025-06-14 04:13:49 +08:00
parent 8ee9cdc396
commit edaf5aa3ca
6 changed files with 71 additions and 10 deletions

View File

@ -5,6 +5,8 @@
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/component/StaticMeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@ -40,6 +42,8 @@ private:
Pipeline * pipeline =nullptr;
StaticMeshComponent *sm_component=nullptr;
private:
bool InitMaterial()
@ -87,7 +91,11 @@ private:
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));
@ -98,6 +106,11 @@ public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(sm_component);
}
bool Init() override
{
if(!InitMaterial())

View File

@ -43,7 +43,13 @@ COMPONENT_NAMESPACE_BEGIN
class ComponentManager;
class SceneNode;
struct ComponentData{};
struct ComponentData
{
public:
ComponentData()=default;
virtual ~ComponentData()=default;
};
/**
* <br>

View File

@ -49,7 +49,9 @@ public:
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;

View File

@ -22,6 +22,9 @@ VK_NAMESPACE_BEGIN
bool InitShaderCompiler();
void CloseShaderCompiler();
void InitializeComponentManager();
void UninitializeComponentManager();
namespace mtl
{
void ClearMaterialFactory();
@ -64,6 +67,7 @@ RenderFramework::~RenderFramework()
if(RENDER_FRAMEWORK_COUNT==0)
{
UninitializeComponentManager();
STD_MTL_NAMESPACE::ClearMaterialFactory();
CloseShaderCompiler();
}
@ -79,6 +83,8 @@ bool RenderFramework::Init(uint w,uint h)
logger::InitLogger(app_name);
InitNativeWindowSystem();
InitializeComponentManager();
}
++RENDER_FRAMEWORK_COUNT;

View File

@ -5,35 +5,65 @@ namespace hgl::graph
{
namespace
{
tsl::robin_map<size_t,ComponentManager *> component_manager_map;
using ComponentManagerMap=tsl::robin_map<size_t,ComponentManager *>;
ComponentManagerMap *component_manager_map=nullptr;
}//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)
{
if(!cm)return(false);
const size_t hash_code=cm->GetHashCode();
if(component_manager_map.contains(hash_code))
if(!component_manager_map)
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);
}
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);
//[]对于不存的会自行插入一个,所以不要把下面的.at改成[]
return component_manager_map.at(hash_code);
return component_manager_map->at(hash_code);
}
int ComponentManager::GetComponents(ArrayList<Component *> &comp_list,SceneNode *node)
{
if(!node)return(-1);
if(comp_list.IsEmpty())return(-2);
if(!component_manager_map)return(-3);
Component **cc=component_set.GetData();

View File

@ -6,7 +6,11 @@ COMPONENT_NAMESPACE_BEGIN
StaticMeshComponentData::~StaticMeshComponentData()
{
SAFE_CLEAR(mesh);
if(mesh)
{
//mesh->Release(); //外面有RenderResource管理不需要在这里释放.但未来要考虑是增加Release函数通知这里释放了一次使用权
mesh=nullptr;
}
}
Component *StaticMeshComponentManager::CreateComponent(ComponentData *data)