#pragma once #include #include #include #include STD_MTL_NAMESPACE_BEGIN DefineIDName(MaterialName, char) class MaterialFactory { public: virtual const MaterialName &GetName()const=0; //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; virtual MaterialCreateInfo *Create(const VulkanDevAttr *dev_attr,MaterialCreateConfig *)=0; };//class MaterialFactory bool RegistryMaterialFactory(MaterialFactory *); MaterialFactory * GetMaterialFactory(const MaterialName &); template class RegistryMaterialFactoryClass { public: RegistryMaterialFactoryClass() { STD_MTL_NAMESPACE::RegistryMaterialFactory(new T); } };//class RegistryMaterialFactoryClass #define DEFINE_MATERIAL_FACTORY_CLASS(name,cfg_type) \ namespace inline_material \ { \ constexpr const char name[]=#name; \ } \ \ MaterialCreateInfo *Create##name(const VulkanDevAttr *dev_attr,cfg_type *); \ \ namespace \ { \ class MaterialFactory##name:public MaterialFactory \ { \ public: \ \ const MaterialName &GetName()const override \ { \ static MaterialName mtl_name(#name); \ return mtl_name; \ } \ \ MaterialCreateInfo *Create(const VulkanDevAttr *dev_attr,MaterialCreateConfig *cfg) override \ { \ return Create##name(dev_attr,(cfg_type *)cfg); \ } \ }; \ \ static RegistryMaterialFactoryClass MaterialFactoryInstance_##name; \ } MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const MaterialName &,MaterialCreateConfig *cfg); inline MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const char *mtl_name,MaterialCreateConfig *cfg) { MaterialName mtl_id_name(mtl_name); return CreateMaterialCreateInfo(dev_attr,mtl_id_name,cfg); } inline MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const AnsiString &mtl_name,MaterialCreateConfig *cfg) { MaterialName mtl_id_name(mtl_name); return CreateMaterialCreateInfo(dev_attr,mtl_id_name,cfg); } STD_MTL_NAMESPACE_END