2025-05-05 03:25:19 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include<hgl/graph/VK.h>
|
|
|
|
#include<hgl/graph/mtl/StdMaterial.h>
|
|
|
|
#include<hgl/type/String.h>
|
2025-05-09 01:26:58 +08:00
|
|
|
#include<hgl/type/IDName.h>
|
2025-05-05 03:25:19 +08:00
|
|
|
|
|
|
|
STD_MTL_NAMESPACE_BEGIN
|
|
|
|
|
2025-05-09 01:26:58 +08:00
|
|
|
DefineIDName(MaterialName, char)
|
|
|
|
|
2025-05-05 03:25:19 +08:00
|
|
|
class MaterialFactory
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2025-05-09 01:26:58 +08:00
|
|
|
virtual const MaterialName &GetName()const=0;
|
2025-05-05 03:25:19 +08:00
|
|
|
|
|
|
|
//virtual const bool GetMaterialName()const=0;
|
|
|
|
|
|
|
|
//virtual const PrimitiveType supportPrimitive()const=0;
|
|
|
|
|
|
|
|
//virtual const bool is2D()const=0;
|
|
|
|
//virtual const bool is3D()const=0;
|
|
|
|
|
|
|
|
//virtual const bool hasCamera()const=0;
|
|
|
|
//virtual const bool hasLocalToWorld()const=0;
|
|
|
|
|
|
|
|
//virtual const CoordinateSystem2D get2DCoordinateSystem()const=0;
|
|
|
|
|
2025-05-17 20:26:36 +08:00
|
|
|
virtual MaterialCreateInfo *Create(const VulkanDevAttr *dev_attr,MaterialCreateConfig *)=0;
|
2025-05-05 03:25:19 +08:00
|
|
|
|
|
|
|
};//class MaterialFactory
|
|
|
|
|
2025-05-06 00:41:07 +08:00
|
|
|
bool RegistryMaterialFactory(MaterialFactory *);
|
2025-05-09 01:26:58 +08:00
|
|
|
MaterialFactory * GetMaterialFactory(const MaterialName &);
|
2025-05-05 03:25:19 +08:00
|
|
|
|
|
|
|
template<typename T> class RegistryMaterialFactoryClass
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
RegistryMaterialFactoryClass()
|
|
|
|
{
|
|
|
|
STD_MTL_NAMESPACE::RegistryMaterialFactory(new T);
|
|
|
|
}
|
2025-05-09 01:26:58 +08:00
|
|
|
};//class RegistryMaterialFactoryClass
|
2025-05-05 03:25:19 +08:00
|
|
|
|
2025-05-17 20:47:39 +08:00
|
|
|
#define DEFINE_MATERIAL_FACTORY_CLASS(name,cfg_type) \
|
2025-05-18 23:42:39 +08:00
|
|
|
namespace inline_material \
|
|
|
|
{ \
|
|
|
|
constexpr const char name[]=#name; \
|
|
|
|
} \
|
|
|
|
\
|
2025-05-17 20:26:36 +08:00
|
|
|
MaterialCreateInfo *Create##name(const VulkanDevAttr *dev_attr,cfg_type *); \
|
2025-05-17 20:01:17 +08:00
|
|
|
\
|
|
|
|
namespace \
|
|
|
|
{ \
|
2025-05-09 01:26:58 +08:00
|
|
|
class MaterialFactory##name:public MaterialFactory \
|
|
|
|
{ \
|
|
|
|
public: \
|
|
|
|
\
|
|
|
|
const MaterialName &GetName()const override \
|
|
|
|
{ \
|
|
|
|
static MaterialName mtl_name(#name); \
|
|
|
|
return mtl_name; \
|
|
|
|
} \
|
|
|
|
\
|
2025-05-17 20:26:36 +08:00
|
|
|
MaterialCreateInfo *Create(const VulkanDevAttr *dev_attr,MaterialCreateConfig *cfg) override \
|
2025-05-09 01:26:58 +08:00
|
|
|
{ \
|
2025-05-17 20:47:39 +08:00
|
|
|
return Create##name(dev_attr,(cfg_type *)cfg); \
|
2025-05-09 01:26:58 +08:00
|
|
|
} \
|
|
|
|
}; \
|
|
|
|
\
|
2025-05-17 20:01:17 +08:00
|
|
|
static RegistryMaterialFactoryClass<MaterialFactory##name> MaterialFactoryInstance_##name; \
|
|
|
|
}
|
2025-05-09 01:26:58 +08:00
|
|
|
|
2025-05-17 20:26:36 +08:00
|
|
|
MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const MaterialName &,MaterialCreateConfig *cfg);
|
2025-05-09 01:26:58 +08:00
|
|
|
|
2025-05-17 20:26:36 +08:00
|
|
|
inline MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const char *mtl_name,MaterialCreateConfig *cfg)
|
2025-05-09 01:26:58 +08:00
|
|
|
{
|
|
|
|
MaterialName mtl_id_name(mtl_name);
|
|
|
|
|
2025-05-16 09:12:33 +08:00
|
|
|
return CreateMaterialCreateInfo(dev_attr,mtl_id_name,cfg);
|
2025-05-09 01:26:58 +08:00
|
|
|
}
|
|
|
|
|
2025-05-17 20:26:36 +08:00
|
|
|
inline MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const AnsiString &mtl_name,MaterialCreateConfig *cfg)
|
2025-05-09 01:26:58 +08:00
|
|
|
{
|
|
|
|
MaterialName mtl_id_name(mtl_name);
|
|
|
|
|
2025-05-16 09:12:33 +08:00
|
|
|
return CreateMaterialCreateInfo(dev_attr,mtl_id_name,cfg);
|
2025-05-09 01:26:58 +08:00
|
|
|
}
|
2025-05-05 03:25:19 +08:00
|
|
|
|
|
|
|
STD_MTL_NAMESPACE_END
|
2025-05-09 01:26:58 +08:00
|
|
|
|