Browse Source

SG Macros

Clement Espeute 2 years ago
parent
commit
9b0a7e7a15
2 changed files with 77 additions and 0 deletions
  1. 57 0
      hrt/shgraph/Macros.hx
  2. 20 0
      hrt/shgraph/ShaderGraph.hx

+ 57 - 0
hrt/shgraph/Macros.hx

@@ -0,0 +1,57 @@
+package hrt.shgraph;
+
+import haxe.macro.Context;
+import haxe.macro.Expr;
+import hxsl.Ast;
+using hxsl.Ast;
+using haxe.macro.Tools;
+
+class Macros {
+	#if macro
+	static function buildNode() {
+		var fields = Context.getBuildFields();
+		for (f in fields) {
+			if (f.name == "SRC") {
+				switch (f.kind) {
+					case FVar(_, expr) if (expr != null):
+						var pos = expr.pos;
+						if( !Lambda.has(f.access, AStatic) ) f.access.push(AStatic);
+						Context.getLocalClass().get().meta.add(":src", [expr], pos);
+						try {
+							var c = Context.getLocalClass();
+
+							var shader = new hxsl.MacroParser().parseExpr(expr);
+							f.kind = FVar(null, macro @:pos(pos) $v{shader});
+							var check = new hxsl.Checker();
+							check.warning = function(msg,pos) {
+								haxe.macro.Context.warning(msg, pos);
+							};
+
+							var name = Std.string(c);
+
+							var name = Std.string(c);
+							var check = new hxsl.Checker();
+							check.warning = function(msg,pos) {
+								haxe.macro.Context.warning(msg, pos);
+							};
+							var shader = check.check(name, shader);
+							trace(shader);
+							//Printer.check(shader);
+							var str = Context.defined("display") ? "" : hxsl.Serializer.run(shader);
+							f.kind = FVar(null, { expr : EConst(CString(str)), pos : pos } );
+							f.meta.push({
+								name : ":keep",
+								pos : pos,
+							});
+						} catch( e : hxsl.Ast.Error ) {
+							fields.remove(f);
+							Context.error(e.msg, e.pos);
+						}
+					default:
+				}
+			}
+		}
+		return fields;
+	}
+	#end
+}

+ 20 - 0
hrt/shgraph/ShaderGraph.hx

@@ -38,6 +38,21 @@ typedef Parameter = {
 	index : Int
 	index : Int
 };
 };
 
 
+@:autoBuild(hrt.shgraph.Macros.buildNode())
+class TestNewNode {
+
+}
+
+class TestNewNode2 extends TestNewNode {
+	static var SRC = {
+		@sginput var input : Vec4;
+		@sgoutput var out : Vec4;
+		function fragment() {
+			out = vec4(input.r, 1.0, 1.0, 1.0);
+		}
+	}
+}
+
 class ShaderGraph {
 class ShaderGraph {
 
 
 	var allVariables : Array<TVar> = [];
 	var allVariables : Array<TVar> = [];
@@ -372,6 +387,11 @@ class ShaderGraph {
 			args : []
 			args : []
 		});
 		});
 
 
+		var unser = new hxsl.Serializer();
+		var data = @:privateAccess unser.unserialize(TestNewNode2.SRC);
+		data.vars.find((v) -> v.name == "input").name = "inputomgichangedthename";
+		trace(hxsl.Printer.shaderToString(data));
+
 		return shaderData;
 		return shaderData;
 
 
 		/*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};