From 2fa918c00d4202be630e1c2617e8d43b0b6c41d1 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 13 Dec 2019 11:20:08 +0800 Subject: [PATCH] first finished check function of ShaderMaker.wait test. --- CMCore | 2 +- inc/hgl/graph/shader/common.h | 3 +- inc/hgl/graph/shader/node/finished.h | 14 +++--- inc/hgl/graph/shader/node/node.h | 31 ++++++++----- inc/hgl/graph/shader/param/data.h | 28 ------------ inc/hgl/graph/shader/param/in.h | 39 ++++++++++++----- inc/hgl/graph/shader/param/out.h | 5 --- inc/hgl/graph/shader/param/param.h | 4 ++ inc/hgl/graph/shader/param/type.h | 7 ++- src/RenderDevice/Shader/ShaderMaker.cpp | 43 ++++++++++++++++++- src/RenderDevice/Shader/node/shader_node.cpp | 9 +++- .../Shader/param/shader_param_in.cpp | 18 +++----- 12 files changed, 122 insertions(+), 81 deletions(-) delete mode 100644 inc/hgl/graph/shader/param/data.h diff --git a/CMCore b/CMCore index 328e6d2f..e3a58db7 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 328e6d2f26f0cbd15104dd817798f20cc624ea80 +Subproject commit e3a58db799b9588d0e10e3eb804ba3403f18dff4 diff --git a/inc/hgl/graph/shader/common.h b/inc/hgl/graph/shader/common.h index dc38b2dd..82ca5b43 100644 --- a/inc/hgl/graph/shader/common.h +++ b/inc/hgl/graph/shader/common.h @@ -19,7 +19,6 @@ END_SHADER_NODE_NAMESPACE BEGIN_SHADER_PARAM_NAMESPACE class Param; -class InputParam:public Param; -class OutputParam:public Param; END_SHADER_PARAM_NAMESPACE + #endif//HGL_GRAPH_SHADER_COMMON_INCLUDE diff --git a/inc/hgl/graph/shader/node/finished.h b/inc/hgl/graph/shader/node/finished.h index 009b6e3e..c4a74579 100644 --- a/inc/hgl/graph/shader/node/finished.h +++ b/inc/hgl/graph/shader/node/finished.h @@ -25,7 +25,7 @@ public: VertexFinished():Finished("Vertex Output") { - SHADER_INPUT_PARAM(Position, Float3) + SHADER_INPUT_PARAM(true,Position, Float3) } ~VertexFinished()=default; @@ -40,12 +40,12 @@ public: FragmentFinished():Finished("Fragment Output") { - SHADER_INPUT_PARAM(BaseColor, Float3) - SHADER_INPUT_PARAM(Normal, Float3) - SHADER_INPUT_PARAM(Metallic, Float1) - SHADER_INPUT_PARAM(Roughness, Float1) - SHADER_INPUT_PARAM(Opacity, Float1) - SHADER_INPUT_PARAM(DepthOffset, Float1) + SHADER_INPUT_PARAM(false,BaseColor, Float3) + SHADER_INPUT_PARAM(false,Normal, Float3) + SHADER_INPUT_PARAM(false,Metallic, Float1) + SHADER_INPUT_PARAM(false,Roughness, Float1) + SHADER_INPUT_PARAM(false,Opacity, Float1) + SHADER_INPUT_PARAM(false,DepthOffset, Float1) } ~FragmentFinished()=default; diff --git a/inc/hgl/graph/shader/node/node.h b/inc/hgl/graph/shader/node/node.h index 6ea78094..c51286d3 100644 --- a/inc/hgl/graph/shader/node/node.h +++ b/inc/hgl/graph/shader/node/node.h @@ -3,38 +3,49 @@ #include #include -#include +#include +#include BEGIN_SHADER_NODE_NAMESPACE + +#define SHADER_INPUT_PARAM(mj,name,type) input_params.Add(new SHADER_PARAM_NAMESPACE::InputParam(mj,#name,SHADER_PARAM_NAMESPACE::ParamType::type)); +#define SHADER_OUTPUT_PARAM(name,type) output_params.Add(new SHADER_PARAM_NAMESPACE::Param(#name,SHADER_PARAM_NAMESPACE::ParamType::type)); + +using InputParamList=ObjectList; +using OutputParamList=ObjectList; + /** * Shader 节点是所有Shader的基础,它可以是一个简单的计算,也可以是一段复杂的函数 */ class Node { - UTF8String type_name; ///<节点类型本身的名称 + UTF8String type_name; ///<节点类型本身的名称 protected: - UTF8String name; ///<节点用户自定义名称 + UTF8String name; ///<节点用户自定义名称 - ObjectList input_params; - ObjectList output_params; + InputParamList input_params; + OutputParamList output_params; public: Node(const UTF8String &n){type_name=n;} virtual ~Node()=default; - const UTF8String & GetTypename()const{return type_name;} + const UTF8String & GetTypename ()const{return type_name;} + + const UTF8String & GetName ()const{return name;} + void SetName (const UTF8String &n){name=n;} + + InputParamList & GetInputParamList (){return input_params;} + OutputParamList & GetOutputParamList (){return output_params;} - const UTF8String & GetName()const{return name;} - void SetName(const UTF8String &n){name=n;} - public: //参数相关 virtual bool IsOutputParam(param::OutputParam *); - virtual bool CheckInputParam(); + virtual bool Check(); ///<检测当前节点是否可用 };//class Node END_SHADER_NODE_NAMESPACE #endif//HGL_GRAPH_SHADER_NODE_INCLUDE diff --git a/inc/hgl/graph/shader/param/data.h b/inc/hgl/graph/shader/param/data.h deleted file mode 100644 index f341ff50..00000000 --- a/inc/hgl/graph/shader/param/data.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef HGL_GRAPH_SHADER_PARAM_DATA_INCLUDE -#define HGL_GRAPH_SHADER_PARAM_DATA_INCLUDE - -#include - -BEGIN_SHADER_PARAM_NAMESPACE -class ParamData -{ - ParamType type; - -public: - - ParamData(); - virtual ~ParamData(); - - /** - * 比较当前类型是否接收外部参数的输入 - * @param in 外部传入的参数 - */ - virtual bool JoinCheck(const ParamData *in) - { - if(!in)return(false); - - return(type==in->type); - } -};//class ParamData -END_SHADER_PARAM_NAMESPACE -#endif//HGL_GRAPH_SHADER_PARAM_DATA_INCLUDE diff --git a/inc/hgl/graph/shader/param/in.h b/inc/hgl/graph/shader/param/in.h index 60a556b7..76cd4010 100644 --- a/inc/hgl/graph/shader/param/in.h +++ b/inc/hgl/graph/shader/param/in.h @@ -1,32 +1,51 @@ #ifndef HGL_GRAPH_SHADER_PARAM_INPUT_INCLUDE #define HGL_GRAPH_SHADER_PARAM_INPUT_INCLUDE -#include +#include #include #include BEGIN_SHADER_PARAM_NAMESPACE -#define SHADER_INPUT_PARAM(name,type) input_params.Add(new SHADER_PARAM_NAMESPACE::InputParam(#name,SHADER_PARAM_NAMESPACE::ParamType::type)); - /** * 输入参数定义 */ class InputParam:public Param { - node::Node *input_node; - param::OutputParam *output_param; + bool must_join; //是否必须有接入 + +protected: + + node::Node *join_node; + param::OutputParam *join_param; + +protected: + + /** + * 可否接入判断,默认只判断类型 + */ + virtual bool JoinCheck(node::Node *n,param::OutputParam *op) + { + return(op->GetType()==this->GetType()); + } + +public: //属性 + + node::Node * GetJoinNode (){return join_node;} ///<取得接入节点 + param::OutputParam *GetJoinParam(){return join_param;} ///<取得接入节点参数 public: - using Param::Param; + InputParam(const bool mj,const UTF8String &n,const ParamType &t):Param(n,t) + { + must_join=mj; + } virtual ~InputParam()=default; - virtual bool Join(node::Node *,OutputParam *); ///<增加一个输入节点 - virtual void Break(); ///<断开一个输入节点 + virtual bool Join(node::Node *,param::OutputParam *); ///<增加一个关联节点 + virtual void Break(){join_node=nullptr;join_param=nullptr;} ///<断开一个关联节点 - virtual bool Check(); ///<检测当前节点是否可用 + virtual bool Check(){return(must_join?join_param:true);} ///<检测当前节点是否可用 };//class InputParam:public Param - END_SHADER_PARAM_NAMESPACE #endif//#ifndef HGL_GRAPH_SHADER_PARAM_INPUT_INCLUDE diff --git a/inc/hgl/graph/shader/param/out.h b/inc/hgl/graph/shader/param/out.h index 63ffea79..ec3d10ff 100644 --- a/inc/hgl/graph/shader/param/out.h +++ b/inc/hgl/graph/shader/param/out.h @@ -2,21 +2,16 @@ #define HGL_GRAPH_SHADER_PARAM_OUTPUT_INCLUDE #include -#include -#include BEGIN_SHADER_PARAM_NAMESPACE using namespace hgl; -#define SHADER_OUTPUT_PARAM(name,type) output_params.Add(new SHADER_PARAM_NAMESPACE::Param(#name,SHADER_PARAM_NAMESPACE::ParamType::type)); - /** * 输出参数定义 */ class OutputParam:public Param { - public: using Param::Param; diff --git a/inc/hgl/graph/shader/param/param.h b/inc/hgl/graph/shader/param/param.h index fa1d25e8..5c6e652c 100644 --- a/inc/hgl/graph/shader/param/param.h +++ b/inc/hgl/graph/shader/param/param.h @@ -3,6 +3,7 @@ #include #include +#include BEGIN_SHADER_PARAM_NAMESPACE /** @@ -22,6 +23,9 @@ public: } virtual ~Param()=default; + + const UTF8String & GetName()const{return name;} + const ParamType GetType()const{return type;} };//class Param END_SHADER_PARAM_NAMESPACE #endif//HGL_GRAPH_SHADER_PARAM_INCLUDE diff --git a/inc/hgl/graph/shader/param/type.h b/inc/hgl/graph/shader/param/type.h index 63679f3d..903647fd 100644 --- a/inc/hgl/graph/shader/param/type.h +++ b/inc/hgl/graph/shader/param/type.h @@ -1,5 +1,5 @@ -#ifndef HGL_GRAPH_SHADER_PARAM_INCLUDE -#define HGL_GRAPH_SHADER_PARAM_INCLUDE +#ifndef HGL_GRAPH_SHADER_PARAM_TYPE_INCLUDE +#define HGL_GRAPH_SHADER_PARAM_TYPE_INCLUDE #include @@ -68,5 +68,4 @@ enum class ParamType RANGE_SIZE =(END_RANGE-BEGIN_RANGE+1) };//enum class ParamType END_SHADER_PARAM_NAMESPACE -#endif//HGL_GRAPH_SHADER_PARAM_INCLUDE - +#endif//HGL_GRAPH_SHADER_PARAM_TYPE_INCLUDE diff --git a/src/RenderDevice/Shader/ShaderMaker.cpp b/src/RenderDevice/Shader/ShaderMaker.cpp index efd39971..aeaef7af 100644 --- a/src/RenderDevice/Shader/ShaderMaker.cpp +++ b/src/RenderDevice/Shader/ShaderMaker.cpp @@ -1,4 +1,6 @@ #include +#include +#include BEGIN_SHADER_NAMESPACE bool ShaderMaker::Make() @@ -6,8 +8,45 @@ bool ShaderMaker::Make() if(!fin_node) return(false); - if(!fin_node->CheckInputParam()) - return(false); + Set post; //完成检测的节点合集 + Set prev; //等待检测的节点合集 + node::Node *cur,*nn; + + node::InputParamList *ipl; + int i,count; + param::InputParam **ip; + + prev.Add(fin_node); + + while(prev.GetEnd(cur)) + { + ipl =&(cur->GetInputParamList()); + count =ipl->GetCount(); + ip =ipl->GetData(); + + for(i=0;iCheck()) + return(false); + + nn=(*ip)->GetJoinNode(); + + if(nn) + { + if(!post.IsMember(nn) + &&!prev.IsMember(nn) + &&nn!=cur) + { + prev.Add(nn); + } + } + + ip++; + } + + prev.Delete(cur); + post.Add(cur); + } return(true); } diff --git a/src/RenderDevice/Shader/node/shader_node.cpp b/src/RenderDevice/Shader/node/shader_node.cpp index 7b72dba1..ffe75571 100644 --- a/src/RenderDevice/Shader/node/shader_node.cpp +++ b/src/RenderDevice/Shader/node/shader_node.cpp @@ -1,7 +1,14 @@ #include BEGIN_SHADER_NODE_NAMESPACE -bool Node::CheckInputParam() +bool Node::IsOutputParam(param::OutputParam *op) +{ + if(!op)return(false); + + return output_params.IsExist(op); +} + +bool Node::Check() { const int count=input_params.GetCount(); param::InputParam **ip=input_params.GetData(); diff --git a/src/RenderDevice/Shader/param/shader_param_in.cpp b/src/RenderDevice/Shader/param/shader_param_in.cpp index 5bce3872..57c2ab99 100644 --- a/src/RenderDevice/Shader/param/shader_param_in.cpp +++ b/src/RenderDevice/Shader/param/shader_param_in.cpp @@ -1,24 +1,20 @@ #include +#include BEGIN_SHADER_PARAM_NAMESPACE -bool InputParam::Join(node::Node *n,OutputParam *op) +bool InputParam::Join(node::Node *n,param::OutputParam *op) { if(!n||!op)return(false); if(!n->IsOutputParam(op)) return(false); - input_node=n; - output_param=op; + if(!JoinCheck(n,op)) + return(false); + + join_node=n; + join_param=op; return(true); } - -void InputParam::Break() -{ -} - -bool InputParam::Check() -{ -} END_SHADER_PARAM_NAMESPACE