From 27c409c7fdedc73a00585376d85a34cbd8f29dd2 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Wed, 11 Oct 2023 13:12:51 +0800 Subject: [PATCH] added To parse "require" of the MaterialBlock in MaterialFileLoader.cpp --- src/ShaderGen/MaterialFileData.h | 9 ++++++++- src/ShaderGen/MaterialFileLoader.cpp | 28 +++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/ShaderGen/MaterialFileData.h b/src/ShaderGen/MaterialFileData.h index 5a831dc0..fe0556a1 100644 --- a/src/ShaderGen/MaterialFileData.h +++ b/src/ShaderGen/MaterialFileData.h @@ -1,7 +1,9 @@ #pragma once #include +#include #include #include +#include namespace material_file { @@ -67,6 +69,8 @@ namespace material_file using ShaderData::ShaderData; }; + using ShaderDataMap=ObjectMap; + struct MaterialFileData { private: @@ -80,11 +84,14 @@ namespace material_file public: + AnsiStringList require; ///<需求的内部模块(如LocalToWorld,Sun,Shadow等系统内置元素) +// AnsiStringList import; ///<引用的外部模块 + MaterialInstanceData mi{}; List vi; - ObjectMap shader; + ShaderDataMap shader; uint32_t shader_stage_flag_bit; diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index 787edd44..0461393c 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -67,9 +67,15 @@ namespace { MaterialFileBlock state; - MaterialBlockParse() + AnsiStringList *require=nullptr; + + public: + + MaterialBlockParse(AnsiStringList *asl) { state=MaterialFileBlock::None; + + require=asl; } bool OnLine(char *text,const int len) override @@ -77,11 +83,27 @@ namespace if(!text||!*text||len<=0) return(false); + char *ep=text+len; + if(hgl::stricmp(text,"Require ",8)==0) { + text+=8; + + char *sp=text; + + while(spAdd(AnsiString(sp,text-sp)); + + while(!hgl::iscodechar(*text))++text; + + sp=text; + } } - return(true); + return(true); } };//struct MaterialBlockParse @@ -439,7 +461,7 @@ namespace state=GetMaterialFileState(text+1,len-1); if(state==MaterialFileBlock::Material) - parse=new MaterialBlockParse; + parse=new MaterialBlockParse(&(mfd->require)); else if(state==MaterialFileBlock::MaterialInstance) parse=new MaterialInstanceBlockParse(&(mfd->mi));