diff --git a/CMCore b/CMCore index 70b65670..d5264e1d 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 70b6567029f3278692ca41c99bdf422af3365b8b +Subproject commit d5264e1da655390bdef2ce99550024c69b7c4cb1 diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index 22723835..27abeda4 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -37,13 +37,13 @@ namespace hgl protected: - virtual bool BeginCustomShader(){return true;/*some work before creating shader*/}; + virtual bool BeginCustomShader(){return true;/*some work before create shader*/}; virtual bool CustomVertexShader(ShaderCreateInfoVertex *)=0; virtual bool CustomGeometryShader(ShaderCreateInfoGeometry *){return false;} virtual bool CustomFragmentShader(ShaderCreateInfoFragment *)=0; - virtual bool EndCustomShader(){return true;/*some work after creating shader*/}; + virtual bool EndCustomShader(){return true;/*some work after create shader*/}; public: diff --git a/inc/hgl/shadergen/ShaderCreateInfo.h b/inc/hgl/shadergen/ShaderCreateInfo.h index 4823a941..6a26628d 100644 --- a/inc/hgl/shadergen/ShaderCreateInfo.h +++ b/inc/hgl/shadergen/ShaderCreateInfo.h @@ -88,6 +88,10 @@ public: void SetLocalToWorld(UBODescriptor *); void SetMain(const AnsiString &str){main_function=str;} + void SetMain(const char *str,const int len) + { + main_function.SetString(str,len); + } const AnsiString &GetOutputStruct()const{return output_struct;} const AnsiString &GetShaderSource()const{return final_shader;} diff --git a/src/ShaderGen/2d/Std2DMaterialLoader.cpp b/src/ShaderGen/2d/Std2DMaterialLoader.cpp index 959a13b7..f968f463 100644 --- a/src/ShaderGen/2d/Std2DMaterialLoader.cpp +++ b/src/ShaderGen/2d/Std2DMaterialLoader.cpp @@ -1,24 +1,122 @@ -#include"Std2DMaterial.h" +#include"Std2DMaterial.h" +#include"MaterialFileData.h" +#include STD_MTL_NAMESPACE_BEGIN -class Std2DMaterialLoader:public Std2DMaterial + +namespace { -public: + class Std2DMaterialLoader:public Std2DMaterial + { + protected: - using Std2DMaterial::Std2DMaterial; - ~Std2DMaterialLoader()=default; + material_file::MaterialFileData *mfd; - bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override{return true;} - bool CustomGeometryShader(ShaderCreateInfoGeometry *) override{return true;} - bool CustomFragmentShader(ShaderCreateInfoFragment *) override{return true;} + public: - bool EndCustomShader() override{return true;} -};//class Std2DMaterialLoader:public Std2DMaterial + Std2DMaterialLoader(material_file::MaterialFileData *data,const Material2DCreateConfig *cfg):Std2DMaterial(cfg) + { + mfd=data; + } + + ~Std2DMaterialLoader() + { + delete mfd; + } + + bool BeginCustomShader() override + { + if(!Std2DMaterial::BeginCustomShader()) + return(false); + + if(mfd->mi.mi_bytes>0) + { + mci->SetMaterialInstance( mfd->mi.code, + mfd->mi.mi_bytes, + mfd->mi.shader_stage_flag_bits); + return(false); + } + + return true; + } + + bool CustomVertexShader(ShaderCreateInfoVertex *vsc) override + { + if(!Std2DMaterial::CustomVertexShader(vsc)) + return(false); + + if(mfd->vi.GetCount()>0) + { + for(auto &ua:mfd->vi) + vsc->AddInput(ua.vat,ua.name); + } + + material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_VERTEX_BIT]; + + if(!sd) + return(false); + + for(auto &ua:sd->output) + vsc->AddOutput(ua.vat,ua.name); + + vsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 + + return true; + } + + bool CustomGeometryShader(ShaderCreateInfoGeometry *gsc) override + { + if(!Std2DMaterial::CustomGeometryShader(gsc)) + return(false); + + material_file::GeometryShaderData *sd=(material_file::GeometryShaderData *)(mfd->shader[VK_SHADER_STAGE_GEOMETRY_BIT]); + + if(!sd) + return(false); + + gsc->SetGeom(sd->input_prim,sd->output_prim,sd->max_vertices); + + for(auto &ua:sd->output) + gsc->AddOutput(ua.vat,ua.name); + + gsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 + + return true; + } + + bool CustomFragmentShader(ShaderCreateInfoFragment *fsc) override + { + if(!Std2DMaterial::CustomFragmentShader(fsc)) + return(false); + + material_file::ShaderData *sd=mfd->shader[VK_SHADER_STAGE_FRAGMENT_BIT]; + + if(!sd) + return(false); + + for(auto &ua:sd->output) + fsc->AddOutput(ua.vat,ua.name); + + fsc->SetMain(sd->code,sd->code_length); //这里会产生复制这个string,但我不希望产生这个。未来想办法改进 + + return true; + } + + bool EndCustomShader() override{return true;} + };//class Std2DMaterialLoader:public Std2DMaterial +}//namespace + +material_file::MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename); MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material2DCreateConfig *cfg) { - Std2DMaterialLoader *mtl=new Std2DMaterialLoader(cfg); + material_file::MaterialFileData *mfd=LoadMaterialDataFromFile(name); - return nullptr; + if(!mfd) + return nullptr; + + Std2DMaterialLoader mtl(mfd,cfg); + + return mtl.Create(); } STD_MTL_NAMESPACE_END diff --git a/src/ShaderGen/MaterialFileData.h b/src/ShaderGen/MaterialFileData.h index c28a3c7c..06250f66 100644 --- a/src/ShaderGen/MaterialFileData.h +++ b/src/ShaderGen/MaterialFileData.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -61,6 +61,10 @@ namespace material_file { private: + //不管是文本版还是二进制版 + //其中的代码段数据解析后都是放的指针,并无复制出来。 + //所以这里需要保存原始的文件数据 + char * data=nullptr; int data_length=0; @@ -85,5 +89,4 @@ namespace material_file delete[] data; } };//struct MaterialFileData - -}//namespace material_file \ No newline at end of file +}//namespace material_file diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index 20817355..f53665ba 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -33,8 +33,8 @@ namespace struct MaterialFileBlockInfo { - const char *name; - const int len; + char *name; + int len; MaterialFileBlock state; }; @@ -71,7 +71,7 @@ namespace state=MaterialFileBlock::None; } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -82,12 +82,12 @@ namespace struct CodeParse:public MaterialFileParse { - const char *start =nullptr; - const char *end =nullptr; + char *start =nullptr; + char *end =nullptr; public: - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -103,6 +103,7 @@ namespace if(*text=='}') { + *text=0; end=text; return(true); } @@ -139,7 +140,7 @@ namespace } } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -223,7 +224,7 @@ namespace vi_list=ual; } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -253,7 +254,7 @@ namespace shader_data=sd; } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -310,7 +311,7 @@ namespace gsd=sd; } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -394,7 +395,7 @@ namespace SAFE_CLEAR(parse) } - bool OnLine(const char *text,const int len) override + bool OnLine(char *text,const int len) override { if(!text||!*text||len<=0) return(false); @@ -462,22 +463,22 @@ namespace }; }//namespace MaterialFile -MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_filename) +MaterialFileData *LoadMaterialDataFromFile(const AnsiString &mtl_filename) { const OSString mtl_osfn=ToOSString(mtl_filename+".mtl"); const OSString mtl_os_filename=filesystem::MergeFilename(OS_TEXT("ShaderLibrary"),mtl_osfn); if(!filesystem::FileExist(mtl_os_filename)) - return(nullptr); + return nullptr; - char *data; + char *data; //未来二进制版本的材质文件,也是使用LoadFileToMemory加载。这里为了统一,所以文本也这么操作。 int size=filesystem::LoadFileToMemory(mtl_os_filename,(void **)&data,true); - MaterialFileData mfd(data,size); + MaterialFileData *mfd=new MaterialFileData(data,size); - MaterialTextParse mtp(&mfd); + MaterialTextParse mtp(mfd); io::TextInputStream tis(data,size); @@ -486,15 +487,6 @@ MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_filename) if(!tis.Run()) return nullptr; - return(nullptr); + return mfd; } - -MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const MaterialCreateConfig *cfg) -{ - return nullptr; -} - -//MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material3DCreateConfig *cfg) -//{ -//} STD_MTL_NAMESPACE_END