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

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

2
CMCore

@ -1 +1 @@
Subproject commit b4d1bd17a9a85feb5f13cc6fac201f4f75942f70
Subproject commit 511dd86c56383bc14078602f5e5baab1a3109ae5

View File

@ -3,6 +3,7 @@
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
#include"AssetData.h"
using namespace hgl;
@ -47,7 +48,10 @@ private:
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg);
//AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg); //这个是直接创建
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateMaterialCreateInfo("VertexColor2D",&cfg); //这个是使用名称创建
//这两种方式都可以,上一种方式肯定是会快些,主要用于一些程序中直接写死的地方。
//而下面这种方式很明显是为了可以将使用的材质写入配置文件中。
material_instance=CreateMaterialInstance(mci);

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

View File

@ -71,7 +71,7 @@ void RenderAssignBuffer::StatL2W(const RenderNodeList &rn_list)
RenderNode *rn=rn_list.GetData();
Matrix4f *l2wp=(Matrix4f *)(l2w_buffer->DeviceBuffer::Map());
for(uint i=0;i<rn_list.GetCount();i++)
for(int i=0;i<rn_list.GetCount();i++)
{
*l2wp=rn->scene_node->GetLocalToWorldMatrix();
++l2wp;

View File

@ -62,25 +62,25 @@ MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *cfg)
return mvc2d.Create();
}
class MaterialFactoryVertexColor2D:public MaterialFactory
{
public:
//class MaterialFactoryVertexColor2D:public MaterialFactory
//{
//public:
//
// const MaterialName &GetName()const override
// {
// static MaterialName mtl_name("VertexColor2D");
//
// return mtl_name;
// }
//
// MaterialCreateInfo *Create(MaterialCreateConfig *cfg) override
// {
// return CreateVertexColor2D((Material2DCreateConfig *)cfg);
// }
//};//class MaterialFactoryVertexColor2D:public MaterialFactory
//
//DEFINE_MATERIAL_FACTORY(VertexColor2D)
MaterialFactoryVertexColor2D()
{
}
AnsiString GetName()const override
{
return "VertexColor2D";
}
MaterialCreateInfo *Create(MaterialCreateConfig *cfg) override
{
return CreateVertexColor2D((Material2DCreateConfig *)cfg);
}
};//class MaterialFactoryVertexColor2D:public MaterialFactory
DEFINE_MATERIAL_FACTORY(VertexColor2D)
DEFINE_MATERIAL_FACTORY_CLASS(VertexColor2D,CreateVertexColor2D,Material2DCreateConfig)
STD_MTL_NAMESPACE_END

View File

@ -6,7 +6,7 @@ STD_MTL_NAMESPACE_BEGIN
namespace
{
using MaterialFactoryMap=ObjectMap<AnsiString,MaterialFactory>;
using MaterialFactoryMap=ObjectMap<int,MaterialFactory>;
using MaterialFactoryMapPtr=MaterialFactoryMap *;
MaterialFactoryMapPtr material_factory_map=nullptr;
@ -17,27 +17,28 @@ bool RegistryMaterialFactory(MaterialFactory *mf)
if(!mf)
return(false);
const AnsiString &name=mf->GetName();
const MaterialName &name=mf->GetName();
const int name_id=name.GetID();
if(!material_factory_map)
{
material_factory_map=new MaterialFactoryMap();
}
if(material_factory_map->ContainsKey(name))
if(material_factory_map->ContainsKey(name_id))
return(false);
material_factory_map->Add(name,mf);
material_factory_map->Add(name_id,mf);
return(true);
}
MaterialFactory *GetMaterialFactory(const AnsiString &name)
MaterialFactory *GetMaterialFactory(const MaterialName &name)
{
if(!material_factory_map)
return(nullptr);
return (*material_factory_map)[name];
return (*material_factory_map)[name.GetID()];
}
void ClearMaterialFactory()
@ -45,9 +46,9 @@ void ClearMaterialFactory()
SAFE_CLEAR(material_factory_map);
}
MaterialCreateInfo *CreateMaterialCreateInfo(const AnsiString &name,MaterialCreateConfig *cfg,const VILConfig *vil_cfg)
MaterialCreateInfo *CreateMaterialCreateInfo(const MaterialName &name,MaterialCreateConfig *cfg)
{
if(name.IsEmpty())
if(!cfg)
return(nullptr);
MaterialFactory *mf=GetMaterialFactory(name);