准备增加MaterialLibrary

This commit is contained in:
hyzboy 2025-05-05 03:25:19 +08:00
parent 2b251f06d4
commit 9be5de0f57
8 changed files with 174 additions and 15 deletions

2
CMCore

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

@ -1 +1 @@
Subproject commit 2d9dae646081e79f4a822bf79fd9c552617a764f Subproject commit be7f43d6a9077288e5ef883a56f54310dce5f735

View File

@ -1,10 +1,8 @@
#pragma once #pragma once
#include<hgl/TypeFunc.h> #include<hgl/TypeFunc.h>
namespace hgl namespace hgl::graph
{ {
namespace graph
{
enum class CoordinateSystem2D enum class CoordinateSystem2D
{ {
NDC, NDC,
@ -13,5 +11,4 @@ namespace hgl
ENUM_CLASS_RANGE(NDC,Ortho) ENUM_CLASS_RANGE(NDC,Ortho)
}; };
}//namespace graph }//namespace hgl::graph
}//namespace hgl

View File

@ -53,7 +53,6 @@ public:
MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *); MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *);
MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *); MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *);
struct MaterialLerpLineConfig struct MaterialLerpLineConfig
{ {

View File

@ -0,0 +1,70 @@
#pragma once
#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 const bool GetMaterialName()const=0;
virtual const MaterialDomain GetDomain()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();
};//class MaterialFactory
bool RegistryMaterialFactory(MaterialFactory *);
MaterialFactory *GetMaterialFactory(const AIDName &);
void ClearMaterialFactory();
template<typename T> class RegistryMaterialFactoryClass
{
public:
RegistryMaterialFactoryClass()
{
STD_MTL_NAMESPACE::RegistryMaterialFactory(new T);
}
};
#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);
STD_MTL_NAMESPACE_END

View File

@ -1,5 +1,6 @@
#include"Std2DMaterial.h" #include"Std2DMaterial.h"
#include<hgl/shadergen/MaterialCreateInfo.h> #include<hgl/shadergen/MaterialCreateInfo.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
STD_MTL_NAMESPACE_BEGIN STD_MTL_NAMESPACE_BEGIN
namespace namespace
@ -60,4 +61,26 @@ MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *cfg)
return mvc2d.Create(); return mvc2d.Create();
} }
class MaterialFactoryVertexColor2D:public MaterialFactory
{
public:
MaterialFactoryVertexColor2D()
{
}
AnsiString GetName()const override
{
return "VertexColor2D";
}
MaterialCreateInfo *Create() override
{
return CreateVertexColor2D(nullptr);
}
};//class MaterialFactoryVertexColor2D:public MaterialFactory
DEFINE_MATERIAL_FACTORY(VertexColor2D)
STD_MTL_NAMESPACE_END STD_MTL_NAMESPACE_END

View File

@ -90,7 +90,10 @@ SOURCE_GROUP("Standard Material\\Light Model\\Blinn Phong" FILES ${BLINN_PHONG_H
SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES}) SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES})
SOURCE_GROUP("Standard Material\\3D" FILES ${STD_MTL_3D_SOURCE_FILES}) SOURCE_GROUP("Standard Material\\3D" FILES ${STD_MTL_3D_SOURCE_FILES})
SET(SHADER_LIBRARY_FILES ShaderLibrary.cpp ShaderLibrary.h) SET(SHADER_LIBRARY_FILES ShaderLibrary.cpp
ShaderLibrary.h
MaterialLibrary.cpp
${STD_MTL_HEADER_PATH}/MaterialLibrary.h)
SOURCE_GROUP("Shader Library" FILES ${SHADER_LIBRARY_FILES}) SOURCE_GROUP("Shader Library" FILES ${SHADER_LIBRARY_FILES})

View File

@ -0,0 +1,67 @@
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/type/IDName.h>
#include<tsl/robin_map.h>
STD_MTL_NAMESPACE_BEGIN
namespace
{
using MaterialFactoryMap=tsl::robin_map<AIDName,MaterialFactory *>;
MaterialFactoryMap *material_factory_map=nullptr;
}//namespace
bool RegistryMaterialFactory(MaterialFactory *mf)
{
if(!mf)
return(false);
const AIDName name=mf->GetName();
if(!material_factory_map)
{
material_factory_map=new MaterialFactoryMap;
}
if(material_factory_map->contains(name))
return(false);
material_factory_map->insert({name,mf});
const MaterialDomain &domain=mf->GetDomain();
return(true);
}
MaterialFactory *GetMaterialFactory(const AIDName &name)
{
if(!material_factory_map)
return(nullptr);
auto it=material_factory_map->find(name);
if(it==material_factory_map->end())
return(nullptr);
return(it->second);
}
void ClearMaterialFactory()
{
if(!material_factory_map)
return;
SAFE_CLEAR_STD_MAP(*material_factory_map)
delete material_factory_map;
material_factory_map=nullptr;
}
Material *CreateMaterial2D(const AnsiString &name,Material2DCreateConfig *cfg)
{
}
STD_MTL_NAMESPACE_END