Selaa lähdekoodia

[shgraph] Add alpha preview, AlphaOver Node

Clément Espeute 1 vuosi sitten
vanhempi
commit
39da358eb5

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

@@ -201,6 +201,23 @@ class PreviewShaderBase extends hxsl.Shader {
 	}
 }
 
+class PreviewShaderAlpha extends hxsl.Shader {
+	static var SRC = {
+		@input var input : {
+			var uv : Vec2;
+		};
+
+		var pixelColor : Vec4;
+
+		function fragment() {
+			var cb = floor(mod(input.uv * 10.0, vec2(2.0)));
+			var check = mod(cb.x + cb.y, 2.0);
+			var color = check >= 1.0 ? vec3(0.22) : vec3(0.44);
+			pixelColor.rgb = mix(color, pixelColor.rgb, pixelColor.a);
+		}
+	}
+}
+
 typedef ClassRepoEntry =
 {
 	/**
@@ -252,6 +269,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	var compiledShaderPreview : hrt.prefab.Cache.ShaderDef;
 
 	var previewShaderBase : PreviewShaderBase;
+	var previewShaderAlpha : PreviewShaderAlpha;
 	var previewVar : hxsl.Ast.TVar;
 	var needRecompile : Bool = true;
 
@@ -283,6 +301,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
  		shaderGraph = cast hide.Ide.inst.loadPrefab(state.path, null,  true);
 		currentGraph = shaderGraph.getGraph(Fragment);
 		previewShaderBase = new PreviewShaderBase();
+		previewShaderAlpha = new PreviewShaderAlpha();
 
 		if (graphEditor != null)
 			graphEditor.remove();
@@ -1293,6 +1312,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			bitmapToShader.set(bitmap, shader);
 			bitmap.addShader(previewShaderBase);
 			bitmap.addShader(shader);
+			bitmap.addShader(previewShaderAlpha);
 		}
 		for (init in compiledShaderPreview.inits) {
 			@:privateAccess graphEditor.previewsScene.checkCurrent();

+ 9 - 4
hrt/shgraph/NodeGenContext.hx

@@ -193,16 +193,21 @@ class NodeGenContext {
 		if (delta > 0) {
 			var args = [];
 			if (sourceSize == 1) {
-				for (_ in 0...targetSize) {
-					args.push(sourceExpr);
+				for (i in 0...targetSize) {
+					if (i == 3) {
+						// Set alpha to 1.0 by default on upcasts casts
+						args.push(makeFloat(1.0));
+					}
+					else {
+						args.push(sourceExpr);
+					}
 				}
 			}
 			else {
-
 				args.push(sourceExpr);
 				for (i in 0...delta) {
 					// Set alpha to 1.0 by default on upcasts casts
-					var value = i == delta - 1 ? 1.0 : 0.0;
+					var value = ((sourceSize + i) == 3) ? 1.0 : 0.0;
 					args.push({e : TConst(CFloat(value)), p: sourceExpr.p, t: TFloat});
 				}
 			}

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

@@ -16,5 +16,4 @@ class Add extends Operation {
 			output = a + b;
 		}
 	}
-
 }

+ 20 - 0
hrt/shgraph/nodes/AlphaOver.hx

@@ -0,0 +1,20 @@
+package hrt.shgraph.nodes;
+
+@name("Alpha Over")
+@description("Output is A if A.")
+@width(100)
+@group("Operation")
+class AlphaOver extends Operation {
+
+	static var SRC = {
+		@sginput(0.0) var a : Vec4;
+		@sginput(0.0) var b : Vec4;
+        @sginput(1.0) var opacity : Float;
+		@sgoutput var output : Vec4;
+		function fragment() {
+            var alpha = opacity * a.a;
+			output.rgb = a.rgb * alpha + b.rgb * (1.0 - alpha);
+            output.a = clamp(alpha + b.a,0.0, 1.0);
+		}
+	}
+}

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

@@ -11,7 +11,7 @@ using hxsl.Ast;
 class CombineAlpha extends ShaderNodeHxsl {
 
 	static var SRC = {
-		@sginput var rgb : Vec3;
+		@sginput(0.0) var rgb : Vec3;
 		@sginput(1.0) var a : Float;
 		@sgoutput var output : Vec4;