cables_dev/cables/src/libs/cgl/shadergraph/cgl_shadergraph.js
import { Events } from "cables-shared-client";
import { ShaderGraphProgram } from "./cgl_shadergraphprogram.js";
const ShaderGraph = class extends Events
{
constructor(op, portFrag, portVert)
{
super();
this._op = op;
this._portFrag = portFrag;
this._portVert = portVert;
this.progFrag = new ShaderGraphProgram(op, portFrag, "frag");
this.progVert = new ShaderGraphProgram(op, portVert, "vert");
this.progFrag.on("compiled", () => { this.emitEvent("compiled"); });
this.progVert.on("compiled", () => { this.emitEvent("compiled"); });
portFrag.on("change", () =>
{
this.progFrag.compile();
});
portVert.on("change", this.updateVertex.bind(this));
portVert.on("onLinkChanged", this.updateVertex.bind(this));
}
getUniforms()
{
const arr = [];
for (let i = 0; i < this.progFrag.uniforms.length; i++) arr.push(this.progFrag.uniforms[i]);
for (let i = 0; i < this.progVert.uniforms.length; i++) arr.push(this.progVert.uniforms[i]);
return arr;
}
updateVertex()
{
console.log("update vertex", this._portVert.isLinked());
if (this._portVert.isLinked()) this.progVert.compile();
else
{
this.progVert.finalSrc = CGL.Shader.getDefaultVertexShader();
this.emitEvent("compiled");
}
}
getSrcFrag() { return this.progFrag.finalSrc; }
getSrcVert() { return this.progVert.finalSrc || CGL.Shader.getDefaultVertexShader(); }
};
ShaderGraph.convertTypes = function (typeTo, typeFrom, paramStr)
{
// console.log(typeFrom, " to ", typeTo);
if (typeTo == "sg_genType") return paramStr;
if (typeFrom == "sg_texture" && typeTo == "sg_vec3") return paramStr + ".xyz";
if (typeFrom == "sg_vec4" && typeTo == "sg_vec3") return paramStr + ".xyz";
if (typeFrom == "sg_vec4" && typeTo == "sg_vec2") return paramStr + ".xy";
if (typeFrom == "sg_vec4" && typeTo == "sg_float") return paramStr + ".x";
if (typeFrom == "sg_vec3" && typeTo == "sg_vec2") return paramStr + ".xy";
if (typeFrom == "sg_vec3" && typeTo == "sg_float") return paramStr + ".x";
if (typeFrom == "sg_vec2" && typeTo == "sg_float") return paramStr + ".x";
if (typeFrom == "sg_vec3" && typeTo == "sg_vec4") return "vec4(" + paramStr + ", 0.)";
if (typeFrom == "sg_vec2" && typeTo == "sg_vec3") return "vec3(" + paramStr + ", 0.)";
if (typeFrom == "sg_vec2" && typeTo == "sg_vec4") return "vec4(" + paramStr + ", 0., 0.)";
if (typeFrom == "sg_float" && typeTo == "sg_vec2") return "vec2(" + paramStr + "," + paramStr + ")";
if (typeFrom == "sg_float" && typeTo == "sg_vec3") return "vec3(" + paramStr + "," + paramStr + "," + paramStr + ")";
if (typeFrom == "sg_float" && typeTo == "sg_vec4") return "vec4(" + paramStr + "," + paramStr + "," + paramStr + ", 0.0)";
return "/* conversionfail: " + typeFrom + "->" + typeTo + " */";
};
ShaderGraph.getDefaultParameter = function (t)
{
if (t == "sg_vec4") return "vec4(0., 0., 0., 0.)";
if (t == "sg_vec3") return "vec3(0., 0., 0.)";
if (t == "sg_vec2") return "vec2(0., 0.)";
if (t == "sg_float") return "0.";
if (t == "sg_genType") return "0.";
return "/* no default: " + t + "*/";
};
ShaderGraph.typeConv = function (sgtype)
{
return sgtype.substr(3);
};
ShaderGraph.shaderIdCounter = ShaderGraph.shaderIdCounter || 1;
ShaderGraph.getNewId = () =>
{
return ++ShaderGraph.shaderIdCounter;
};
export { ShaderGraph };