2024-03-26 01:22:58 +08:00
|
|
|
|
#include"MaterialFileData.h"
|
|
|
|
|
#include"Std3DMaterial.h"
|
|
|
|
|
#include<hgl/shadergen/MaterialCreateInfo.h>
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
|
|
|
|
STD_MTL_NAMESPACE_BEGIN
|
|
|
|
|
|
2024-03-09 22:26:45 +08:00
|
|
|
|
const char *GetUBOCodes(const AccumMemoryManager::Block *block);
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
namespace
|
2024-03-09 22:26:45 +08:00
|
|
|
|
{
|
2024-03-26 01:22:58 +08:00
|
|
|
|
class Std3DMaterialLoader: public Std3DMaterial
|
2023-10-10 14:49:33 +08:00
|
|
|
|
{
|
2024-03-26 01:22:58 +08:00
|
|
|
|
protected:
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
material_file::MaterialFileData *mfd;
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
public:
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-05-25 17:58:39 +08:00
|
|
|
|
Std3DMaterialLoader(material_file::MaterialFileData *data,const Material3DCreateConfig *c)
|
|
|
|
|
: Std3DMaterial(c)
|
2024-03-09 22:26:45 +08:00
|
|
|
|
{
|
2024-03-26 01:22:58 +08:00
|
|
|
|
mfd=data;
|
2024-03-09 22:26:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
~Std3DMaterialLoader()
|
2024-03-09 22:26:45 +08:00
|
|
|
|
{
|
2024-03-26 01:22:58 +08:00
|
|
|
|
delete mfd;
|
2023-10-10 14:49:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
bool BeginCustomShader() override
|
|
|
|
|
{
|
|
|
|
|
if(!Std3DMaterial::BeginCustomShader())
|
|
|
|
|
return (false);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
for(const auto ubo:mfd->ubo_list)
|
|
|
|
|
{
|
|
|
|
|
const char *ubo_codes=GetUBOCodes(ubo.block);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
mci->AddStruct(ubo.struct_name,ubo_codes);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
mci->AddUBO(ubo.shader_stage_flag_bits,
|
|
|
|
|
ubo.set,
|
|
|
|
|
ubo.struct_name,
|
|
|
|
|
ubo.name);
|
|
|
|
|
}
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
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);
|
|
|
|
|
}
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
material_file::ShaderData *CommonProc(VkShaderStageFlagBits ss,ShaderCreateInfo *sc)
|
|
|
|
|
{
|
|
|
|
|
material_file::ShaderData *sd=mfd->shader[ss];
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
if(!sd)
|
|
|
|
|
return (nullptr);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
for(auto &ua:sd->output)
|
|
|
|
|
sc->AddOutput(ua.vat,ua.name);
|
2024-03-26 01:20:20 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
for(auto &s:sd->sampler)
|
|
|
|
|
mci->AddSampler(ss,DescriptorSetType::PerMaterial,s.type,s.name);
|
2024-03-12 23:29:06 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
sc->SetMain(sd->code,sd->code_length); // 这里会产生复制这个string,但我不希望产生这个。未来想办法改进
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
return sd;
|
|
|
|
|
}
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override
|
|
|
|
|
{
|
|
|
|
|
for(auto &ua:mfd->vi)
|
|
|
|
|
vsc->AddInput(ua.vat,ua.name);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
if(!Std3DMaterial::CustomVertexShader(vsc))
|
|
|
|
|
return (false);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
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
|
2023-10-10 14:49:33 +08:00
|
|
|
|
} // namespace
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
material_file::MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,Material3DCreateConfig *cfg)
|
2023-10-10 14:49:33 +08:00
|
|
|
|
{
|
2024-03-26 01:22:58 +08:00
|
|
|
|
if(name.IsEmpty()||!cfg)
|
2023-10-10 14:49:33 +08:00
|
|
|
|
return (nullptr);
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
if(!mfd)
|
2023-10-10 14:49:33 +08:00
|
|
|
|
return nullptr;
|
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
cfg->shader_stage_flag_bit=mfd->shader_stage_flag_bit;
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
2024-03-26 01:22:58 +08:00
|
|
|
|
Std3DMaterialLoader mtl(mfd,cfg);
|
2023-10-10 14:49:33 +08:00
|
|
|
|
|
|
|
|
|
return mtl.Create();
|
|
|
|
|
}
|
|
|
|
|
STD_MTL_NAMESPACE_END
|