cables_dev/cables/src/libs/cgl/rendertargets/rendertargets.js
- import slots_frag from "./slots.frag";
- import slots_vert from "./slots.vert";
- import slots_head_frag from "./slots_head.frag";
- import slots_head_vert from "./slots_head.vert";
-
-
- class RenderTargets
- {
- constructor(cgl)
- {
- this._numBuffers = 4;
- this.asString = "";
- this._slots = ["Default", "Normal"];
- this._name = "rendertargets" + CABLES.uuid();
- this.mod = new CGL.ShaderModifier(cgl, this._name);
- // this.updateModules();
-
-
- this.mod.onBind = (currentShader) =>
- {
- // console.log(currentShader);
- // currentShader.setDrawBuffers([true, true, true, true]);
- };
- }
-
-
- updateModules()
- {
- this.mod.removeModule(this._name + "_frag");
-
- this.mod.addModule(
- {
- "priority": 2,
- "title": this._name + "_frag",
- "name": "MODULE_COLOR",
- "srcHeadFrag": slots_head_frag,
- "srcBodyFrag": this.getSrcFrag(),
- });
-
- this.mod.removeModule(this._name + "_vert");
-
- this.mod.addModule(
- {
- "priority": 2,
- "title": this._name + "_vert",
- "name": "MODULE_VERTEX_POSITION",
- "srcHeadVert": slots_head_vert,
- "srcBodyVert": slots_vert
- });
- }
-
- getTypes()
- {
- return ["Default",
- "Material Id, Object Id, Instance Id",
- "Material Id",
- "Object Id",
- "Position World",
- "Position * ModelView",
- "Position Local",
- "Position Object",
- "Normal",
- "Normal World",
- "Normal * ModelView",
- "OIT Accum",
- "OIT Revealage",
- "FragCoord.z",
- "TexCoord",
- "Black",
- "0", "1"];
- }
-
- setNumBuffers(n)
- {
- this._numBuffers = n;
- }
-
- getSrcString(type, i)
- {
- let outcolor = "outColor";
- if (i === "")outcolor = "col";
-
- if (type == "Normal") return " " + outcolor + i + " = vec4(norm,1.);".endl();
- else if (type == "Material Id, Object Id, Instance Id") return " " + outcolor + i + " = vec4(round(materialId),round(objectId),round(instIdx),1.0);".endl();
- else if (type == "Default" || type == "Color") return " " + outcolor + i + " = col;".endl();
- else if (type == "1") return " " + outcolor + i + " = vec4(1.,1.,1.,1.);".endl();
- else if (type == "0") return " " + outcolor + i + " = vec4(0.,0.,0.,0.);".endl();
- else if (type == "Black") return " " + outcolor + i + " = vec4(0.,0.,0.,1.);".endl();
- else if (type == "TexCoord") return " " + outcolor + i + " = vec4(texCoord,0.,1.);".endl();
- else if (type == "Position Local") return " " + outcolor + i + " = vec4(MOD_pos_local,1.);".endl();
- else if (type == "Position World") return " " + outcolor + i + " = vec4(MOD_pos_world,1.);".endl();
- else if (type == "Position * ModelView") return " " + outcolor + i + " = vec4(MOD_pos_mv,1.);".endl();
-
- else if (type == "Position Object") return " " + outcolor + i + " = vec4(MOD_pos_object,1.);".endl();
- else if (type == "Normal World") return " " + outcolor + i + " = vec4(MOD_normal_world,1.);".endl();
- else if (type == "Normal * ModelView") return " " + outcolor + i + " = vec4(MOD_normal_mv,1.);".endl();
- else if (type == "Material Id") return " " + outcolor + i + " = vec4(round(materialId),round(instIdx),0.,1.);".endl();
- else if (type == "Object Id") return " " + outcolor + i + " = vec4(objectId,0.,0.,1.);".endl();
- else if (type == "FragCoord.z") return " " + outcolor + i + " = vec4(vec3(gl_FragCoord.z),1.);".endl();
-
- else if (type.contains("OIT "))
- {
- let str = ""
- .endl() + "#ifndef OIT_WEIGHT"
- .endl() + "#define OIT_WEIGHT"
- .endl() + " float oitWeight=clamp(pow(min(1.0, col.a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - gl_FragCoord.z * 0.9, 3.0), 1e-2, 3e3);"
- // .endl() + " float oitWeight=100.0*exp(gl_FragCoord.z*gl_FragCoord.z);"
- .endl() + "#endif"
- .endl();
-
- if (type == "OIT Revealage") str += " " + outcolor + i + " = vec4(col.a*oitWeight,col.a,1.0,1.0);".endl();
- if (type == "OIT Accum") str += ""
- .endl() + " " + outcolor + i + " = vec4(col.rgb * col.a * oitWeight, col.a);";
-
- return str;
- }
- }
-
- getSrcFrag()
- {
- let src = slots_frag;
-
-
- if (this._slots.length == 1)
- {
- src += this.getSrcString(this._slots[0], "");
- }
- else
- for (let i = 0; i < this._numBuffers; i++)
- {
- src += this.getSrcString(this._slots[i], i);
- }
-
- // console.log(src);
- return src;
- }
-
- update(slots)
- {
- this._slots = slots;
- this._numBuffers = slots.length;
- this.asString = "";
-
- let hasPosWorld = false;
- let hasPosLocal = false;
- let hasPosObject = false;
- let hasMaterialId = false;
- let hasObjectId = false;
- let hasNormalModelView = false;
- let hasNormalWorld = false;
- let hasPosModelView = false;
-
-
- for (let i = 0; i < this._numBuffers; i++)
- {
- hasPosWorld = (slots[i] == "Position World") || hasPosWorld;
- hasNormalModelView = (slots[i] == "Normal * ModelView") || hasNormalModelView;
- hasPosLocal = (slots[i] == "Position Local") || hasPosLocal;
- hasPosModelView = (slots[i] == "Position * ModelView") || hasPosModelView;
- hasPosObject = (slots[i] == "Position Object") || hasPosObject;
- hasMaterialId = (slots[i].contains("Material Id")) || hasMaterialId;
- hasObjectId = (slots[i].contains("Object Id")) || hasObjectId;
- hasNormalWorld = (slots[i].contains("Normal World")) || hasNormalWorld;
-
- this.asString += slots[i];
- if (i != this._numBuffers - 1) this.asString += " | ";
- }
-
-
- // this.updateModules();
- this.updateModules();
-
- this.mod.toggleDefine("MOD_UNI_OBJECT_ID", hasObjectId);
- this.mod.toggleDefine("MOD_UNI_MATERIAL_ID", hasMaterialId);
- this.mod.toggleDefine("MOD_SLOT_POS_MV", hasPosModelView);
-
- this.mod.toggleDefine("MOD_SLOT_POS_WORLD", hasPosWorld);
- this.mod.toggleDefine("MOD_SLOT_POS_LOCAL", hasPosLocal);
- this.mod.toggleDefine("MOD_SLOT_POS_OBJECT", hasPosObject);
- this.mod.toggleDefine("MOD_SLOT_POS_NORMAL_MV", hasNormalModelView);
- this.mod.toggleDefine("MOD_SLOT_POS_NORMAL_WORLD", hasNormalWorld);
- }
- }
-
- export { RenderTargets };