|
@@ -10,15 +10,16 @@ using hxsl.Ast;
|
|
@group("Channel")
|
|
@group("Channel")
|
|
class Combine extends ShaderNode {
|
|
class Combine extends ShaderNode {
|
|
|
|
|
|
- @input("R") var r = SType.Float;
|
|
|
|
- @input("G") var g = SType.Float;
|
|
|
|
- @input("B") var b = SType.Float;
|
|
|
|
- @input("A") var a = SType.Float;
|
|
|
|
|
|
+ @input("R", false, false) var r = SType.Float;
|
|
|
|
+ @input("G", false, false) var g = SType.Float;
|
|
|
|
+ @input("B", false, false) var b = SType.Float;
|
|
|
|
+ @input("A", false, false) var a = SType.Float;
|
|
|
|
|
|
- @output() var output = SType.Vec4;
|
|
|
|
|
|
+ @output() var output = SType.Variant;
|
|
|
|
|
|
var components = [X, Y, Z, W];
|
|
var components = [X, Y, Z, W];
|
|
var componentsString = ["r", "g", "b", "a"];
|
|
var componentsString = ["r", "g", "b", "a"];
|
|
|
|
+ var numberOutputs = 0;
|
|
|
|
|
|
function generateOutputComp(idx : Int) : TExpr {
|
|
function generateOutputComp(idx : Int) : TExpr {
|
|
var comp = components[idx];
|
|
var comp = components[idx];
|
|
@@ -40,11 +41,47 @@ class Combine extends ShaderNode {
|
|
}
|
|
}
|
|
|
|
|
|
override public function computeOutputs() {
|
|
override public function computeOutputs() {
|
|
- addOutput("output", TVec(4, VFloat));
|
|
|
|
|
|
+ numberOutputs = 1;
|
|
|
|
+ if (a != null && !a.isEmpty()) {
|
|
|
|
+ numberOutputs = 4;
|
|
|
|
+ } else if (b != null && !b.isEmpty()) {
|
|
|
|
+ numberOutputs = 3;
|
|
|
|
+ } else if (g != null && !g.isEmpty()) {
|
|
|
|
+ numberOutputs = 2;
|
|
|
|
+ }
|
|
|
|
+ if (numberOutputs == 1) {
|
|
|
|
+ addOutput("output", TFloat);
|
|
|
|
+ } else {
|
|
|
|
+ addOutput("output", TVec(numberOutputs, VFloat));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
override public function build(key : String) : TExpr {
|
|
override public function build(key : String) : TExpr {
|
|
|
|
|
|
|
|
+ var args = [];
|
|
|
|
+ var valueArgs = [];
|
|
|
|
+ var opTGlobal : TGlobal = Vec4;
|
|
|
|
+ if (numberOutputs >= 1) {
|
|
|
|
+ args.push({ name: "r", type : TFloat });
|
|
|
|
+ valueArgs.push(r.getVar());
|
|
|
|
+ opTGlobal = ToFloat;
|
|
|
|
+ }
|
|
|
|
+ if (numberOutputs >= 2) {
|
|
|
|
+ args.push({ name: "g", type : TFloat });
|
|
|
|
+ valueArgs.push(g.getVar());
|
|
|
|
+ opTGlobal = Vec2;
|
|
|
|
+ }
|
|
|
|
+ if (numberOutputs >= 3) {
|
|
|
|
+ args.push({ name: "b", type : TFloat });
|
|
|
|
+ valueArgs.push(g.getVar());
|
|
|
|
+ opTGlobal = Vec3;
|
|
|
|
+ }
|
|
|
|
+ if (numberOutputs >= 4) {
|
|
|
|
+ args.push({ name: "a", type : TFloat });
|
|
|
|
+ valueArgs.push(a.getVar());
|
|
|
|
+ opTGlobal = Vec4;
|
|
|
|
+ }
|
|
|
|
+
|
|
return {
|
|
return {
|
|
p : null,
|
|
p : null,
|
|
t : output.type,
|
|
t : output.type,
|
|
@@ -55,22 +92,15 @@ class Combine extends ShaderNode {
|
|
},
|
|
},
|
|
{
|
|
{
|
|
e: TCall({
|
|
e: TCall({
|
|
- e: TGlobal(Vec4),
|
|
|
|
|
|
+ e: TGlobal(opTGlobal),
|
|
p: null,
|
|
p: null,
|
|
t: TFun([
|
|
t: TFun([
|
|
{
|
|
{
|
|
ret: output.type,
|
|
ret: output.type,
|
|
- args: [
|
|
|
|
- { name: "r", type : TFloat },
|
|
|
|
- { name: "g", type : TFloat },
|
|
|
|
- { name: "b", type : TFloat },
|
|
|
|
- { name: "a", type : TFloat }]
|
|
|
|
|
|
+ args: args
|
|
}
|
|
}
|
|
])
|
|
])
|
|
- }, [(r != null) ? r.getVar() : { e: TConst(CFloat(0.0)), p: null, t: TFloat },
|
|
|
|
- (g != null) ? g.getVar() : { e: TConst(CFloat(0.0)), p: null, t: TFloat },
|
|
|
|
- (b != null) ? b.getVar() : { e: TConst(CFloat(0.0)), p: null, t: TFloat },
|
|
|
|
- (a != null) ? a.getVar() : { e: TConst(CFloat(1.0)), p: null, t: TFloat }]
|
|
|
|
|
|
+ }, valueArgs
|
|
),
|
|
),
|
|
p: null,
|
|
p: null,
|
|
t: output.type
|
|
t: output.type
|