成功使用字符串创建MaterialCreateInfo,为后续使用名称创建材质提供基础
This commit is contained in:
parent
33976d9bf6
commit
b030684cbd
2
CMCore
2
CMCore
@ -1 +1 @@
|
||||
Subproject commit b4d1bd17a9a85feb5f13cc6fac201f4f75942f70
|
||||
Subproject commit 511dd86c56383bc14078602f5e5baab1a3109ae5
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user