Combine.hx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package hrt.shgraph.nodes;
  2. import hxsl.Types.Vec;
  3. import hxsl.*;
  4. using hxsl.Ast;
  5. @name("Combine")
  6. @description("Create a vector of size 4 from 4 floats")
  7. @group("Channel")
  8. class Combine extends ShaderNode {
  9. @input("R", false, false) var r = SType.Float;
  10. @input("G", false, false) var g = SType.Float;
  11. @input("B", false, false) var b = SType.Float;
  12. @input("A", false, false) var a = SType.Float;
  13. @output() var output = SType.Number;
  14. var components = [X, Y, Z, W];
  15. var componentsString = ["r", "g", "b", "a"];
  16. var numberOutputs = 0;
  17. function generateOutputComp(idx : Int) : TExpr {
  18. var comp = components[idx];
  19. var input = getInput(componentsString[idx]);
  20. return {
  21. p : null,
  22. t : output.type,
  23. e : TBinop(OpAssign, {
  24. e: TSwiz({
  25. e: TVar(output),
  26. p: null,
  27. t : output.type
  28. }, [comp]),
  29. p: null,
  30. t: TVec(1, VFloat)
  31. }, input.getVar())
  32. };
  33. }
  34. override public function computeOutputs() {
  35. numberOutputs = 0;
  36. if (a != null && !a.isEmpty()) {
  37. numberOutputs = 4;
  38. } else if (b != null && !b.isEmpty()) {
  39. numberOutputs = 3;
  40. } else if (g != null && !g.isEmpty()) {
  41. numberOutputs = 2;
  42. } else if (r != null && !r.isEmpty()) {
  43. numberOutputs = 1;
  44. }
  45. if (numberOutputs == 1) {
  46. addOutput("output", TFloat);
  47. } else {
  48. addOutput("output", TVec(numberOutputs, VFloat));
  49. }
  50. }
  51. override public function build(key : String) : TExpr {
  52. var args = [];
  53. var valueArgs = [];
  54. var opTGlobal : TGlobal = Vec4;
  55. if (numberOutputs >= 1) {
  56. args.push({ name: "r", type : TFloat });
  57. valueArgs.push(r.getVar());
  58. opTGlobal = ToFloat;
  59. }
  60. if (numberOutputs >= 2) {
  61. args.push({ name: "g", type : TFloat });
  62. valueArgs.push(g.getVar());
  63. opTGlobal = Vec2;
  64. }
  65. if (numberOutputs >= 3) {
  66. args.push({ name: "b", type : TFloat });
  67. valueArgs.push(b.getVar());
  68. opTGlobal = Vec3;
  69. }
  70. if (numberOutputs >= 4) {
  71. args.push({ name: "a", type : TFloat });
  72. valueArgs.push(a.getVar());
  73. opTGlobal = Vec4;
  74. }
  75. return {
  76. p : null,
  77. t : output.type,
  78. e : TBinop(OpAssign, {
  79. e: TVar(output),
  80. p: null,
  81. t : output.type
  82. },
  83. {
  84. e: TCall({
  85. e: TGlobal(opTGlobal),
  86. p: null,
  87. t: TFun([
  88. {
  89. ret: output.type,
  90. args: args
  91. }
  92. ])
  93. }, valueArgs
  94. ),
  95. p: null,
  96. t: output.type
  97. })
  98. };
  99. }
  100. }