瀏覽代碼

Default params wokring

Clement Espeute 1 年之前
父節點
當前提交
c02ce6185e

+ 8 - 7
hide/view/Graph.hx

@@ -266,13 +266,14 @@ class Graph extends FileView {
 		listOfBoxes.push(box);
 
 		for (inputName => inputVar in box.getInstance().getInputs2(domain)) {
-			var defaultValue = null;
-
-			if (inputVar.def != null) {
-				defaultValue = Reflect.getProperty(box.getInstance().defaults, '${inputName}');
-				if (defaultValue == null) {
-					defaultValue = "0";
-				}
+			var defaultValue : String = null;
+			switch (inputVar.def) {
+				case Const(defValue):
+					defaultValue= Reflect.getProperty(box.getInstance().defaults, '${inputName}');
+					if (defaultValue == null) {
+						defaultValue = '$defValue';
+					}
+				default:
 			}
 			var grNode = box.addInput(editor, inputName, defaultValue, inputVar.v.type);
 			if (defaultValue != null) {

+ 13 - 1
hrt/shgraph/Macros.hx

@@ -40,7 +40,19 @@ class Macros {
 											case "sginput":
 												var defValue = null;
 												if (meta.params != null && meta.params.length > 0) {
-													defValue = "0.0";
+													switch (meta.params[0].expr) {
+														case EConst(v):
+															switch(v) {
+																case CIdent(name):
+																	defValue = name;
+																case CFloat(val), CInt(val):
+																	defValue = '$val';
+																default:
+																	throw "sginput default param must be an identifier or a integer";
+															}
+														default:
+															throw "sginput default param must be a constant value";
+													}
 												}
 
 												switch(subexpr.expr) {

+ 30 - 6
hrt/shgraph/ShaderGraph.hx

@@ -6,9 +6,15 @@ using hide.tools.Extensions.ArrayExtensions;
 using haxe.EnumTools.EnumValueTools;
 using Lambda;
 
+enum ShaderDefInput {
+	Var(name: String);
+	Const(intialValue: Float);
+}
+
+
 typedef ShaderNodeDef = {
 	expr: TExpr,
-	inVars: Array<{v: TVar, internal: Bool, ?defVal: String}>, // If internal = true, don't show input in ui
+	inVars: Array<{v: TVar, internal: Bool, ?defVal: ShaderDefInput}>, // If internal = true, don't show input in ui
 	outVars: Array<{v: TVar, internal: Bool}>,
 	externVars: Array<TVar>, // other external variables like globals and stuff
 	inits: Array<{variable: TVar, value: Dynamic}>, // Default values for some variables
@@ -637,12 +643,30 @@ class Graph {
 						}
 						else {
 							// default parameter if no connection
-							var defVal = 0.0;
-							var defaultValue = Reflect.getProperty(currentNode.instance.defaults, nodeVar.v.name);
-							if (defaultValue != null) {
-								defVal = Std.parseFloat(defaultValue) ?? 0.0;
+							switch(nodeVar.defVal) {
+								case Const(def):
+									var defVal = def;
+									var defaultValue = Reflect.getProperty(currentNode.instance.defaults, nodeVar.v.name);
+									if (defaultValue != null) {
+										defVal = Std.parseFloat(defaultValue) ?? defVal;
+									}
+									replacement = convertToType(nodeVar.v.type, {e: TConst(CFloat(defVal)), p: pos, t:TFloat});
+								case Var(name):
+									var tvar = externs.find((v) -> v.name == name);
+									if (tvar == null) {
+										tvar = {
+											id: getNewVarId(),
+											name: name,
+											type: nodeVar.v.type,
+											kind: Input
+										};
+										externs.push(tvar);
+									}
+									replacement = {e: TVar(tvar), p: pos, t:nodeVar.v.type};
+								default:
+									replacement = convertToType(nodeVar.v.type, {e: TConst(CFloat(0.0)), p: pos, t:TFloat});
 							}
-							replacement = convertToType(nodeVar.v.type, {e: TConst(CFloat(defVal)), p: pos, t:TFloat});
+
 						}
 					}
 

+ 2 - 2
hrt/shgraph/ShaderNode.hx

@@ -47,9 +47,9 @@ class ShaderNode {
 	}
 
 	// TODO(ces) : caching
-	public function getInputs2(domain: ShaderGraph.Domain) : Map<String, {v: TVar, ?def: String}> {
+	public function getInputs2(domain: ShaderGraph.Domain) : Map<String, {v: TVar, ?def: hrt.shgraph.ShaderGraph.ShaderDefInput}> {
 		var def = getShaderDef(domain);
-		var map : Map<String, {v: TVar, ?def: String}> = [];
+		var map : Map<String, {v: TVar, ?def: hrt.shgraph.ShaderGraph.ShaderDefInput}> = [];
 		for (i => tvar in def.inVars) {
 			if (!tvar.internal) {
 				map.set(tvar.v.name, {v: tvar.v, def: tvar.defVal});

+ 12 - 1
hrt/shgraph/ShaderNodeHxsl.hx

@@ -28,7 +28,18 @@ class ShaderNodeHxsl extends ShaderNode {
 
 					var indexOf = classInVars.indexOf(tvar.name);
 					if (indexOf > -1) {
-						inVars.push({v:tvar, internal: false, defVal: classDefVal[indexOf]});
+						var defStr = classDefVal[indexOf];
+						var def : hrt.shgraph.ShaderGraph.ShaderDefInput = null;
+						if (defStr != null) {
+							var float = Std.parseFloat(defStr);
+							if (!Math.isNaN(float)) {
+								def = Const(float);
+							} else {
+								def = Var(defStr);
+							}
+							trace(def);
+						}
+						inVars.push({v:tvar, internal: false, defVal: def});
 						// TODO : handle default values
 						input = true;
 					}

+ 2 - 2
hrt/shgraph/nodes/Add.hx

@@ -9,8 +9,8 @@ using hxsl.Ast;
 class Add extends Operation {
 
 	static var SRC = {
-		@sginput var a : Vec4;
-		@sginput(a) var b : Vec4;
+		@sginput(0.0) var a : Vec4;
+		@sginput(0.0) var b : Vec4;
 		@sgoutput var output : Vec4;
 		function fragment() {
 			output = a + b;

+ 2 - 2
hrt/shgraph/nodes/Sampler.hx

@@ -9,14 +9,14 @@ class Sampler extends ShaderNodeHxsl {
 
 	static var SRC = {
 		@sginput var texture : Sampler2D;
-		@sginput var uv : Vec2;
+		@sginput(uv) var _uv : Vec2;
 		@sgoutput var RGBA : Vec4;
 		@sgoutput var RGB : Vec3;
 		@sgoutput var A : Float;
 
 
 		function fragment() {
-			RGBA = texture.get(uv);
+			RGBA = texture.get(_uv);
 			RGB = RGBA.rgb;
 			A = RGBA.a;
 		}