diff --git a/CMSceneGraph b/CMSceneGraph index b5305731..b5b5b0b2 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit b5305731744fea32e6494bb4dc4ff281c06188b1 +Subproject commit b5b5b0b2e7b00ec3d399659573ba40db8ec8e175 diff --git a/src/ShaderGen/MaterialFileLoader.cpp b/src/ShaderGen/MaterialFileLoader.cpp index fc13c2c2..404994d8 100644 --- a/src/ShaderGen/MaterialFileLoader.cpp +++ b/src/ShaderGen/MaterialFileLoader.cpp @@ -269,6 +269,75 @@ namespace } };//struct ShaderStateParse + struct GeometryShaderStateParse:public ShaderStateParse + { + Prim input_prim; + Prim output_prim; + uint max_vertices; + + public: + + bool OnLine(const char *text,const int len) override + { + if(!text||!*text||len<=0) + return(false); + + if(hgl::stricmp(text,"in ",3)==0) + { + text+=3; + + while(*text==' '||*text=='\t')++text; + + const char *sp=text; + + while(hgl::isalpha(*text)||*text=='_')++text; + + const Prim ip=ParsePrimName(sp,text-sp); + + if(!CheckGeometryShaderIn(ip)) + return(false); + + input_prim=ip; + return(true); + } + else + if(hgl::stricmp(text,"out ",4)==0) + { + text+=4; + + while(*text==' '||*text=='\t')++text; + + const char *sp=text; + + while(hgl::isalpha(*text)||*text=='_')++text; + + const Prim op=ParsePrimName(sp,text-sp); + + if(!CheckGeometryShaderOut(op)) + return(false); + + output_prim=op; + + while(*text!=',')++text; + + while(*text==' '||*text=='\t'||*text==',')++text; + + hgl::stou(text,max_vertices); + + if(max_vertices<=0) + return(false); + + return(true); + } + + if(!ShaderStateParse::OnLine(text,len)) + return(false); + + return(true); + } + + };//struct GeometryShaderStateParse + struct MaterialTextParse:public MaterialFileParse { MaterialFileState state; @@ -306,8 +375,7 @@ namespace case MaterialFileState::VertexInput: parse=new VertexInputStateParse;break; case MaterialFileState::Vertex: case MaterialFileState::Fragment: parse=new ShaderStateParse;break; - -// case MaterialFileState::Geometry: parse=new GeometryStateParse;break; + case MaterialFileState::Geometry: parse=new GeometryShaderStateParse;break; default: state=MaterialFileState::None;return(false); } diff --git a/src/ShaderGen/ShaderCreateInfoGeometry.cpp b/src/ShaderGen/ShaderCreateInfoGeometry.cpp index 09a9410f..ef42d930 100644 --- a/src/ShaderGen/ShaderCreateInfoGeometry.cpp +++ b/src/ShaderGen/ShaderCreateInfoGeometry.cpp @@ -6,21 +6,15 @@ namespace hgl { bool ShaderCreateInfoGeometry::SetGeom(const Prim &ip,const Prim &op,const uint32_t mv) { - if(ip==Prim::Points )input_prim="points";else - if(ip==Prim::Lines )input_prim="lines";else - if(ip==Prim::LinesAdj )input_prim="lines_adjacency";else - if(ip==Prim::Triangles )input_prim="triangles";else - if(ip==Prim::TrianglesAdj )input_prim="triangles_adjacency";else - return(false); - - if(op==Prim::Points )output_prim="points";else - if(op==Prim::LineStrip )output_prim="line_strip";else - if(op==Prim::TriangleStrip )output_prim="triangle_strip";else - return(false); + if(!CheckGeometryShaderIn(ip))return(false); + if(!CheckGeometryShaderOut(op))return(false); if(mv==0) return(false); + input_prim=GetPrimName(ip); + output_prim=GetPrimName(op); + max_vertices=mv; return(true); }