@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
48 lines (47 loc) • 1.57 kB
JavaScript
;
import { ShaderAssemblerStandard } from "./Standard";
import originalTransmissionFragment from "three/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl";
import { MeshPhysicalMaterial } from "three";
function addPolyTransmission(fragment) {
const transmission = "material.transmission = transmission;";
const thickness = "material.thickness = thickness;";
const lines = fragment.split("\n");
let cmptr = 0;
for (let line of lines) {
if (line.includes(transmission)) {
line = line.replace(transmission, "material.transmission = transmission * POLY_transmission;");
lines[cmptr] = line;
}
if (line.includes(thickness)) {
line = line.replace(thickness, "material.thickness = thickness * POLY_thickness;");
lines[cmptr] = line;
}
cmptr++;
}
return lines.join("\n");
}
export class ShaderAssemblerPhysical extends ShaderAssemblerStandard {
constructor(_gl_parent_node) {
super(_gl_parent_node);
this._gl_parent_node = _gl_parent_node;
this._addFilterFragmentShaderCallback(
"MeshPhysicalBuilderMatNode",
ShaderAssemblerPhysical.filterFragmentShader
);
}
isPhysical() {
return true;
}
static filterFragmentShader(fragmentShader) {
fragmentShader = fragmentShader.replace(
"#include <transmission_fragment>",
addPolyTransmission(originalTransmissionFragment)
);
return fragmentShader;
}
createMaterial() {
const material = new MeshPhysicalMaterial();
this._addCustomMaterials(material);
return material;
}
}