{"version":3,"file":"vendor.openbim-components-6abdb991.0dc3876f540c177a.bundle.js","mappings":"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","sources":["webpack://client-app/./node_modules/openbim-components/src/navigation/PostproductionRenderer/src/custom-effects-pass.js","webpack://client-app/./node_modules/openbim-components/src/navigation/PostproductionRenderer/src/plane-distance-shader.js","webpack://client-app/./node_modules/openbim-components/src/navigation/PostproductionRenderer/src/projected-normal-shader.js","webpack://client-app/./node_modules/openbim-components/src/navigation/PostproductionRenderer/src/postproduction.js","webpack://client-app/./node_modules/openbim-components/src/navigation/PostproductionRenderer/index.js"],"sourcesContent":["import * as THREE from \"three\";\r\nimport { Pass, FullScreenQuad } from \"three/examples/jsm/postprocessing/Pass\";\r\nimport { getPlaneDistanceMaterial } from \"./plane-distance-shader\";\r\nimport { Disposer } from \"../../../core/Disposer\";\r\nimport { getProjectedNormalMaterial } from \"./projected-normal-shader\";\r\n// Follows the structure of\r\n// \t\thttps://github.com/mrdoob/three.js/blob/master/examples/jsm/postprocessing/OutlinePass.js\r\nexport class CustomEffectsPass extends Pass {\r\n get lineColor() {\r\n return this._lineColor;\r\n }\r\n set lineColor(lineColor) {\r\n this._lineColor = lineColor;\r\n const material = this.fsQuad.material;\r\n material.uniforms.lineColor.value.set(lineColor);\r\n }\r\n get tolerance() {\r\n return this._tolerance;\r\n }\r\n set tolerance(value) {\r\n this._tolerance = value;\r\n const material = this.fsQuad.material;\r\n material.uniforms.tolerance.value = value;\r\n }\r\n get opacity() {\r\n return this._opacity;\r\n }\r\n set opacity(value) {\r\n this._opacity = value;\r\n const material = this.fsQuad.material;\r\n material.uniforms.opacity.value = value;\r\n }\r\n get glossEnabled() {\r\n return this._glossEnabled;\r\n }\r\n set glossEnabled(active) {\r\n if (active === this._glossEnabled)\r\n return;\r\n this._glossEnabled = active;\r\n const material = this.fsQuad.material;\r\n material.uniforms.glossEnabled.value = active ? 1 : 0;\r\n }\r\n get glossExponent() {\r\n return this._glossExponent;\r\n }\r\n set glossExponent(value) {\r\n this._glossExponent = value;\r\n const material = this.fsQuad.material;\r\n material.uniforms.glossExponent.value = value;\r\n }\r\n get minGloss() {\r\n return this._minGloss;\r\n }\r\n set minGloss(value) {\r\n this._minGloss = value;\r\n const material = this.fsQuad.material;\r\n material.uniforms.minGloss.value = value;\r\n }\r\n get maxGloss() {\r\n new THREE.MeshBasicMaterial().color.convertLinearToSRGB();\r\n return this._maxGloss;\r\n }\r\n set maxGloss(value) {\r\n this._maxGloss = value;\r\n const material = this.fsQuad.material;\r\n material.uniforms.maxGloss.value = value;\r\n }\r\n get outlineEnabled() {\r\n return this._outlineEnabled;\r\n }\r\n set outlineEnabled(active) {\r\n if (active === this._outlineEnabled)\r\n return;\r\n this._outlineEnabled = active;\r\n const material = this.fsQuad.material;\r\n material.uniforms.outlineEnabled.value = active ? 1 : 0;\r\n }\r\n constructor(resolution, components, scene, camera) {\r\n super();\r\n this.excludedMeshes = [];\r\n this.outlinedMeshes = {};\r\n this._outlineScene = new THREE.Scene();\r\n this._outlineEnabled = false;\r\n this._lineColor = 0x999999;\r\n this._opacity = 0.4;\r\n this._tolerance = 3;\r\n this._glossEnabled = true;\r\n this._glossExponent = 1.9;\r\n this._minGloss = -0.1;\r\n this._maxGloss = 0.1;\r\n this._outlinesNeedsUpdate = false;\r\n this.components = components;\r\n this.renderScene = scene;\r\n this.renderCamera = camera;\r\n this.resolution = new THREE.Vector2(resolution.x, resolution.y);\r\n this.fsQuad = new FullScreenQuad();\r\n this.fsQuad.material = this.createOutlinePostProcessMaterial();\r\n this.planeBuffer = this.newRenderTarget();\r\n this.glossBuffer = this.newRenderTarget();\r\n this.outlineBuffer = this.newRenderTarget();\r\n const normalMaterial = getPlaneDistanceMaterial();\r\n normalMaterial.clippingPlanes = components.renderer.clippingPlanes;\r\n this.normalOverrideMaterial = normalMaterial;\r\n const glossMaterial = getProjectedNormalMaterial();\r\n glossMaterial.clippingPlanes = components.renderer.clippingPlanes;\r\n this.glossOverrideMaterial = glossMaterial;\r\n }\r\n async dispose() {\r\n this.planeBuffer.dispose();\r\n this.glossBuffer.dispose();\r\n this.outlineBuffer.dispose();\r\n this.normalOverrideMaterial.dispose();\r\n this.glossOverrideMaterial.dispose();\r\n this.fsQuad.dispose();\r\n this.excludedMeshes = [];\r\n this._outlineScene.children = [];\r\n const disposer = await this.components.tools.get(Disposer);\r\n for (const name in this.outlinedMeshes) {\r\n const style = this.outlinedMeshes[name];\r\n for (const mesh of style.meshes) {\r\n disposer.destroy(mesh, true, true);\r\n }\r\n style.material.dispose();\r\n }\r\n }\r\n setSize(width, height) {\r\n this.planeBuffer.setSize(width, height);\r\n this.glossBuffer.setSize(width, height);\r\n this.outlineBuffer.setSize(width, height);\r\n this.resolution.set(width, height);\r\n const material = this.fsQuad.material;\r\n material.uniforms.screenSize.value.set(this.resolution.x, this.resolution.y, 1 / this.resolution.x, 1 / this.resolution.y);\r\n }\r\n render(renderer, writeBuffer, readBuffer) {\r\n // Turn off writing to the depth buffer\r\n // because we need to read from it in the subsequent passes.\r\n const depthBufferValue = writeBuffer.depthBuffer;\r\n writeBuffer.depthBuffer = false;\r\n // 1. Re-render the scene to capture all normals in a texture.\r\n const previousOverrideMaterial = this.renderScene.overrideMaterial;\r\n const previousBackground = this.renderScene.background;\r\n this.renderScene.background = null;\r\n for (const mesh of this.excludedMeshes) {\r\n mesh.visible = false;\r\n }\r\n // Render normal pass\r\n renderer.setRenderTarget(this.planeBuffer);\r\n this.renderScene.overrideMaterial = this.normalOverrideMaterial;\r\n renderer.render(this.renderScene, this.renderCamera);\r\n // Render gloss pass\r\n if (this._glossEnabled) {\r\n renderer.setRenderTarget(this.glossBuffer);\r\n this.renderScene.overrideMaterial = this.glossOverrideMaterial;\r\n renderer.render(this.renderScene, this.renderCamera);\r\n }\r\n this.renderScene.overrideMaterial = previousOverrideMaterial;\r\n // Render outline pass\r\n if (this._outlineEnabled) {\r\n let outlinedMeshesFound = false;\r\n for (const name in this.outlinedMeshes) {\r\n const style = this.outlinedMeshes[name];\r\n for (const mesh of style.meshes) {\r\n outlinedMeshesFound = true;\r\n mesh.userData.materialPreOutline = mesh.material;\r\n mesh.material = style.material;\r\n mesh.userData.groupsPreOutline = mesh.geometry.groups;\r\n mesh.geometry.groups = [];\r\n if (mesh instanceof THREE.InstancedMesh) {\r\n mesh.userData.colorPreOutline = mesh.instanceColor;\r\n mesh.instanceColor = null;\r\n }\r\n mesh.userData.parentPreOutline = mesh.parent;\r\n this._outlineScene.add(mesh);\r\n }\r\n }\r\n // This way, when there are no outlines meshes, it clears the outlines buffer only once\r\n // and then skips this render\r\n if (outlinedMeshesFound || this._outlinesNeedsUpdate) {\r\n renderer.setRenderTarget(this.outlineBuffer);\r\n renderer.render(this._outlineScene, this.renderCamera);\r\n this._outlinesNeedsUpdate = outlinedMeshesFound;\r\n }\r\n for (const name in this.outlinedMeshes) {\r\n const style = this.outlinedMeshes[name];\r\n for (const mesh of style.meshes) {\r\n mesh.material = mesh.userData.materialPreOutline;\r\n mesh.geometry.groups = mesh.userData.groupsPreOutline;\r\n if (mesh instanceof THREE.InstancedMesh) {\r\n mesh.instanceColor = mesh.userData.colorPreOutline;\r\n }\r\n if (mesh.userData.parentPreOutline) {\r\n mesh.userData.parentPreOutline.add(mesh);\r\n }\r\n mesh.userData.materialPreOutline = undefined;\r\n mesh.userData.groupsPreOutline = undefined;\r\n mesh.userData.colorPreOutline = undefined;\r\n mesh.userData.parentPreOutline = undefined;\r\n }\r\n }\r\n }\r\n for (const mesh of this.excludedMeshes) {\r\n mesh.visible = true;\r\n }\r\n this.renderScene.background = previousBackground;\r\n const material = this.fsQuad.material;\r\n material.uniforms.planeBuffer.value = this.planeBuffer.texture;\r\n material.uniforms.glossBuffer.value = this.glossBuffer.texture;\r\n material.uniforms.outlineBuffer.value = this.outlineBuffer.texture;\r\n material.uniforms.sceneColorBuffer.value = readBuffer.texture;\r\n if (this.renderToScreen) {\r\n // If this is the last effect, then renderToScreen is true.\r\n // So we should render to the screen by setting target null\r\n // Otherwise, just render into the writeBuffer that the next effect will use as its read buffer.\r\n renderer.setRenderTarget(null);\r\n this.fsQuad.render(renderer);\r\n }\r\n else {\r\n renderer.setRenderTarget(writeBuffer);\r\n this.fsQuad.render(renderer);\r\n }\r\n // Reset the depthBuffer value so we continue writing to it in the next render.\r\n writeBuffer.depthBuffer = depthBufferValue;\r\n }\r\n get vertexShader() {\r\n return `\r\n\t varying vec2 vUv;\r\n\t void main() {\r\n\t \tvUv = uv;\r\n\t \tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\t }\r\n\t`;\r\n }\r\n get fragmentShader() {\r\n return `\r\n\t uniform sampler2D sceneColorBuffer;\r\n\t uniform sampler2D planeBuffer;\r\n\t uniform sampler2D glossBuffer;\r\n\t uniform sampler2D outlineBuffer;\r\n\t uniform vec4 screenSize;\r\n\t uniform vec3 lineColor;\r\n\t \r\n\t uniform float outlineEnabled;\r\n\t \r\n uniform int width;\r\n\t uniform float opacity;\r\n uniform float tolerance;\r\n uniform float glossExponent;\r\n uniform float minGloss;\r\n uniform float maxGloss;\r\n uniform float glossEnabled;\r\n\r\n\t varying vec2 vUv;\r\n\r\n\t vec4 getValue(sampler2D buffer, int x, int y) {\r\n\t \treturn texture2D(buffer, vUv + screenSize.zw * vec2(x, y));\r\n\t }\r\n\r\n float normalDiff(vec3 normal1, vec3 normal2) {\r\n return ((dot(normal1, normal2) - 1.) * -1.) / 2.;\r\n }\r\n\r\n // Returns 0 if it's background, 1 if it's not\r\n float getIsBackground(vec3 normal) {\r\n float background = 1.0;\r\n background *= step(normal.x, 0.);\r\n background *= step(normal.y, 0.);\r\n background *= step(normal.z, 0.);\r\n background = (background - 1.) * -1.;\r\n return background;\r\n }\r\n\r\n\t void main() {\r\n\t \r\n\t vec4 sceneColor = getValue(sceneColorBuffer, 0, 0);\r\n\t vec3 normSceneColor = normalize(sceneColor.rgb);\r\n \r\n vec4 plane = getValue(planeBuffer, 0, 0);\r\n\t vec3 normal = plane.xyz;\r\n float distance = plane.w;\r\n \r\n vec3 normalTop = getValue(planeBuffer, 0, width).rgb;\r\n vec3 normalBottom = getValue(planeBuffer, 0, -width).rgb;\r\n vec3 normalRight = getValue(planeBuffer, width, 0).rgb;\r\n vec3 normalLeft = getValue(planeBuffer, -width, 0).rgb;\r\n vec3 normalTopRight = getValue(planeBuffer, width, width).rgb;\r\n vec3 normalTopLeft = getValue(planeBuffer, -width, width).rgb;\r\n vec3 normalBottomRight = getValue(planeBuffer, width, -width).rgb;\r\n vec3 normalBottomLeft = getValue(planeBuffer, -width, -width).rgb;\r\n \r\n float distanceTop = getValue(planeBuffer, 0, width).a;\r\n float distanceBottom = getValue(planeBuffer, 0, -width).a;\r\n float distanceRight = getValue(planeBuffer, width, 0).a;\r\n float distanceLeft = getValue(planeBuffer, -width, 0).a;\r\n float distanceTopRight = getValue(planeBuffer, width, width).a;\r\n float distanceTopLeft = getValue(planeBuffer, -width, width).a;\r\n float distanceBottomRight = getValue(planeBuffer, width, -width).a;\r\n float distanceBottomLeft = getValue(planeBuffer, -width, -width).a;\r\n \r\n vec3 sceneColorTop = normalize(getValue(sceneColorBuffer, 1, 0).rgb);\r\n vec3 sceneColorBottom = normalize(getValue(sceneColorBuffer, -1, 0).rgb);\r\n vec3 sceneColorLeft = normalize(getValue(sceneColorBuffer, 0, -1).rgb);\r\n vec3 sceneColorRight = normalize(getValue(sceneColorBuffer, 0, 1).rgb);\r\n vec3 sceneColorTopRight = normalize(getValue(sceneColorBuffer, 1, 1).rgb);\r\n vec3 sceneColorBottomRight = normalize(getValue(sceneColorBuffer, -1, 1).rgb);\r\n vec3 sceneColorTopLeft = normalize(getValue(sceneColorBuffer, 1, 1).rgb);\r\n vec3 sceneColorBottomLeft = normalize(getValue(sceneColorBuffer, -1, 1).rgb);\r\n\r\n // Checks if the planes of this texel and the neighbour texels are different\r\n\r\n float planeDiff = 0.0;\r\n\r\n planeDiff += step(0.001, normalDiff(normal, normalTop));\r\n planeDiff += step(0.001, normalDiff(normal, normalBottom));\r\n planeDiff += step(0.001, normalDiff(normal, normalLeft));\r\n planeDiff += step(0.001, normalDiff(normal, normalRight));\r\n planeDiff += step(0.001, normalDiff(normal, normalTopRight));\r\n planeDiff += step(0.001, normalDiff(normal, normalTopLeft));\r\n planeDiff += step(0.001, normalDiff(normal, normalBottomRight));\r\n planeDiff += step(0.001, normalDiff(normal, normalBottomLeft));\r\n \r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorTop));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorBottom));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorLeft));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorRight));\r\n \tplaneDiff += step(0.001, normalDiff(normSceneColor, sceneColorTopRight));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorTopLeft));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorBottomRight));\r\n planeDiff += step(0.001, normalDiff(normSceneColor, sceneColorBottomLeft));\r\n\r\n planeDiff += step(0.001, abs(distance - distanceTop));\r\n planeDiff += step(0.001, abs(distance - distanceBottom));\r\n planeDiff += step(0.001, abs(distance - distanceLeft));\r\n planeDiff += step(0.001, abs(distance - distanceRight));\r\n planeDiff += step(0.001, abs(distance - distanceTopRight));\r\n planeDiff += step(0.001, abs(distance - distanceTopLeft));\r\n planeDiff += step(0.001, abs(distance - distanceBottomRight));\r\n planeDiff += step(0.001, abs(distance - distanceBottomLeft));\r\n\r\n // Add extra background outline\r\n\r\n int width2 = width + 1;\r\n vec3 normalTop2 = getValue(planeBuffer, 0, width2).rgb;\r\n vec3 normalBottom2 = getValue(planeBuffer, 0, -width2).rgb;\r\n vec3 normalRight2 = getValue(planeBuffer, width2, 0).rgb;\r\n vec3 normalLeft2 = getValue(planeBuffer, -width2, 0).rgb;\r\n vec3 normalTopRight2 = getValue(planeBuffer, width2, width2).rgb;\r\n vec3 normalTopLeft2 = getValue(planeBuffer, -width2, width2).rgb;\r\n vec3 normalBottomRight2 = getValue(planeBuffer, width2, -width2).rgb;\r\n vec3 normalBottomLeft2 = getValue(planeBuffer, -width2, -width2).rgb;\r\n\r\n planeDiff += -(getIsBackground(normalTop2) - 1.);\r\n planeDiff += -(getIsBackground(normalBottom2) - 1.);\r\n planeDiff += -(getIsBackground(normalRight2) - 1.);\r\n planeDiff += -(getIsBackground(normalLeft2) - 1.);\r\n planeDiff += -(getIsBackground(normalTopRight2) - 1.);\r\n planeDiff += -(getIsBackground(normalBottomRight2) - 1.);\r\n planeDiff += -(getIsBackground(normalBottomRight2) - 1.);\r\n planeDiff += -(getIsBackground(normalBottomLeft2) - 1.);\r\n\r\n // Tolerance sets the minimum amount of differences to consider\r\n // this texel an edge\r\n\r\n float line = step(tolerance, planeDiff);\r\n\r\n // Exclude background and apply opacity\r\n\r\n float background = getIsBackground(normal);\r\n line *= background;\r\n line *= opacity;\r\n \r\n // Add gloss\r\n \r\n vec3 gloss = getValue(glossBuffer, 0, 0).xyz;\r\n float diffGloss = abs(maxGloss - minGloss);\r\n vec3 glossExpVector = vec3(glossExponent,glossExponent,glossExponent);\r\n gloss = min(pow(gloss, glossExpVector), vec3(1.,1.,1.));\r\n gloss *= diffGloss;\r\n gloss += minGloss;\r\n vec4 glossedColor = sceneColor + vec4(gloss, 1.) * glossEnabled;\r\n \r\n vec4 corrected = mix(sceneColor, glossedColor, background);\r\n \r\n // Draw lines\r\n \r\n corrected = mix(corrected, vec4(lineColor, 1.), line);\r\n \r\n // Add outline\r\n \r\n vec4 outlinePreview =getValue(outlineBuffer, 0, 0);\r\n float outlineColorCorrection = 1. / max(0.2, outlinePreview.a);\r\n vec3 outlineColor = outlinePreview.rgb * outlineColorCorrection;\r\n \r\n // thickness between 10 and 2, opacity between 1 and 0.2\r\n\t int outlineThickness = int(outlinePreview.a * 10.);\r\n\t \r\n\t float outlineDiff = 0.;\r\n \r\n outlineDiff += step(0.1, getValue(outlineBuffer, 0, 0).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, 1, 0).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, -1, 0).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, 0, -1).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, 0, 1).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, outlineThickness, 0).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, -outlineThickness, 0).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, 0, -outlineThickness).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, 0, outlineThickness).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, outlineThickness, outlineThickness).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, -outlineThickness, outlineThickness).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, -outlineThickness, -outlineThickness).a);\r\n outlineDiff += step(0.1, getValue(outlineBuffer, outlineThickness, -outlineThickness).a);\r\n \r\n float outLine = step(4., outlineDiff) * step(outlineDiff, 12.) * outlineEnabled;\r\n corrected = mix(corrected, vec4(outlineColor, 1.), outLine);\r\n \r\n gl_FragColor = corrected;\r\n\t}\r\n\t\t\t`;\r\n }\r\n createOutlinePostProcessMaterial() {\r\n return new THREE.ShaderMaterial({\r\n uniforms: {\r\n opacity: { value: this._opacity },\r\n debugVisualize: { value: 0 },\r\n sceneColorBuffer: { value: null },\r\n tolerance: { value: this._tolerance },\r\n planeBuffer: { value: null },\r\n glossBuffer: { value: null },\r\n outlineBuffer: { value: null },\r\n glossEnabled: { value: 1 },\r\n minGloss: { value: this._minGloss },\r\n maxGloss: { value: this._maxGloss },\r\n outlineEnabled: { value: 0 },\r\n glossExponent: { value: this._glossExponent },\r\n width: { value: 1 },\r\n lineColor: { value: new THREE.Color(this._lineColor) },\r\n screenSize: {\r\n value: new THREE.Vector4(this.resolution.x, this.resolution.y, 1 / this.resolution.x, 1 / this.resolution.y),\r\n },\r\n },\r\n vertexShader: this.vertexShader,\r\n fragmentShader: this.fragmentShader,\r\n });\r\n }\r\n newRenderTarget() {\r\n const planeBuffer = new THREE.WebGLRenderTarget(this.resolution.x, this.resolution.y);\r\n planeBuffer.texture.colorSpace = \"srgb-linear\";\r\n planeBuffer.texture.format = THREE.RGBAFormat;\r\n planeBuffer.texture.type = THREE.HalfFloatType;\r\n planeBuffer.texture.minFilter = THREE.NearestFilter;\r\n planeBuffer.texture.magFilter = THREE.NearestFilter;\r\n planeBuffer.texture.generateMipmaps = false;\r\n planeBuffer.stencilBuffer = false;\r\n return planeBuffer;\r\n }\r\n}\r\n//# sourceMappingURL=custom-effects-pass.js.map","import * as THREE from \"three\";\r\n// Gets the plane information (ax + by + cz = d) of each face, where:\r\n// - (a, b, c) is the normal vector of the plane\r\n// - d is the signed distance to the origin\r\nexport function getPlaneDistanceMaterial() {\r\n return new THREE.ShaderMaterial({\r\n side: 2,\r\n clipping: true,\r\n uniforms: {},\r\n vertexShader: `\r\n varying vec4 vColor;\r\n \r\n #include \r\n \r\n void main() {\r\n #include \r\n \r\n vec4 absPosition = vec4(position, 1.0);\r\n vec3 trueNormal = normal;\r\n \r\n #ifdef USE_INSTANCING\r\n absPosition = instanceMatrix * absPosition;\r\n trueNormal = (instanceMatrix * vec4(normal, 0.)).xyz;\r\n #endif\r\n \r\n absPosition = modelMatrix * absPosition;\r\n trueNormal = (normalize(modelMatrix * vec4(trueNormal, 0.))).xyz;\r\n \r\n vec3 planePosition = absPosition.xyz / 40.;\r\n float d = abs(dot(trueNormal, planePosition));\r\n vColor = vec4(abs(trueNormal), d);\r\n gl_Position = projectionMatrix * viewMatrix * absPosition;\r\n \r\n #include \r\n #include \r\n }\r\n `,\r\n fragmentShader: `\r\n varying vec4 vColor;\r\n \r\n #include \r\n \r\n void main() {\r\n #include \r\n gl_FragColor = vColor;\r\n }\r\n `,\r\n });\r\n}\r\n//# sourceMappingURL=plane-distance-shader.js.map","import * as THREE from \"three\";\r\n// Gets the plane information (ax + by + cz = d) of each face, where:\r\n// - (a, b, c) is the normal vector of the plane\r\n// - d is the signed distance to the origin\r\nexport function getProjectedNormalMaterial() {\r\n return new THREE.ShaderMaterial({\r\n side: 2,\r\n clipping: true,\r\n uniforms: {},\r\n vertexShader: `\r\n varying vec3 vCameraPosition;\r\n varying vec3 vPosition;\r\n varying vec3 vNormal;\r\n \r\n #include \r\n \r\n void main() {\r\n #include \r\n \r\n vec4 absPosition = vec4(position, 1.0);\r\n vNormal = normal;\r\n \r\n #ifdef USE_INSTANCING\r\n absPosition = instanceMatrix * absPosition;\r\n vNormal = (instanceMatrix * vec4(normal, 0.)).xyz;\r\n #endif\r\n \r\n absPosition = modelMatrix * absPosition;\r\n vNormal = (normalize(modelMatrix * vec4(vNormal, 0.))).xyz;\r\n \r\n gl_Position = projectionMatrix * viewMatrix * absPosition;\r\n \r\n vCameraPosition = cameraPosition;\r\n vPosition = absPosition.xyz;\r\n \r\n #include \r\n #include \r\n }\r\n `,\r\n fragmentShader: `\r\n varying vec3 vCameraPosition;\r\n varying vec3 vPosition;\r\n varying vec3 vNormal;\r\n \r\n #include \r\n \r\n void main() {\r\n #include \r\n vec3 cameraPixelVec = normalize(vCameraPosition - vPosition);\r\n float difference = abs(dot(vNormal, cameraPixelVec));\r\n \r\n // This achieves a double gloss effect: when the surface is perpendicular and when it's parallel\r\n difference = abs((difference * 2.) - 1.);\r\n \r\n gl_FragColor = vec4(difference, difference, difference, 1.);\r\n }\r\n `,\r\n });\r\n}\r\n//# sourceMappingURL=projected-normal-shader.js.map","import * as THREE from \"three\";\r\nimport { EffectComposer } from \"three/examples/jsm/postprocessing/EffectComposer\";\r\nimport { RenderPass } from \"three/examples/jsm/postprocessing/RenderPass\";\r\nimport { N8AOPass } from \"n8ao\";\r\nimport { ShaderPass } from \"three/examples/jsm/postprocessing/ShaderPass\";\r\nimport { GammaCorrectionShader } from \"three/examples/jsm/shaders/GammaCorrectionShader\";\r\nimport { OrthoPerspectiveCamera } from \"../../OrthoPerspectiveCamera\";\r\nimport { CustomEffectsPass } from \"./custom-effects-pass\";\r\n// source: https://discourse.threejs.org/t/how-to-render-full-outlines-as-a-post-process-tutorial/22674\r\nexport class Postproduction {\r\n get basePass() {\r\n if (!this._basePass) {\r\n throw new Error(\"Custom effects not initialized!\");\r\n }\r\n return this._basePass;\r\n }\r\n get gammaPass() {\r\n if (!this._gammaPass) {\r\n throw new Error(\"Custom effects not initialized!\");\r\n }\r\n return this._gammaPass;\r\n }\r\n get customEffects() {\r\n if (!this._customEffects) {\r\n throw new Error(\"Custom effects not initialized!\");\r\n }\r\n return this._customEffects;\r\n }\r\n get n8ao() {\r\n if (!this._n8ao) {\r\n throw new Error(\"Custom effects not initialized!\");\r\n }\r\n return this._n8ao;\r\n }\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(active) {\r\n if (!this._initialized) {\r\n this.initialize();\r\n }\r\n this._enabled = active;\r\n }\r\n get settings() {\r\n return { ...this._settings };\r\n }\r\n constructor(components, renderer) {\r\n this.components = components;\r\n this.renderer = renderer;\r\n this.excludedItems = new Set();\r\n this.overrideClippingPlanes = false;\r\n this._enabled = false;\r\n this._initialized = false;\r\n this._settings = {\r\n gamma: true,\r\n custom: true,\r\n ao: false,\r\n };\r\n this._renderTarget = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight);\r\n this._renderTarget.texture.colorSpace = \"srgb-linear\";\r\n this.composer = new EffectComposer(this.renderer, this._renderTarget);\r\n this.composer.setSize(window.innerWidth, window.innerHeight);\r\n }\r\n async dispose() {\r\n var _a, _b, _c, _d;\r\n this._renderTarget.dispose();\r\n (_a = this._depthTexture) === null || _a === void 0 ? void 0 : _a.dispose();\r\n await ((_b = this._customEffects) === null || _b === void 0 ? void 0 : _b.dispose());\r\n (_c = this._gammaPass) === null || _c === void 0 ? void 0 : _c.dispose();\r\n (_d = this._n8ao) === null || _d === void 0 ? void 0 : _d.dispose();\r\n this.excludedItems.clear();\r\n }\r\n setPasses(settings) {\r\n // This check can prevent some bugs\r\n let settingsChanged = false;\r\n for (const name in settings) {\r\n const key = name;\r\n if (this.settings[key] !== settings[key]) {\r\n settingsChanged = true;\r\n break;\r\n }\r\n }\r\n if (!settingsChanged) {\r\n return;\r\n }\r\n for (const name in settings) {\r\n const key = name;\r\n if (this._settings[key] !== undefined) {\r\n this._settings[key] = settings[key];\r\n }\r\n }\r\n this.updatePasses();\r\n }\r\n setSize(width, height) {\r\n if (this._initialized) {\r\n this.composer.setSize(width, height);\r\n this.basePass.setSize(width, height);\r\n this.n8ao.setSize(width, height);\r\n this.customEffects.setSize(width, height);\r\n this.gammaPass.setSize(width, height);\r\n }\r\n }\r\n update() {\r\n if (!this._enabled)\r\n return;\r\n this.composer.render();\r\n }\r\n updateCamera() {\r\n const camera = this.components.camera.get();\r\n if (this._n8ao) {\r\n this._n8ao.camera = camera;\r\n }\r\n if (this._customEffects) {\r\n this._customEffects.renderCamera = camera;\r\n }\r\n if (this._basePass) {\r\n this._basePass.camera = camera;\r\n }\r\n }\r\n initialize() {\r\n const scene = this.overrideScene || this.components.scene.get();\r\n const camera = this.overrideCamera || this.components.camera.get();\r\n if (!scene || !camera)\r\n return;\r\n if (this.components.camera instanceof OrthoPerspectiveCamera) {\r\n this.components.camera.projectionChanged.add(() => {\r\n this.updateCamera();\r\n });\r\n }\r\n const renderer = this.components.renderer;\r\n if (!this.overrideClippingPlanes) {\r\n this.renderer.clippingPlanes = renderer.clippingPlanes;\r\n }\r\n this.renderer.outputColorSpace = \"srgb\";\r\n this.renderer.toneMapping = THREE.NoToneMapping;\r\n this.newBasePass(scene, camera);\r\n this.newSaoPass(scene, camera);\r\n this.newGammaPass();\r\n this.newCustomPass(scene, camera);\r\n this._initialized = true;\r\n this.updatePasses();\r\n }\r\n updateProjection(camera) {\r\n this.composer.passes.forEach((pass) => {\r\n // @ts-ignore\r\n pass.camera = camera;\r\n });\r\n this.update();\r\n }\r\n updatePasses() {\r\n for (const pass of this.composer.passes) {\r\n this.composer.removePass(pass);\r\n }\r\n if (this._basePass) {\r\n this.composer.addPass(this.basePass);\r\n }\r\n if (this._settings.gamma) {\r\n this.composer.addPass(this.gammaPass);\r\n }\r\n if (this._settings.ao) {\r\n this.composer.addPass(this.n8ao);\r\n }\r\n if (this._settings.custom) {\r\n this.composer.addPass(this.customEffects);\r\n }\r\n }\r\n newCustomPass(scene, camera) {\r\n this._customEffects = new CustomEffectsPass(new THREE.Vector2(window.innerWidth, window.innerHeight), this.components, scene, camera);\r\n }\r\n newGammaPass() {\r\n this._gammaPass = new ShaderPass(GammaCorrectionShader);\r\n }\r\n newSaoPass(scene, camera) {\r\n const { width, height } = this.components.renderer.getSize();\r\n this._n8ao = new N8AOPass(scene, camera, width, height);\r\n // this.composer.addPass(this.n8ao);\r\n const { configuration } = this._n8ao;\r\n configuration.aoSamples = 16;\r\n configuration.denoiseSamples = 1;\r\n configuration.denoiseRadius = 13;\r\n configuration.aoRadius = 1;\r\n configuration.distanceFalloff = 4;\r\n configuration.aoRadius = 1;\r\n configuration.intensity = 4;\r\n configuration.halfRes = true;\r\n configuration.color = new THREE.Color().setHex(0xcccccc, \"srgb-linear\");\r\n }\r\n newBasePass(scene, camera) {\r\n this._basePass = new RenderPass(scene, camera);\r\n }\r\n}\r\n//# sourceMappingURL=postproduction.js.map","import { SimpleRenderer } from \"../../core/SimpleRenderer\";\r\nimport { Postproduction } from \"./src/postproduction\";\r\n/**\r\n * Renderer that uses efficient postproduction effects (e.g. Ambient Occlusion).\r\n */\r\nexport class PostproductionRenderer extends SimpleRenderer {\r\n constructor(components, container, parameters) {\r\n super(components, container, parameters);\r\n this.postproduction = new Postproduction(components, this._renderer);\r\n this.setPostproductionSize();\r\n this.onResize.add((size) => this.resizePostproduction(size));\r\n }\r\n /** {@link Updateable.update} */\r\n async update() {\r\n if (!this.enabled)\r\n return;\r\n await this.onBeforeUpdate.trigger();\r\n const scene = this.overrideScene || this.components.scene.get();\r\n const camera = this.overrideCamera || this.components.camera.get();\r\n if (!scene || !camera)\r\n return;\r\n if (this.postproduction.enabled) {\r\n this.postproduction.composer.render();\r\n }\r\n else {\r\n this._renderer.render(scene, camera);\r\n }\r\n this._renderer2D.render(scene, camera);\r\n await this.onAfterUpdate.trigger();\r\n }\r\n /** {@link Disposable.dispose}. */\r\n async dispose() {\r\n await super.dispose();\r\n await this.postproduction.dispose();\r\n }\r\n resizePostproduction(size) {\r\n if (this.postproduction) {\r\n this.setPostproductionSize(size);\r\n }\r\n }\r\n setPostproductionSize(size) {\r\n if (!this.container)\r\n return;\r\n const width = size ? size.x : this.container.clientWidth;\r\n const height = size ? size.y : this.container.clientHeight;\r\n this.postproduction.setSize(width, height);\r\n }\r\n}\r\n//# sourceMappingURL=index.js.map"],"names":["CustomEffectsPass","Pass","lineColor","this","_lineColor","fsQuad","material","uniforms","value","set","tolerance","_tolerance","opacity","_opacity","glossEnabled","_glossEnabled","active","glossExponent","_glossExponent","minGloss","_minGloss","maxGloss","color","convertLinearToSRGB","_maxGloss","outlineEnabled","_outlineEnabled","constructor","resolution","components","scene","camera","super","excludedMeshes","outlinedMeshes","_outlineScene","_outlinesNeedsUpdate","renderScene","renderCamera","x","y","createOutlinePostProcessMaterial","planeBuffer","newRenderTarget","glossBuffer","outlineBuffer","normalMaterial","side","clipping","vertexShader","fragmentShader","clippingPlanes","renderer","normalOverrideMaterial","glossMaterial","glossOverrideMaterial","async","dispose","children","disposer","tools","get","Disposer","name","style","mesh","meshes","destroy","setSize","width","height","screenSize","render","writeBuffer","readBuffer","depthBufferValue","depthBuffer","previousOverrideMaterial","overrideMaterial","previousBackground","background","visible","setRenderTarget","outlinedMeshesFound","userData","materialPreOutline","groupsPreOutline","geometry","groups","colorPreOutline","instanceColor","parentPreOutline","parent","add","undefined","texture","sceneColorBuffer","renderToScreen","debugVisualize","colorSpace","format","type","minFilter","magFilter","generateMipmaps","stencilBuffer","Postproduction","basePass","_basePass","Error","gammaPass","_gammaPass","customEffects","_customEffects","n8ao","_n8ao","enabled","_enabled","_initialized","initialize","settings","_settings","excludedItems","Set","overrideClippingPlanes","gamma","custom","ao","_renderTarget","window","innerWidth","innerHeight","composer","EffectComposer","_a","_b","_c","_d","_depthTexture","clear","setPasses","settingsChanged","key","updatePasses","update","updateCamera","overrideScene","overrideCamera","OrthoPerspectiveCamera","O","projectionChanged","outputColorSpace","toneMapping","newBasePass","newSaoPass","newGammaPass","newCustomPass","updateProjection","passes","forEach","pass","removePass","addPass","ShaderPass","GammaCorrectionShader","getSize","N8AO","configuration","aoSamples","denoiseSamples","denoiseRadius","aoRadius","distanceFalloff","intensity","halfRes","setHex","RenderPass","PostproductionRenderer","SimpleRenderer","container","parameters","postproduction","_renderer","setPostproductionSize","onResize","size","resizePostproduction","onBeforeUpdate","trigger","_renderer2D","onAfterUpdate","clientWidth","clientHeight"],"sourceRoot":""}