UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

48 lines (47 loc) 1.57 kB
"use strict"; 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; } }