Sampler.hx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package hrt.shgraph.nodes;
  2. using hxsl.Ast;
  3. @name("Sampler")
  4. @description("Get color from texture and UV")
  5. @group("Property")
  6. class Sampler extends ShaderNode {
  7. @input("Texture") var texture = SType.Sampler;
  8. @input("UV") var uv = SType.Vec2;
  9. @output("RGBA") var rgba = SType.Vec4;
  10. @output("R") var r = SType.Float;
  11. @output("G") var g = SType.Float;
  12. @output("B") var b = SType.Float;
  13. @output("A") var a = SType.Float;
  14. var components = [X, Y, Z, W];
  15. var componentsString = ["r", "g", "b", "a"];
  16. override public function computeOutputs() {
  17. addOutput("rgba", TVec(4, VFloat));
  18. addOutput("r", TFloat);
  19. addOutput("g", TFloat);
  20. addOutput("b", TFloat);
  21. addOutput("a", TFloat);
  22. }
  23. override public function build(key : String) : TExpr {
  24. if (key == "rgba") {
  25. var args = [];
  26. var varArgs = [];
  27. for (k in getInputInfoKeys()) {
  28. args.push({ name: k, type: getInput(k).getType() });
  29. var wantedType = ShaderType.getType(getInputInfo(k).type);
  30. varArgs.push(getInput(k).getVar((wantedType != null) ? wantedType : null));
  31. }
  32. return {
  33. p : null,
  34. t : rgba.type,
  35. e : TBinop(OpAssign, {
  36. e: TVar(rgba),
  37. p: null,
  38. t: rgba.type
  39. }, {
  40. e: TCall({
  41. e: TGlobal(Texture),
  42. p: null,
  43. t: TFun([
  44. {
  45. ret: rgba.type,
  46. args: args
  47. }
  48. ])
  49. }, varArgs),
  50. p: null,
  51. t: rgba.type
  52. })
  53. };
  54. } else {
  55. var arrayExpr = [];
  56. if (!outputCompiled.get("rgba")) {
  57. arrayExpr.push({ e : TVarDecl(rgba), t : rgba.type, p : null });
  58. arrayExpr.push(build("rgba"));
  59. outputCompiled.set("rgba", true);
  60. }
  61. var compIdx = componentsString.indexOf(key);
  62. arrayExpr.push({ e: TBinop(OpAssign, {
  63. e: TVar(getOutput(key)),
  64. p: null,
  65. t: getOutput(key).type
  66. }, {e: TSwiz({
  67. e: TVar(rgba),
  68. p: null,
  69. t: rgba.type
  70. },
  71. [components[compIdx]]),
  72. p: null,
  73. t: getOutput(key).type }),
  74. p: null,
  75. t: getOutput(key).type
  76. });
  77. if (arrayExpr.length > 1) {
  78. return {
  79. p : null,
  80. t : TVoid,
  81. e : TBlock(arrayExpr)
  82. };
  83. } else {
  84. return arrayExpr[0];
  85. }
  86. }
  87. }
  88. }