Layout codes

This commit is contained in:
hyzboy 2024-03-26 01:22:58 +08:00
parent a60ffbb7da
commit 8492b886c9

View File

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