From 018a72c09a2b3f7da6b9b0f74d1742bc499ed029 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 10 Oct 2023 00:24:41 +0800 Subject: [PATCH 1/3] created MaterialFileData and all material's data in the struct. --- inc/hgl/graph/mtl/StdMaterial.h | 3 - src/ShaderGen/CMakeLists.txt | 1 + src/ShaderGen/MaterialFileData.h | 69 +++++++++++++ src/ShaderGen/MaterialFileLoader.cpp | 146 +++++++++++++++++++++------ 4 files changed, 183 insertions(+), 36 deletions(-) create mode 100644 src/ShaderGen/MaterialFileData.h diff --git a/inc/hgl/graph/mtl/StdMaterial.h b/inc/hgl/graph/mtl/StdMaterial.h index 0f7e0e8b..22723835 100644 --- a/inc/hgl/graph/mtl/StdMaterial.h +++ b/inc/hgl/graph/mtl/StdMaterial.h @@ -52,9 +52,6 @@ namespace hgl virtual MaterialCreateInfo *Create(); };//class StdMaterial - - - bool LoadMaterialFromFile(const AnsiString &mtl_filename); }//namespace mtl }//namespace graph }//namespace hgl diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index f078ffb9..1983f227 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -72,6 +72,7 @@ SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h ${STD_MTL_HEADER_PATH}/StdMaterial.h ${STD_MTL_HEADER_PATH}/ShaderBuffer.h StandardMaterial.cpp + MaterialFileData.h MaterialFileLoader.cpp) SOURCE_GROUP("Standard Material" FILES ${STD_MTL_SOURCE}) diff --git a/src/ShaderGen/MaterialFileData.h b/src/ShaderGen/MaterialFileData.h new file mode 100644 index 00000000..06750422 --- /dev/null +++ b/src/ShaderGen/MaterialFileData.h @@ -0,0 +1,69 @@ +#pragma once +#include +#include + +namespace material_file +{ + using namespace hgl; + using namespace hgl::graph; + + struct UniformAttrib + { + VAT vat; + + char name[SHADER_RESOURCE_NAME_MAX_LENGTH]; + }; + + struct MaterialInstanceData + { + const char *code; + uint code_length; + + uint mi_bytes; + + uint32_t shader_stage_flag_bits; + }; + + struct ShaderData + { + VkShaderStageFlagBits shader_stage; + + const char *code; + uint code_length; + + List output; + + public: + + ShaderData(VkShaderStageFlagBits ss) + { + shader_stage=ss; + + code=nullptr; + code_length=0; + } + + const VkShaderStageFlagBits GetShaderStage()const{return shader_stage;} + }; + + struct GeometryShaderData:public ShaderData + { + Prim input_prim; + Prim output_prim; + uint max_vertices=0; + + public: + + using ShaderData::ShaderData; + }; + + struct MaterialFileData + { + MaterialInstanceData mi{}; + + List vi; + + ObjectMap shader; + };//struct MaterialFileData + +}//namespace material_file \ No newline at end of file diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index fa842479..319937b0 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -2,15 +2,19 @@ #include #include #include -#include #include #include #include +#include"MaterialFileData.h" + STD_MTL_NAMESPACE_BEGIN + namespace { + using namespace material_file; + using MaterialFileParse=io::TextInputStream::ParseCallback; enum class MaterialFileBlock @@ -116,8 +120,26 @@ namespace uint mi_bytes =0; uint32_t shader_stage_flag_bits =0; + MaterialInstanceData *mid=nullptr; + public: + MaterialInstanceStateParse(MaterialInstanceData *d) + { + mid=d; + } + + ~MaterialInstanceStateParse() + { + if(code_parse.start&&code_parse.end) + { + mid->code =code_parse.start; + mid->code_length =code_parse.end-code_parse.start; + mid->mi_bytes =mi_bytes; + mid->shader_stage_flag_bits =shader_stage_flag_bits; + } + } + bool OnLine(const char *text,const int len) override { if(!text||!*text||len<=0) @@ -170,13 +192,6 @@ namespace } };//struct MaterialInstanceStateParse - struct UniformAttrib - { - VAT vat; - - char name[SHADER_RESOURCE_NAME_MAX_LENGTH]; - }; - bool ParseUniformAttrib(UniformAttrib *ua,const char *str) { const char *sp; @@ -200,10 +215,15 @@ namespace struct VertexInputBlockParse:public MaterialFileParse { - List input_list; + List *vi_list=nullptr; public: + VertexInputBlockParse(List *ual) + { + vi_list=ual; + } + bool OnLine(const char *text,const int len) override { if(!text||!*text||len<=0) @@ -212,7 +232,7 @@ namespace UniformAttrib ua; if(ParseUniformAttrib(&ua,text)) - input_list.Add(ua); + vi_list->Add(ua); return(true); } @@ -220,14 +240,20 @@ namespace struct ShaderBlockParse:public MaterialFileParse { + ShaderData * shader_data=nullptr; + bool output=false; - List output_list; bool code=false; CodeParse code_parse; public: + ShaderBlockParse(ShaderData *sd) + { + shader_data=sd; + } + bool OnLine(const char *text,const int len) override { if(!text||!*text||len<=0) @@ -236,8 +262,13 @@ namespace if(code) { if(code_parse.OnLine(text,len)) + { code=false; + shader_data->code=code_parse.start; + shader_data->code_length=code_parse.end-code_parse.start; + } + return(true); } @@ -252,7 +283,7 @@ namespace UniformAttrib ua; if(ParseUniformAttrib(&ua,text)) - output_list.Add(ua); + shader_data->output.Add(ua); } if(hgl::stricmp(text,"Code",4)==0) @@ -271,12 +302,15 @@ namespace struct GeometryShaderBlockParse:public ShaderBlockParse { - Prim input_prim; - Prim output_prim; - uint max_vertices; + GeometryShaderData *gsd=nullptr; public: + GeometryShaderBlockParse(GeometryShaderData *sd):ShaderBlockParse(sd) + { + gsd=sd; + } + bool OnLine(const char *text,const int len) override { if(!text||!*text||len<=0) @@ -297,7 +331,7 @@ namespace if(!CheckGeometryShaderIn(ip)) return(false); - input_prim=ip; + gsd->input_prim=ip; return(true); } else @@ -316,15 +350,15 @@ namespace if(!CheckGeometryShaderOut(op)) return(false); - output_prim=op; + gsd->output_prim=op; while(*text!=',')++text; while(*text==' '||*text=='\t'||*text==',')++text; - hgl::stou(text,max_vertices); + hgl::stou(text,gsd->max_vertices); - if(max_vertices<=0) + if(gsd->max_vertices<=0) return(false); return(true); @@ -344,12 +378,16 @@ namespace MaterialFileParse *parse; + MaterialFileData *mfd; + public: - MaterialTextParse() + MaterialTextParse(MaterialFileData *fd) { state=MaterialFileBlock::None; parse=nullptr; + + mfd=fd; } ~MaterialTextParse() @@ -368,16 +406,50 @@ namespace state=GetMaterialFileState(text+1,len-1); - switch(state) + if(state==MaterialFileBlock::Material) + parse=new MaterialFileBlockParse; + else + if(state==MaterialFileBlock::MaterialInstance) + parse=new MaterialInstanceStateParse(&(mfd->mi)); + else + if(state==MaterialFileBlock::VertexInput) + parse=new VertexInputBlockParse(&(mfd->vi)); + else + if(state>=MaterialFileBlock::Vertex + &&state<=MaterialFileBlock::Fragment) { - case MaterialFileBlock::Material: parse=new MaterialFileBlockParse;break; - case MaterialFileBlock::MaterialInstance: parse=new MaterialInstanceStateParse;break; - case MaterialFileBlock::VertexInput: parse=new VertexInputBlockParse;break; - case MaterialFileBlock::Vertex: - case MaterialFileBlock::Fragment: parse=new ShaderBlockParse;break; - case MaterialFileBlock::Geometry: parse=new GeometryShaderBlockParse;break; + ShaderData *sd=nullptr; - default: state=MaterialFileBlock::None;return(false); + if(state==MaterialFileBlock::Vertex) + { + sd=new ShaderData(VK_SHADER_STAGE_VERTEX_BIT); + + parse=new ShaderBlockParse(sd); + } + else + if(state==MaterialFileBlock::Geometry) + { + sd=new GeometryShaderData(VK_SHADER_STAGE_GEOMETRY_BIT); + + parse=new GeometryShaderBlockParse((GeometryShaderData *)sd); + } + else + if(state==MaterialFileBlock::Fragment) + { + sd=new ShaderData(VK_SHADER_STAGE_FRAGMENT_BIT); + + parse=new ShaderBlockParse(sd); + } + + if(!sd) + return(false); + + mfd->shader.Add(sd->GetShaderStage(),sd); + } + else + { + state=MaterialFileBlock::None; + return(false); } return(true); @@ -391,27 +463,35 @@ namespace }; }//namespace MaterialFile -bool LoadMaterialFromFile(const AnsiString &mtl_filename) +MaterialFileData *LoadMaterialFromFile(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(false); + return(nullptr); io::OpenFileInputStream fis(mtl_os_filename); if(!fis) - return(false); + return(nullptr); - MaterialTextParse mtp; + MaterialFileData *mfd=new MaterialFileData; + + MaterialTextParse mtp(mfd); io::TextInputStream tis(fis,0); tis.SetParseCallback(&mtp); - return tis.Run(); + if(!tis.Run()) + { + delete mfd; + return nullptr; + } + + return mfd; } MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const MaterialCreateConfig *cfg) From 03750832c85bd3be29f9745f9416a47f1725ad53 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 10 Oct 2023 01:19:05 +0800 Subject: [PATCH 2/3] MaterialFileData added origin data. --- CMCore | 2 +- src/ShaderGen/MaterialFileData.h | 20 ++++++++++++++++++++ src/ShaderGen/MaterialFileLoader.cpp | 19 +++++++------------ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CMCore b/CMCore index 252f2f6a..70b65670 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 252f2f6a1f4546d84e105e9f76462576e1b26a25 +Subproject commit 70b6567029f3278692ca41c99bdf422af3365b8b diff --git a/src/ShaderGen/MaterialFileData.h b/src/ShaderGen/MaterialFileData.h index 06750422..c28a3c7c 100644 --- a/src/ShaderGen/MaterialFileData.h +++ b/src/ShaderGen/MaterialFileData.h @@ -59,11 +59,31 @@ namespace material_file struct MaterialFileData { + private: + + char * data=nullptr; + int data_length=0; + + public: + MaterialInstanceData mi{}; List vi; ObjectMap shader; + + public: + + MaterialFileData(char *d,int dl) + { + data=d; + data_length=dl; + } + + ~MaterialFileData() + { + delete[] data; + } };//struct MaterialFileData }//namespace material_file \ No newline at end of file diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index 319937b0..20817355 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include"MaterialFileData.h" @@ -463,7 +462,7 @@ namespace }; }//namespace MaterialFile -MaterialFileData *LoadMaterialFromFile(const AnsiString &mtl_filename) +MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &mtl_filename) { const OSString mtl_osfn=ToOSString(mtl_filename+".mtl"); @@ -472,26 +471,22 @@ MaterialFileData *LoadMaterialFromFile(const AnsiString &mtl_filename) if(!filesystem::FileExist(mtl_os_filename)) return(nullptr); - io::OpenFileInputStream fis(mtl_os_filename); + char *data; - if(!fis) - return(nullptr); + int size=filesystem::LoadFileToMemory(mtl_os_filename,(void **)&data,true); - MaterialFileData *mfd=new MaterialFileData; + MaterialFileData mfd(data,size); - MaterialTextParse mtp(mfd); + MaterialTextParse mtp(&mfd); - io::TextInputStream tis(fis,0); + io::TextInputStream tis(data,size); tis.SetParseCallback(&mtp); if(!tis.Run()) - { - delete mfd; return nullptr; - } - return mfd; + return(nullptr); } MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const MaterialCreateConfig *cfg) From 7ca81f38e85dd01c752b61c7e120306b74b9e905 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 10 Oct 2023 02:48:02 +0800 Subject: [PATCH 3/3] Std2DMaterialLoader start ok,,but don't support Sampler2D in material file... --- CMCore | 2 +- inc/hgl/graph/mtl/StdMaterial.h | 4 +- inc/hgl/shadergen/ShaderCreateInfo.h | 4 + src/ShaderGen/2d/Std2DMaterialLoader.cpp | 122 ++++++++++++++++++++--- src/ShaderGen/MaterialFileData.h | 9 +- src/ShaderGen/MaterialFileLoader.cpp | 46 ++++----- 6 files changed, 142 insertions(+), 45 deletions(-) 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