Преглед изворни кода

ShaderGraph: support local vars like calculatedUV etc

trethaller пре 4 година
родитељ
комит
89242d9d39
3 измењених фајлова са 29 додато и 27 уклоњено
  1. 2 1
      hrt/shgraph/NodeVar.hx
  2. 18 16
      hrt/shgraph/ShaderGraph.hx
  3. 9 10
      hrt/shgraph/ShaderInput.hx

+ 2 - 1
hrt/shgraph/NodeVar.hx

@@ -308,7 +308,8 @@ class NodeVar {
 		node.outputCompiled.set(keyOutput, true);
 		var res = [];
 		var nodeBuild = node.build(keyOutput);
-		if (getTVar() != null && getTVar().kind == Local)
+		var tvar = getTVar();
+		if (tvar != null && tvar.kind == Local && ShaderInput.availableInputs.indexOf(tvar) < 0)
 			res.push({ e : TVarDecl(getTVar()), t : getType(), p : null });
 		if (nodeBuild != null)
 			res.push(nodeBuild);

+ 18 - 16
hrt/shgraph/ShaderGraph.hx

@@ -206,7 +206,7 @@ class ShaderGraph {
 		var shaderInput = Std.downcast(node, ShaderInput);
 		if (shaderInput != null) {
 			var variable = shaderInput.variable;
-			if ((variable.kind == Param || variable.kind == Global || variable.kind == Input) && !alreadyAddVariable(variable)) {
+			if ((variable.kind == Param || variable.kind == Global || variable.kind == Input || variable.kind == Local) && !alreadyAddVariable(variable)) {
 				allVariables.push(variable);
 			}
 		}
@@ -307,32 +307,32 @@ class ShaderGraph {
 		}
 
 		for (n in nodes) {
-			var shaderNode;
-			var variable;
+			var outNode;
+			var outVar;
 			if (specificOutput != null) {
 				if (n.instance != specificOutput) continue;
-				shaderNode = specificOutput;
-				variable = Std.downcast(specificOutput, hrt.shgraph.nodes.Preview).variable;
+				outNode = specificOutput;
+				outVar = Std.downcast(specificOutput, hrt.shgraph.nodes.Preview).variable;
 			} else {
 				var shaderOutput = Std.downcast(n.instance, ShaderOutput);
 
 				if (shaderOutput != null) {
-					variable = shaderOutput.variable;
-					shaderNode = n.instance;
+					outVar = shaderOutput.variable;
+					outNode = n.instance;
 				} else {
 					continue;
 				}
 			}
-			if (shaderNode != null) {
-				if (outputs.indexOf(variable.name) != -1) {
+			if (outNode != null) {
+				if (outputs.indexOf(outVar.name) != -1) {
 					throw ShaderException.t("This output already exists", n.id);
 				}
-				outputs.push(variable.name);
-				if ( !alreadyAddVariable(variable) ) {
-					allVariables.push(variable);
+				outputs.push(outVar.name);
+				if ( !alreadyAddVariable(outVar) ) {
+					allVariables.push(outVar);
 				}
-				var nodeVar = new NodeVar(shaderNode, "input");
-				var isVertex = (variableNameAvailableOnlyInVertex.indexOf(variable.name) != -1);
+				var nodeVar = new NodeVar(outNode, "input");
+				var isVertex = (variableNameAvailableOnlyInVertex.indexOf(outVar.name) != -1);
 				if (isVertex) {
 					contentVertex = contentVertex.concat(buildNodeVar(nodeVar));
 				} else {
@@ -451,12 +451,14 @@ class ShaderGraph {
 			setParamValue(ctx, s, init.variable, init.value);
 		return s;
 	}
-	
+
 	static function setParamValue(ctx: hrt.prefab.ContextShared, shader : hxsl.DynamicShader, variable : hxsl.Ast.TVar, value : Dynamic) {
 		try {
 			switch (variable.type) {
 				case TSampler2D:
-					shader.setParamValue(variable, ctx.loadTexture(value));
+					var t = ctx.loadTexture(value);
+					t.wrap = Repeat;
+					shader.setParamValue(variable, t);
 				case TVec(size, _):
 					shader.setParamValue(variable, h3d.Vector.fromArray(value));
 				default:

+ 9 - 10
hrt/shgraph/ShaderInput.hx

@@ -20,20 +20,19 @@ class ShaderInput extends ShaderNode {
 		return null;
 	}
 
-	static var availableInputs = [ 	{ parent: null, id: 0, kind: Input, name: "position", type: TVec(3, VFloat) },
+	public static var availableInputs : Array<TVar> = [
+									{ parent: null, id: 0, kind: Input, name: "position", type: TVec(3, VFloat) },
 									{ parent: null, id: 0, kind: Input, name: "color", type: TVec(3, VFloat) },
 									{ parent: null, id: 0, kind: Input, name: "uv", type: TVec(2, VFloat) },
 									{ parent: null, id: 0, kind: Input, name: "normal", type: TVec(3, VFloat) },
 									{ parent: null, id: 0, kind: Input, name: "tangent", type: TVec(3, VFloat) },
-									{ parent: null, id: 0, kind: Input, name: "relativePosition", type: TVec(3, VFloat) },
-									{ parent: null, id: 0, kind: Input, name: "transformedPosition", type: TVec(3, VFloat) },
-									{ parent: null, id: 0, kind: Input, name: "projectedPosition", type: TVec(4, VFloat) },
-									{ parent: null, id: 0, kind: Input, name: "transformedNormal", type: TVec(3, VFloat) },
-									{ parent: null, id: 0, kind: Input, name: "screenUV", type: TVec(2, VFloat) } ];
-
-	function getAvailableInputs() {
-		return ShaderInput.availableInputs;
-	}
+									{ parent: null, id: 0, kind: Local, name: "relativePosition", type: TVec(3, VFloat) },
+									{ parent: null, id: 0, kind: Local, name: "transformedPosition", type: TVec(3, VFloat) },
+									{ parent: null, id: 0, kind: Local, name: "projectedPosition", type: TVec(4, VFloat) },
+									{ parent: null, id: 0, kind: Local, name: "transformedNormal", type: TVec(3, VFloat) },
+									{ parent: null, id: 0, kind: Local, name: "screenUV", type: TVec(2, VFloat) },
+									{ parent: null, id: 0, kind: Local, name: "calculatedUV", type: TVec(2, VFloat) },
+								];
 
 	override public function loadProperties(props : Dynamic) {
 		var paramVariable : String = Reflect.field(props, "variable");