初步实现CreateMaterialCreateInfo(name,cfg,vil),下一待整合进WorkObject/WorkManager后正式启用。

This commit is contained in:
hyzboy 2025-05-06 00:41:07 +08:00
parent 9be5de0f57
commit e88facf834
7 changed files with 36 additions and 49 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 3f44011ea2894e618c8fdd361e3b7f7260bf7a04
Subproject commit b4d1bd17a9a85feb5f13cc6fac201f4f75942f70

View File

@ -1,5 +1,4 @@
#ifndef HGL_GRAPH_MTL_CONFIG_INCLUDE
#define HGL_GRAPH_MTL_CONFIG_INCLUDE
#pragma once
#include<hgl/graph/mtl/StdMaterial.h>
#include<hgl/type/String.h>
@ -15,7 +14,7 @@ class MaterialCreateInfo;
*/
struct MaterialCreateConfig:public Comparator<MaterialCreateConfig>
{
const GPUDeviceAttribute *dev_attr;
const GPUDeviceAttribute * dev_attr; ///<GPU设备属性(目前仅用于获取UBO/SSBO数值未来可以考虑干掉)
AnsiString mtl_name; ///<材质名称
@ -61,4 +60,3 @@ public:
}
};//struct MaterialCreateConfig
STD_MTL_NAMESPACE_END
#endif//HGL_GRAPH_MTL_CONFIG_INCLUDE

View File

@ -2,35 +2,18 @@
#include<hgl/graph/VK.h>
#include<hgl/graph/mtl/StdMaterial.h>
#include<hgl/type/IDName.h>
#include<hgl/type/String.h>
STD_MTL_NAMESPACE_BEGIN
enum class MaterialDomain
{
UI, ///<用户界面,一般2D均使用这种
Gizmo, ///<Gizmo材质(基本同Surface但很多数值和处理逻辑会写死)
Surface, ///<常规的3D表面材质
DeferredDecal, ///<延迟贴花材质
PostProcess, ///<后期处理材质
ENUM_CLASS_RANGE(UI,PostProcess)
};
class MaterialFactory
{
public:
virtual AIDName GetName()const=0;
virtual AnsiString GetName()const=0;
//virtual const bool GetMaterialName()const=0;
virtual const MaterialDomain GetDomain()const=0;
//virtual const PrimitiveType supportPrimitive()const=0;
//virtual const bool is2D()const=0;
@ -41,13 +24,12 @@ public:
//virtual const CoordinateSystem2D get2DCoordinateSystem()const=0;
virtual MaterialCreateInfo *Create();
virtual MaterialCreateInfo *Create(MaterialCreateConfig *);
};//class MaterialFactory
bool RegistryMaterialFactory(MaterialFactory *);
MaterialFactory *GetMaterialFactory(const AIDName &);
void ClearMaterialFactory();
MaterialFactory * GetMaterialFactory(const AnsiString &);
template<typename T> class RegistryMaterialFactoryClass
{
@ -61,10 +43,6 @@ public:
#define DEFINE_MATERIAL_FACTORY(name) namespace{static RegistryMaterialFactoryClass<MaterialFactory##name> MaterialFactoryInstance_##name;}
struct Material2DCreateConfig;
struct Material3DCreateConfig;
Material *CreateMaterial2D(const AnsiString &,Material2DCreateConfig *cfg=nullptr);
Material *CreateMaterial3D(const AnsiString &,Material3DCreateConfig *cfg=nullptr);
MaterialCreateInfo *CreateMaterialCreateInfo(const AnsiString &,MaterialCreateConfig *cfg=nullptr,const VILConfig *vil_cfg=nullptr);
STD_MTL_NAMESPACE_END

View File

@ -16,6 +16,11 @@ VK_NAMESPACE_BEGIN
bool InitShaderCompiler();
void CloseShaderCompiler();
namespace mtl
{
void ClearMaterialFactory();
}
namespace
{
static int RENDER_FRAMEWORK_COUNT=0;
@ -49,6 +54,7 @@ RenderFramework::~RenderFramework()
if(RENDER_FRAMEWORK_COUNT==0)
{
STD_MTL_NAMESPACE::ClearMaterialFactory();
CloseShaderCompiler();
}
}

View File

@ -75,9 +75,9 @@ public:
return "VertexColor2D";
}
MaterialCreateInfo *Create() override
MaterialCreateInfo *Create(MaterialCreateConfig *cfg) override
{
return CreateVertexColor2D(nullptr);
return CreateVertexColor2D((Material2DCreateConfig *)cfg);
}
};//class MaterialFactoryVertexColor2D:public MaterialFactory

View File

@ -239,7 +239,7 @@ bool MaterialCreateInfo::CreateShader()
if(!shader_map.GetValue(i,sc))
return(false);
if(sc->GetShaderStage()<mi_shader_stage)
if(static_cast<uint32_t>(sc->GetShaderStage())<mi_shader_stage)
sc->AddMaterialInstanceOutput();
sc->CreateShader(last);

View File

@ -6,9 +6,10 @@ STD_MTL_NAMESPACE_BEGIN
namespace
{
using MaterialFactoryMap=tsl::robin_map<AIDName,MaterialFactory *>;
using MaterialFactoryMap=tsl::robin_map<AnsiString,MaterialFactory *>;
using MaterialFactoryMapPtr=MaterialFactoryMap *;
MaterialFactoryMap *material_factory_map=nullptr;
MaterialFactoryMapPtr material_factory_map=nullptr;
}//namespace
bool RegistryMaterialFactory(MaterialFactory *mf)
@ -16,7 +17,7 @@ bool RegistryMaterialFactory(MaterialFactory *mf)
if(!mf)
return(false);
const AIDName name=mf->GetName();
const AnsiString &name=mf->GetName();
if(!material_factory_map)
{
@ -28,14 +29,10 @@ bool RegistryMaterialFactory(MaterialFactory *mf)
material_factory_map->insert({name,mf});
const MaterialDomain &domain=mf->GetDomain();
return(true);
}
MaterialFactory *GetMaterialFactory(const AIDName &name)
MaterialFactory *GetMaterialFactory(const AnsiString &name)
{
if(!material_factory_map)
return(nullptr);
@ -59,9 +56,17 @@ void ClearMaterialFactory()
material_factory_map=nullptr;
}
Material *CreateMaterial2D(const AnsiString &name,Material2DCreateConfig *cfg)
MaterialCreateInfo *CreateMaterialCreateInfo(const AnsiString &name,MaterialCreateConfig *cfg,const VILConfig *vil_cfg)
{
if(name.IsEmpty())
return(nullptr);
MaterialFactory *mf=GetMaterialFactory(name);
if(!mf)
return(nullptr);
return mf->Create(cfg);
}
STD_MTL_NAMESPACE_END