ULRE/inc/hgl/graph/module/GraphModuleFactory.h

60 lines
1.4 KiB
C
Raw Normal View History

#pragma once
#include<hgl/graph/VKNamespace.h>
2025-01-08 13:26:27 +08:00
#include<hgl/type/IDName.h>
#include<hgl/graph/module/GraphModule.h>
2025-01-09 00:48:15 +08:00
#include<hgl/graph/RenderFramework.h>
VK_NAMESPACE_BEGIN
class GraphModuleFactory
{
public:
GraphModuleFactory()=default;
virtual ~GraphModuleFactory()=default;
2025-01-09 00:48:15 +08:00
virtual GraphModule *Create(RenderFramework *)=0;
};//class GraphModuleFactory
bool RegistryGraphModuleFactory(const char *module_name,GraphModuleFactory *);
template<typename T> class RegistryGraphModule:public GraphModuleFactory
{
public:
2025-01-09 00:48:15 +08:00
GraphModule *Create(RenderFramework *rf) override
{
2025-01-09 00:48:15 +08:00
if(!rf)
return(nullptr);
Map<AnsiIDName,GraphModule *> dgm_map;
//检查依赖模块
{
const auto &dependent_modules=T::GetDependentModules();
if(!dependent_modules.IsEmpty())
{
for(const AnsiIDName &name:dependent_modules)
{
2025-01-09 00:48:15 +08:00
GraphModule *dgm=rf->GetModule(name,true);
if(!dgm)
return(nullptr);
dgm_map.Add(name,dgm);
}
}
}
2025-01-09 00:48:15 +08:00
T *gm=T::CreateModule(rf,dgm_map);
2024-11-09 19:28:31 +08:00
return(gm);
}
};//template<typename T> class RegistryGraphModule:public GraphModuleFactory
2024-11-09 19:28:31 +08:00
#define REGISTRY_GRAPH_MODULE(Class) {RegistryGraphModuleFactory(#Class,new RegistryGraphModule<Class>);}
VK_NAMESPACE_END