Browse Source

New nodes and imrpovements

Clement Espeute 1 year ago
parent
commit
40a1912c8b

+ 32 - 0
hide/view/shadereditor/ShaderEditor.hx

@@ -28,6 +28,31 @@ typedef SavedClipboard = {
 	edges : Array<{ fromIdx : Int, fromName : String, toIdx : Int, toName : String }>,
 }
 
+class PreviewShaderBase extends hxsl.Shader {
+	static var SRC = {
+
+		@input var input : {
+			var position : Vec2;
+		};
+
+		@global var camera : {
+			var viewProj : Mat4;
+		}
+
+		var relativePosition : Vec3;
+		var transformedPosition : Vec3;
+		var projectedPosition : Vec4;
+		var transformedNormal : Vec3;
+
+		function __init__() {
+			relativePosition = vec3(input.position, 0.0);
+			transformedPosition = vec3(input.position, 0.0);
+			projectedPosition = vec4(input.position, 0.0, 0.0);
+			transformedNormal = vec3(0,0,-1);
+		}
+	}
+}
+
 
 class Preview extends h2d.Bitmap {
 
@@ -54,6 +79,8 @@ class Preview extends h2d.Bitmap {
 	public function new(parent: h2d.Object) {
 		super(h2d.Tile.fromColor(0xFF00FF,1,1), parent);
 		this.blendMode = None;
+		var shaderBase = new PreviewShaderBase();
+		addShader(shaderBase);
 	}
 
 }
@@ -151,6 +178,7 @@ class ShaderEditor extends hide.view.Graph {
 		previewsScene.onReady = onMiniPreviewReady;
 		previewsScene.onUpdate = onMiniPreviewUpdate;
 
+
 		var preview = new Element('<div id="preview" ></div>');
 		preview.on("mousedown", function(e) { e.stopPropagation(); });
 		preview.on("wheel", function(e) { e.stopPropagation(); });
@@ -1056,6 +1084,10 @@ class ShaderEditor extends hide.view.Graph {
 		bg.fillWidth = true;
 		bg.backgroundTile = h2d.Tile.fromColor(0x333333);
 		boxToPreview = [];
+
+		var identity : h3d.Matrix = new h3d.Matrix();
+		identity.identity();
+		@:privateAccess previewsScene.s2d.renderer.manager.globals.set("camera.viewProj", identity);
 	}
 
 	function onMiniPreviewUpdate(dt: Float) {

+ 4 - 4
hrt/shgraph/ShaderGraph.hx

@@ -152,11 +152,11 @@ class ShaderGraph extends hrt.prefab.Prefab {
 							v.name = split[1] ?? throw "Invalid variable name";
 							globalInputVars.pushUnique(v);
 						}
-						default:
-							if (split.length > 1) {
+						default: {
+							if (split.length > 1)
 								throw "Var has a dot in its name without being input or global var";
-							}
-						shaderData.vars.pushUnique(v);
+							shaderData.vars.pushUnique(v);
+						}
 					}
 				}
 			}

+ 6 - 0
hrt/shgraph/ShaderInput.hx

@@ -92,6 +92,12 @@ class ShaderInput extends ShaderNode {
 					t: flt
 				};
 		}
+		else if (variable.v.name == "projectedNormal") {
+			inVar.name == "transformedNormal";
+
+			//var expr = new MacroParser().parseExpr(macro var transformedNormal = vec4(transformedNormal, 1) * camera.viewProj;);
+			//final
+		}
 
 
 		return {expr: finalExpr, inVars: [{v:inVar, internal: true, isDynamic: false}], outVars:[{v:output, internal: false, isDynamic: false}], externVars: [], inits: []};

+ 14 - 4
hrt/shgraph/ShaderParam.hx

@@ -19,11 +19,21 @@ class ShaderParam extends ShaderNode {
 		if (this.variable.type == TSampler2D) {
 			qual.push(Sampler(this.variable.name));
 		}
-		var inVar : TVar = {name: this.variable.name, id: getNewIdFn(), type: this.variable.type, kind: Param, qualifiers: qual};
-		var output : TVar = {name: "output", id: getNewIdFn(), type: this.variable.type, kind: Local, qualifiers: []};
-		var finalExpr : TExpr = {e: TBinop(OpAssign, {e:TVar(output), p:pos, t:output.type}, {e: TVar(inVar), p: pos, t: output.type}), p: pos, t: output.type};
 
-		return {expr: finalExpr, inVars: [{v:inVar, internal: true, isDynamic: false}], outVars:[{v:output, internal: false, isDynamic: false}], externVars: [], inits: []};
+		//if (this.variable.type != TSampler2D) {
+			var inVar : TVar = {name: this.variable.name, id: getNewIdFn(), type: this.variable.type, kind: Param, qualifiers: qual};
+			var output : TVar = {name: "output", id: getNewIdFn(), type: this.variable.type, kind: Local, qualifiers: []};
+			var finalExpr : TExpr = {e: TBinop(OpAssign, {e:TVar(output), p:pos, t:output.type}, {e: TVar(inVar), p: pos, t: output.type}), p: pos, t: output.type};
+
+			return {expr: finalExpr, inVars: [{v:inVar, internal: true, isDynamic: false}], outVars:[{v:output, internal: false, isDynamic: false}], externVars: [], inits: []};
+		//}
+		//else {
+			//var samplerVar : TVar = {name: this.variable.name, id: getNewIdFn(), type: this.variable.type, kind: Param, qualifiers: qual};
+			//var cuv = ShaderInput.availableInputs.get("calculatedUV");
+			//var uv : TVar = {name: cuv.v.name, id: getNewIdFn(), type: cuv.v.type, kind: cuv.v.kind, qualifiers: []};
+			//var output : TVar = {name: "output", id: getNewIdFn(), type: this.variable.type, kind: Local, qualifiers: []};
+		//	return
+		//}
 	}
 
 	public var variable : TVar;

+ 22 - 0
hrt/shgraph/nodes/Project.hx

@@ -0,0 +1,22 @@
+
+package hrt.shgraph.nodes;
+
+@name("Project")
+@description("Project the given world space vector into view space")
+@width(100)
+@group("Operation")
+class Project extends Operation {
+
+	static var SRC = {
+		@global var camera : {
+			var viewProj: Mat4;
+		};
+
+		@sginput(0.0) var a : Vec3;
+		@sgoutput var out : Vec4;
+
+		function fragment() {
+			out = vec4(a,0.0) * camera.viewProj * vec4(1.0,1.0,1.0,1.0);
+		}
+	}
+}

+ 7 - 3
hrt/shgraph/nodes/Sampler.hx

@@ -2,7 +2,7 @@ package hrt.shgraph.nodes;
 
 using hxsl.Ast;
 
-@name("Sampler")
+@name("Sample Texture 2D")
 @description("Get color from texture and UV")
 @group("Property")
 class Sampler extends ShaderNodeHxsl {
@@ -11,13 +11,17 @@ class Sampler extends ShaderNodeHxsl {
 		@sginput var texture : Sampler2D;
 		@sginput(calculatedUV) var uv : Vec2;
 		@sgoutput var RGBA : Vec4;
-		@sgoutput var RGB : Vec3;
+		@sgoutput var R : Float;
+		@sgoutput var G : Float;
+		@sgoutput var B : Float;
 		@sgoutput var A : Float;
 
 
 		function fragment() {
 			RGBA = texture.get(uv);
-			RGB = RGBA.rgb;
+			R = RGBA.r;
+			G = RGBA.g;
+			B = RGBA.b;
 			A = RGBA.a;
 		}
 	}