Home Reference Source

cables_dev/cables/src/libs/cgl/shadergraph/cgl_shadergraph.js

  1. import { Events } from "cables-shared-client";
  2. import { ShaderGraphProgram } from "./cgl_shadergraphprogram.js";
  3.  
  4. const ShaderGraph = class extends Events
  5. {
  6. constructor(op, portFrag, portVert)
  7. {
  8. super();
  9. this._op = op;
  10. this._portFrag = portFrag;
  11. this._portVert = portVert;
  12.  
  13. this.progFrag = new ShaderGraphProgram(op, portFrag, "frag");
  14. this.progVert = new ShaderGraphProgram(op, portVert, "vert");
  15.  
  16. this.progFrag.on("compiled", () => { this.emitEvent("compiled"); });
  17. this.progVert.on("compiled", () => { this.emitEvent("compiled"); });
  18.  
  19. portFrag.on("change", () =>
  20. {
  21. this.progFrag.compile();
  22. });
  23. portVert.on("change", this.updateVertex.bind(this));
  24. portVert.on("onLinkChanged", this.updateVertex.bind(this));
  25. }
  26.  
  27. getUniforms()
  28. {
  29. const arr = [];
  30.  
  31. for (let i = 0; i < this.progFrag.uniforms.length; i++) arr.push(this.progFrag.uniforms[i]);
  32. for (let i = 0; i < this.progVert.uniforms.length; i++) arr.push(this.progVert.uniforms[i]);
  33. return arr;
  34. }
  35.  
  36. updateVertex()
  37. {
  38. console.log("update vertex", this._portVert.isLinked());
  39.  
  40. if (this._portVert.isLinked()) this.progVert.compile();
  41. else
  42. {
  43. this.progVert.finalSrc = CGL.Shader.getDefaultVertexShader();
  44. this.emitEvent("compiled");
  45. }
  46. }
  47.  
  48. getSrcFrag() { return this.progFrag.finalSrc; }
  49.  
  50. getSrcVert() { return this.progVert.finalSrc || CGL.Shader.getDefaultVertexShader(); }
  51. };
  52.  
  53. ShaderGraph.convertTypes = function (typeTo, typeFrom, paramStr)
  54. {
  55. // console.log(typeFrom, " to ", typeTo);
  56.  
  57. if (typeTo == "sg_genType") return paramStr;
  58.  
  59.  
  60. if (typeFrom == "sg_texture" && typeTo == "sg_vec3") return paramStr + ".xyz";
  61.  
  62. if (typeFrom == "sg_vec4" && typeTo == "sg_vec3") return paramStr + ".xyz";
  63. if (typeFrom == "sg_vec4" && typeTo == "sg_vec2") return paramStr + ".xy";
  64. if (typeFrom == "sg_vec4" && typeTo == "sg_float") return paramStr + ".x";
  65.  
  66. if (typeFrom == "sg_vec3" && typeTo == "sg_vec2") return paramStr + ".xy";
  67. if (typeFrom == "sg_vec3" && typeTo == "sg_float") return paramStr + ".x";
  68.  
  69. if (typeFrom == "sg_vec2" && typeTo == "sg_float") return paramStr + ".x";
  70.  
  71. if (typeFrom == "sg_vec3" && typeTo == "sg_vec4") return "vec4(" + paramStr + ", 0.)";
  72.  
  73. if (typeFrom == "sg_vec2" && typeTo == "sg_vec3") return "vec3(" + paramStr + ", 0.)";
  74. if (typeFrom == "sg_vec2" && typeTo == "sg_vec4") return "vec4(" + paramStr + ", 0., 0.)";
  75.  
  76. if (typeFrom == "sg_float" && typeTo == "sg_vec2") return "vec2(" + paramStr + "," + paramStr + ")";
  77. if (typeFrom == "sg_float" && typeTo == "sg_vec3") return "vec3(" + paramStr + "," + paramStr + "," + paramStr + ")";
  78. if (typeFrom == "sg_float" && typeTo == "sg_vec4") return "vec4(" + paramStr + "," + paramStr + "," + paramStr + ", 0.0)";
  79.  
  80. return "/* conversionfail: " + typeFrom + "->" + typeTo + " */";
  81. };
  82.  
  83. ShaderGraph.getDefaultParameter = function (t)
  84. {
  85. if (t == "sg_vec4") return "vec4(0., 0., 0., 0.)";
  86. if (t == "sg_vec3") return "vec3(0., 0., 0.)";
  87. if (t == "sg_vec2") return "vec2(0., 0.)";
  88. if (t == "sg_float") return "0.";
  89. if (t == "sg_genType") return "0.";
  90. return "/* no default: " + t + "*/";
  91. };
  92.  
  93. ShaderGraph.typeConv = function (sgtype)
  94. {
  95. return sgtype.substr(3);
  96. };
  97.  
  98.  
  99. ShaderGraph.shaderIdCounter = ShaderGraph.shaderIdCounter || 1;
  100. ShaderGraph.getNewId = () =>
  101. {
  102. return ++ShaderGraph.shaderIdCounter;
  103. };
  104.  
  105. export { ShaderGraph };