Ver Fonte

[shgraph] Fixed node hxsl top level globals, added support for preview of global channels/textures

Clément Espeute há 1 ano atrás
pai
commit
d81792b97e

+ 8 - 7
hide/view/shadereditor/ShaderEditor.hx

@@ -6,7 +6,6 @@ import h3d.Vector;
 import hrt.shgraph.ShaderParam;
 import hrt.shgraph.ShaderException;
 import haxe.Timer;
-using hxsl.Ast.Type;
 using Lambda;
 
 import hide.comp.SceneEditor;
@@ -18,6 +17,7 @@ import hrt.shgraph.ShaderGraph;
 import hrt.shgraph.ShaderNode;
 import hide.view.GraphInterface;
 
+typedef HxslType = hxsl.Ast.Type;
 
 typedef NodeInfo = { name : String, description : String, key : String };
 
@@ -368,11 +368,11 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		rightPannel.appendTo(element);
 
 		var newParamCtxMenu : Array<hide.comp.ContextMenu.ContextMenuItem> = [
-			{ label : "Number", click : () -> createParameter(TFloat) },
-			{ label : "Vec2", click : () -> createParameter(TVec(2, VFloat)) },
-			{ label : "Vec3", click : () -> createParameter(TVec(3, VFloat)) },
-			{ label : "Color", click : () -> createParameter(TVec(4, VFloat)) },
-			{ label : "Texture", click : () -> createParameter(TSampler(T2D,false)) },
+			{ label : "Number", click : () -> createParameter(HxslType.TFloat) },
+			{ label : "Vec2", click : () -> createParameter(HxslType.TVec(2, VFloat)) },
+			{ label : "Vec3", click : () -> createParameter(HxslType.TVec(3, VFloat)) },
+			{ label : "Color", click : () -> createParameter(HxslType.TVec(4, VFloat)) },
+			{ label : "Texture", click : () -> createParameter(HxslType.TSampler(T2D,false)) },
 		];
 
 		rightPannel.find("#createParameter").on("click", function() {
@@ -436,7 +436,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		}
 	}
 
-	function createParameter(type : Type) {
+	function createParameter(type : HxslType) {
 		@:privateAccess var paramShaderID : Int = shaderGraph.current_param_id++;
 		@:privateAccess
 		function exec(isUndo:Bool) {
@@ -1309,6 +1309,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			var engine = graphEditor.previewsScene.engine;
 			var t = engine.getCurrentTarget();
 			graphEditor.previewsScene.s2d.ctx.globals.set("global.pixelSize", new h3d.Vector(2 / (t == null ? engine.width : t.width), 2 / (t == null ? engine.height : t.height)));
+			graphEditor.previewsScene.s2d.ctx.globals.set("blackChannel", h3d.mat.Texture.fromColor(0));
 		}
 
 		@:privateAccess

+ 15 - 0
hrt/shgraph/AstTools.hx

@@ -91,4 +91,19 @@ class AstTools {
 			name = getFullName(tvar.parent) + "." + name;
 		return name;
 	}
+
+	public static function removeFromParent(tvar: TVar) : Void {
+		var parent = tvar.parent;
+		if (parent != null) {
+			switch(parent.type) {
+				case TStruct(arr):
+					arr.remove(tvar);
+					if (arr.length == 0) {
+						removeFromParent(parent);
+					}
+				default: throw "parent must be a TStruct";
+			}
+		}
+		tvar.parent = null;
+	}
 }

+ 0 - 12
hrt/shgraph/Macros.hx

@@ -101,18 +101,6 @@ class Macros {
 														throw "sgconst must be used with variables only";
 												}
 											default:
-												switch(subexpr.expr) {
-													case EVars(vars):
-														for (v in vars) {
-															if(Variables.getGlobalNameMap().exists(v.name)) {
-																varmap.set(v.name, SgGlobal);
-															}
-															else {
-																Context.error('Unknown global variable ${v.name}', expr.pos);
-															}
-														}
-													default:
-												}
 										}
 									default:
 								}

+ 0 - 1
hrt/shgraph/SgHxslVar.hx

@@ -10,5 +10,4 @@ enum SgHxslVar {
 	SgInput(isDynamic: Bool, defaultValue: ShaderDefInput);
 	SgConst;
 	SgOutput(isDynamic: Bool);
-	SgGlobal;
 }

+ 7 - 8
hrt/shgraph/ShaderGraph.hx

@@ -466,13 +466,7 @@ class ShaderGraph extends hrt.prefab.Prefab {
 			if (previewDomain != null && v.paramIndex == null) {
 				var fullName = AstTools.getFullName(v.v);
 				if (Variables.getGlobalNameMap().get(fullName) == null) {
-					var parent = v.v.parent;
-					switch(parent.type) {
-						case TStruct(arr):
-							arr.remove(v.v);
-						default: throw "parent must be a TStruct";
-					}
-					v.v.parent = null;
+					AstTools.removeFromParent(v.v);
 					v.v.name =  StringTools.replace(fullName, ".", "_") + "_SG";
 					v.v.kind = Local;
 
@@ -496,11 +490,16 @@ class ShaderGraph extends hrt.prefab.Prefab {
 								AstTools.makeVec([0.0,0.0,1.0,0.0]),
 								AstTools.makeVec([0.0,0.0,0.0,1.0]),
 							], TMat4);
+						case TChannel(_), TSampler(T2D, false):
+							v.v.name = "blackChannel";
+							v.v.kind = Global;
+							null;
 						default:
 							throw 'Can not default initialize global vaiable $fullName in preview shader (type ${v.v.type})';
 					}
 
-					v.__init__ = AstTools.makeAssign(AstTools.makeVar(v.v), expr);
+					if (expr != null)
+						v.__init__ = AstTools.makeAssign(AstTools.makeVar(v.v), expr);
 				}
 			}
 

+ 0 - 5
hrt/shgraph/ShaderNodeHxsl.hx

@@ -107,7 +107,6 @@ class ShaderNodeHxsl extends ShaderNode {
 					outputs.push({name: v.name, type: isDynamic ? SgGeneric(0, ShaderGraph.ConstraintFloat) : typeToSgType(v.type)});
 					idOutputOrder.set(v.id, outputCount++);
 				case SgConst:
-				case SgGlobal:
 				case null:
 			}
 		}
@@ -174,10 +173,6 @@ class ShaderNodeHxsl extends ShaderNode {
 							};
 							replacement = makeVar(outputVar);
 							outputs[outputId] = outputVar;
-						case SgGlobal:
-							var id = Variables.getGlobalNameMap().get(v.name);
-							var expr = ctx.getGlobalInput(id);
-							replacement = expr;//{e: TVar(tvar), p: e.p, t: e.t};
 						case null:
 							var tvar = varsRemap.get(v.id);
 							if (tvar != null) {

+ 0 - 2
hrt/shgraph/ShaderType.hx

@@ -1,7 +1,5 @@
 package hrt.shgraph;
 
-import hxsl.Ast.Type;
-
 enum SType {
 	/** Bool **/
 	Bool;