added MaterialFileLoader.cpp

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-10-08 20:00:46 +08:00
parent 5e795c4a7f
commit b262fdc645
4 changed files with 191 additions and 2 deletions

2
CMCore

@ -1 +1 @@
Subproject commit f9007c5564568b2596ddfb8643905e9df28cf7b8
Subproject commit 252f2f6a1f4546d84e105e9f76462576e1b26a25

View File

@ -38,5 +38,7 @@ MaterialCreateInfo *CreatePureColor2D(const Material2DCreateConfig *);
MaterialCreateInfo *CreatePureTexture2D(const Material2DCreateConfig *);
MaterialCreateInfo *CreateRectTexture2D(Material2DCreateConfig *);
MaterialCreateInfo *CreateRectTexture2DArray(Material2DCreateConfig *);
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &,const Material2DCreateConfig *);
STD_MTL_NAMESPACE_END
#endif//HGL_GRAPH_MTL_2D_CREATE_CONFIG_INCLUDE

View File

@ -69,7 +69,8 @@ SET(STD_MTL_3D_SOURCE_FILES ${STD_MTL_HEADER_PATH}/Material3DCreateConfig.h
SET(STD_MTL_SOURCE ${STD_MTL_HEADER_PATH}/MaterialConfig.h
${STD_MTL_HEADER_PATH}/StdMaterial.h
${STD_MTL_HEADER_PATH}/ShaderBuffer.h
StandardMaterial.cpp)
StandardMaterial.cpp
MaterialFileLoader.cpp)
SOURCE_GROUP("Standard Material" FILES ${STD_MTL_SOURCE})
SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES})

View File

@ -0,0 +1,186 @@
#include<hgl/graph/mtl/MaterialConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/io/TextInputStream.h>
#include<hgl/io/FileInputStream.h>
#include<hgl/filesystem/FileSystem.h>
STD_MTL_NAMESPACE_BEGIN
namespace
{
using MaterialFileParse=io::TextInputStream::ParseCallback<char>;
enum class MaterialFileState
{
None,
Material,
MaterialInstance,
MaterialInstanceCode,
Vertex,
VertexInput,
VertexOutput,
VertexCode,
Geometry,
GeometryInput,
GeometryOutput,
GeometryCode,
Fragment,
FragmentInput,
FragmentOutput,
FragmentCode,
ENUM_CLASS_RANGE(None,FragmentCode)
};//enum class State
constexpr const char *StateNameList[]=
{
"Material",
"MaterialInstance",
"Vertex",
"Geometry",
"Fragment",
};
const MaterialFileState GetMaterialFileState(const char *str)
{
for(int i=0;i<int(MaterialFileState::END_RANGE);i++)
if(hgl::stricmp(str,StateNameList[i])==0)
return MaterialFileState(i);
return MaterialFileState::None;
}
struct MaterialStateParse:public MaterialFileParse
{
MaterialFileState state;
MaterialStateParse()
{
state=MaterialFileState::None;
}
bool OnLine(const char *text,const int len) override
{
if(!text||!*text||len<=0)
return(false);
return(true);
}
};//struct MaterialStateParse
struct MaterialInstanceStateParse:public MaterialFileParse
{
bool code =false;
char * code_sp =nullptr;
char * code_ep =nullptr;
int brace_count =0;
bool OnLine(const char *text,const int len) override
{
if(!text||!*text||len<=0)
return(false);
if(code)
{
}
return(true);
}
};
struct MaterialTextParse:public MaterialFileParse
{
MaterialFileState state;
MaterialFileParse *parse;
public:
MaterialTextParse()
{
state=MaterialFileState::None;
parse=nullptr;
}
~MaterialTextParse()
{
SAFE_CLEAR(parse)
}
bool OnLine(const char *text,const int len) override
{
if(!text||!*text||len<=0)
return(false);
if(*text=='#')
{
SAFE_CLEAR(parse)
state=GetMaterialFileState(text+1);
switch(state)
{
case MaterialFileState::Material: parse=new MaterialStateParse;break;
case MaterialFileState::MaterialInstance: parse=new MaterialInstanceStateParse;break;
case MaterialFileState::Vertex: parse=new VertexStateParse;break;
case MaterialFileState::Geometry: parse=new GeometryStateParse;break;
case MaterialFileState::Fragment: parse=new FragmentStateParse;break;
default: state=MaterialFileState::None;return(false);
}
return(true);
}
if(parse)
parse->OnLine(text,len);
return(true);
}
};
}//namespace MaterialFile
bool 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);
io::OpenFileInputStream fis(mtl_os_filename);
if(!fis)
return(false);
MaterialTextParse mtp;
io::TextInputStream tis(fis,0);
tis.SetParseCallback(&mtp);
return tis.Run();
}
MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const MaterialCreateConfig *cfg)
{
return nullptr;
}
//MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material2DCreateConfig *cfg)
//{
// Std2DMaterial *mtl=new Std2DMaterial(cfg);
//
//
//}
//
//MaterialCreateInfo *LoadMaterialFromFile(const AnsiString &name,const Material3DCreateConfig *cfg)
//{
//}
STD_MTL_NAMESPACE_END