Clement Espeute 1 рік тому
батько
коміт
abd109d9d4

+ 6 - 5
hide/view/Graph.hx

@@ -267,13 +267,14 @@ class Graph extends FileView {
 
 		for (inputName => inputVar in box.getInstance().getInputs2(domain)) {
 			var defaultValue = null;
-			/*if (inputInfo.hasProperty) {
-				defaultValue = Reflect.field(box.getInstance(), 'prop_${inputName => inputVar}');
+
+			if (inputVar.def != null) {
+				defaultValue = Reflect.getProperty(box.getInstance().defaults, '${inputName}');
 				if (defaultValue == null) {
 					defaultValue = "0";
 				}
-			}*/
-			var grNode = box.addInput(editor, inputName, defaultValue, inputVar.type);
+			}
+			var grNode = box.addInput(editor, inputName, defaultValue, inputVar.v.type);
 			if (defaultValue != null) {
 				var fieldEditInput = grNode.find("input");
 				fieldEditInput.on("change", function(ev) {
@@ -281,7 +282,7 @@ class Graph extends FileView {
 					if (Math.isNaN(tmpValue) ) {
 						fieldEditInput.addClass("error");
 					} else {
-						Reflect.setField(box.getInstance(), 'prop_${inputName}', tmpValue);
+						Reflect.setField(box.getInstance().defaults, '${inputName}', tmpValue);
 						fieldEditInput.val(tmpValue);
 						fieldEditInput.removeClass("error");
 					}

+ 10 - 0
hrt/shgraph/Macros.hx

@@ -31,16 +31,23 @@ class Macros {
 
 							var inVars : Array<String> = [];
 							var outVars : Array<String> = [];
+							var defValues : Array<String> = [];
 
 							function iter(e: haxe.macro.Expr) : Void {
 								switch(e.expr) {
 									case EMeta(meta, subexpr):
 										switch (meta.name) {
 											case "sginput":
+												var defValue = null;
+												if (meta.params != null && meta.params.length > 0) {
+													defValue = "0.0";
+												}
+
 												switch(subexpr.expr) {
 													case EVars(vars):
 														for (v in vars) {
 															inVars.push(v.name);
+															defValues.push(defValue);
 														}
 														e.expr = subexpr.expr;
 													default:
@@ -103,9 +110,12 @@ class Macros {
 
 							var inVarField : Field = makeField("_inVars", inVars);
 							var outVarField : Field = makeField("_outVars", outVars);
+							var defValuesField : Field = makeField("_defValues", defValues);
 
 							fields.push(inVarField);
 							fields.push(outVarField);
+							fields.push(defValuesField);
+
 
 						} catch( e : hxsl.Ast.Error ) {
 							fields.remove(f);

+ 9 - 8
hrt/shgraph/ShaderGraph.hx

@@ -8,7 +8,7 @@ using Lambda;
 
 typedef ShaderNodeDef = {
 	expr: TExpr,
-	inVars: Array<{v: TVar, internal: Bool}>, // If internal = true, don't show input in ui
+	inVars: Array<{v: TVar, internal: Bool, ?defVal: String}>, // 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
@@ -316,9 +316,6 @@ class Graph {
 	}
 
 	public function generate(nodes : Array<Node>, edges : Array<Edge>) {
-
-
-
 		for (n in nodes) {
 			n.outputs = [];
 			var cl = std.Type.resolveClass(n.type);
@@ -391,7 +388,7 @@ class Graph {
 			return false;
 		}
 
-		var inputType = inputs[inputName].type;
+		var inputType = inputs[inputName].v.type;
 		var outputType = outputs[outputName].type;
 
 		if (!areTypesCompatible(inputType, outputType)) {
@@ -640,8 +637,12 @@ class Graph {
 						}
 						else {
 							// default parameter if no connection
-							// TODO : Handle default values for non Float/Vec vars
-							replacement = convertToType(nodeVar.v.type, {e: TConst(CFloat(0.0)), p: pos, t:TFloat});
+							var defVal = 0.0;
+							var defaultValue = Reflect.getProperty(currentNode.instance.defaults, nodeVar.v.name);
+							if (defaultValue != null) {
+								defVal = Std.parseFloat(defaultValue) ?? 0.0;
+							}
+							replacement = convertToType(nodeVar.v.type, {e: TConst(CFloat(defVal)), p: pos, t:TFloat});
 						}
 					}
 
@@ -770,7 +771,7 @@ class Graph {
 		}
 		var json = {
 			nodes: [
-				for (n in nodes) { x : Std.int(n.x), y : Std.int(n.y), id: n.id, type: n.type, properties : n.instance.savePropertiesNode() }
+				for (n in nodes) { x : Std.int(n.x), y : Std.int(n.y), id: n.id, type: n.type, properties : n.instance.saveProperties() }
 			],
 			edges: edgesJson
 		};

+ 17 - 31
hrt/shgraph/ShaderNode.hx

@@ -11,6 +11,8 @@ class ShaderNode {
 
 	public var id : Int;
 
+	public var defaults : Dynamic = {};
+
 	static var availableVariables = [
 					{
 						parent: null,
@@ -45,12 +47,13 @@ class ShaderNode {
 	}
 
 	// TODO(ces) : caching
-	public function getInputs2(domain: ShaderGraph.Domain) : Map<String, TVar> {
+	public function getInputs2(domain: ShaderGraph.Domain) : Map<String, {v: TVar, ?def: String}> {
 		var def = getShaderDef(domain);
-		var map : Map<String, TVar> = [];
-		for (tvar in def.inVars) {
-			if (!tvar.internal)
-				map.set(tvar.v.name, tvar.v);
+		var map : Map<String, {v: TVar, ?def: String}> = [];
+		for (i => tvar in def.inVars) {
+			if (!tvar.internal) {
+				map.set(tvar.v.name, {v: tvar.v, def: tvar.defVal});
+			}
 		}
 		return map;
 	}
@@ -132,35 +135,13 @@ class ShaderNode {
 	public function loadProperties(props : Dynamic) {
 		var fields = Reflect.fields(props);
 		for (f in fields) {
-			Reflect.setField(this, f, Reflect.field(props, f));
-		}
-	}
-
-	public function savePropertiesNode() : Dynamic {
-		var parameters = saveProperties();
-
-		var thisClass = std.Type.getClass(this);
-		var fields = std.Type.getInstanceFields(thisClass);
-		var metas = haxe.rtti.Meta.getFields(thisClass);
-		var metaSuperClass = haxe.rtti.Meta.getFields(std.Type.getSuperClass(thisClass));
-
-		for (f in fields) {
-			var m = Reflect.field(metas, f);
-			if (m == null) {
-				m = Reflect.field(metaSuperClass, f);
-				if (m == null)
-					continue;
+			if (f == "defaults") {
+				defaults = haxe.Json.parse(Reflect.field(props, f));
 			}
-
-			if (Reflect.hasField(m, "prop")) {
-				var metaData : Array<String> = Reflect.field(m, "prop");
-				if (metaData != null && metaData.length >= 1 && metaData[0] == "macro") {
-					Reflect.setField(parameters, f, Reflect.getProperty(this, f));
-				}
+			else {
+				Reflect.setField(this, f, Reflect.field(props, f));
 			}
 		}
-
-		return parameters;
 	}
 
 	public function saveProperties() : Dynamic {
@@ -185,6 +166,11 @@ class ShaderNode {
 				}
 			}
 		}
+		var defSer = haxe.Json.stringify(defaults);
+		if (defSer.length > 0) {
+			Reflect.setField(parameters, "defaults", defSer);
+		}
+
 		return parameters;
 	}
 

+ 5 - 2
hrt/shgraph/ShaderNodeHxsl.hx

@@ -24,8 +24,11 @@ class ShaderNodeHxsl extends ShaderNode {
 					var input = false;
 					var output = false;
 					var classInVars : Array<String> = cast (cl:Dynamic)._inVars;
-					if (classInVars.contains(tvar.name)) {
-						inVars.push({v:tvar, internal: false});
+					var classDefVal : Array<String> = cast (cl:Dynamic)._defValues;
+
+					var indexOf = classInVars.indexOf(tvar.name);
+					if (indexOf > -1) {
+						inVars.push({v:tvar, internal: false, defVal: classDefVal[indexOf]});
 						// TODO : handle default values
 						input = true;
 					}

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

@@ -10,7 +10,7 @@ class Add extends Operation {
 
 	static var SRC = {
 		@sginput var a : Vec4;
-		@sginput var b : Vec4;
+		@sginput(a) var b : Vec4;
 		@sgoutput var output : Vec4;
 		function fragment() {
 			output = a + b;