ULRE/src/ShaderGen/3d/Std3DMaterialLoader.cpp

124 lines
3.4 KiB
C++
Raw Normal View History

2024-03-26 01:22:58 +08:00
#include"MaterialFileData.h"
#include"Std3DMaterial.h"
#include<hgl/shadergen/MaterialCreateInfo.h>
STD_MTL_NAMESPACE_BEGIN
const char *GetUBOCodes(const AccumMemoryManager::Block *block);
2024-03-26 01:22:58 +08:00
namespace
{
2024-03-26 01:22:58 +08:00
class Std3DMaterialLoader: public Std3DMaterial
{
2024-03-26 01:22:58 +08:00
protected:
2024-03-26 01:22:58 +08:00
material_file::MaterialFileData *mfd;
2024-03-26 01:22:58 +08:00
public:
Std3DMaterialLoader(material_file::MaterialFileData *data,const Material3DCreateConfig *c)
: Std3DMaterial(c)
{
2024-03-26 01:22:58 +08:00
mfd=data;
}
2024-03-26 01:22:58 +08:00
~Std3DMaterialLoader()
{
2024-03-26 01:22:58 +08:00
delete mfd;
}
2024-03-26 01:22:58 +08:00
bool BeginCustomShader() override
{
if(!Std3DMaterial::BeginCustomShader())
return (false);
2024-03-26 01:22:58 +08:00
for(const auto ubo:mfd->ubo_list)
{
const char *ubo_codes=GetUBOCodes(ubo.block);
2024-03-26 01:22:58 +08:00
mci->AddStruct(ubo.struct_name,ubo_codes);
2024-03-26 01:22:58 +08:00
mci->AddUBO(ubo.shader_stage_flag_bits,
ubo.set,
ubo.struct_name,
ubo.name);
}
2024-03-26 01:22:58 +08:00
if(mfd->mi.mi_bytes>0)
{
mci->SetMaterialInstance(mfd->mi.code,
mfd->mi.mi_bytes,
mfd->mi.shader_stage_flag_bits);
}
2024-03-26 01:22:58 +08:00
return true;
}
2024-03-26 01:22:58 +08:00
material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc)
{
material_file::ShaderData *sd=mfd->shader[ss];
2024-03-26 01:22:58 +08:00
if(!sd)
return (nullptr);
2024-03-26 01:22:58 +08:00
for(auto &ua:sd->output)
sc->AddOutput(ua.vat,ua.name);
2024-03-26 01:22:58 +08:00
for(auto &s:sd->sampler)
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
2024-03-26 01:22:58 +08:00
sc->SetMain(sd->code,sd->code_length); // 这里会产生复制这个string但我不希望产生这个。未来想办法改进
2024-03-26 01:22:58 +08:00
return sd;
}
2024-03-26 01:22:58 +08:00
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
{
for(auto &ua:mfd->vi)
vsc->AddInput(ua.vat,ua.name);
2024-03-26 01:22:58 +08:00
if(!Std3DMaterial::CustomVertexShader(vsc))
return (false);
2024-03-26 01:22:58 +08:00
return CommonProc(VK_SHADER_STAGE_VERTEX_BIT,vsc);
}
bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override
{
material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT,gsc);
if(!sd)
return (false);
gsc->SetGeom(sd->input_prim,sd->output_prim,sd->max_vertices);
return true;
}
bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override
{
return CommonProc(VK_SHADER_STAGE_FRAGMENT_BIT,fsc);
}
}; // class Std3DMaterialLoader:public Std3DMaterial
} // namespace
2024-03-26 01:22:58 +08:00
material_file::MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename);
2024-03-26 01:22:58 +08:00
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material3DCreateConfig *cfg)
{
2024-03-26 01:22:58 +08:00
if(name.IsEmpty()||!cfg)
return (nullptr);
2024-03-26 01:22:58 +08:00
material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name);
2024-03-26 01:22:58 +08:00
if(!mfd)
return nullptr;
2024-03-26 01:22:58 +08:00
cfg->shader_stage_flag_bit=mfd->shader_stage_flag_bit;
2024-03-26 01:22:58 +08:00
Std3DMaterialLoader mtl(mfd,cfg);
return mtl.Create();
}
STD_MTL_NAMESPACE_END