尝试制作StaticMeshComponent
This commit is contained in:
parent
8ee9cdc396
commit
edaf5aa3ca
@ -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())
|
||||
|
@ -43,7 +43,13 @@ COMPONENT_NAMESPACE_BEGIN
|
||||
class ComponentManager;
|
||||
class SceneNode;
|
||||
|
||||
struct ComponentData{};
|
||||
struct ComponentData
|
||||
{
|
||||
public:
|
||||
|
||||
ComponentData()=default;
|
||||
virtual ~ComponentData()=default;
|
||||
};
|
||||
|
||||
/**
|
||||
* 基础组件<br>
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user