成功使用字符串创建MaterialCreateInfo,为后续使用名称创建材质提供基础

This commit is contained in:
2025-05-09 01:26:58 +08:00
parent 33976d9bf6
commit b030684cbd
6 changed files with 77 additions and 35 deletions

View File

@@ -3,14 +3,17 @@
#include<hgl/graph/VK.h>
#include<hgl/graph/mtl/StdMaterial.h>
#include<hgl/type/String.h>
#include<hgl/type/IDName.h>
STD_MTL_NAMESPACE_BEGIN
DefineIDName(MaterialName, char)
class MaterialFactory
{
public:
virtual AnsiString GetName()const=0;
virtual const MaterialName &GetName()const=0;
//virtual const bool GetMaterialName()const=0;
@@ -24,12 +27,12 @@ public:
//virtual const CoordinateSystem2D get2DCoordinateSystem()const=0;
virtual MaterialCreateInfo *Create(MaterialCreateConfig *);
virtual MaterialCreateInfo *Create(MaterialCreateConfig *)=0;
};//class MaterialFactory
bool RegistryMaterialFactory(MaterialFactory *);
MaterialFactory * GetMaterialFactory(const AnsiString &);
MaterialFactory * GetMaterialFactory(const MaterialName &);
template<typename T> class RegistryMaterialFactoryClass
{
@@ -39,10 +42,44 @@ public:
{
STD_MTL_NAMESPACE::RegistryMaterialFactory(new T);
}
};
};//class RegistryMaterialFactoryClass
#define DEFINE_MATERIAL_FACTORY(name) namespace{static RegistryMaterialFactoryClass<MaterialFactory##name> MaterialFactoryInstance_##name;}
MaterialCreateInfo *CreateMaterialCreateInfo(const AnsiString &,MaterialCreateConfig *cfg=nullptr,const VILConfig *vil_cfg=nullptr);
#define DEFINE_MATERIAL_FACTORY_CLASS(name,create_func,cfg_type) \
class MaterialFactory##name:public MaterialFactory \
{ \
public: \
\
const MaterialName &GetName()const override \
{ \
static MaterialName mtl_name(#name); \
return mtl_name; \
} \
\
MaterialCreateInfo *Create(MaterialCreateConfig *cfg) override \
{ \
return create_func((cfg_type *)cfg); \
} \
}; \
\
DEFINE_MATERIAL_FACTORY(name)
MaterialCreateInfo *CreateMaterialCreateInfo(const MaterialName &,MaterialCreateConfig *cfg);
inline MaterialCreateInfo *CreateMaterialCreateInfo(const char *mtl_name,MaterialCreateConfig *cfg)
{
MaterialName mtl_id_name(mtl_name);
return CreateMaterialCreateInfo(mtl_id_name,cfg);
}
inline MaterialCreateInfo *CreateMaterialCreateInfo(const AnsiString &mtl_name,MaterialCreateConfig *cfg)
{
MaterialName mtl_id_name(mtl_name);
return CreateMaterialCreateInfo(mtl_id_name,cfg);
}
STD_MTL_NAMESPACE_END