ShaderOutput.hx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package hrt.shgraph;
  2. import hide.Element;
  3. import h3d.Vector;
  4. import hxsl.*;
  5. using hxsl.Ast;
  6. @name("Outputs")
  7. @description("Parameters outputs, it's dynamic")
  8. @group("Output")
  9. @noheader()
  10. class ShaderOutput extends ShaderNode {
  11. @input("input") var input = SType.Variant;
  12. @param("Variable") public var variable : TVar;
  13. var components = [X, Y, Z, W];
  14. override public function checkValidityInput(key : String, type : ShaderType.SType) : Bool {
  15. return ShaderType.checkCompatibilities(type, ShaderType.getType(variable.type));
  16. }
  17. override public function build(key : String) : TExpr {
  18. return {
  19. p : null,
  20. t : TVoid,
  21. e : TBinop(OpAssign, {
  22. e: TVar(variable),
  23. p: null,
  24. t: variable.type
  25. }, input.getVar(variable.type))
  26. };
  27. }
  28. static var availableOutputs = [];
  29. override public function loadParameters(params : Dynamic) {
  30. var paramVariable : Array<String> = Reflect.field(params, "variable");
  31. for (c in ShaderNode.availableVariables) {
  32. if (c.name == paramVariable[0]) {
  33. this.variable = c;
  34. return;
  35. }
  36. }
  37. for (c in ShaderOutput.availableOutputs) {
  38. if (c.name == paramVariable[0]) {
  39. this.variable = c;
  40. return;
  41. }
  42. }
  43. }
  44. override public function saveParameters() : Dynamic {
  45. var parameters = {
  46. variable: [variable.name, variable.type.getName()]
  47. };
  48. return parameters;
  49. }
  50. #if editor
  51. override public function getParametersHTML(width : Float) : Array<Element> {
  52. var elements = super.getParametersHTML(width);
  53. var element = new Element('<div style="width: 110px; height: 30px"></div>');
  54. element.append(new Element('<select id="variable"></select>'));
  55. if (this.variable == null) {
  56. this.variable = ShaderNode.availableVariables[0];
  57. }
  58. var input = element.children("select");
  59. var indexOption = 0;
  60. for (c in ShaderNode.availableVariables) {
  61. input.append(new Element('<option value="${indexOption}">${c.name}</option>'));
  62. if (this.variable.name == c.name) {
  63. input.val(indexOption);
  64. }
  65. indexOption++;
  66. }
  67. for (c in ShaderOutput.availableOutputs) {
  68. input.append(new Element('<option value="${indexOption}">${c.name}</option>'));
  69. if (this.variable.name == c.name) {
  70. input.val(indexOption);
  71. }
  72. indexOption++;
  73. }
  74. input.on("change", function(e) {
  75. var value = input.val();
  76. this.variable = ShaderNode.availableVariables[value];
  77. });
  78. elements.push(element);
  79. return elements;
  80. }
  81. #end
  82. }