123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package hrt.shgraph.nodes;
- import hxsl.Types.Vec;
- import hxsl.*;
- using hxsl.Ast;
- @name("Combine")
- @description("Create a vector of size 4 from 4 floats")
- @group("Channel")
- class Combine extends ShaderNode {
- @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.Number;
- var components = [X, Y, Z, W];
- var componentsString = ["r", "g", "b", "a"];
- var numberOutputs = 0;
- function generateOutputComp(idx : Int) : TExpr {
- var comp = components[idx];
- var input = getInput(componentsString[idx]);
- return {
- p : null,
- t : output.type,
- e : TBinop(OpAssign, {
- e: TSwiz({
- e: TVar(output),
- p: null,
- t : output.type
- }, [comp]),
- p: null,
- t: TVec(1, VFloat)
- }, input.getVar())
- };
- }
- override public function computeOutputs() {
- numberOutputs = 0;
- if (a != null && !a.isEmpty()) {
- numberOutputs = 4;
- } else if (b != null && !b.isEmpty()) {
- numberOutputs = 3;
- } else if (g != null && !g.isEmpty()) {
- numberOutputs = 2;
- } else if (r != null && !r.isEmpty()) {
- numberOutputs = 1;
- }
- if (numberOutputs == 1) {
- addOutput("output", TFloat);
- } else {
- addOutput("output", TVec(numberOutputs, VFloat));
- }
- }
- 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(b.getVar());
- opTGlobal = Vec3;
- }
- if (numberOutputs >= 4) {
- args.push({ name: "a", type : TFloat });
- valueArgs.push(a.getVar());
- opTGlobal = Vec4;
- }
- return {
- p : null,
- t : output.type,
- e : TBinop(OpAssign, {
- e: TVar(output),
- p: null,
- t : output.type
- },
- {
- e: TCall({
- e: TGlobal(opTGlobal),
- p: null,
- t: TFun([
- {
- ret: output.type,
- args: args
- }
- ])
- }, valueArgs
- ),
- p: null,
- t: output.type
- })
- };
- }
- }
|