瀏覽代碼

Subgraph working

Clement Espeute 2 年之前
父節點
當前提交
d2200a60fe
共有 1 個文件被更改,包括 59 次插入34 次删除
  1. 59 34
      hrt/shgraph/ShaderGraph.hx

+ 59 - 34
hrt/shgraph/ShaderGraph.hx

@@ -52,7 +52,7 @@ class TestNewNode2 extends TestNewNode {
 		@sginput var input1 : Vec4;
 		@sginput var input1 : Vec4;
 		@sgoutput var output : Vec4;
 		@sgoutput var output : Vec4;
 		function fragment() {
 		function fragment() {
-			output = input0 * input1;
+			output = input0 + input1;
 		}
 		}
 	}
 	}
 }
 }
@@ -233,13 +233,7 @@ class ShaderGraph {
 			};
 			};
 	}
 	}
 
 
-	public function compile2() : hrt.prefab.ContextShared.ShaderDef {
-
-		var shaderData : ShaderData = {
-			name: "foobar",
-			vars: [],
-			funs: [],
-		};
+	public function generate2(?getNewVarId: () -> Int) : {expr: TExpr, inVars: Array<{variable: TVar, value: Dynamic}>, outVars: Array<TVar>} {
 
 
 		var pos : Position = {file: "", min: 0, max: 0};
 		var pos : Position = {file: "", min: 0, max: 0};
 
 
@@ -256,11 +250,9 @@ class ShaderGraph {
 				outputNodes.push(node);
 				outputNodes.push(node);
 			}
 			}
 		}
 		}
-
-		var varIdCount = 0;
-
-		inline function getNewVarId() : Int {
-			return varIdCount++;
+		if (getNewVarId == null) {
+			var varIdCount = 0;
+			getNewVarId = function(){return varIdCount++;};
 		}
 		}
 
 
 		inline function getNewVarName(id: Int) : String {
 		inline function getNewVarName(id: Int) : String {
@@ -324,6 +316,7 @@ class ShaderGraph {
 		}
 		}
 
 
 		function syncLocalVar(expr: TExpr, localVar: TVar) : TExpr {
 		function syncLocalVar(expr: TExpr, localVar: TVar) : TExpr {
+			throw "locals vars not supported yet";
 			var prev = shaderLocalVars.get(localVar.name);
 			var prev = shaderLocalVars.get(localVar.name);
 			if (prev != null) {
 			if (prev != null) {
 				return replaceVar(expr, localVar, prev);
 				return replaceVar(expr, localVar, prev);
@@ -360,16 +353,7 @@ class ShaderGraph {
 
 
 				exprsReverse.push(finalExpr);
 				exprsReverse.push(finalExpr);
 				graphOutputsVars.push(outVar);
 				graphOutputsVars.push(outVar);
-			} /*else if (Std.downcast(currentNode.instance, ShaderInput) != null) {
-				var inputNode : ShaderInput = cast currentNode.instance;
-				var outVars = getOutputs(currentNode);
-				var inVar : TVar = {name: inputNode.variable.name, id:getNewVarId(), type: TVec(4, VFloat), kind: Local};
-				graphInputVars.push(inVar);
-
-				for (output in outVars) {
-					replaceVar(output, inVar);
-				}
-			} */else if (Std.downcast(currentNode.instance, ShaderParam) != null) {
+			} else if (Std.downcast(currentNode.instance, ShaderParam) != null) {
 				var inputNode : ShaderParam = cast currentNode.instance;
 				var inputNode : ShaderParam = cast currentNode.instance;
 				var inVar : TVar = {name: inputNode.variable.name, id:getNewVarId(), type: TVec(4, VFloat), kind: Param};
 				var inVar : TVar = {name: inputNode.variable.name, id:getNewVarId(), type: TVec(4, VFloat), kind: Param};
 
 
@@ -381,6 +365,32 @@ class ShaderGraph {
 
 
 				var param = getParameter(inputNode.parameterId);
 				var param = getParameter(inputNode.parameterId);
 				inits.push({variable: inVar, value: param.defaultValue});
 				inits.push({variable: inVar, value: param.defaultValue});
+			} else if (Std.downcast(currentNode.instance, hrt.shgraph.nodes.SubGraph) != null) {
+				var subgraph : hrt.shgraph.nodes.SubGraph = cast currentNode.instance;
+				var shader = new ShaderGraph(subgraph.pathShaderGraph);
+				var gen = shader.generate2(getNewVarId);
+
+				var finalExprs = [];
+
+				// Patch outputs
+				for (i => output in outputs) {
+					gen.expr = replaceVar(gen.expr, gen.outVars[0], output);
+				}
+
+				// Patch inputs
+				for (i => tvar in tvars) {
+					var originalInput = gen.inVars[i].variable;
+					var finalExpr : TExpr = {e: TVarDecl(originalInput, {e: TVar(tvar), p: pos, t: originalInput.type}), p: pos, t: tvar.type};
+					finalExprs.push(finalExpr);
+				}
+
+				finalExprs.push(gen.expr);
+				exprsReverse.push({e: TBlock(finalExprs), p:pos, t:TVoid});
+
+				for (i => output in outputs) {
+					var finalExpr : TExpr = {e: TVarDecl(output), p: pos, t: output.type};
+					exprsReverse.push(finalExpr);
+				}
 			}
 			}
 			else
 			else
 			{
 			{
@@ -403,11 +413,11 @@ class ShaderGraph {
 							expr = replaceVar(expr, inputTVar, tvar);
 							expr = replaceVar(expr, inputTVar, tvar);
 						}
 						}
 
 
-						for (localvar in data.vars) {
+						/*for (localvar in data.vars) {
 							if (localvar.qualifiers == null || localvar.qualifiers.length == 0) {
 							if (localvar.qualifiers == null || localvar.qualifiers.length == 0) {
 								expr = syncLocalVar(expr,localvar);
 								expr = syncLocalVar(expr,localvar);
 							}
 							}
-						}
+						}*/
 
 
 						exprsReverse.push(expr);
 						exprsReverse.push(expr);
 
 
@@ -437,8 +447,27 @@ class ShaderGraph {
 		}
 		}
 
 
 		exprsReverse.reverse();
 		exprsReverse.reverse();
-		shaderData.vars.append(graphOutputsVars);
-		shaderData.vars.append(graphInputVars);
+
+		return {
+			expr: {e: TBlock(exprsReverse), t:TVoid, p:pos},
+			inVars: inits,
+			outVars: graphOutputsVars,
+		};
+	}
+
+	public function compile2() : hrt.prefab.ContextShared.ShaderDef {
+
+
+		var gen = generate2();
+
+		var shaderData : ShaderData = {
+			name: "",
+			vars: [],
+			funs: [],
+		};
+
+		shaderData.vars.append(gen.inVars.map((f) -> f.variable));
+		shaderData.vars.append(gen.outVars);
 
 
 		shaderData.funs.push({
 		shaderData.funs.push({
 			ret : TVoid, kind : Fragment,
 			ret : TVoid, kind : Fragment,
@@ -448,11 +477,7 @@ class ShaderGraph {
 				kind : Function,
 				kind : Function,
 				type : TFun([{ ret : TVoid, args : [] }])
 				type : TFun([{ ret : TVoid, args : [] }])
 			},
 			},
-			expr : {
-				p : null,
-				t : TVoid,
-				e : TBlock(exprsReverse)
-			},
+			expr : gen.expr,
 			args : []
 			args : []
 		});
 		});
 
 
@@ -460,8 +485,8 @@ class ShaderGraph {
 		@:privateAccess shared.data = shaderData;
 		@:privateAccess shared.data = shaderData;
 		@:privateAccess shared.initialize();
 		@:privateAccess shared.initialize();
 
 
-		trace(inits);
-		return {shader : shared, inits: inits};
+
+		return {shader : shared, inits: gen.inVars};
 
 
 		/*var pixelColor : TVar = {id: 0, name: "pixelColor", type: TVec(4, VFloat), kind: Local};
 		/*var pixelColor : TVar = {id: 0, name: "pixelColor", type: TVec(4, VFloat), kind: Local};
 		shaderData.vars.push(pixelColor);
 		shaderData.vars.push(pixelColor);