diff --git a/src/ShaderGen/3d/Std3DMaterialLoader.cpp b/src/ShaderGen/3d/Std3DMaterialLoader.cpp index a7c8fb3b..a4f62dd4 100644 --- a/src/ShaderGen/3d/Std3DMaterialLoader.cpp +++ b/src/ShaderGen/3d/Std3DMaterialLoader.cpp @@ -1,124 +1,125 @@ -#include "MaterialFileData.h" -#include "Std3DMaterial.h" -#include +#include"MaterialFileData.h" +#include"Std3DMaterial.h" +#include STD_MTL_NAMESPACE_BEGIN const char *GetUBOCodes(const AccumMemoryManager::Block *block); -namespace { -class Std3DMaterialLoader : public Std3DMaterial +namespace { -protected: - - material_file::MaterialFileData *mfd; - -public: - - Std3DMaterialLoader(material_file::MaterialFileData* data, const Material3DCreateConfig* cfg) - : Std3DMaterial(cfg) + class Std3DMaterialLoader: public Std3DMaterial { - mfd = data; - } + protected: - ~Std3DMaterialLoader() - { - delete mfd; - } + material_file::MaterialFileData *mfd; - bool BeginCustomShader() override - { - if (!Std3DMaterial::BeginCustomShader()) - return (false); + public: - for(const auto ubo:mfd->ubo_list) + Std3DMaterialLoader(material_file::MaterialFileData *data,const Material3DCreateConfig *cfg) + : Std3DMaterial(cfg) { - const char *ubo_codes=GetUBOCodes(ubo.block); - - mci->AddStruct(ubo.struct_name,ubo_codes); - - mci->AddUBO(ubo.shader_stage_flag_bits, - ubo.set, - ubo.struct_name, - ubo.name); + mfd=data; } - if (mfd->mi.mi_bytes > 0) + ~Std3DMaterialLoader() { - mci->SetMaterialInstance( mfd->mi.code, - mfd->mi.mi_bytes, - mfd->mi.shader_stage_flag_bits); + delete mfd; } - return true; - } + bool BeginCustomShader() override + { + if(!Std3DMaterial::BeginCustomShader()) + return (false); - material_file::ShaderData* CommonProc(VkShaderStageFlagBits ss, ShaderCreateInfo* sc) - { - material_file::ShaderData* sd = mfd->shader[ss]; + for(const auto ubo:mfd->ubo_list) + { + const char *ubo_codes=GetUBOCodes(ubo.block); - if (!sd) - return (nullptr); + mci->AddStruct(ubo.struct_name,ubo_codes); - for (auto& ua : sd->output) - sc->AddOutput(ua.vat, ua.name); + mci->AddUBO(ubo.shader_stage_flag_bits, + ubo.set, + ubo.struct_name, + ubo.name); + } - for (auto& s : sd->sampler) - mci->AddSampler(ss, DescriptorSetType::PerMaterial, s.type, s.name); + if(mfd->mi.mi_bytes>0) + { + 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 - { - for (auto& ua : mfd->vi) - vsc->AddInput(ua.vat, ua.name); + if(!sd) + return (nullptr); - if(mfd->mi.mi_bytes>0) - vsc->AddMaterialInstanceID(); + for(auto &ua:sd->output) + sc->AddOutput(ua.vat,ua.name); - if (!Std3DMaterial::CustomVertexShader(vsc)) - return (false); + for(auto &s:sd->sampler) + 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 - { - material_file::GeometryShaderData* sd = (material_file::GeometryShaderData*)CommonProc(VK_SHADER_STAGE_GEOMETRY_BIT, gsc); + return sd; + } - if (!sd) - return (false); + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override + { + 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_FRAGMENT_BIT, fsc); - } -}; // class Std3DMaterialLoader:public Std3DMaterial + 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 -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); - material_file::MaterialFileData* mfd = LoadMaterialDataFromFile(name); + material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name); - if (!mfd) + if(!mfd) 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(); }