diff --git a/CMCore b/CMCore index b4d1bd17..511dd86c 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit b4d1bd17a9a85feb5f13cc6fac201f4f75942f70 +Subproject commit 511dd86c56383bc14078602f5e5baab1a3109ae5 diff --git a/example/Basic/rf_test.cpp b/example/Basic/rf_test.cpp index 4aa6887d..4c82e018 100644 --- a/example/Basic/rf_test.cpp +++ b/example/Basic/rf_test.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include"AssetData.h" using namespace hgl; @@ -47,7 +48,10 @@ private: cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.local_to_world=false; - AutoDelete mci=mtl::CreateVertexColor2D(&cfg); + //AutoDelete mci=mtl::CreateVertexColor2D(&cfg); //这个是直接创建 + AutoDelete mci=mtl::CreateMaterialCreateInfo("VertexColor2D",&cfg); //这个是使用名称创建 + //这两种方式都可以,上一种方式肯定是会快些,主要用于一些程序中直接写死的地方。 + //而下面这种方式很明显是为了可以将使用的材质写入配置文件中。 material_instance=CreateMaterialInstance(mci); diff --git a/inc/hgl/graph/mtl/MaterialLibrary.h b/inc/hgl/graph/mtl/MaterialLibrary.h index 4d82cdf1..a19fa4a6 100644 --- a/inc/hgl/graph/mtl/MaterialLibrary.h +++ b/inc/hgl/graph/mtl/MaterialLibrary.h @@ -3,14 +3,17 @@ #include #include #include +#include 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 class RegistryMaterialFactoryClass { @@ -39,10 +42,44 @@ public: { STD_MTL_NAMESPACE::RegistryMaterialFactory(new T); } -}; +};//class RegistryMaterialFactoryClass #define DEFINE_MATERIAL_FACTORY(name) namespace{static RegistryMaterialFactoryClass 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 + diff --git a/src/SceneGraph/render/RenderAssignBuffer.cpp b/src/SceneGraph/render/RenderAssignBuffer.cpp index 46660ddb..c257833c 100644 --- a/src/SceneGraph/render/RenderAssignBuffer.cpp +++ b/src/SceneGraph/render/RenderAssignBuffer.cpp @@ -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;iscene_node->GetLocalToWorldMatrix(); ++l2wp; diff --git a/src/ShaderGen/2d/M_VertexColor2D.cpp b/src/ShaderGen/2d/M_VertexColor2D.cpp index 3fdb8aee..b02175d4 100644 --- a/src/ShaderGen/2d/M_VertexColor2D.cpp +++ b/src/ShaderGen/2d/M_VertexColor2D.cpp @@ -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 diff --git a/src/ShaderGen/MaterialLibrary.cpp b/src/ShaderGen/MaterialLibrary.cpp index 83e9e5b4..d67085a6 100644 --- a/src/ShaderGen/MaterialLibrary.cpp +++ b/src/ShaderGen/MaterialLibrary.cpp @@ -6,7 +6,7 @@ STD_MTL_NAMESPACE_BEGIN namespace { - using MaterialFactoryMap=ObjectMap; + using MaterialFactoryMap=ObjectMap; 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);