@roomle/web-sdk 3.7.0-alpha.3 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{BufferGeometry-C696z6r3.mjs → BufferGeometry-BzmfTBQt.mjs} +1 -1
- package/lib/{BufferGeometry-C696z6r3.mjs.map → BufferGeometry-BzmfTBQt.mjs.map} +1 -1
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/{GLTFExporter-AfQIvZAD.mjs → GLTFExporter-CyhgWPq0.mjs} +2 -2
- package/lib/{GLTFExporter-AfQIvZAD.mjs.map → GLTFExporter-CyhgWPq0.mjs.map} +1 -1
- package/lib/{PointLightHelper-wVSmrAnD.mjs → PointLightHelper-DwIXACyT.mjs} +2 -2
- package/lib/{PointLightHelper-wVSmrAnD.mjs.map → PointLightHelper-DwIXACyT.mjs.map} +1 -1
- package/lib/RoomleCore.js +2 -2
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{SpotLightHelper-C7J95t4f.mjs → SpotLightHelper-CfLHM7LU.mjs} +2 -2
- package/lib/{SpotLightHelper-C7J95t4f.mjs.map → SpotLightHelper-CfLHM7LU.mjs.map} +1 -1
- package/lib/{USDZExporter-BBk0APeK.mjs → USDZExporter-kmxcTvnQ.mjs} +2 -2
- package/lib/{USDZExporter-BBk0APeK.mjs.map → USDZExporter-kmxcTvnQ.mjs.map} +1 -1
- package/lib/{api-DgXsyN04.mjs → api-X1dDTDvL.mjs} +2 -2
- package/lib/{api-DgXsyN04.mjs.map → api-X1dDTDvL.mjs.map} +1 -1
- package/lib/asset-loader.worker-A7nEeQB4.mjs.map +1 -1
- package/lib/{banana-for-scale-D8t2dmc7.mjs → banana-for-scale-Bpf8RfLi.mjs} +4 -4
- package/lib/{banana-for-scale-D8t2dmc7.mjs.map → banana-for-scale-Bpf8RfLi.mjs.map} +1 -1
- package/lib/budgeteer.sw-CQWYbQSc.mjs.map +1 -1
- package/lib/budgeteer.sw.js +1 -1
- package/lib/{common-utils-qErzZAiR.mjs → common-utils-DMI8Yuhe.mjs} +5 -3
- package/lib/common-utils-DMI8Yuhe.mjs.map +1 -0
- package/lib/{component-dimensioning-DlB7-9Om.mjs → component-dimensioning-MtS9xiY-.mjs} +15 -15
- package/lib/{component-dimensioning-DlB7-9Om.mjs.map → component-dimensioning-MtS9xiY-.mjs.map} +1 -1
- package/lib/{component-raycast-helper-C6ptEb0K.mjs → component-raycast-helper-C1qWqpRH.mjs} +13 -9
- package/lib/component-raycast-helper-C1qWqpRH.mjs.map +1 -0
- package/lib/configurator-C5t3clCx.mjs +2 -0
- package/lib/{configurator-CmMBHkyd.mjs → configurator-Cg1a9XSL.mjs} +4 -4
- package/lib/{configurator-CmMBHkyd.mjs.map → configurator-Cg1a9XSL.mjs.map} +1 -1
- package/lib/{continuous-drawing-helper-BwulJHKj.mjs → continuous-drawing-helper-CQx5Sbns.mjs} +3 -3
- package/lib/{continuous-drawing-helper-BwulJHKj.mjs.map → continuous-drawing-helper-CQx5Sbns.mjs.map} +1 -1
- package/lib/{dat.gui.module-CZHqOVGq.mjs → dat.gui.module-CZ-DIWHM.mjs} +1 -1
- package/lib/{dat.gui.module-CZHqOVGq.mjs.map → dat.gui.module-CZ-DIWHM.mjs.map} +1 -1
- package/lib/{decorate-BAtqSPNS.mjs → decorate-Bck1_lG8.mjs} +1 -1
- package/lib/{decorate-BAtqSPNS.mjs.map → decorate-Bck1_lG8.mjs.map} +1 -1
- package/lib/dimensioning-helper-Bfe0fImX.mjs +2 -0
- package/lib/{dimensioning-helper--Y0Y-Wr1.mjs → dimensioning-helper-GPn7Z8GE.mjs} +7 -7
- package/lib/{dimensioning-helper--Y0Y-Wr1.mjs.map → dimensioning-helper-GPn7Z8GE.mjs.map} +1 -1
- package/lib/glb-viewer-DIEpkrvY.mjs +2 -0
- package/lib/{glb-viewer-Cs3i0yb8.mjs → glb-viewer-tgKOPCaI.mjs} +44 -45
- package/lib/glb-viewer-tgKOPCaI.mjs.map +1 -0
- package/lib/highlight-coordinator-DRHeEU-E.mjs +116 -0
- package/lib/highlight-coordinator-DRHeEU-E.mjs.map +1 -0
- package/lib/{homag-intelligence-CBZujG1I.mjs → homag-intelligence-D5mCTWgG.mjs} +19 -11
- package/lib/homag-intelligence-D5mCTWgG.mjs.map +1 -0
- package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs → imos-ix-poc-export-helper-BKFs_Yhm.mjs} +5 -5
- package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs.map → imos-ix-poc-export-helper-BKFs_Yhm.mjs.map} +1 -1
- package/lib/kernel-C7YDLxq8.mjs.map +1 -1
- package/lib/{kernel-utils-DCnHzW4n.mjs → kernel-utils-B80amC-l.mjs} +2 -2
- package/lib/{kernel-utils-DCnHzW4n.mjs.map → kernel-utils-B80amC-l.mjs.map} +1 -1
- package/lib/{layer-CFAr2mK_.mjs → layer-BfckfWZz.mjs} +1 -1
- package/lib/{layer-CFAr2mK_.mjs.map → layer-BfckfWZz.mjs.map} +1 -1
- package/lib/{main-_HtiLIhS.mjs → main-CJ5TNhBt.mjs} +2484 -2533
- package/lib/main-CJ5TNhBt.mjs.map +1 -0
- package/lib/{material-viewer-BCjg687R.mjs → material-viewer-DCqZzMZN.mjs} +40 -35
- package/lib/material-viewer-DCqZzMZN.mjs.map +1 -0
- package/lib/packages-DuOz6rk6.mjs +4 -0
- package/lib/{planner-OYwMFSWo.mjs → planner-CSboZram.mjs} +3 -3
- package/lib/{planner-OYwMFSWo.mjs.map → planner-CSboZram.mjs.map} +1 -1
- package/lib/planner-CWPqJktz.mjs +2 -0
- package/lib/{plugin-system-DInww4H_.mjs → plugin-system-DD0Z9Jvt.mjs} +3 -3
- package/lib/{plugin-system-DInww4H_.mjs.map → plugin-system-DD0Z9Jvt.mjs.map} +1 -1
- package/lib/{roomle-headless-setup-LoBO7UJe.mjs → roomle-headless-setup-nsoGENQV.mjs} +1 -1
- package/lib/{roomle-headless-setup-LoBO7UJe.mjs.map → roomle-headless-setup-nsoGENQV.mjs.map} +1 -1
- package/lib/roomle-headless.d.ts +185 -63
- package/lib/roomle-headless.js +9 -9
- package/lib/{roomle-renderer-DVlJsHYn.mjs → roomle-renderer-BEJNPCKx.mjs} +2 -2
- package/lib/roomle-renderer-BEJNPCKx.mjs.map +1 -0
- package/lib/roomle-sdk.d.ts +185 -63
- package/lib/roomle-sdk.js +6 -6
- package/lib/roomle-webgpu-renderer-D5flithq.mjs +1502 -0
- package/lib/roomle-webgpu-renderer-D5flithq.mjs.map +1 -0
- package/lib/{scene-renderer-BHZrQYAH.mjs → scene-renderer-Dm1kij1z.mjs} +26 -26
- package/lib/scene-renderer-Dm1kij1z.mjs.map +1 -0
- package/lib/{script-loader-X4I-gQl2.mjs → script-loader-DqaDm1FG.mjs} +3 -3
- package/lib/{script-loader-X4I-gQl2.mjs.map → script-loader-DqaDm1FG.mjs.map} +1 -1
- package/lib/static/packages/workers/generated/budgeteer.sw.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.d.ts +2 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +18 -6
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js +15 -11
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.d.ts +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +21 -12
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +2 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/{stats-helper-Cv5SoEWT.mjs → stats-helper-D7a7oxnj.mjs} +3 -3
- package/lib/{stats-helper-Cv5SoEWT.mjs.map → stats-helper-D7a7oxnj.mjs.map} +1 -1
- package/lib/{three.core-mM-jZdgg.mjs → three.core-BmQnspOL.mjs} +819 -816
- package/lib/{three.core-mM-jZdgg.mjs.map → three.core-BmQnspOL.mjs.map} +1 -1
- package/lib/{three.module-Bmy3sVQ-.mjs → three.module-DkrZwaid.mjs} +455 -455
- package/lib/{three.module-Bmy3sVQ-.mjs.map → three.module-DkrZwaid.mjs.map} +1 -1
- package/lib/{three.webgpu-BbVYfCDp.mjs → three.webgpu-DLZjhIYv.mjs} +1517 -1517
- package/lib/{three.webgpu-BbVYfCDp.mjs.map → three.webgpu-DLZjhIYv.mjs.map} +1 -1
- package/lib/three.webgpu-RkQxSIwG.mjs +3 -0
- package/lib/{threejs-utils-Bq4pVWBA.mjs → threejs-utils-CrK_gp1x.mjs} +67 -63
- package/lib/{threejs-utils-Bq4pVWBA.mjs.map → threejs-utils-CrK_gp1x.mjs.map} +1 -1
- package/lib/{tools-core-BRzDdhLJ.mjs → tools-core-CZWgXTFV.mjs} +3 -3
- package/lib/{tools-core-BRzDdhLJ.mjs.map → tools-core-CZWgXTFV.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/common-utils-qErzZAiR.mjs.map +0 -1
- package/lib/component-raycast-helper-C6ptEb0K.mjs.map +0 -1
- package/lib/component-raycast-helper-LrhRpeDD.mjs +0 -2
- package/lib/configurator-DtvX4JqP.mjs +0 -2
- package/lib/dimensioning-helper-BpUreWo2.mjs +0 -2
- package/lib/glb-viewer-Cs3i0yb8.mjs.map +0 -1
- package/lib/glb-viewer-Dcllu_oG.mjs +0 -2
- package/lib/homag-intelligence-CBZujG1I.mjs.map +0 -1
- package/lib/main-_HtiLIhS.mjs.map +0 -1
- package/lib/material-viewer-BCjg687R.mjs.map +0 -1
- package/lib/packages-BhrPUb9k.mjs +0 -4
- package/lib/planner-CDJtTG3g.mjs +0 -2
- package/lib/roomle-renderer-DVlJsHYn.mjs.map +0 -1
- package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs +0 -217
- package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs.map +0 -1
- package/lib/scene-renderer-BHZrQYAH.mjs.map +0 -1
- package/lib/three.webgpu-Bnp8Whu8.mjs +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-renderer-Dm1kij1z.mjs","names":[],"sources":["../../packages/common-core/src/webgl/renderer/shader-utility.ts","../../../../node_modules/three/examples/jsm/postprocessing/Pass.js","../../../../node_modules/three/examples/jsm/math/SimplexNoise.js","../../packages/common-core/src/webgl/renderer/render-utility.ts","../../packages/common-core/src/webgl/renderer/objects/shadow-ground-plane.ts","../../packages/common-core/src/webgl/renderer/pass/render-pass.ts","../../packages/common-core/src/webgl/renderer/pass/pass-utility.ts","../../packages/common-core/src/webgl/renderer/shaders/ao-shader.ts","../../packages/common-core/src/webgl/renderer/pass/ao-pass.ts","../../packages/common-core/src/webgl/renderer/materials/blend-ao-and-shadow-material.ts","../../packages/common-core/src/webgl/renderer/shaders/poisson-denoise-shader.ts","../../packages/common-core/src/webgl/renderer/pass/poisson-denoise-pass.ts","../../packages/common-core/src/webgl/renderer/pass/shadow-and-ao-pass.ts","../../packages/common-core/src/webgl/renderer/outline-renderer.ts","../../packages/common-core/src/webgl/renderer/shading-settings.ts","../../packages/common-core/src/webgl/renderer/render-cache.ts","../../packages/common-core/src/webgl/renderer/pass/baked-ground-contact-shadow-pass.ts","../../packages/common-core/src/webgl/renderer/materials/normal-depth-material.ts","../../packages/common-core/src/webgl/renderer/pass/gbuffer-render-pass.ts","../../packages/common-core/src/webgl/renderer/pass/ground-reflection-pass.ts","../../../../node_modules/three/examples/jsm/helpers/RectAreaLightHelper.js","../../packages/common-core/src/webgl/renderer/materials/illumination-buffer-material.ts","../../packages/common-core/src/webgl/renderer/pass/screen-space-shadow-map-pass.ts","../../../../node_modules/three/examples/jsm/shaders/CopyShader.js","../../../../node_modules/three/examples/jsm/shaders/FXAAShader.js","../../packages/common-core/src/webgl/renderer/pass/outline-pass.ts","../../packages/common-core/src/webgl/renderer/materials/blend-ao-pass-depth-material.ts","../../packages/common-core/src/webgl/renderer/light-source-detection.ts","../../packages/common-core/src/webgl/renderer/pass/debug-pass.ts","../../packages/common-core/src/webgl/renderer/pass/scene-render-pass.ts","../../packages/common-core/src/webgl/renderer/materials/postprocessing-material-plugin.ts","../../../../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../../../../node_modules/three/examples/jsm/postprocessing/LUTPass.js","../../../../node_modules/three/examples/jsm/loaders/LUTCubeLoader.js","../../../../node_modules/three/examples/jsm/loaders/LUTImageLoader.js","../../../../node_modules/three/examples/jsm/loaders/LUT3dlLoader.js","../../../../node_modules/three/examples/jsm/shaders/OutputShader.js","../../../../node_modules/three/examples/jsm/postprocessing/OutputPass.js","../../packages/common-core/src/webgl/renderer/render-pass-manager.ts","../../packages/common-core/src/webgl/renderer/scene-renderer.ts"],"sourcesContent":["import type { Enumify } from '#/common/src/utils/types';\nimport type {\n Blending,\n BlendingDstFactor,\n BlendingEquation,\n BlendingSrcFactor,\n OrthographicCamera,\n PerspectiveCamera,\n Texture,\n} from 'three';\nimport {\n AddEquation,\n DstAlphaFactor,\n DstColorFactor,\n Matrix3,\n Matrix4,\n NoBlending,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n Vector4,\n ZeroFactor,\n} from 'three';\n\nconst CopyTransformShader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n colorTransform: { value: new Matrix4() },\n colorBase: { value: new Vector4(0, 0, 0, 0) },\n multiplyChannels: { value: 0 },\n uvTransform: { value: new Matrix3() },\n },\n vertexShader: `\n varying vec2 vUv;\n uniform mat3 uvTransform;\n\n void main() {\n vUv = (uvTransform * vec3(uv, 1.0)).xy;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform mat4 colorTransform;\n uniform vec4 colorBase;\n uniform float multiplyChannels;\n varying vec2 vUv;\n\n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n #if PREMULTIPLIED_ALPHA == 1\n if (color.a > 0.0) color.rgb /= color.a;\n #endif\n color = colorTransform * color + colorBase;\n color.rgb = mix(color.rgb, vec3(color.r * color.g * color.b), multiplyChannels);\n #if LINEAR_TO_SRGB == 1\n color.rgb = mix(color.rgb * 12.92, 1.055 * pow(color.rgb, vec3(0.41666)) - 0.055, step(0.0031308, color.rgb));\n #endif\n gl_FragColor = color;\n }`,\n};\n\nexport const DEFAULT_TRANSFORM: Matrix4 = new Matrix4();\n// prettier-ignore\nexport const RGB_TRANSFORM: Matrix4 = new Matrix4().set(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 0\n);\n// prettier-ignore\nexport const ALPHA_TRANSFORM: Matrix4 = new Matrix4().set(\n 0, 0, 0, 1,\n 0, 0, 0, 1,\n 0, 0, 0, 1,\n 0, 0, 0, 0\n);\n// prettier-ignore\nexport const RED_TRANSFORM: Matrix4 = new Matrix4().set(\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 0, 0, 0, 1\n);\n// prettier-ignore\nexport const BLUE_TRANSFORM: Matrix4 = new Matrix4().set(\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 0, 1\n);\n// prettier-ignore\nexport const GREEN_TRANSFORM: Matrix4 = new Matrix4().set(\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n);\n// prettier-ignore\nexport const GRAYSCALE_TRANSFORM: Matrix4 = new Matrix4().set(\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 1, 0, 0, 0,\n 0, 0, 0, 1\n);\nexport const ZERO_RGBA: Vector4 = new Vector4(0, 0, 0, 0);\nexport const ALPHA_RGBA: Vector4 = new Vector4(0, 0, 0, 1);\nexport const DEFAULT_UV_TRANSFORM: Matrix3 = new Matrix3();\n// prettier-ignore\nexport const FLIP_Y_UV_TRANSFORM: Matrix3 = new Matrix3().set(\n 1, 0, 0,\n 0, -1, 1,\n 0, 0, 1\n);\n\n// prettier-ignore\nexport const interpolationMatrix = (r: number, g: number, b: number, a: number): Matrix4 => {\n // prettier-ignore\n return new Matrix4().set(\n r, 0, 0, 1 - r,\n 0, g, 0, 1 - g,\n 0, 0, b, 1 - b,\n 0, 0, 0, a\n );\n};\n\nexport const COLOR_COPY_BLEND_MODES = {\n DEFAULT: 'default',\n ADDITIVE: 'additive',\n} as const;\n\nexport type CopyMaterialBlendMode = Enumify<typeof COLOR_COPY_BLEND_MODES>;\n\nexport interface CopyTransformMaterialParameters {\n texture?: Texture | null;\n colorTransform?: Matrix4;\n colorBase?: Vector4;\n multiplyChannels?: number;\n uvTransform?: Matrix3;\n blending?: Blending;\n blendSrc?: BlendingSrcFactor | BlendingDstFactor;\n blendDst?: BlendingDstFactor;\n blendEquation?: BlendingEquation;\n blendSrcAlpha?: BlendingSrcFactor;\n blendDstAlpha?: BlendingDstFactor;\n blendEquationAlpha?: BlendingEquation;\n}\n\nexport class CopyTransformMaterial extends ShaderMaterial {\n constructor(\n parameters?: CopyTransformMaterialParameters,\n copyBlendMode: CopyMaterialBlendMode = COLOR_COPY_BLEND_MODES.ADDITIVE,\n linearToSrgb: boolean = false,\n premultipliedALpha: boolean = false,\n ) {\n const blendingParameters =\n copyBlendMode === COLOR_COPY_BLEND_MODES.ADDITIVE\n ? {\n blendSrc: DstColorFactor,\n blendDst: ZeroFactor,\n blendEquation: AddEquation,\n blendSrcAlpha: DstAlphaFactor,\n blendDstAlpha: ZeroFactor,\n blendEquationAlpha: AddEquation,\n }\n : {};\n super({\n uniforms: UniformsUtils.clone(CopyTransformShader.uniforms),\n vertexShader: CopyTransformShader.vertexShader,\n fragmentShader: CopyTransformShader.fragmentShader,\n defines: {\n LINEAR_TO_SRGB: linearToSrgb ? 1 : 0,\n PREMULTIPLIED_ALPHA: premultipliedALpha ? 1 : 0,\n },\n transparent: true,\n depthTest: false,\n depthWrite: false,\n ...blendingParameters,\n });\n this.update(parameters);\n }\n\n public update(\n parameters?: CopyTransformMaterialParameters,\n ): CopyTransformMaterial {\n if (parameters?.texture !== undefined) {\n this.uniforms.tDiffuse.value = parameters?.texture;\n }\n if (parameters?.colorTransform !== undefined) {\n this.uniforms.colorTransform.value = parameters?.colorTransform;\n }\n if (parameters?.colorBase !== undefined) {\n this.uniforms.colorBase.value = parameters?.colorBase;\n }\n if (parameters?.multiplyChannels !== undefined) {\n this.uniforms.multiplyChannels.value = parameters?.multiplyChannels;\n }\n if (parameters?.uvTransform !== undefined) {\n this.uniforms.uvTransform.value = parameters?.uvTransform;\n }\n if (parameters?.blending !== undefined) {\n this.blending = parameters?.blending;\n }\n if (parameters?.blendSrc !== undefined) {\n this.blendSrc = parameters?.blendSrc;\n }\n if (parameters?.blendDst !== undefined) {\n this.blendDst = parameters?.blendDst;\n }\n if (parameters?.blendEquation !== undefined) {\n this.blendEquation = parameters?.blendEquation;\n }\n if (parameters?.blendSrcAlpha !== undefined) {\n this.blendSrcAlpha = parameters?.blendSrcAlpha;\n }\n if (parameters?.blendDstAlpha !== undefined) {\n this.blendDstAlpha = parameters?.blendDstAlpha;\n }\n if (parameters?.blendEquationAlpha !== undefined) {\n this.blendEquationAlpha = parameters?.blendEquationAlpha;\n }\n return this;\n }\n}\n\nexport const BlurShader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n rangeMin: { value: new Vector2(1.0 / 512.0, 1.0 / 512.0) },\n rangeMax: { value: new Vector2(1.0 / 512.0, 1.0 / 512.0) },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform vec2 rangeMin;\n uniform vec2 rangeMax;\n varying vec2 vUv;\n\n void main() {\n vec4 baseColor = texture2D(tDiffuse, vUv);\n vec2 blur = mix(rangeMax, rangeMin, baseColor.a);\n vec4 sum = vec4( 0.0 );\n sum += texture2D(tDiffuse, vUv - 1.0 * blur) * 0.051;\n sum += texture2D(tDiffuse, vUv - 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv - 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv - 0.25 * blur) * 0.1531;\n sum += baseColor * 0.1633;\n sum += texture2D(tDiffuse, vUv + 0.25 * blur) * 0.1531;\n sum += texture2D(tDiffuse, vUv + 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv + 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv + 1.0 * blur) * 0.051;\n gl_FragColor = sum;\n }`,\n};\n\nexport const MixShadowShader = {\n uniforms: {\n tShadow1: { value: null as Texture | null },\n tShadow2: { value: null as Texture | null },\n shadowScale1: { value: 0.5 },\n shadowScale2: { value: 0.5 },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`,\n fragmentShader: `\n uniform sampler2D tShadow1;\n uniform sampler2D tShadow2;\n uniform float shadowScale1;\n uniform float shadowScale2;\n varying vec2 vUv;\n\n void main() {\n vec4 color1 = texture2D(tShadow1, vUv);\n vec4 color2 = texture2D(tShadow2, vUv);\n gl_FragColor = color1 * shadowScale1 + color2 * shadowScale2;\n }`,\n};\n\nexport const HorizontalBlurShadowShader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n blur: { value: 1.0 / 512.0 },\n shadowRange: { value: new Vector2(0.1, 0.9) },\n },\n defines: {\n DEBUG_BLUR_AREA: 0,\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float blur;\n uniform vec2 shadowRange;\n varying vec2 vUv;\n\n void main() {\n vec4 baseColor = texture2D(tDiffuse, vUv);\n float h = blur * step(shadowRange.x, baseColor.r) * step(baseColor.r, shadowRange.y);\n vec4 sum = vec4(0.0);\n sum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\n sum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\n sum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\n sum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\n sum += baseColor * 0.1633;\n sum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\n sum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\n sum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\n sum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\n #if DEBUG_BLUR_AREA == 1\n gl_FragColor = h > 0.001 ? vec4(sum.r, 0.0, 0.0, 1.0) : sum;\n #else\n gl_FragColor = min(sum, baseColor);\n #endif\n }`,\n};\n\nexport const VerticalBlurShadowShader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n blur: { value: 1.0 / 512.0 },\n shadowRange: { value: new Vector2(0.1, 0.9) },\n },\n defines: {\n DEBUG_BLUR_AREA: 0,\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float blur;\n uniform vec2 shadowRange;\n varying vec2 vUv;\n\n void main() {\n vec4 baseColor = texture2D(tDiffuse, vUv);\n float v = blur * step(shadowRange.x, baseColor.r) * step(baseColor.r, shadowRange.y);\n vec4 sum = vec4(0.0);\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\n sum += baseColor * 0.1633;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\n sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\n #if DEBUG_BLUR_AREA == 1\n gl_FragColor = v > 0.001 ? vec4(sum.r, 0.0, 0.0, 1.0) : sum;\n #else\n gl_FragColor = min(sum, baseColor);\n #endif\n }`,\n};\n\nconst glslLinearDepthVertexShader = `varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }`;\n\nconst glslLinearDepthFragmentShader = `uniform sampler2D tDepth;\n uniform vec4 depthFilter;\n uniform float cameraNear;\n uniform float cameraFar;\n varying vec2 vUv;\n\n #include <packing>\n\n float getLinearDepth(const in vec2 screenPosition) {\n float fragCoordZ = dot(texture2D(tDepth, screenPosition), depthFilter);\n #if PERSPECTIVE_CAMERA == 1\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return fragCoordZ;\n #endif\n }\n\n void main() {\n float depth = getLinearDepth(vUv);\n gl_FragColor = vec4(vec3(1.0 - depth), 1.0);\n }`;\n\nexport class LinearDepthRenderMaterial extends ShaderMaterial {\n private static _linearDepthShader: any = {\n uniforms: {\n tDepth: { value: null as Texture | null },\n depthFilter: { value: new Vector4(1, 0, 0, 0) },\n cameraNear: { value: 0.1 },\n cameraFar: { value: 1 },\n },\n defines: {\n PERSPECTIVE_CAMERA: 1,\n ALPHA_DEPTH: 0,\n },\n vertexShader: glslLinearDepthVertexShader,\n fragmentShader: glslLinearDepthFragmentShader,\n };\n\n constructor(parameters: Record<string, any>) {\n super({\n defines: Object.assign(\n {},\n LinearDepthRenderMaterial._linearDepthShader.defines,\n ),\n uniforms: UniformsUtils.clone(\n LinearDepthRenderMaterial._linearDepthShader.uniforms,\n ),\n vertexShader: LinearDepthRenderMaterial._linearDepthShader.vertexShader,\n fragmentShader:\n LinearDepthRenderMaterial._linearDepthShader.fragmentShader,\n blending: NoBlending,\n });\n this.update(parameters);\n }\n\n public update(parameters?: Record<string, any>): LinearDepthRenderMaterial {\n if (parameters?.depthTexture !== undefined) {\n this.uniforms.tDepth.value = parameters?.depthTexture;\n }\n if (parameters?.camera !== undefined) {\n const camera =\n (parameters?.camera as OrthographicCamera) ||\n (parameters?.camera as PerspectiveCamera);\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n }\n if (parameters?.depthFilter !== undefined) {\n this.uniforms.depthFilter.value = parameters?.depthFilter;\n }\n return this;\n }\n}\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\n/**\n * Abstract base class for all post processing passes.\n *\n * This module is only relevant for post processing with {@link WebGLRenderer}.\n *\n * @abstract\n * @three_import import { Pass } from 'three/addons/postprocessing/Pass.js';\n */\nclass Pass {\n\n\t/**\n\t * Constructs a new pass.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPass = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass is processed by the composer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass indicates to swap read and write buffer after rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsSwap = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass clears its buffer before rendering\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clear = false;\n\n\t\t/**\n\t\t * If set to `true`, the result of the pass is rendered to screen. The last pass in the composers\n\t\t * pass chain gets automatically rendered to screen, no matter how this property is configured.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @abstract\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( /* width, height */ ) {}\n\n\t/**\n\t * This method holds the render logic of a pass. It must be implemented in all derived classes.\n\t *\n\t * @abstract\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t *\n\t * @abstract\n\t */\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\n\n/**\n * This module is a helper for passes which need to render a full\n * screen effect which is quite common in context of post processing.\n *\n * The intended usage is to reuse a single full screen quad for rendering\n * subsequent passes by just reassigning the `material` reference.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * @augments Mesh\n * @three_import import { FullScreenQuad } from 'three/addons/postprocessing/Pass.js';\n */\nclass FullScreenQuad {\n\n\t/**\n\t * Constructs a new full screen quad.\n\t *\n\t * @param {?Material} material - The material to render te full screen quad with.\n\t */\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\t/**\n\t * Renders the full screen quad.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\t/**\n\t * The quad's material.\n\t *\n\t * @type {?Material}\n\t */\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","/**\n * A utility class providing noise functions.\n *\n * The code is based on [Simplex noise demystified](https://web.archive.org/web/20210210162332/http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf)\n * by Stefan Gustavson, 2005.\n *\n * @three_import import { SimplexNoise } from 'three/addons/math/SimplexNoise.js';\n */\nclass SimplexNoise {\n\n\t/**\n\t * Constructs a new simplex noise object.\n\t *\n\t * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n\t * possible to pass in custom random number generator.\n\t */\n\tconstructor( r = Math ) {\n\n\t\tthis.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],\n\t\t\t[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],\n\t\t\t[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];\n\n\t\tthis.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],\n\t\t\t[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],\n\t\t\t[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],\n\t\t\t[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],\n\t\t\t[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],\n\t\t\t[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],\n\t\t\t[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],\n\t\t\t[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];\n\n\t\tthis.p = [];\n\n\t\tfor ( let i = 0; i < 256; i ++ ) {\n\n\t\t\tthis.p[ i ] = Math.floor( r.random() * 256 );\n\n\t\t}\n\n\t\t// To remove the need for index wrapping, double the permutation table length\n\t\tthis.perm = [];\n\n\t\tfor ( let i = 0; i < 512; i ++ ) {\n\n\t\t\tthis.perm[ i ] = this.p[ i & 255 ];\n\n\t\t}\n\n\t\t// A lookup table to traverse the simplex around a given point in 4D.\n\t\t// Details can be found where this table is used, in the 4D noise method.\n\t\tthis.simplex = [\n\t\t\t[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],\n\t\t\t[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],\n\t\t\t[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],\n\t\t\t[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];\n\n\t}\n\n\t/**\n\t * A 2D simplex noise method.\n\t *\n\t * @param {number} xin - The x coordinate.\n\t * @param {number} yin - The y coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise( xin, yin ) {\n\n\t\tlet n0; // Noise contributions from the three corners\n\t\tlet n1;\n\t\tlet n2;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );\n\t\tconst s = ( xin + yin ) * F2; // Hairy factor for 2D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;\n\t\tconst t = ( i + j ) * G2;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y) space\n\t\tconst Y0 = j - t;\n\t\tconst x0 = xin - X0; // The x,y distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\n\t\t// For the 2D case, the simplex shape is an equilateral triangle.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second (middle) corner of simplex in (i,j) coords\n\n\t\tlet j1;\n\t\tif ( x0 > y0 ) {\n\n\t\t\ti1 = 1; j1 = 0;\n\n\t\t\t// lower triangle, XY order: (0,0)->(1,0)->(1,1)\n\n\t\t}\telse {\n\n\t\t\ti1 = 0; j1 = 1;\n\n\t\t} // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n\t\t// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n\t\t// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n\t\t// c = (3-sqrt(3))/6\n\t\tconst x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n\t\tconst y1 = y0 - j1 + G2;\n\t\tconst x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n\t\tconst y2 = y0 - 1.0 + 2.0 * G2;\n\t\t// Work out the hashed gradient indices of the three simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;\n\t\t// Calculate the contribution from the three corners\n\t\tlet t0 = 0.5 - x0 * x0 - y0 * y0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient\n\n\t\t}\n\n\t\tlet t1 = 0.5 - x1 * x1 - y1 * y1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot( this.grad3[ gi1 ], x1, y1 );\n\n\t\t}\n\n\t\tlet t2 = 0.5 - x2 * x2 - y2 * y2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot( this.grad3[ gi2 ], x2, y2 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to return values in the interval [-1,1].\n\t\treturn 70.0 * ( n0 + n1 + n2 );\n\n\t}\n\n\t/**\n\t * A 3D simplex noise method.\n\t *\n\t * @param {number} xin - The x coordinate.\n\t * @param {number} yin - The y coordinate.\n\t * @param {number} zin - The z coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise3d( xin, yin, zin ) {\n\n\t\tlet n0; // Noise contributions from the four corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F3 = 1.0 / 3.0;\n\t\tconst s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst k = Math.floor( zin + s );\n\t\tconst G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too\n\t\tconst t = ( i + j + k ) * G3;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst x0 = xin - X0; // The x,y,z distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\t\tconst z0 = zin - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second corner of simplex in (i,j,k) coords\n\n\t\tlet j1;\n\t\tlet k1;\n\t\tlet i2; // Offsets for third corner of simplex in (i,j,k) coords\n\t\tlet j2;\n\t\tlet k2;\n\t\tif ( x0 >= y0 ) {\n\n\t\t\tif ( y0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t\t// X Y Z order\n\n\t\t\t} else if ( x0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t\t// X Z Y order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t} // Z X Y order\n\n\t\t} else { // x0<y0\n\n\t\t\tif ( y0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Z Y X order\n\n\t\t\t} else if ( x0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Y Z X order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t} // Y X Z order\n\n\t\t}\n\n\t\t// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n\t\t// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n\t\t// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n\t\t// c = 1/6.\n\t\tconst x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n\t\tconst y1 = y0 - j1 + G3;\n\t\tconst z1 = z0 - k1 + G3;\n\t\tconst x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G3;\n\t\tconst z2 = z0 - k2 + 2.0 * G3;\n\t\tconst x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n\t\tconst y3 = y0 - 1.0 + 3.0 * G3;\n\t\tconst z3 = z0 - 1.0 + 3.0 * G3;\n\t\t// Work out the hashed gradient indices of the four simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;\n\t\tconst gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12;\n\t\t// Calculate the contribution from the four corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot3( this.grad3[ gi0 ], x0, y0, z0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot3( this.grad3[ gi1 ], x1, y1, z1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot3( this.grad3[ gi2 ], x2, y2, z2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this._dot3( this.grad3[ gi3 ], x3, y3, z3 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to stay just inside [-1,1]\n\t\treturn 32.0 * ( n0 + n1 + n2 + n3 );\n\n\t}\n\n\t/**\n\t * A 4D simplex noise method.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @param {number} z - The z coordinate.\n\t * @param {number} w - The w coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise4d( x, y, z, w ) {\n\n\t\t// For faster and easier lookups\n\t\tconst grad4 = this.grad4;\n\t\tconst simplex = this.simplex;\n\t\tconst perm = this.perm;\n\n\t\t// The skewing and unskewing factors are hairy again for the 4D case\n\t\tconst F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;\n\t\tconst G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;\n\t\tlet n0; // Noise contributions from the five corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\tlet n4;\n\t\t// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n\t\tconst s = ( x + y + z + w ) * F4; // Factor for 4D skewing\n\t\tconst i = Math.floor( x + s );\n\t\tconst j = Math.floor( y + s );\n\t\tconst k = Math.floor( z + s );\n\t\tconst l = Math.floor( w + s );\n\t\tconst t = ( i + j + k + l ) * G4; // Factor for 4D unskewing\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst W0 = l - t;\n\t\tconst x0 = x - X0; // The x,y,z,w distances from the cell origin\n\t\tconst y0 = y - Y0;\n\t\tconst z0 = z - Z0;\n\t\tconst w0 = w - W0;\n\n\t\t// For the 4D case, the simplex is a 4D shape I won't even try to describe.\n\t\t// To find out which of the 24 possible simplices we're in, we need to\n\t\t// determine the magnitude ordering of x0, y0, z0 and w0.\n\t\t// The method below is a good way of finding the ordering of x,y,z,w and\n\t\t// then find the correct traversal order for the simplex we’re in.\n\t\t// First, six pair-wise comparisons are performed between each possible pair\n\t\t// of the four coordinates, and the results are used to add up binary bits\n\t\t// for an integer index.\n\t\tconst c1 = ( x0 > y0 ) ? 32 : 0;\n\t\tconst c2 = ( x0 > z0 ) ? 16 : 0;\n\t\tconst c3 = ( y0 > z0 ) ? 8 : 0;\n\t\tconst c4 = ( x0 > w0 ) ? 4 : 0;\n\t\tconst c5 = ( y0 > w0 ) ? 2 : 0;\n\t\tconst c6 = ( z0 > w0 ) ? 1 : 0;\n\t\tconst c = c1 + c2 + c3 + c4 + c5 + c6;\n\n\t\t// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n\t\t// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n\t\t// impossible. Only the 24 indices which have non-zero entries make any sense.\n\t\t// We use a thresholding to set the coordinates in turn from the largest magnitude.\n\t\t// The number 3 in the \"simplex\" array is at the position of the largest coordinate.\n\t\tconst i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;\n\t\tconst j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;\n\t\tconst k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;\n\t\tconst l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;\n\t\t// The number 2 in the \"simplex\" array is at the second largest coordinate.\n\t\tconst i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;\n\t\tconst j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;\n\t\tconst k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;\n\t\tconst l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;\n\t\t// The number 1 in the \"simplex\" array is at the second smallest coordinate.\n\t\tconst i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;\n\t\tconst j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;\n\t\tconst k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;\n\t\tconst l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;\n\t\t// The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\t\tconst x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n\t\tconst y1 = y0 - j1 + G4;\n\t\tconst z1 = z0 - k1 + G4;\n\t\tconst w1 = w0 - l1 + G4;\n\t\tconst x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G4;\n\t\tconst z2 = z0 - k2 + 2.0 * G4;\n\t\tconst w2 = w0 - l2 + 2.0 * G4;\n\t\tconst x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n\t\tconst y3 = y0 - j3 + 3.0 * G4;\n\t\tconst z3 = z0 - k3 + 3.0 * G4;\n\t\tconst w3 = w0 - l3 + 3.0 * G4;\n\t\tconst x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n\t\tconst y4 = y0 - 1.0 + 4.0 * G4;\n\t\tconst z4 = z0 - 1.0 + 4.0 * G4;\n\t\tconst w4 = w0 - 1.0 + 4.0 * G4;\n\t\t// Work out the hashed gradient indices of the five simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst ll = l & 255;\n\t\tconst gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;\n\t\tconst gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;\n\t\tconst gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;\n\t\tconst gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;\n\t\tconst gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;\n\t\t// Calculate the contribution from the five corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot4( grad4[ gi0 ], x0, y0, z0, w0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot4( grad4[ gi1 ], x1, y1, z1, w1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot4( grad4[ gi2 ], x2, y2, z2, w2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this._dot4( grad4[ gi3 ], x3, y3, z3, w3 );\n\n\t\t}\n\n\t\tlet t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n\t\tif ( t4 < 0 ) n4 = 0.0;\n\t\telse {\n\n\t\t\tt4 *= t4;\n\t\t\tn4 = t4 * t4 * this._dot4( grad4[ gi4 ], x4, y4, z4, w4 );\n\n\t\t}\n\n\t\t// Sum up and scale the result to cover the range [-1,1]\n\t\treturn 27.0 * ( n0 + n1 + n2 + n3 + n4 );\n\n\t}\n\n\t// private\n\n\t_dot( g, x, y ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y;\n\n\t}\n\n\t_dot3( g, x, y, z ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;\n\n\t}\n\n\t_dot4( g, x, y, z, w ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;\n\n\t}\n\n}\n\nexport { SimplexNoise };\n","import { BlurShader } from './shader-utility';\nimport type {\n Camera,\n ColorRepresentation,\n Material,\n Matrix4,\n ShaderMaterialParameters,\n Texture,\n WebGLRenderer,\n WebGLRenderTarget,\n} from 'three';\nimport {\n Box3,\n Color,\n DataTexture,\n MathUtils,\n OrthographicCamera,\n PerspectiveCamera,\n RepeatWrapping,\n Scene,\n ShaderMaterial,\n Vector3,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise.js';\n\nexport const setOrthographicViewVolumeFromBox = (\n camera: OrthographicCamera,\n viewBox: Box3,\n): void => {\n camera.left = viewBox.min.x;\n camera.right = viewBox.max.x;\n camera.bottom = viewBox.min.y;\n camera.top = viewBox.max.y;\n camera.near = Math.min(-viewBox.min.z, -viewBox.max.z);\n camera.far = Math.max(-viewBox.min.z, -viewBox.max.z);\n camera.updateProjectionMatrix();\n};\n\nexport const setPerspectiveViewVolumeFromBox = (\n camera: PerspectiveCamera,\n viewBox: Box3,\n): void => {\n const near = Math.min(-viewBox.min.z, -viewBox.max.z);\n const far = Math.max(-viewBox.min.z, -viewBox.max.z);\n if (near < 0.001) {\n return;\n }\n const halfWidth = Math.max(Math.abs(viewBox.min.x), Math.abs(viewBox.max.x));\n const halfHeight = Math.max(Math.abs(viewBox.min.y), Math.abs(viewBox.max.y));\n camera.aspect = halfWidth / halfHeight;\n camera.fov = MathUtils.radToDeg(Math.atan2(halfHeight, near) * 2);\n camera.near = near;\n camera.far = far;\n camera.updateProjectionMatrix();\n};\n\nexport class SceneVolume {\n public bounds: Box3 = new Box3(new Vector3(-1, -1, -1), new Vector3(1, 1, 1));\n public size: Vector3 = new Vector3(2, 2, 2);\n public center: Vector3 = new Vector3(0, 0, 0);\n public maxSceneDistanceFromCenter: number = Math.sqrt(3);\n public maxSceneDistanceFrom0: number = Math.sqrt(3);\n\n public updateFromBox(boundingBox: Box3): void {\n if (this.bounds !== boundingBox) {\n this.bounds.copy(boundingBox);\n }\n this.bounds.getSize(this.size);\n this.bounds.getCenter(this.center);\n this.maxSceneDistanceFromCenter = this.size.length() / 2;\n this.maxSceneDistanceFrom0 = new Vector3(\n Math.max(Math.abs(this.bounds.min.x), Math.abs(this.bounds.max.x)),\n Math.max(Math.abs(this.bounds.min.y), Math.abs(this.bounds.max.y)),\n Math.max(Math.abs(this.bounds.min.z), Math.abs(this.bounds.max.z)),\n ).length();\n }\n\n public updateCameraViewVolumeFromBounds(camera: Camera): void {\n camera.updateMatrixWorld();\n const cameraViewBounds = this.bounds\n .clone()\n .applyMatrix4(camera.matrixWorldInverse);\n if (camera instanceof OrthographicCamera) {\n setOrthographicViewVolumeFromBox(camera, cameraViewBounds);\n } else if (camera instanceof PerspectiveCamera) {\n setPerspectiveViewVolumeFromBox(camera, cameraViewBounds);\n }\n }\n\n public getNearAndFarForPerspectiveCamera(\n cameraPosition: Vector3,\n backScale: number = 1,\n ): number[] {\n const distanceFromCenter = cameraPosition.clone().sub(this.center).length();\n const near = Math.max(\n 0.01,\n distanceFromCenter - this.maxSceneDistanceFromCenter - 0.01,\n );\n const far =\n distanceFromCenter + this.maxSceneDistanceFromCenter * backScale + 0.01;\n return [near, far];\n }\n}\n\nexport class CameraUpdate {\n private _lastCameraProjection: Matrix4 | undefined;\n private _lastCameraWorld: Matrix4 | undefined;\n\n public changed(camera: Camera): boolean {\n const hasChanged =\n !this._lastCameraProjection?.equals(camera.projectionMatrix) ||\n !this._lastCameraWorld?.equals(camera.matrixWorld);\n this._lastCameraProjection = camera.projectionMatrix?.clone();\n this._lastCameraWorld = camera.matrixWorld?.clone();\n return hasChanged;\n }\n}\n\nexport const generateMagicSquare = (size: number): number[] => {\n const noiseSize =\n Math.floor(size) % 2 === 0 ? Math.floor(size) + 1 : Math.floor(size);\n const noiseSquareSize = noiseSize * noiseSize;\n const magicSquare = Array(noiseSquareSize).fill(0);\n let i = Math.floor(noiseSize / 2);\n let j = noiseSize - 1;\n for (let num = 1; num <= noiseSquareSize; ) {\n if (i === -1 && j === noiseSize) {\n j = noiseSize - 2;\n i = 0;\n } else {\n if (j === noiseSize) {\n j = 0;\n }\n if (i < 0) {\n i = noiseSize - 1;\n }\n }\n if (magicSquare[i * noiseSize + j] !== 0) {\n j -= 2;\n i++;\n continue;\n } else {\n magicSquare[i * noiseSize + j] = num++;\n }\n j++;\n i--;\n }\n return magicSquare;\n};\n\nexport const generateMagicSquareDistributedKernelRotations = (\n size: number,\n): DataTexture => {\n const simplex = new SimplexNoise();\n const noiseSize =\n Math.floor(size) % 2 === 0 ? Math.floor(size) + 1 : Math.floor(size);\n const magicSquare = generateMagicSquare(noiseSize);\n const noiseSquareSize = magicSquare.length;\n const data = new Uint8Array(noiseSquareSize * 4);\n for (let inx = 0; inx < noiseSquareSize; ++inx) {\n const iAng = magicSquare[inx];\n const angle = (2 * Math.PI * iAng) / noiseSquareSize;\n const randomVec = new Vector3(\n Math.cos(angle),\n Math.sin(angle),\n 0,\n ).normalize();\n data[inx * 4] = (randomVec.x * 0.5 + 0.5) * 255;\n data[inx * 4 + 1] = (randomVec.y * 0.5 + 0.5) * 255;\n data[inx * 4 + 2] = 127;\n data[inx * 4 + 3] =\n (simplex.noise(inx / size, inx % size) * 0.5 + 0.5) * 255;\n }\n const noiseTexture = new DataTexture(data, noiseSize, noiseSize);\n noiseTexture.wrapS = RepeatWrapping;\n noiseTexture.wrapT = RepeatWrapping;\n noiseTexture.needsUpdate = true;\n return noiseTexture;\n};\n\nexport class PassRenderer {\n private _originalClearColor = new Color();\n private _originalClearAlpha: number = 0;\n private _originalAutoClear: boolean = false;\n private _originalRenderTarget: WebGLRenderTarget | null = null;\n private _screenSpaceQuad = new FullScreenQuad(undefined);\n private _emptyScene = new Scene();\n private _defaultCamera = new PerspectiveCamera();\n\n public renderWithOverrideMaterial(\n renderer: WebGLRenderer | WebGPURenderer,\n scene: Scene,\n camera: Camera,\n overrideMaterial: Material | null,\n renderTarget: WebGLRenderTarget | null,\n clearColor?: ColorRepresentation,\n clearAlpha?: number,\n ): void {\n this._backup(renderer as WebGLRenderer);\n this._prepareRenderer(\n renderer as WebGLRenderer,\n renderTarget,\n clearColor,\n clearAlpha,\n );\n const originalOverrideMaterial = scene.overrideMaterial;\n scene.overrideMaterial = overrideMaterial;\n renderer.render(scene, camera);\n scene.overrideMaterial = originalOverrideMaterial;\n this._restore(renderer as WebGLRenderer);\n }\n\n public clear(\n renderer: WebGLRenderer | WebGPURenderer,\n renderTarget: WebGLRenderTarget | null,\n clearColor?: ColorRepresentation,\n clearAlpha?: number,\n ): void {\n this._backup(renderer as WebGLRenderer);\n this._prepareRenderer(\n renderer as WebGLRenderer,\n renderTarget,\n clearColor,\n clearAlpha,\n );\n renderer.render(this._emptyScene, this._defaultCamera);\n this._restore(renderer as WebGLRenderer);\n }\n\n public render(\n renderer: WebGLRenderer | WebGPURenderer,\n scene: Scene,\n camera: Camera,\n renderTarget: WebGLRenderTarget | null,\n clearColor?: ColorRepresentation,\n clearAlpha?: number,\n ): void {\n this._backup(renderer as WebGLRenderer);\n this._prepareRenderer(\n renderer as WebGLRenderer,\n renderTarget,\n clearColor,\n clearAlpha,\n );\n renderer.render(scene, camera);\n this._restore(renderer as WebGLRenderer);\n }\n\n public renderScreenSpace(\n renderer: WebGLRenderer | WebGPURenderer,\n passMaterial: Material,\n renderTarget: WebGLRenderTarget | null,\n clearColor?: ColorRepresentation,\n clearAlpha?: number,\n ): void {\n this._backup(renderer as WebGLRenderer);\n this._prepareRenderer(\n renderer as WebGLRenderer,\n renderTarget,\n clearColor,\n clearAlpha,\n );\n this._screenSpaceQuad.material = passMaterial;\n this._screenSpaceQuad.render(renderer as WebGLRenderer);\n this._restore(renderer as WebGLRenderer);\n }\n\n private _prepareRenderer(\n renderer: WebGLRenderer,\n renderTarget: WebGLRenderTarget | null,\n clearColor?: ColorRepresentation,\n clearAlpha?: number,\n ): void {\n renderer.setRenderTarget(renderTarget);\n renderer.autoClear = false;\n if (clearColor !== undefined && clearColor !== null) {\n renderer.setClearColor(clearColor);\n renderer.setClearAlpha(clearAlpha || 0.0);\n renderer.clear();\n }\n }\n\n private _backup(renderer: WebGLRenderer): void {\n renderer.getClearColor(this._originalClearColor);\n this._originalClearAlpha = renderer.getClearAlpha();\n this._originalAutoClear = renderer.autoClear;\n this._originalRenderTarget = renderer.getRenderTarget();\n }\n\n private _restore(renderer: WebGLRenderer): void {\n renderer.setClearColor(this._originalClearColor);\n renderer.setClearAlpha(this._originalClearAlpha);\n renderer.setRenderTarget(this._originalRenderTarget);\n renderer.autoClear = this._originalAutoClear;\n }\n}\n\nexport class BlurPass {\n private _passRenderer: PassRenderer;\n private _blurMaterial: ShaderMaterial;\n\n constructor(\n blurShaderParameters?: ShaderMaterialParameters,\n parameters?: { passRenderer?: PassRenderer },\n ) {\n this._passRenderer = parameters?.passRenderer ?? new PassRenderer();\n this._blurMaterial = new ShaderMaterial(blurShaderParameters ?? BlurShader);\n this._blurMaterial.depthTest = false;\n }\n\n public dispose() {\n this._blurMaterial.dispose();\n }\n\n public render(\n renderer: WebGLRenderer | WebGPURenderer,\n renderTargets: WebGLRenderTarget[],\n uvMin: number[],\n uvMax: number[],\n ) {\n this._blurMaterial.uniforms.tDiffuse.value = renderTargets[0].texture;\n this._blurMaterial.uniforms.rangeMin.value.x = uvMin[0];\n this._blurMaterial.uniforms.rangeMin.value.y = 0;\n this._blurMaterial.uniforms.rangeMax.value.x = uvMax[0];\n this._blurMaterial.uniforms.rangeMax.value.y = 0;\n this._passRenderer.renderScreenSpace(\n renderer as WebGLRenderer,\n this._blurMaterial,\n renderTargets[1],\n );\n this._blurMaterial.uniforms.tDiffuse.value = renderTargets[1].texture;\n this._blurMaterial.uniforms.rangeMin.value.x = 0;\n this._blurMaterial.uniforms.rangeMin.value.y = uvMin[1];\n this._blurMaterial.uniforms.rangeMax.value.x = 0;\n this._blurMaterial.uniforms.rangeMax.value.y = uvMax[1];\n this._passRenderer.renderScreenSpace(\n renderer as WebGLRenderer,\n this._blurMaterial,\n renderTargets[2],\n );\n }\n}\n\nexport interface DenoisePass {\n get texture(): Texture | null;\n set inputTexture(texture: Texture | null);\n dispose(): void;\n setSize(width: number, height: number): void;\n render(renderer: WebGLRenderer | WebGPURenderer, camera: Camera): void;\n}\n","import type { Texture } from 'three';\nimport { Mesh, MeshPhysicalMaterial, PlaneGeometry } from 'three';\n\nexport interface ShadowGroundPlaneParameters {\n opacity?: number;\n polygonOffset?: number;\n}\n\nexport class ShadowGroundPlane extends Mesh {\n public static alphaMap: boolean = true;\n\n constructor(\n shadowMap: Texture | null,\n parameters?: ShadowGroundPlaneParameters,\n ) {\n super(\n new PlaneGeometry(1, 1, 10, 10),\n new MeshPhysicalMaterial({\n color: ShadowGroundPlane.alphaMap ? 0x000000 : 0xffffff,\n transparent: true,\n depthWrite: false,\n //side: DoubleSide,\n polygonOffset: true,\n name: 'ShadowGroundPlaneMaterial',\n }),\n );\n this.name = 'ShadowGroundPlane';\n this.userData.isFloor = true;\n this.renderOrder = 1;\n this.receiveShadow = false;\n this.layers.disableAll();\n if (parameters) {\n this.updateMaterial(parameters);\n }\n this.setShadowMap(shadowMap);\n }\n\n public setVisibility(visible: boolean) {\n this.visible = visible;\n this.setVisibilityLayers(visible);\n }\n\n public setVisibilityLayers(visible: boolean) {\n if (visible) {\n this.layers.enableAll();\n } else {\n this.layers.disableAll();\n }\n }\n\n public setDepthWrite(write: boolean) {\n const shadowGroundMaterial = this.material as MeshPhysicalMaterial;\n shadowGroundMaterial.depthWrite = write;\n shadowGroundMaterial.transparent = !write;\n shadowGroundMaterial.needsUpdate = true;\n this.setVisibility(write);\n }\n\n public setReceiveShadow(receive: boolean) {\n this.receiveShadow = receive;\n this.setVisibility(receive);\n }\n\n public setShadowMap(shadowMap: Texture | null) {\n const shadowGroundMaterial = this.material as MeshPhysicalMaterial;\n if (ShadowGroundPlane.alphaMap) {\n shadowGroundMaterial.alphaMap = shadowMap;\n shadowGroundMaterial.map = null;\n shadowGroundMaterial.color.set(0x000000);\n } else {\n shadowGroundMaterial.alphaMap = null;\n shadowGroundMaterial.map = shadowMap;\n shadowGroundMaterial.color.set(0xffffff);\n }\n shadowGroundMaterial.needsUpdate = true;\n }\n\n public updateMaterial(parameters: ShadowGroundPlaneParameters) {\n const shadowGroundMaterial = this.material as MeshPhysicalMaterial;\n if (\n parameters.opacity &&\n shadowGroundMaterial.opacity !== parameters.opacity\n ) {\n shadowGroundMaterial.opacity = parameters.opacity;\n }\n if (\n parameters.polygonOffset &&\n shadowGroundMaterial.polygonOffsetFactor !== parameters.polygonOffset\n ) {\n shadowGroundMaterial.polygonOffset = true;\n shadowGroundMaterial.polygonOffsetFactor = parameters.polygonOffset;\n shadowGroundMaterial.polygonOffsetUnits = parameters.polygonOffset;\n }\n shadowGroundMaterial.needsUpdate = true;\n }\n}\n","import type { PassRenderer } from '../render-utility';\nimport type { RenderCacheManager } from '../render-cache';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport type { GBufferTextures } from './gbuffer-render-pass';\nimport type { Camera, Scene, WebGLRenderer, WebGLRenderTarget } from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport { Pass } from 'three/examples/jsm/postprocessing/Pass.js';\n\nexport abstract class RenderPass extends Pass {\n private _renderPassManager: RenderPassManager;\n\n protected get renderPassManager(): RenderPassManager {\n return this._renderPassManager;\n }\n\n protected get renderCacheManager(): RenderCacheManager {\n return this._renderPassManager.renderCacheManager;\n }\n\n protected get scene(): Scene {\n return this._renderPassManager.scene;\n }\n\n protected get camera(): Camera {\n return this._renderPassManager.camera;\n }\n\n protected get gBufferTextures(): GBufferTextures {\n return this._renderPassManager.gBufferRenderPass;\n }\n\n protected get passRenderer(): PassRenderer {\n return this._renderPassManager.passRenderer;\n }\n\n constructor(renderPassManager: RenderPassManager) {\n super();\n this._renderPassManager = renderPassManager;\n }\n\n public render(\n renderer: WebGLRenderer | WebGPURenderer,\n _writeBuffer: WebGLRenderTarget,\n _readBuffer: WebGLRenderTarget,\n _deltaTime: number,\n _maskActive: boolean,\n ): void {\n this.renderPass(renderer);\n }\n\n abstract renderPass(renderer: WebGLRenderer | WebGPURenderer): void;\n}\n","import type { Enumify } from '#/common/src/utils/types';\n\nexport const NORMAL_VECTOR_SOURCE_TYPES = {\n INPUT_RGB_NORMAL: 'inputRgbNormal',\n FLOAT_BUFFER_NORMAL: 'floatBufferNormal',\n CONSTANT_Z: 'constantZ',\n} as const;\n\nexport type NormalVectorSourceType = Enumify<typeof NORMAL_VECTOR_SOURCE_TYPES>;\n\nexport const DEPTH_VALUE_SOURCE_TYPES = {\n SEPARATE_BUFFER: 'separateBuffer',\n NORMAL_VECTOR_ALPHA: 'normalVectorAlpha',\n} as const;\n\nexport type DepthValueSourceType = Enumify<typeof DEPTH_VALUE_SOURCE_TYPES>;\n","import type { Enumify } from '#/common/src/utils/types';\nimport type { Texture } from 'three';\nimport { Matrix4, Vector2, Vector3, Vector4 } from 'three';\n\nexport const AO_ALGORITHMS = {\n SSAO: 0,\n SAO: 1,\n N8AO: 2,\n HBAO: 3,\n GTAO: 4,\n} as const;\n\nexport type AoAlgorithmType = Enumify<typeof AO_ALGORITHMS> | null;\n\nexport const generateAoSampleKernelInitializer = (\n samples: number,\n cosineWeighted: boolean,\n) => {\n const poissonDisk = generateAoSamples(samples, cosineWeighted);\n let glslCode = 'vec4[SAMPLES](';\n for (let i = 0; i < samples; i++) {\n const sample = poissonDisk[i];\n glslCode += `vec4(${sample.x}, ${sample.y}, ${sample.z}, ${sample.w})${\n i < samples - 1 ? ',' : ')'\n }`;\n }\n return glslCode;\n};\n\nconst generateAoSamples = (samples: number, cosineWeighted: boolean) => {\n // https://github.com/Rabbid76/research-sampling-hemisphere\n const kernel: Vector4[] = [];\n for (let sampleIndex = 0; sampleIndex < samples; sampleIndex++) {\n const spiralAngle = sampleIndex * Math.PI * (3 - Math.sqrt(5));\n const z = 0.01 + (sampleIndex / (samples - 1)) * 0.99;\n const radius = cosineWeighted ? Math.sqrt(1 - z * z) : 1 - z;\n const x = Math.cos(spiralAngle) * radius;\n const y = Math.sin(spiralAngle) * radius;\n const scaleStep = 4;\n const scaleRange = Math.floor(samples / scaleStep);\n const scaleIndex =\n Math.floor(sampleIndex / scaleStep) +\n (sampleIndex % scaleStep) * scaleRange;\n let scale = 1 - scaleIndex / samples;\n scale = 0.1 + 0.9 * scale;\n kernel.push(new Vector4(x, y, z, scale));\n }\n\n return kernel;\n};\n\nexport const AOShader = {\n name: 'AOShader',\n\n defines: {\n PERSPECTIVE_CAMERA: 1,\n SAMPLES: 16,\n SAMPLE_VECTORS: generateAoSampleKernelInitializer(16, false),\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_SWIZZLING: 'x',\n AO_ALGORITHM: AO_ALGORITHMS.GTAO,\n NV_ALIGNED_SAMPLES: 1,\n SCREEN_SPACE_RADIUS: 0,\n SCREEN_SPACE_RADIUS_SCALE: 100.0,\n SCENE_CLIP_BOX: 0,\n NORMAL_VECTOR_ANTIALIAS: 2,\n DEPTH_BUFFER_ANTIALIAS: 1,\n },\n\n uniforms: {\n tNormal: { value: null as Texture | null },\n tDepth: { value: null as Texture | null },\n tNoise: { value: null as Texture | null },\n resolution: { value: new Vector2() },\n cameraNear: { value: null as Texture | null },\n cameraFar: { value: null as Texture | null },\n cameraProjectionMatrix: { value: new Matrix4() },\n cameraProjectionMatrixInverse: { value: new Matrix4() },\n cameraWorldMatrix: { value: new Matrix4() },\n radius: { value: 1 },\n distanceExponent: { value: 1 },\n thickness: { value: 1 },\n distanceFallOff: { value: 1 },\n bias: { value: 0.001 },\n scale: { value: 1 },\n sceneBoxMin: { value: new Vector3(-1, -1, -1) },\n sceneBoxMax: { value: new Vector3(1, 1, 1) },\n },\n\n vertexShader: /* glsl */ `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n fragmentShader: /* glsl */ `\n\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float bias;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <packing>\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tconst vec4 sampleKernel[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\t#if DEPTH_BUFFER_ANTIALIAS == 1\n\t\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\t\tivec2 p = ivec2(uv * size);\n\t\t\t\tfloat d0 = texelFetch(tDepth, p, 0).DEPTH_SWIZZLING;\n\t\t\t\tvec2 depth = vec2(d0, 1.0);\n\t\t\t\tfloat d1 = texelFetch(tDepth, p + ivec2(1, 0), 0).DEPTH_SWIZZLING;\n\t\t\t\tdepth += vec2(d1, 1.0) * step(abs(d1 - d0), 0.1);\n\t\t\t\tfloat d2 = texelFetch(tDepth, p - ivec2(1, 0), 0).DEPTH_SWIZZLING;\n\t\t\t\tdepth += vec2(d2, 1.0) * step(abs(d2 - d0), 0.1);\n\t\t\t\tfloat d3 = texelFetch(tDepth, p + ivec2(0, 1), 0).DEPTH_SWIZZLING;\n\t\t\t\tdepth += vec2(d3, 1.0) * step(abs(d3 - d0), 0.1);\n\t\t\t\tfloat d4 = texelFetch(tDepth, p - ivec2(0, 1), 0).DEPTH_SWIZZLING;\n\t\t\t\tdepth += vec2(d4, 1.0) * step(abs(d4 - d0), 0.1);\n\t\t\t\treturn depth.x / depth.y;\n \t#else\n \treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n \t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n vec2 size = vec2(textureSize(tDepth, 0));\n ivec2 p = ivec2(uv * size);\n float c0 = fetchDepth(p);\n float l2 = fetchDepth(p - ivec2(2, 0));\n float l1 = fetchDepth(p - ivec2(1, 0));\n float r1 = fetchDepth(p + ivec2(1, 0));\n float r2 = fetchDepth(p + ivec2(2, 0));\n float b2 = fetchDepth(p - ivec2(0, 2));\n float b1 = fetchDepth(p - ivec2(0, 1));\n float t1 = fetchDepth(p + ivec2(0, 1));\n float t2 = fetchDepth(p + ivec2(0, 2));\n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n vec3 ce = getViewPosition(uv, c0).xyz;\n vec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n vec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n return normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getAntiAliasedViewNormal(const in vec2 screenPosition) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\t#if NORMAL_VECTOR_ANTIALIAS == 1\n\t\t\t\t\tvec2 uv = screenPosition;\n\t\t\t\t\tvec2 size = vec2(textureSize(tNormal, 0));\n\t\t\t\t\tivec2 p = ivec2(screenPosition * size);\n\t\t\t\t\tfloat c0 = texelFetch(tNormal, p, 0).a;\n\t\t\t\t\tfloat l2 = texelFetch(tNormal, p - ivec2(2, 0), 0).a;\n\t\t\t\t\tfloat l1 = texelFetch(tNormal, p - ivec2(1, 0), 0).a;\n\t\t\t\t\tfloat r1 = texelFetch(tNormal, p + ivec2(1, 0), 0).a;\n\t\t\t\t\tfloat r2 = texelFetch(tNormal, p + ivec2(2, 0), 0).a;\n\t\t\t\t\tfloat b2 = texelFetch(tNormal, p - ivec2(0, 2), 0).a;\n\t\t\t\t\tfloat b1 = texelFetch(tNormal, p - ivec2(0, 1), 0).a;\n\t\t\t\t\tfloat t1 = texelFetch(tNormal, p + ivec2(0, 1), 0).a;\n\t\t\t\t\tfloat t2 = texelFetch(tNormal, p + ivec2(0, 2), 0).a;\n\t\t\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t\t : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t\t : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t\t\t#elif NORMAL_VECTOR_ANTIALIAS == 2\n\t\t\t\t\tvec2 size = vec2(textureSize(tNormal, 0));\n\t\t\t\t\tivec2 p = ivec2(screenPosition * size);\n\t\t\t\t\tvec3 normalVector = texelFetch(tNormal, p, 0).xyz;\n\t\t\t\t\tnormalVector += texelFetch(tNormal, p + ivec2(1, 0), 0).xyz;\n\t\t\t\t\tnormalVector += texelFetch(tNormal, p - ivec2(1, 0), 0).xyz;\n\t\t\t\t\tnormalVector += texelFetch(tNormal, p + ivec2(0, 1), 0).xyz;\n\t\t\t\t\tnormalVector += texelFetch(tNormal, p - ivec2(0, 1), 0).xyz;\n\t\t\t\t\treturn normalize(normalVector);\n\t\t\t\t#else\n\t\t\t\t\treturn texture2D(tNormal, screenPosition).xyz;\n\t\t\t\t#endif\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, screenPosition, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(screenPosition);\n\t\t\t#endif\n\t\t }\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tfloat sinusToPlane(vec3 pointOnPlane, vec3 planeNormal, vec3 point) {\n\t\t\tvec3 delta = point - pointOnPlane;\n\t\t\tfloat sinV = dot(planeNormal, normalize(delta));\n\t\t\treturn sinV;\n\t\t}\n\n\t\tfloat getFallOff(float delta, float falloffDistance) {\n\t\t\tfloat fallOff = smoothstep(0., 1., 1. - distanceFallOff * abs(delta) / falloffDistance);\n\t\t\treturn fallOff;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getAntiAliasedViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t float radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n \t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\n\t\t\t#if NV_ALIGNED_SAMPLES == 1\n \t\t\t\tvec3 tangent = normalize(randomVec - viewNormal * dot(randomVec, viewNormal));\n \t\t\tvec3 bitangent = cross(viewNormal, tangent);\n \t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, viewNormal);\n\t\t\t#else\n\t\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\t\t\t#endif\n\n\t\t#if AO_ALGORITHM == 4\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t#elif AO_ALGORITHM == 3\n\t\t\tconst int DIRECTIONS = SAMPLES < 16 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t#else\n\t\t\tconst int DIRECTIONS = SAMPLES;\n\t\t\tconst int STEPS = 1;\n\t\t#endif\n\n\t\t\tfloat ao = 0.0, totalWeight = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t#if AO_ALGORITHM == 4\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t#elif AO_ALGORITHM == 3\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * 2. * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t#else\n\t\t\t\tvec4 sampleDir = sampleKernel[i];\n\t\t\t#endif\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t#if (AO_ALGORITHM == 3 || AO_ALGORITHM == 4)\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\t#if AO_ALGORITHM == 4\n\t\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\t\t\t\t#else\n\t\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice));\n\t\t\t\t#endif\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\t\t\t\t\tvec3 sampleViewPos = viewPos + sampleViewOffset;\n\t\t\t#else\n\t\t\t\t\tvec3 sampleViewPos = viewPos + sampleDir.xyz * radiusToUse * pow(sampleDir.w, distanceExponent);\n\t\t\t#endif\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(sampleViewPos);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tfloat sceneSampleDist = abs(sampleSceneViewPos.z);\n\t\t\t\t\tfloat sampleDist = abs(sampleViewPos.z);\n\n\t\t\t\t#if (AO_ALGORITHM == 3 || AO_ALGORITHM == 4)\n\t\t\t\t\t// HBAO || GTAO\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tvec2 clipRangeCheck = step(0., sampleSceneUvDepth.xy) * step(sampleSceneUvDepth.xy, vec2(1.));\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff) * clipRangeCheck.x * clipRangeCheck.y);\n\t\t\t\t\t}\n\t\t\t\t\t#if AO_ALGORITHM == 4\n\t\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\t\tvec2 clipRangeCheck = step(0., sampleSceneUvDepth.xy) * step(sampleSceneUvDepth.xy, vec2(1.));\n\t\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff) * clipRangeCheck.x * clipRangeCheck.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t#elif AO_ALGORITHM == 2\n\t\t\t\t\t// N8AO\n\t\t\t\t\tfloat weight = dot(viewNormal, sampleDir.xyz);\n\t\t\t\t\tfloat occlusion = weight * step(sceneSampleDist + bias, sampleDist);\n\t\t\t\t#elif AO_ALGORITHM == 1\n\t\t\t\t\t// SAO\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tfloat minResolution = 0.; // ?\n\t\t\t\t\tfloat scaledViewDist = length( viewDelta ) / scale;\n\t\t\t\t\tfloat weight = 1.;\n\t\t\t\t\tfloat occlusion = max(0., (dot(viewNormal, viewDelta) - minResolution) / scaledViewDist - bias) / (1. + scaledViewDist * scaledViewDist );\n\t\t\t\t#else\n\t\t\t\t\t// SSAO\n\t\t\t\t\tfloat weight = 1.;\n\t\t\t\t\tfloat occlusion = step(sceneSampleDist + bias, sampleDist);\n\t\t\t\t#endif\n\n\t\t#if AO_ALGORITHM == 4\n\t\t\t\t}\n\t\t\t\t// GTAO\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#elif AO_ALGORITHM == 3\n\t\t\t\t}\n\t\t\t\ttotalWeight += 1.;\n\t\t\t\tao += max(0., cosHorizons.x - max(0., cosHorizons.y));\n\t\t\t}\n\t\t\tao /= totalWeight + 1. - step(0., totalWeight);\n\t\t\tao = clamp(1. - ao, 0., 1.);\n\t\t#else\n\n\t\t\t\tfloat fallOff = getFallOff(sceneSampleDist - sampleDist, distanceFalloffToUse);\n\t\t\t\tocclusion *= fallOff;\n\t\t\t\tvec2 diff = (vUv - sampleSceneUvDepth.xy) * resolution;\n\t\t\t\tocclusion *= step(1., dot(diff, diff));\n\t\t\t\tvec2 clipRangeCheck = step(0., sampleSceneUvDepth.xy) * step(sampleSceneUvDepth.xy, vec2(1.));\n\t\t\t\tocclusion *= clipRangeCheck.x * clipRangeCheck.y;\n\t\t\t\tweight *= clipRangeCheck.x * clipRangeCheck.y;\n\t\t\t\ttotalWeight += weight;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\t\t\tao /= totalWeight + 1. - step(0., totalWeight);\n\t\t\tao = clamp(1. - ao, 0., 1.);\n\t\t#endif\n\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t#if AO_ALGORITHM != 1\n\t\t\tao = pow(ao, scale);\n\t\t#endif\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`,\n};\n","import {\n generateMagicSquareDistributedKernelRotations,\n PassRenderer,\n} from '../render-utility';\nimport type {\n NormalVectorSourceType,\n DepthValueSourceType,\n} from './pass-utility';\nimport {\n NORMAL_VECTOR_SOURCE_TYPES,\n DEPTH_VALUE_SOURCE_TYPES,\n} from './pass-utility';\nimport type { AoAlgorithmType } from '../shaders/ao-shader';\nimport {\n generateAoSampleKernelInitializer,\n AO_ALGORITHMS,\n AOShader,\n} from '../shaders/ao-shader';\nimport type {\n Camera,\n OrthographicCamera,\n PerspectiveCamera,\n Scene,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport {\n Box3,\n CustomBlending,\n DataTexture,\n LinearFilter,\n MinEquation,\n NearestFilter,\n OneFactor,\n RepeatWrapping,\n RGBAFormat,\n ShaderMaterial,\n UniformsUtils,\n UnsignedByteType,\n Vector3,\n WebGLRenderTarget,\n} from 'three';\nimport { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise.js';\n\nexport { AO_ALGORITHMS, type AoAlgorithmType } from '../shaders/ao-shader';\n\nexport interface AORenderPassParameters {\n [key: string]: any;\n resolutionScale: number;\n algorithm: AoAlgorithmType;\n samples: number;\n radius: number;\n distanceExponent: number;\n thickness: number;\n distanceFallOff: number;\n scale: number;\n bias: number;\n screenSpaceRadius: boolean;\n}\n\nexport const defaultAORenderPassParameters: AORenderPassParameters = {\n resolutionScale: 1,\n algorithm: AO_ALGORITHMS.SSAO,\n samples: 32,\n radius: 0.25,\n distanceExponent: 2, // 1\n thickness: 0.5,\n distanceFallOff: 0.5,\n scale: 1,\n bias: 0.01,\n screenSpaceRadius: false,\n};\n\nexport interface AOPassParameters {\n aoParameters?: AORenderPassParameters;\n normalVectorSourceType?: NormalVectorSourceType;\n depthValueSourceType?: DepthValueSourceType;\n modulateRedChannel?: boolean;\n depthTexture?: Texture;\n normalTexture?: Texture;\n}\n\nexport class AORenderPass {\n public needsUpdate: boolean = true;\n public parameters: AORenderPassParameters = {\n ...defaultAORenderPassParameters,\n };\n private _width: number = 0;\n private _height: number = 0;\n private _samples: number = 0;\n private _gBufferAntiAliasing: boolean = false;\n private _normalVectorSourceType: NormalVectorSourceType =\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL;\n private _depthValueSourceType: DepthValueSourceType =\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA;\n private _modulateRedChannel: boolean = false;\n public depthTexture: Texture | null = null;\n public normalTexture: Texture | null = null;\n private _noiseTexture: Texture | null = null;\n private _aoMaterial?: ShaderMaterial;\n private _renderTarget: WebGLRenderTarget | null = null;\n private _passRenderer: PassRenderer = new PassRenderer();\n private _sceneClipBox: Box3 = new Box3(\n new Vector3(-1, -1, -1),\n new Vector3(1, 1, 1),\n );\n private _sceneScale: number = 1;\n\n public get texture(): Texture | null {\n return this._renderTarget ? this._renderTarget?.texture : null;\n }\n\n constructor(\n width: number,\n height: number,\n samples: number,\n gBufferAntiAliasing: boolean,\n parameters?: AOPassParameters,\n ) {\n this._width = width;\n this._height = height;\n this._samples = samples;\n this._gBufferAntiAliasing = gBufferAntiAliasing;\n this._normalVectorSourceType =\n parameters?.normalVectorSourceType ||\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL;\n this._depthValueSourceType =\n parameters?.depthValueSourceType ||\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA;\n this._modulateRedChannel = parameters?.modulateRedChannel || false;\n if (parameters?.aoParameters) {\n this.parameters = parameters.aoParameters;\n }\n if (parameters) {\n this.updateTextures(parameters);\n }\n }\n\n private _getNoiseTexture(size = 64): Texture | null {\n if (!this._noiseTexture) {\n const simplex = new SimplexNoise();\n const data = new Uint8Array(size * size * 4);\n for (let i = 0; i < size; i++) {\n for (let j = 0; j < size; j++) {\n const x = i;\n const y = j;\n\n data[(i * size + j) * 4] = (simplex.noise(x, y) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 1] =\n (simplex.noise(x + size, y) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 2] =\n (simplex.noise(x, y + size) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 3] =\n (simplex.noise(x + size, y + size) + 1.0) * 127.5;\n }\n }\n this._noiseTexture = new DataTexture(\n data,\n size,\n size,\n RGBAFormat,\n UnsignedByteType,\n );\n this._noiseTexture.wrapS = RepeatWrapping;\n this._noiseTexture.wrapT = RepeatWrapping;\n this._noiseTexture.needsUpdate = true;\n }\n return this._noiseTexture;\n }\n\n private _getMaterial(camera: Camera, needsUpdate: boolean): ShaderMaterial {\n let updateShader = needsUpdate;\n if (!this._aoMaterial) {\n this._aoMaterial = this._newAoMaterial();\n updateShader = true;\n }\n if (updateShader) {\n this._updateShader(this._aoMaterial, camera);\n this._aoMaterial.needsUpdate = true;\n }\n this._updateUniforms(this._aoMaterial, camera, updateShader);\n return this._aoMaterial;\n }\n\n private _newAoMaterial(): ShaderMaterial {\n const aoMaterial = new ShaderMaterial({\n defines: Object.assign({}, AOShader.defines),\n uniforms: UniformsUtils.clone(AOShader.uniforms),\n vertexShader: AOShader.vertexShader,\n fragmentShader: AOShader.fragmentShader,\n depthTest: false,\n depthWrite: false,\n });\n if (this._modulateRedChannel) {\n aoMaterial.blending = CustomBlending;\n aoMaterial.blendEquation = MinEquation;\n aoMaterial.blendEquationAlpha = null;\n aoMaterial.blendSrc = OneFactor;\n aoMaterial.blendSrcAlpha = null;\n aoMaterial.blendDst = OneFactor;\n aoMaterial.blendDstAlpha = null;\n }\n aoMaterial.defines.FRAGMENT_OUTPUT = this._modulateRedChannel\n ? 'vec4(ao, 1., 1., 1.)'\n : undefined;\n //aoMaterial.uniforms.tNoise.value = this._getNoiseTexture();\n aoMaterial.uniforms.tNoise.value =\n generateMagicSquareDistributedKernelRotations(5);\n return aoMaterial;\n }\n\n private _updateShader(aoMaterial: ShaderMaterial, camera: Camera): void {\n aoMaterial.defines.PERSPECTIVE_CAMERA = (camera as PerspectiveCamera)\n .isPerspectiveCamera\n ? 1\n : 0;\n aoMaterial.defines.SAMPLES = this.parameters.samples;\n aoMaterial.defines.SAMPLE_VECTORS = generateAoSampleKernelInitializer(\n this.parameters.samples,\n this.parameters.algorithm === AO_ALGORITHMS.SSAO,\n );\n aoMaterial.defines.NORMAL_VECTOR_TYPE =\n this._normalVectorSourceType ===\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL\n ? 2\n : 1;\n aoMaterial.defines.DEPTH_SWIZZLING =\n this._depthValueSourceType ===\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n ? 'a'\n : 'x';\n aoMaterial.defines.AO_ALGORITHM = this.parameters.algorithm;\n aoMaterial.defines.NV_ALIGNED_SAMPLES =\n this.parameters.algorithm === AO_ALGORITHMS.HBAO ||\n this.parameters.algorithm === AO_ALGORITHMS.GTAO\n ? 0\n : 1;\n aoMaterial.defines.SCREEN_SPACE_RADIUS = this.parameters.screenSpaceRadius\n ? 1\n : 0;\n aoMaterial.defines.SCENE_CLIP_BOX = 1;\n aoMaterial.defines.NORMAL_VECTOR_ANTIALIAS = this._gBufferAntiAliasing\n ? 2\n : 0;\n aoMaterial.defines.DEPTH_BUFFER_ANTIALIAS = this._gBufferAntiAliasing\n ? 1\n : 0;\n }\n\n private _updateUniforms(\n aoMaterial: ShaderMaterial,\n camera: Camera,\n updateShader: boolean,\n ): void {\n const sceneScale = this.parameters.screenSpaceRadius ? 1 : this._sceneScale;\n const depthTexture =\n this._depthValueSourceType ===\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n ? this.normalTexture\n : this.depthTexture;\n aoMaterial.uniforms.tNormal.value = this.normalTexture as Texture;\n aoMaterial.uniforms.tDepth.value = depthTexture;\n aoMaterial.uniforms.resolution.value.set(this._width, this._height);\n aoMaterial.uniforms.cameraProjectionMatrix.value.copy(\n camera.projectionMatrix,\n );\n aoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(\n camera.projectionMatrixInverse,\n );\n aoMaterial.uniforms.cameraWorldMatrix.value.copy(camera.matrixWorld);\n const currentCamera = camera as PerspectiveCamera | OrthographicCamera;\n aoMaterial.uniforms.cameraNear.value = currentCamera.near;\n aoMaterial.uniforms.cameraFar.value = currentCamera.far;\n if (updateShader) {\n aoMaterial.uniforms.radius.value = this.parameters.radius * sceneScale;\n aoMaterial.uniforms.distanceExponent.value =\n this.parameters.distanceExponent;\n aoMaterial.uniforms.thickness.value =\n this.parameters.thickness * sceneScale;\n aoMaterial.uniforms.distanceFallOff.value =\n this.parameters.distanceFallOff;\n aoMaterial.uniforms.scale.value = this.parameters.scale;\n if (this._sceneClipBox) {\n aoMaterial.uniforms.sceneBoxMin.value.copy(this._sceneClipBox.min);\n aoMaterial.uniforms.sceneBoxMax.value.copy(this._sceneClipBox.max);\n }\n }\n }\n\n private _getRenderTargets(): WebGLRenderTarget {\n if (!this._renderTarget) {\n this._renderTarget = new WebGLRenderTarget(this._width, this._height, {\n samples: this._samples,\n magFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n minFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n });\n }\n return this._renderTarget;\n }\n\n public dispose(): void {\n this._noiseTexture?.dispose();\n this._aoMaterial?.dispose();\n this._renderTarget?.dispose();\n }\n\n public setSize(width: number, height: number): void {\n this._width = width;\n this._height = height;\n this._renderTarget?.setSize(width, height);\n this.needsUpdate = true;\n }\n\n public updateBounds(sceneClipBox: Box3, sceneScale?: number) {\n this._sceneClipBox = new Box3().copy(sceneClipBox);\n this._sceneScale = sceneScale ?? 1;\n this.needsUpdate = true;\n }\n\n public updateParameters(parameters: AORenderPassParameters) {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n this.needsUpdate = true;\n }\n }\n }\n\n public updateTextures(parameters: AOPassParameters) {\n if (parameters.depthTexture) {\n this.depthTexture = parameters.depthTexture;\n this.needsUpdate = true;\n }\n if (parameters.normalTexture) {\n this.normalTexture = parameters.normalTexture;\n this.needsUpdate = true;\n }\n }\n\n public clear(renderer: WebGLRenderer, renderTarget?: WebGLRenderTarget) {\n this._passRenderer.clear(\n renderer,\n renderTarget ? renderTarget : this._getRenderTargets(),\n 0xffffff,\n 1,\n );\n }\n\n public render(\n renderer: WebGLRenderer,\n camera: Camera,\n _scene: Scene,\n renderTarget?: WebGLRenderTarget,\n ) {\n const aoMaterial = this._getMaterial(camera, this.needsUpdate);\n this.needsUpdate = false;\n this._passRenderer.renderScreenSpace(\n renderer,\n aoMaterial,\n renderTarget ? renderTarget : this._getRenderTargets(),\n );\n }\n}\n","import type { Blending, Texture } from 'three';\nimport {\n AddEquation,\n DstAlphaFactor,\n DstColorFactor,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n ZeroFactor,\n} from 'three';\nimport type { Nullable } from '#/common/src/utils/types';\n\nconst BlendAoAndAShadowShader = {\n uniforms: {\n tDiffuse: { value: null as Nullable<Texture> },\n intensity: { value: new Vector2(1, 1) },\n },\n vertexShader: `\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform vec2 intensity;\n varying vec2 vUv;\n\n void main() {\n vec4 textureColor = texture2D(tDiffuse, vUv);\n vec2 aoAndShadow = vec2(1.0) - intensity + intensity * textureColor.rg;\n gl_FragColor = vec4(vec3(aoAndShadow.r * aoAndShadow.g), 1.0);\n }`,\n};\n\nexport interface BlendAoAndAShadowMaterialParameters {\n texture?: Nullable<Texture>;\n blending?: Blending;\n aoIntensity?: number;\n shadowIntensity?: number;\n}\n\nexport class BlendAoAndAShadowMaterial extends ShaderMaterial {\n private _intensity: Vector2 = new Vector2(1, 1);\n constructor(parameters?: BlendAoAndAShadowMaterialParameters) {\n super({\n uniforms: UniformsUtils.clone(BlendAoAndAShadowShader.uniforms),\n vertexShader: BlendAoAndAShadowShader.vertexShader,\n fragmentShader: BlendAoAndAShadowShader.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n blendSrc: DstColorFactor,\n blendDst: ZeroFactor,\n blendEquation: AddEquation,\n blendSrcAlpha: DstAlphaFactor,\n blendDstAlpha: ZeroFactor,\n blendEquationAlpha: AddEquation,\n });\n this.uniforms.intensity.value = this._intensity;\n this.update(parameters);\n }\n\n public update(\n parameters?: BlendAoAndAShadowMaterialParameters,\n ): BlendAoAndAShadowMaterial {\n if (parameters?.texture !== undefined) {\n this.uniforms.tDiffuse.value = parameters.texture;\n }\n if (parameters?.blending !== undefined) {\n this.blending = parameters.blending;\n }\n if (parameters?.aoIntensity !== undefined) {\n this._intensity.x = parameters.aoIntensity;\n }\n if (parameters?.shadowIntensity !== undefined) {\n this._intensity.y = parameters.shadowIntensity;\n }\n return this;\n }\n}\n","import type { Texture } from 'three';\nimport { Matrix4, Vector3, Vector2 } from 'three';\n\nexport const generatePdSamplePointInitializer = (\n samples: number,\n rings: number,\n radius: number,\n radiusExponent: number,\n) => {\n const poissonDisk = generateDenoiseSamples(\n samples,\n rings,\n radius,\n radiusExponent,\n );\n let glslCode = 'vec3[SAMPLES](';\n for (let i = 0; i < samples; i++) {\n const sample = poissonDisk[i];\n glslCode += `vec3(${sample.x}, ${sample.y}, ${sample.z})${\n i < samples - 1 ? ',' : ')'\n }`;\n }\n return glslCode;\n};\n\nexport const generateDenoiseSamples = (\n numSamples: number,\n numRings: number,\n radius: number,\n radiusExponent: number,\n) => {\n const samples: Vector3[] = [];\n for (let i = 0; i < numSamples; i++) {\n const angle = (2 * Math.PI * numRings * i) / numSamples;\n const relativeRadius =\n (1 + (radius - 1) * Math.pow(i / (numSamples - 1), radiusExponent)) /\n radius;\n samples.push(new Vector3(Math.cos(angle), Math.sin(angle), relativeRadius));\n }\n return samples;\n};\n\nconst poissonDenoiseVertexShader = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}`;\n\nconst poissonDenoiseFragmentShader = /* glsl */ `\nvarying vec2 vUv;\nuniform sampler2D tDiffuse;\nuniform sampler2D tNormal;\nuniform sampler2D tDepth;\nuniform sampler2D tNoise;\nuniform vec2 resolution;\nuniform mat4 cameraProjectionMatrix;\nuniform mat4 cameraProjectionMatrixInverse;\nuniform mat4 cameraWorldMatrix;\nuniform float lumaPhi;\nuniform float depthPhi;\nuniform float normalPhi;\nuniform float radius;\nuniform float radiusExponent;\nuniform int iteration;\nuniform int noOfIterations;\n#if SCENE_CLIP_BOX == 1\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n#endif\n\n#include <common>\n#include <packing>\n\n#if LUMINANCE_WEIGHTED == 1 \n\n#ifndef LUMINANCE_TYPE\n#define LUMINANCE_TYPE float\n#endif\n#ifndef SAMPLE_LUMINANCE\n#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n#endif\n#define WEIGHT_TYPE LUMINANCE_TYPE\n\n#else\n#define WEIGHT_TYPE float\n#endif\n\n#ifndef FRAGMENT_OUTPUT\n#define FRAGMENT_OUTPUT vec4(vec3(denoised), 1.)\n#endif\n\nLUMINANCE_TYPE getLuminance(const in vec3 a) {\n return SAMPLE_LUMINANCE;\n}\n\nconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\nvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n vec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n return viewSpacePosition.xyz / viewSpacePosition.w;\n}\n\nfloat getDepth(const vec2 uv) {\n#if DEPTH_VALUE_SOURCE == 1 \n return textureLod(tDepth, uv.xy, 0.0).a;\n#else\n return textureLod(tDepth, uv.xy, 0.0).r;\n#endif\n}\n\nfloat fetchDepth(const ivec2 uv) {\n#if DEPTH_VALUE_SOURCE == 1 \n return texelFetch(tDepth, uv.xy, 0).a;\n#else\n return texelFetch(tDepth, uv.xy, 0).r;\n#endif\n}\n\nvec3 computeNormalFromDepth(const vec2 uv) {\n vec2 size = vec2(textureSize(tDepth, 0));\n ivec2 p = ivec2(uv * size);\n float c0 = fetchDepth(p);\n float l2 = fetchDepth(p - ivec2(2, 0));\n float l1 = fetchDepth(p - ivec2(1, 0));\n float r1 = fetchDepth(p + ivec2(1, 0));\n float r2 = fetchDepth(p + ivec2(2, 0));\n float b2 = fetchDepth(p - ivec2(0, 2));\n float b1 = fetchDepth(p - ivec2(0, 1));\n float t1 = fetchDepth(p + ivec2(0, 1));\n float t2 = fetchDepth(p + ivec2(0, 2));\n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n vec3 ce = getViewPosition(uv, c0).xyz;\n vec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n vec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n return normalize(cross(dpdx, dpdy));\n}\n\nvec3 getViewNormal(const vec2 uv) {\n#if NORMAL_VECTOR_TYPE == 2\n return normalize(textureLod(tNormal, uv, 0.).rgb);\n#elif NORMAL_VECTOR_TYPE == 1\n return unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n#else\n return computeNormalFromDepth(uv);\n#endif\n}\n\nvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout WEIGHT_TYPE totalWeight) {\n vec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n float sampleDepth = getDepth(sampleUv);\n vec3 sampleNormal = getViewNormal(sampleUv);\n vec3 neighborColor = sampleTexel.rgb;\n vec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n \n float normalDiff = dot(viewNormal, sampleNormal);\n float normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n float depthDiff = abs(dot(normalize(viewPos - viewPosSample), viewNormal));\n float depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n #if LUMINANCE_WEIGHTED == 1 \n LUMINANCE_TYPE lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n LUMINANCE_TYPE lumaSimilarity = max(1. - lumaDiff / lumaPhi, 0.);\n LUMINANCE_TYPE w = lumaSimilarity * depthSimilarity * normalSimilarity;\n #else\n WEIGHT_TYPE w = depthSimilarity * normalSimilarity;\n #endif\n\n denoised += w * neighborColor;\n totalWeight += w;\n}\n\nvoid main() {\n float depth = fetchDepth(ivec2(vec2(textureSize(tDepth, 0)) * vUv.xy));\t\n vec3 viewNormal = getViewNormal(vUv);\t\n if (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n discard;\n return;\n }\n vec4 texel = textureLod(tDiffuse, vUv, 0.0);\n vec3 center = texel.rgb;\n vec3 viewPos = getViewPosition(vUv, depth);\n\n #if SCENE_CLIP_BOX == 1\n vec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n float boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n if (boxDistance > radius * 2.) {\n discard;\n return;\n }\n\t\t#endif\n\n vec2 noiseResolution = vec2(textureSize(tNoise, 0));\n vec2 noiseUv = vUv * resolution / noiseResolution;\n vec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n vec2 noiseVec = vec2(sin(noiseTexel[iteration % 4] * 2. * PI), cos(noiseTexel[iteration % 4] * 2. * PI));\n #if SAMPLE_DISTRIBUTION == 1\n vec3 randomVec = normalize(vec3(noiseVec.xy, 0.));\n vec3 tangent = normalize(randomVec - viewNormal * dot(randomVec, viewNormal));\n vec3 bitangent = cross(viewNormal, tangent);\n mat3 kernelMatrix = mat3(tangent, bitangent, viewNormal);\n #else\n mat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n #endif\n\n WEIGHT_TYPE totalWeight = WEIGHT_TYPE(1.);\n vec3 denoised = texel.rgb;\n for (int i = 0; i < SAMPLES; i++) {\n vec3 sampleDir = poissonDisk[i];\n #if SAMPLE_DISTRIBUTION == 1\n vec3 offsetViewPos = viewPos + normalize(kernelMatrix * vec3(sampleDir.xy, 0.)) * sampleDir.z * radius * radius;\n vec4 samplePointNDC = cameraProjectionMatrix * vec4(offsetViewPos, 1.0); \n vec2 sampleUv = (samplePointNDC.xy / samplePointNDC.w * 0.5 + 0.5);\n #else\n vec2 offset = rotationMatrix * sampleDir.xy * (1. + sampleDir.z * (radius - 1.));\n offset *= mix(vec2(1.0), sqrt(1.0 - viewNormal.xy * viewNormal.xy), float(iteration) / float(noOfIterations-1));\n offset *= max(1.0, 1.0 / length(offset));\n vec2 sampleUv = vUv + offset / resolution;\n #endif\n denoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n }\n\n denoised /= totalWeight + 1.0 - step(0.0, totalWeight);\n gl_FragColor = FRAGMENT_OUTPUT;\n}`;\n\nexport const poissonDenoiseShader = {\n name: 'PoissonDenoiseShader',\n defines: {\n SAMPLES: 16,\n SAMPLE_VECTORS: generatePdSamplePointInitializer(16, 2.89, 4, 1.3),\n NV_ALIGNED_SAMPLES: 0,\n SAMPLE_DISTRIBUTION: 0,\n DEPTH_VALUE_SOURCE: 0,\n LUMINANCE_WEIGHTED: 1,\n LUMINANCE_TYPE: 'float',\n SAMPLE_LUMINANCE: 'dot(vec3(0.2125, 0.7154, 0.0721), a)',\n SCENE_CLIP_BOX: 0,\n FRAGMENT_OUTPUT: 'vec4(vec3(denoised), 1.)',\n },\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n tNormal: { value: null as Texture | null },\n tDepth: { value: null as Texture | null },\n tNoise: { value: null as Texture | null },\n resolution: { value: new Vector2() },\n cameraProjectionMatrix: { value: new Matrix4() },\n cameraProjectionMatrixInverse: { value: new Matrix4() },\n cameraWorldMatrix: { value: new Matrix4() },\n lumaPhi: { value: 5 },\n depthPhi: { value: 1 },\n normalPhi: { value: 1 },\n radius: { value: 10 },\n radiusExponent: { value: 1.3 },\n iteration: { value: 0 },\n noOfIterations: { value: 2 },\n sceneBoxMin: { value: new Vector3(-1, -1, -1) },\n sceneBoxMax: { value: new Vector3(1, 1, 1) },\n },\n vertexShader: poissonDenoiseVertexShader,\n fragmentShader: poissonDenoiseFragmentShader,\n};\n","import type { DenoisePass } from './../render-utility';\nimport type {\n NormalVectorSourceType,\n DepthValueSourceType,\n} from './pass-utility';\nimport {\n NORMAL_VECTOR_SOURCE_TYPES,\n DEPTH_VALUE_SOURCE_TYPES,\n} from './pass-utility';\nimport { PassRenderer } from './../render-utility';\nimport {\n type Camera,\n HalfFloatType,\n type Texture,\n type WebGLRenderer,\n NearestFilter,\n} from 'three';\nimport {\n Box3,\n DataTexture,\n RepeatWrapping,\n RGBAFormat,\n ShaderMaterial,\n UniformsUtils,\n UnsignedByteType,\n WebGLRenderTarget,\n} from 'three';\nimport { SimplexNoise } from 'three/examples/jsm/math/SimplexNoise.js';\nimport {\n generatePdSamplePointInitializer,\n poissonDenoiseShader,\n} from '../shaders/poisson-denoise-shader';\n\nexport interface PoissonDenoisePassParameters {\n [key: string]: any;\n iterations: number;\n samples: number;\n rings: number;\n radiusExponent: number;\n radius: number;\n lumaPhi: number;\n depthPhi: number;\n normalPhi: number;\n nvOrientatedSamples?: boolean;\n}\n\nexport const defaultPoissonDenoisePassParameters: PoissonDenoisePassParameters =\n {\n iterations: 2,\n samples: 16,\n rings: 2.89,\n radiusExponent: 1.3,\n radius: 4,\n lumaPhi: 10,\n depthPhi: 2.5,\n normalPhi: 0.5,\n nvOrientatedSamples: false,\n };\n\nexport interface PoissonDenoiseParameters {\n poissonDenoisePassParameters?: PoissonDenoisePassParameters;\n normalVectorSourceType?: NormalVectorSourceType;\n depthValueSourceType?: DepthValueSourceType;\n rgInputTexture?: boolean;\n luminanceWeighted?: boolean;\n luminanceType?: string;\n sampleLuminance?: string;\n fragmentOutput?: string;\n inputTexture?: Texture;\n depthTexture?: Texture;\n normalTexture?: Texture;\n}\n\nexport class PoissonDenoiseRenderPass implements DenoisePass {\n public needsUpdate: boolean = true;\n public parameters: PoissonDenoisePassParameters = {\n ...defaultPoissonDenoisePassParameters,\n };\n private _width: number = 0;\n private _height: number = 0;\n private _samples: number = 0;\n private _normalVectorSourceType: NormalVectorSourceType =\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL;\n private _depthValueSourceType: DepthValueSourceType =\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA;\n public _inputTexture: Texture | null = null;\n public depthTexture: Texture | null = null;\n public normalTexture: Texture | null = null;\n private _noiseTexture: Texture | null = null;\n private _pdMaterial?: ShaderMaterial;\n private _renderTargets: WebGLRenderTarget[] = [];\n private _outputRenderTargetIndex: number = 0;\n private _passRenderer: PassRenderer = new PassRenderer();\n private _sceneClipBox: Box3 | undefined;\n private _rgInputTexture: boolean = false;\n private _luminanceWeighted: boolean = true;\n private _luminanceType: string;\n private _sampleLuminance: string;\n private _fragmentOutput: string;\n\n public get texture(): Texture | null {\n return this.parameters.iterations > 0 && this._renderTargets.length > 0\n ? this._renderTargets[this._outputRenderTargetIndex].texture\n : this._inputTexture;\n }\n\n public set inputTexture(texture: Texture | null) {\n this._inputTexture = texture;\n }\n\n constructor(\n width: number,\n height: number,\n samples: number,\n parameters?: PoissonDenoiseParameters,\n ) {\n this._width = width;\n this._height = height;\n this._samples = samples;\n this._normalVectorSourceType =\n parameters?.normalVectorSourceType ||\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL;\n this._depthValueSourceType =\n parameters?.depthValueSourceType ||\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA;\n this._inputTexture = parameters?.inputTexture || null;\n this.depthTexture = parameters?.depthTexture || null;\n this.normalTexture = parameters?.normalTexture || null;\n this._rgInputTexture = parameters?.rgInputTexture || false;\n this._luminanceWeighted = parameters?.luminanceWeighted === true;\n this._luminanceType = parameters?.luminanceType || 'vec3';\n this._sampleLuminance = parameters?.sampleLuminance || 'a';\n this._fragmentOutput =\n parameters?.fragmentOutput || 'vec4(denoised.xyz, 1.)';\n if (parameters?.poissonDenoisePassParameters) {\n this.parameters = parameters.poissonDenoisePassParameters;\n }\n if (parameters) {\n this.updateTextures(parameters);\n }\n }\n\n private _getNoiseTexture(size = 64): Texture | null {\n if (!this._noiseTexture) {\n const simplex = new SimplexNoise();\n const data = new Uint8Array(size * size * 4);\n for (let i = 0; i < size; i++) {\n for (let j = 0; j < size; j++) {\n const x = i;\n const y = j;\n\n data[(i * size + j) * 4] = (simplex.noise(x, y) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 1] =\n (simplex.noise(x + size, y) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 2] =\n (simplex.noise(x, y + size) + 1.0) * 127.5;\n data[(i * size + j) * 4 + 3] =\n (simplex.noise(x + size, y + size) + 1.0) * 127.5;\n }\n }\n this._noiseTexture = new DataTexture(\n data,\n size,\n size,\n RGBAFormat,\n UnsignedByteType,\n );\n this._noiseTexture.wrapS = RepeatWrapping;\n this._noiseTexture.wrapT = RepeatWrapping;\n this._noiseTexture.needsUpdate = true;\n }\n return this._noiseTexture;\n }\n\n private _getMaterial(camera: Camera, needsUpdate: boolean): ShaderMaterial {\n let updateShader = needsUpdate;\n if (!this._pdMaterial) {\n this._pdMaterial = new ShaderMaterial({\n defines: Object.assign({}, poissonDenoiseShader.defines),\n uniforms: UniformsUtils.clone(poissonDenoiseShader.uniforms),\n vertexShader: poissonDenoiseShader.vertexShader,\n fragmentShader: poissonDenoiseShader.fragmentShader,\n depthTest: false,\n depthWrite: false,\n });\n this._pdMaterial.uniforms.tNoise.value = this._getNoiseTexture();\n updateShader = true;\n }\n if (updateShader) {\n this._updateShader(this._pdMaterial);\n }\n this._updateUniforms(this._pdMaterial, camera, updateShader);\n return this._pdMaterial;\n }\n\n private _updateShader(pdMaterial: ShaderMaterial): void {\n pdMaterial.defines.SAMPLES = this.parameters.samples;\n pdMaterial.defines.SAMPLE_VECTORS = generatePdSamplePointInitializer(\n this.parameters.samples,\n this.parameters.rings,\n this.parameters.radius,\n this.parameters.radiusExponent,\n );\n pdMaterial.defines.SAMPLE_DISTRIBUTION = this.parameters.nvOrientatedSamples\n ? 1\n : 0;\n pdMaterial.defines.NORMAL_VECTOR_TYPE =\n this._normalVectorSourceType ===\n NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL\n ? 2\n : 1;\n pdMaterial.defines.DEPTH_VALUE_SOURCE =\n this._depthValueSourceType ===\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n ? 1\n : 0;\n pdMaterial.needsUpdate = true;\n pdMaterial.defines.LUMINANCE_WEIGHTED = this._luminanceWeighted ? 1 : 0;\n pdMaterial.defines.LUMINANCE_TYPE = this._luminanceType;\n pdMaterial.defines.SAMPLE_LUMINANCE = this._sampleLuminance;\n pdMaterial.defines.FRAGMENT_OUTPUT = this._fragmentOutput;\n pdMaterial.defines.SCENE_CLIP_BOX = this._sceneClipBox ? 1 : 0;\n pdMaterial.needsUpdate = true;\n }\n\n private _updateUniforms(\n pdMaterial: ShaderMaterial,\n camera: Camera,\n updateShader: boolean,\n ): void {\n const depthTexture =\n this._depthValueSourceType ===\n DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n ? this.normalTexture\n : this.depthTexture;\n pdMaterial.uniforms.tDiffuse.value = this._inputTexture as Texture;\n pdMaterial.uniforms.tNormal.value = this.normalTexture as Texture;\n pdMaterial.uniforms.tDepth.value = depthTexture;\n pdMaterial.uniforms.resolution.value.set(this._width, this._height);\n if (camera.projectionMatrix) {\n pdMaterial.uniforms.cameraProjectionMatrix.value.copy(\n camera.projectionMatrix,\n );\n }\n if (camera.projectionMatrixInverse) {\n pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(\n camera.projectionMatrixInverse,\n );\n }\n if (camera.matrixWorld) {\n pdMaterial.uniforms.cameraWorldMatrix.value.copy(camera.matrixWorld);\n }\n if (updateShader) {\n pdMaterial.uniforms.lumaPhi.value = this.parameters.lumaPhi;\n pdMaterial.uniforms.depthPhi.value = this.parameters.depthPhi;\n pdMaterial.uniforms.normalPhi.value = this.parameters.normalPhi;\n pdMaterial.uniforms.radius.value = this.parameters.radius;\n pdMaterial.uniforms.radiusExponent.value = this.parameters.radiusExponent;\n if (this._sceneClipBox) {\n pdMaterial.uniforms.sceneBoxMin.value.copy(this._sceneClipBox.min);\n pdMaterial.uniforms.sceneBoxMax.value.copy(this._sceneClipBox.max);\n }\n }\n }\n\n private _getRenderTargets(): WebGLRenderTarget[] {\n if (this._renderTargets.length < 2) {\n this._renderTargets = [\n new WebGLRenderTarget(this._width, this._height, {\n samples: this._samples,\n format: RGBAFormat,\n type: HalfFloatType,\n magFilter: NearestFilter,\n minFilter: NearestFilter,\n }),\n new WebGLRenderTarget(this._width, this._height, {\n samples: this._samples,\n format: RGBAFormat,\n type: HalfFloatType,\n magFilter: NearestFilter,\n minFilter: NearestFilter,\n }),\n ];\n }\n return this._renderTargets;\n }\n\n public dispose(): void {\n this._noiseTexture?.dispose();\n this._pdMaterial?.dispose();\n this._renderTargets.forEach((target) => target.dispose());\n }\n\n public setSize(width: number, height: number): void {\n this._width = width;\n this._height = height;\n this._renderTargets.forEach((target) => target.setSize(width, height));\n this.needsUpdate = true;\n }\n\n public updateBounds(sceneClipBox: Box3) {\n this._sceneClipBox = new Box3().copy(sceneClipBox);\n this.needsUpdate = true;\n }\n\n public updateParameters(parameters: PoissonDenoisePassParameters) {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n this.needsUpdate = true;\n }\n }\n }\n\n public updateTextures(parameters: PoissonDenoiseParameters) {\n if (parameters.inputTexture) {\n this._inputTexture = parameters.inputTexture;\n this.needsUpdate = true;\n }\n if (parameters.depthTexture) {\n this.depthTexture = parameters.depthTexture;\n this.needsUpdate = true;\n }\n if (parameters.normalTexture) {\n this.normalTexture = parameters.normalTexture;\n this.needsUpdate = true;\n }\n }\n\n public render(renderer: WebGLRenderer, camera: Camera) {\n const pdMaterial = this._getMaterial(camera, this.needsUpdate);\n this.needsUpdate = false;\n const renderTargets = this._getRenderTargets();\n pdMaterial.uniforms.iteration.value = this.parameters.iterations;\n for (let i = 0; i < this.parameters.iterations; i++) {\n const inputRenderTarget = renderTargets[(i + 1) % 2];\n this._outputRenderTargetIndex = i % 2;\n const outputRenderTarget = renderTargets[this._outputRenderTargetIndex];\n pdMaterial.uniforms.tDiffuse.value =\n i === 0 ? this._inputTexture : inputRenderTarget.texture;\n pdMaterial.uniforms.iteration.value = i;\n this._passRenderer.renderScreenSpace(\n renderer,\n pdMaterial,\n outputRenderTarget,\n 0xffffff,\n 1.0,\n );\n }\n }\n\n public renderToTarget(\n renderer: WebGLRenderer,\n camera: Camera,\n renderTarget: WebGLRenderTarget,\n ) {\n const pdMaterial = this._getMaterial(camera, this.needsUpdate);\n this.needsUpdate = false;\n this._passRenderer.renderScreenSpace(\n renderer,\n pdMaterial,\n renderTarget,\n 0xffffff,\n 1.0,\n );\n }\n}\n","import type { Enumify } from '#/common/src/utils/types';\nimport { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport {\n COLOR_COPY_BLEND_MODES,\n CopyTransformMaterial,\n DEFAULT_TRANSFORM,\n ZERO_RGBA,\n} from '../shader-utility';\nimport type { DenoisePass, SceneVolume } from '../render-utility';\nimport {\n NORMAL_VECTOR_SOURCE_TYPES,\n DEPTH_VALUE_SOURCE_TYPES,\n} from './pass-utility';\nimport { CameraUpdate } from '../render-utility';\nimport type { AORenderPassParameters } from './ao-pass';\nimport { defaultAORenderPassParameters, AORenderPass } from './ao-pass';\nimport { BlendAoAndAShadowMaterial } from '../materials/blend-ao-and-shadow-material';\nimport type { PoissonDenoisePassParameters } from './poisson-denoise-pass';\nimport {\n defaultPoissonDenoisePassParameters,\n PoissonDenoiseRenderPass,\n} from './poisson-denoise-pass';\nimport type {\n Camera,\n OrthographicCamera,\n PerspectiveCamera,\n Scene,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport {\n CustomBlending,\n LinearFilter,\n Matrix4,\n NearestFilter,\n NoBlending,\n RGFormat,\n WebGLRenderTarget,\n} from 'three';\n\nexport const SHADOW_BLUR_TYPES = {\n OFF: 'off',\n HARD: 'hard',\n POISSON: 'poisson',\n FULL: 'full',\n} as const;\n\nexport type ShadowBlurType = Enumify<typeof SHADOW_BLUR_TYPES>;\n\nexport interface ShadowParameters {\n [key: string]: any;\n shadowRadius: number;\n}\n\nexport interface ShadowAndAoPassParameters {\n enabled: boolean;\n applyToMaterial: boolean;\n aoIntensity: number;\n shadowIntensity: number;\n aoOnGround: boolean;\n shadowOnGround: boolean;\n alwaysUpdate: boolean;\n progressiveDenoiseIterations: number;\n shadow: ShadowParameters;\n ao: AORenderPassParameters;\n poissonDenoise: PoissonDenoisePassParameters;\n}\n\nexport const defaultShadowParameters: ShadowParameters = {\n shadowRadius: 0.05,\n};\n\nexport const defaultPassParameters = {\n enabled: true,\n applyToMaterial: true,\n aoIntensity: 0.5,\n shadowIntensity: 0.35,\n aoOnGround: true,\n shadowOnGround: false,\n alwaysUpdate: false,\n progressiveDenoiseIterations: 0,\n};\n\nexport interface ShadowAndAoPassConstructorParameters {\n enabled?: boolean;\n applyToMaterial?: boolean;\n aoIntensity?: number;\n shadowIntensity?: number;\n aoOnGround?: boolean;\n shadowOnGround?: boolean;\n alwaysUpdate?: boolean;\n progressiveDenoiseIterations?: number;\n shadow?: ShadowParameters;\n ao?: AORenderPassParameters;\n poissonDenoise?: PoissonDenoisePassParameters;\n}\n\nexport interface ShadowAndAoPassSettings {\n shadowMapTexture: Texture | null;\n shadowBlurType: ShadowBlurType;\n shadowFadeInBlurType: ShadowBlurType;\n shadowFadeInMix: number;\n noOStaticFrames: number;\n}\n\nexport class ShadowAndAoPass extends RenderPass {\n // prettier-ignore\n public static shadowTransform: Matrix4 = new Matrix4().set(\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 0, 1\n );\n public parameters: ShadowAndAoPassParameters;\n public needsUpdate: boolean = true;\n public renderToRenderTarget: boolean = false;\n public shadowAndAoPassSettings: ShadowAndAoPassSettings = {\n shadowMapTexture: null,\n shadowBlurType: SHADOW_BLUR_TYPES.FULL,\n shadowFadeInBlurType: SHADOW_BLUR_TYPES.FULL,\n shadowFadeInMix: 0,\n noOStaticFrames: 0,\n };\n private _width: number;\n private _height: number;\n private _samples: number;\n private _aoAndSoftShadowRenderTarget?: WebGLRenderTarget;\n private _softShadowPass?: PoissonDenoiseRenderPass;\n private _aoPass?: AORenderPass;\n private _fadeRenderTarget?: WebGLRenderTarget;\n private _poissonDenoisePass?: PoissonDenoiseRenderPass;\n private _copyMaterial: CopyTransformMaterial;\n private _blendMaterial: CopyTransformMaterial;\n private _blendAoAndShadowMaterial: BlendAoAndAShadowMaterial;\n private _cameraUpdate: CameraUpdate = new CameraUpdate();\n private _finalTexture: Texture | null = null;\n private _onlyHardShadow: boolean = false;\n\n public get aoAndSoftShadowRenderTarget(): WebGLRenderTarget {\n this._aoAndSoftShadowRenderTarget =\n this._aoAndSoftShadowRenderTarget ??\n new WebGLRenderTarget(this._width, this._height, {\n samples: this._samples,\n format: RGFormat,\n magFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n minFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n });\n return this._aoAndSoftShadowRenderTarget;\n }\n\n public get aoRenderPass(): AORenderPass {\n if (!this._aoPass) {\n this._aoPass = new AORenderPass(\n this._width,\n this._height,\n this._samples,\n !this.parameters.applyToMaterial,\n {\n normalVectorSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL\n : NORMAL_VECTOR_SOURCE_TYPES.INPUT_RGB_NORMAL,\n depthValueSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n : DEPTH_VALUE_SOURCE_TYPES.SEPARATE_BUFFER,\n modulateRedChannel: true,\n aoParameters: this.parameters.ao,\n },\n );\n }\n return this._aoPass;\n }\n\n public get softShadowPass(): PoissonDenoiseRenderPass {\n if (!this._softShadowPass) {\n this._softShadowPass = new PoissonDenoiseRenderPass(\n this._width,\n this._height,\n this._samples,\n {\n inputTexture: undefined,\n depthTexture: this.gBufferTextures.depthBufferTexture,\n normalTexture: this.gBufferTextures.gBufferTexture,\n normalVectorSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL\n : NORMAL_VECTOR_SOURCE_TYPES.INPUT_RGB_NORMAL,\n depthValueSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n : DEPTH_VALUE_SOURCE_TYPES.SEPARATE_BUFFER,\n rgInputTexture: true,\n luminanceWeighted: false,\n fragmentOutput: 'vec4(1.0, denoised.x, 0.0, 1.0)',\n poissonDenoisePassParameters: {\n iterations: 1,\n samples: 16,\n rings: 2.89,\n radiusExponent: 1,\n radius: this.parameters.shadow.shadowRadius,\n lumaPhi: 10,\n depthPhi: 0.1,\n normalPhi: 4,\n nvOrientatedSamples: true,\n },\n },\n );\n } else {\n const softShadowPass = this._softShadowPass;\n softShadowPass.depthTexture = this.gBufferTextures.depthBufferTexture;\n softShadowPass.normalTexture = this.gBufferTextures.gBufferTexture;\n }\n return this._softShadowPass;\n }\n\n public get fadeRenderTarget(): WebGLRenderTarget {\n this._fadeRenderTarget =\n this._fadeRenderTarget ??\n new WebGLRenderTarget(this._width, this._height, {\n samples: this._samples,\n format: RGFormat,\n magFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n minFilter: this._samples > 1 ? LinearFilter : NearestFilter,\n });\n return this._fadeRenderTarget;\n }\n\n public get denoisePass(): DenoisePass {\n if (!this._poissonDenoisePass) {\n this._poissonDenoisePass = new PoissonDenoiseRenderPass(\n this._width,\n this._height,\n this._samples,\n {\n inputTexture: this.aoAndSoftShadowRenderTarget.texture,\n depthTexture: this.gBufferTextures.depthBufferTexture,\n normalTexture: this.gBufferTextures.gBufferTexture,\n normalVectorSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? NORMAL_VECTOR_SOURCE_TYPES.FLOAT_BUFFER_NORMAL\n : NORMAL_VECTOR_SOURCE_TYPES.INPUT_RGB_NORMAL,\n depthValueSourceType: this.gBufferTextures\n .isFloatGBufferWithRgbNormalAlphaDepth\n ? DEPTH_VALUE_SOURCE_TYPES.NORMAL_VECTOR_ALPHA\n : DEPTH_VALUE_SOURCE_TYPES.SEPARATE_BUFFER,\n rgInputTexture: true,\n luminanceWeighted: false,\n fragmentOutput:\n 'vec4(denoised.xy, vec2(fract(depth * 1024.0), floor(depth * 1024.0)))',\n poissonDenoisePassParameters: this.parameters.poissonDenoise,\n },\n );\n } else {\n const denoisePass = this._poissonDenoisePass;\n denoisePass.depthTexture = this.gBufferTextures.depthBufferTexture;\n denoisePass.normalTexture = this.gBufferTextures.gBufferTexture;\n }\n return this._poissonDenoisePass;\n }\n\n public get denoiseRenderTargetTexture(): Texture | null {\n return this.denoisePass ? this.denoisePass.texture : null;\n }\n\n public get finalTexture(): Texture | null {\n return this._finalTexture;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n width: number,\n height: number,\n samples: number,\n parameters?: ShadowAndAoPassConstructorParameters,\n ) {\n super(renderPassManager);\n this._width = width;\n this._height = height;\n this._samples = samples;\n this.parameters = {\n enabled: parameters?.enabled ?? defaultPassParameters.enabled,\n applyToMaterial:\n parameters?.applyToMaterial ?? defaultPassParameters.applyToMaterial,\n aoIntensity: parameters?.aoIntensity ?? defaultPassParameters.aoIntensity,\n shadowIntensity:\n parameters?.shadowIntensity ?? defaultPassParameters.shadowIntensity,\n aoOnGround: parameters?.aoOnGround ?? defaultPassParameters.aoOnGround,\n shadowOnGround:\n parameters?.shadowOnGround ?? defaultPassParameters.shadowOnGround,\n alwaysUpdate:\n parameters?.alwaysUpdate ?? defaultPassParameters.alwaysUpdate,\n progressiveDenoiseIterations:\n parameters?.progressiveDenoiseIterations ??\n defaultPassParameters.progressiveDenoiseIterations,\n shadow: {\n ...defaultShadowParameters,\n },\n ao: {\n ...defaultAORenderPassParameters,\n },\n poissonDenoise: {\n ...defaultPoissonDenoisePassParameters,\n },\n };\n this._copyMaterial = new CopyTransformMaterial();\n this._blendMaterial = new CopyTransformMaterial(\n {},\n COLOR_COPY_BLEND_MODES.DEFAULT,\n );\n this._blendAoAndShadowMaterial = new BlendAoAndAShadowMaterial();\n }\n\n public dispose() {\n super.dispose();\n this._aoAndSoftShadowRenderTarget?.dispose();\n this._softShadowPass?.dispose();\n this._aoPass?.dispose();\n this._fadeRenderTarget?.dispose();\n this._poissonDenoisePass?.dispose();\n this._copyMaterial?.dispose();\n this._blendMaterial?.dispose();\n this._blendAoAndShadowMaterial?.dispose();\n }\n\n public setSize(width: number, height: number) {\n this._width = width;\n this._height = height;\n this._aoAndSoftShadowRenderTarget?.setSize(width, height);\n this._softShadowPass?.setSize(width, height);\n this._aoPass?.setSize(width, height);\n this._fadeRenderTarget?.setSize(width, height);\n this._poissonDenoisePass?.setSize(this._width, this._height);\n this.needsUpdate = true;\n }\n\n public updateParameters(parameters: ShadowAndAoPassParameters) {\n if (parameters.enabled !== undefined) {\n this.parameters.enabled = parameters.enabled;\n }\n if (parameters.applyToMaterial !== undefined) {\n this.parameters.applyToMaterial = parameters.applyToMaterial;\n }\n if (parameters.aoIntensity !== undefined) {\n this.parameters.aoIntensity = parameters.aoIntensity;\n }\n if (parameters.shadowIntensity !== undefined) {\n this.parameters.shadowIntensity = parameters.shadowIntensity;\n }\n if (parameters.aoOnGround !== undefined) {\n this.parameters.aoOnGround = parameters.aoOnGround;\n }\n if (parameters.shadowOnGround !== undefined) {\n this.parameters.shadowOnGround = parameters.shadowOnGround;\n }\n if (parameters.alwaysUpdate !== undefined) {\n this.parameters.alwaysUpdate = parameters.alwaysUpdate;\n }\n this._updatePassParameters(parameters);\n }\n\n private _updatePassParameters(parameters: ShadowAndAoPassParameters) {\n if (parameters?.shadow) {\n for (const propertyName in parameters.shadow) {\n if (this.parameters.shadow.hasOwnProperty(propertyName)) {\n this.parameters.shadow[propertyName] =\n parameters.shadow[propertyName];\n }\n }\n if (this._softShadowPass) {\n this._softShadowPass.needsUpdate = true;\n }\n }\n if (parameters?.ao) {\n for (const propertyName in parameters.ao) {\n if (this.parameters.ao.hasOwnProperty(propertyName)) {\n this.parameters.ao[propertyName] = parameters.ao[propertyName];\n }\n }\n if (this._aoPass) {\n this._aoPass?.updateParameters(parameters?.ao);\n }\n }\n if (parameters?.poissonDenoise) {\n if (this._poissonDenoisePass) {\n this._poissonDenoisePass?.updateParameters(parameters?.poissonDenoise);\n } else {\n for (const propertyName in parameters.poissonDenoise) {\n if (this.parameters.poissonDenoise.hasOwnProperty(propertyName)) {\n this.parameters.poissonDenoise[propertyName] =\n parameters.poissonDenoise[propertyName];\n }\n }\n }\n }\n }\n\n public updateBounds(sceneBounds: SceneVolume, _shadowAndAoScale: number) {\n this._softShadowPass?.updateBounds(sceneBounds.bounds);\n this._aoPass?.updateBounds(sceneBounds.bounds, _shadowAndAoScale);\n }\n\n private _getRenderConditions(\n shadowFadeInBlurType: ShadowBlurType = SHADOW_BLUR_TYPES.FULL,\n shadowFadeInMix: number = 0,\n noOStaticFrames: number = 0,\n ) {\n const fadeInPoissonShadow =\n shadowFadeInBlurType === SHADOW_BLUR_TYPES.POISSON &&\n shadowFadeInMix > 0.001;\n const fadeInHardShadow =\n shadowFadeInBlurType === SHADOW_BLUR_TYPES.HARD &&\n shadowFadeInMix > 0.001 &&\n shadowFadeInMix < 0.999;\n const onlyHardShadow =\n shadowFadeInBlurType === SHADOW_BLUR_TYPES.HARD && !fadeInHardShadow;\n const progressiveDenoise =\n !fadeInPoissonShadow &&\n !fadeInHardShadow &&\n noOStaticFrames > 1 &&\n noOStaticFrames <= this.parameters.progressiveDenoiseIterations + 1;\n return {\n fadeInPoissonShadow,\n fadeInHardShadow,\n onlyHardShadow,\n progressiveDenoise,\n };\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n if (!this._setRenderState()) {\n return;\n }\n const renderConditions = this._getRenderConditions(\n this.shadowAndAoPassSettings.shadowFadeInBlurType,\n this.shadowAndAoPassSettings.shadowFadeInMix,\n this.shadowAndAoPassSettings.noOStaticFrames,\n );\n let needsDenoise = false;\n if (\n !renderConditions.onlyHardShadow &&\n this.shadowAndAoPassSettings.shadowBlurType === SHADOW_BLUR_TYPES.FULL &&\n this._evaluateIfUpdateIsNeeded(this.camera)\n ) {\n this._renderShadowAndAo(\n renderer as WebGLRenderer,\n this.scene,\n this.camera,\n this.shadowAndAoPassSettings.shadowMapTexture as Texture,\n );\n needsDenoise = true;\n }\n let finalTexture: Texture | null = renderConditions.onlyHardShadow\n ? this.shadowAndAoPassSettings.shadowMapTexture\n : this.denoiseRenderTargetTexture;\n if (renderConditions.fadeInPoissonShadow) {\n finalTexture = this._renderDynamicShadow(\n renderer as WebGLRenderer,\n this.aoAndSoftShadowRenderTarget.texture,\n this.shadowAndAoPassSettings.shadowMapTexture,\n this.shadowAndAoPassSettings.shadowFadeInMix,\n );\n needsDenoise = true;\n }\n if (needsDenoise) {\n finalTexture = this._renderDenoise(\n renderer as WebGLRenderer,\n this.camera,\n renderConditions.fadeInPoissonShadow,\n false,\n );\n } else if (renderConditions.progressiveDenoise) {\n finalTexture = this._renderDenoise(\n renderer as WebGLRenderer,\n this.camera,\n false,\n true,\n );\n }\n if (renderConditions.fadeInHardShadow) {\n finalTexture = this._renderDynamicShadow(\n renderer as WebGLRenderer,\n this.denoiseRenderTargetTexture,\n this.shadowAndAoPassSettings.shadowMapTexture,\n this.shadowAndAoPassSettings.shadowFadeInMix,\n );\n }\n this._finalTexture = finalTexture;\n this._onlyHardShadow = renderConditions.onlyHardShadow;\n if (this.renderToRenderTarget) {\n this.renderToTarget(renderer as WebGLRenderer);\n }\n }\n\n private _setRenderState(): boolean {\n if (\n !this.parameters.enabled ||\n !(\n this.parameters.ao.algorithm !== null ||\n this.parameters.shadowIntensity >= 0.01\n )\n ) {\n return false;\n }\n if (this.needsUpdate) {\n if (this._aoPass) {\n this._aoPass.needsUpdate = true;\n }\n if (this._poissonDenoisePass) {\n this._poissonDenoisePass.needsUpdate = true;\n }\n }\n return true;\n }\n\n private _evaluateIfUpdateIsNeeded(camera: Camera): boolean {\n (camera as OrthographicCamera | PerspectiveCamera).updateProjectionMatrix();\n const needsUpdate =\n this.parameters.alwaysUpdate ||\n this.needsUpdate ||\n (camera != null && this._cameraUpdate.changed(camera));\n this.needsUpdate = false;\n return needsUpdate;\n }\n\n private _renderShadowAndAo(\n renderer: WebGLRenderer,\n scene: Scene,\n camera: Camera,\n shadowMapTexture: Texture,\n ): void {\n const renderAo =\n this.parameters.ao.algorithm !== null &&\n this.parameters.aoIntensity > 0.01;\n if (!renderAo) {\n this._aoPass?.clear(renderer, this.aoAndSoftShadowRenderTarget);\n }\n this._renderSoftShadow(renderer, camera, shadowMapTexture);\n if (renderAo) {\n this._renderAo(renderer, scene, camera);\n }\n }\n\n private _renderAo(\n renderer: WebGLRenderer,\n scene: Scene,\n camera: Camera,\n ): void {\n const depthTexture = this.gBufferTextures.depthBufferTexture;\n const normalTexture = this.gBufferTextures.gBufferTexture;\n const renderTarget = this._aoAndSoftShadowRenderTarget;\n const autoClear = renderer.autoClear;\n renderer.autoClear = false;\n const aoPass = this.aoRenderPass;\n aoPass.depthTexture = depthTexture;\n aoPass.normalTexture = normalTexture;\n aoPass.render(renderer, camera, scene, renderTarget);\n renderer.autoClear = autoClear;\n }\n\n private _renderSoftShadow(\n renderer: WebGLRenderer,\n camera: Camera,\n shadowMapTexture: Texture,\n ): void {\n const softShadowPass = this.softShadowPass;\n softShadowPass.parameters.radius = this.parameters.shadow.shadowRadius;\n softShadowPass.inputTexture = shadowMapTexture;\n this.softShadowPass.renderToTarget(\n renderer,\n camera,\n this.aoAndSoftShadowRenderTarget,\n );\n }\n\n private _renderDynamicShadow(\n renderer: WebGLRenderer,\n passTexture: Texture | null,\n shadowMapTexture: Texture | null,\n shadowFadeInMix: number = 1,\n ): Texture {\n const fade = shadowFadeInMix < 0.999;\n if (fade) {\n this._copyMaterial.update({\n texture: passTexture,\n blending: NoBlending,\n colorTransform: DEFAULT_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n });\n this.passRenderer.renderScreenSpace(\n renderer,\n this._copyMaterial,\n this.fadeRenderTarget,\n );\n }\n if (shadowFadeInMix > 0.001) {\n this._blendMaterial.update({\n texture: shadowMapTexture,\n blending: fade ? CustomBlending : NoBlending,\n // prettier-ignore\n colorTransform: new Matrix4().set(\n 0, 0, 0, 1,\n 1, 0, 0, 0,\n 0, 0, 0, 1,\n 0, 0, 0, fade ? shadowFadeInMix : 1,\n ),\n multiplyChannels: 0,\n });\n this.passRenderer.renderScreenSpace(\n renderer,\n this._blendMaterial,\n this.fadeRenderTarget,\n );\n }\n return this.fadeRenderTarget.texture;\n }\n\n private _renderDenoise(\n renderer: WebGLRenderer,\n camera: Camera,\n fadeInShadow: boolean,\n progressiveDenoise: boolean,\n ): Texture | null {\n const denoisePass = this.denoisePass;\n denoisePass.inputTexture = fadeInShadow\n ? this.fadeRenderTarget.texture\n : progressiveDenoise\n ? denoisePass.texture\n : this.aoAndSoftShadowRenderTarget.texture;\n denoisePass.render(renderer, camera);\n return denoisePass.texture;\n }\n\n public renderToTarget(renderer: WebGLRenderer): void {\n const aoChannel = this._onlyHardShadow\n ? this.parameters.shadowIntensity\n : this.parameters.aoIntensity;\n const shadowChannel = this._onlyHardShadow\n ? 0\n : this.parameters.shadowIntensity;\n this.passRenderer.renderScreenSpace(\n renderer,\n this._blendAoAndShadowMaterial.update({\n texture: this._finalTexture,\n blending: CustomBlending,\n aoIntensity: aoChannel,\n shadowIntensity: shadowChannel,\n }),\n renderer.getRenderTarget(),\n );\n }\n}\n","import type { RenderPassManager } from './render-pass-manager';\nimport type { OutlinePass } from './pass/outline-pass';\nimport type { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport type {\n Camera,\n ColorRepresentation,\n Object3D,\n PerspectiveCamera,\n Scene,\n} from 'three';\n\nexport interface OutlineParameters {\n [key: string]: any;\n enabled: boolean;\n edgeStrength: number;\n edgeGlow: number;\n edgeThickness: number;\n pulsePeriod: number;\n usePatternTexture: false;\n visibleEdgeColor: ColorRepresentation;\n hiddenEdgeColor: ColorRepresentation;\n}\n\nexport interface OutlineRendererParameters {\n enabled?: boolean;\n edgeStrength?: number;\n edgeGlow?: number;\n edgeThickness?: number;\n pulsePeriod?: number;\n usePatternTexture?: false;\n visibleEdgeColor?: ColorRepresentation;\n hiddenEdgeColor?: ColorRepresentation;\n}\n\nexport class OutlineRenderer {\n public parameters: OutlineParameters;\n private _renderPassManager: RenderPassManager;\n private _effectComposer: EffectComposer | null = null;\n public outlinePassActivated = false;\n private _parameterNeedsUpdate = false;\n\n get isOutlinePassActivated(): boolean {\n return this.outlinePassActivated;\n }\n\n get outlinePass(): OutlinePass | null {\n return this._renderPassManager.outlinePass;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n _effectComposer: EffectComposer | null,\n parameters: OutlineRendererParameters,\n ) {\n this._renderPassManager = renderPassManager;\n this._effectComposer = _effectComposer;\n this.parameters = {\n enabled: true,\n edgeStrength: 2.0,\n edgeGlow: 1.0,\n edgeThickness: 2.0,\n pulsePeriod: 0,\n usePatternTexture: false,\n visibleEdgeColor: 0xffffff, // 0xdb0000,\n hiddenEdgeColor: 0xffffff, // 0xdb0000,\n ...parameters,\n };\n }\n\n public updateParameters(parameters: OutlineParameters): void {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n this._parameterNeedsUpdate = true;\n }\n }\n }\n\n public applyParameters(): void {\n if (!this.outlinePass) {\n return;\n }\n this._parameterNeedsUpdate = false;\n this.outlinePass.edgeStrength = this.parameters.edgeStrength;\n this.outlinePass.edgeGlow = this.parameters.edgeGlow;\n this.outlinePass.edgeThickness = this.parameters.edgeThickness;\n this.outlinePass.pulsePeriod = this.parameters.pulsePeriod;\n this.outlinePass.usePatternTexture = this.parameters.usePatternTexture;\n this.outlinePass.visibleEdgeColor.set(this.parameters.visibleEdgeColor);\n this.outlinePass.hiddenEdgeColor.set(this.parameters.hiddenEdgeColor);\n }\n\n public activateOutline(scene: Scene, camera: Camera): void {\n if (!this.parameters.enabled) {\n this.deactivateOutline();\n return;\n }\n const needsUpdate =\n this.outlinePass?.renderCamera &&\n (camera as PerspectiveCamera).isPerspectiveCamera !==\n (this.outlinePass.renderCamera as PerspectiveCamera)\n .isPerspectiveCamera;\n if (this.outlinePass) {\n this.outlinePass.renderScene = scene;\n this.outlinePass.renderCamera = camera;\n }\n if (!needsUpdate && this.outlinePassActivated) {\n return;\n }\n if (needsUpdate || !this.outlinePass) {\n this._renderPassManager.createOutlinePass();\n }\n this.applyParameters();\n if (this._effectComposer) {\n this._effectComposer.addPass(this.outlinePass as OutlinePass);\n }\n this.outlinePassActivated = true;\n }\n\n public deactivateOutline(): void {\n if (!this.outlinePassActivated) {\n return;\n }\n if (this.outlinePass && this._effectComposer) {\n this._effectComposer.removePass(this.outlinePass);\n }\n this.outlinePassActivated = false;\n }\n\n public updateOutline(\n scene: Scene,\n camera: Camera,\n selectedObjects: Object3D[],\n ) {\n if (selectedObjects.length > 0) {\n if (this._parameterNeedsUpdate) {\n this.applyParameters();\n }\n this.activateOutline(scene, camera);\n if (this.outlinePass) {\n this.outlinePass.selectedObjects = selectedObjects;\n }\n } else {\n this.deactivateOutline();\n }\n }\n}\n","import { AO_ALGORITHMS } from './pass/ao-pass';\nimport type { Nullable } from '#/common/src/utils/types';\nimport type { Enumify } from '#/common/src/utils/types';\nimport { deepMerge } from '../../utils/common-utils';\n\nexport const SCENE_SHADING_TYPES = {\n DEFAULT: 'default',\n BRIGHT: 'bright',\n} as const;\n\nexport type SceneShadingType = Enumify<typeof SCENE_SHADING_TYPES>;\n\nexport interface CustomShadingParameters {\n aoIntensity?: number;\n aoExtent?: number;\n shBakedOnGround?: boolean;\n shadowIntensity?: number;\n shadowSoftening?: number;\n grReflectIntensity?: number;\n grReflectFadeOut?: number;\n}\n\nconst brightSceneShadingParameters: Record<string, any> = {\n shadowType: 'PCFShadowMap',\n shAndAoPassParameters: {\n aoIntensity: 0.3,\n shadow: {\n shadowRadius: 0.1,\n },\n ao: {\n algorithm: AO_ALGORITHMS.SSAO,\n samples: 32,\n radius: 0.02,\n distanceExponent: 2,\n thickness: 0.1,\n distanceFallOff: 1,\n bias: 0.01,\n },\n poissonDenoise: {\n iterations: 2,\n samples: 16,\n rings: 2.89,\n radius: 4,\n radiusExponent: 1.3,\n depthPhi: 2.5,\n normalPhi: 0.5,\n },\n },\n groundReflectionParameters: {\n brightness: 0.5,\n },\n};\n\ntype ObjectType = Record<string, object>;\n\nexport const mergeRendererParameters = (\n ...args: ObjectType[]\n): Nullable<ObjectType> => {\n if (args.length === 0) {\n return null;\n }\n if (args.length === 1) {\n return args[0];\n }\n let target = args[0];\n for (let i = 1; i < args.length; i++) {\n target = deepMerge(target, args[i]);\n }\n return target;\n};\n\nexport const getInteractionParameters = (\n uiInteractionMode: boolean,\n): Nullable<ObjectType> => {\n return uiInteractionMode\n ? {\n groundReflectionParameters: {\n enabled: false,\n },\n }\n : null;\n};\n\nexport const getShadingParameters = (\n shadingType: SceneShadingType,\n): Nullable<ObjectType> => {\n if (!shadingType || shadingType === SCENE_SHADING_TYPES.DEFAULT) {\n return null;\n }\n if (shadingType === SCENE_SHADING_TYPES.BRIGHT) {\n return brightSceneShadingParameters;\n }\n return null;\n};\n\nconst _clamp = (value: number): number => {\n return Math.max(0, Math.min(1, value));\n};\n\ninterface ShadingMapParameters {\n shAndAoPassParameters: {\n aoIntensity?: number;\n shadowIntensity?: number;\n ao: {\n radius?: number;\n thickness?: number;\n };\n shadow: {\n shadowRadius?: number;\n };\n };\n groundReflectionParameters: {\n enabled?: boolean;\n intensity?: number;\n fadeOutDistance?: number;\n };\n bakedGroundContactShadowParameters: {\n enabled?: boolean;\n opacity?: number;\n blurMin?: number;\n blurMax?: number;\n };\n}\n\nexport const mapCustomShadingParameters = (\n customShadingParameters: CustomShadingParameters,\n): Record<string, object> => {\n const parameters: ShadingMapParameters = {\n shAndAoPassParameters: {\n ao: {},\n shadow: {},\n },\n groundReflectionParameters: {},\n bakedGroundContactShadowParameters: {},\n };\n _mapCustomAoParameters(parameters, customShadingParameters);\n _mapCustomShadowParameters(parameters, customShadingParameters);\n _mapCustomGroundReflectionParameters(parameters, customShadingParameters);\n return parameters as unknown as Record<string, object>;\n};\n\nexport const _mapCustomAoParameters = (\n parameters: ShadingMapParameters,\n customShadingParameters: CustomShadingParameters,\n) => {\n if (customShadingParameters.aoIntensity !== undefined) {\n parameters.shAndAoPassParameters.aoIntensity = _clamp(\n customShadingParameters.aoIntensity,\n );\n }\n if (customShadingParameters.aoExtent !== undefined) {\n parameters.shAndAoPassParameters.ao.radius =\n _clamp(customShadingParameters.aoExtent) * 0.3;\n parameters.shAndAoPassParameters.ao.thickness =\n 0.1 + _clamp(customShadingParameters.aoExtent) * 0.2;\n }\n};\n\nexport const _mapCustomShadowParameters = (\n parameters: ShadingMapParameters,\n customShadingParameters: CustomShadingParameters,\n) => {\n if (customShadingParameters.shBakedOnGround) {\n parameters.bakedGroundContactShadowParameters.enabled = true;\n parameters.shAndAoPassParameters.shadowIntensity = 0;\n if (customShadingParameters.shadowIntensity !== undefined) {\n parameters.bakedGroundContactShadowParameters.opacity = _clamp(\n customShadingParameters.shadowIntensity,\n );\n }\n if (customShadingParameters.shadowIntensity !== undefined) {\n parameters.bakedGroundContactShadowParameters.blurMax =\n _clamp(customShadingParameters.shadowIntensity) * 0.1;\n parameters.bakedGroundContactShadowParameters.blurMin =\n parameters.bakedGroundContactShadowParameters.blurMax * 0.01;\n }\n } else {\n if (customShadingParameters.shBakedOnGround !== undefined) {\n parameters.bakedGroundContactShadowParameters.enabled = false;\n }\n if (customShadingParameters.shadowIntensity !== undefined) {\n parameters.shAndAoPassParameters.shadowIntensity = _clamp(\n customShadingParameters.shadowIntensity,\n );\n }\n if (customShadingParameters.shadowSoftening !== undefined) {\n parameters.shAndAoPassParameters.shadow.shadowRadius =\n 0.001 + _clamp(customShadingParameters.shadowSoftening) * 0.2;\n }\n }\n};\n\nexport const _mapCustomGroundReflectionParameters = (\n parameters: ShadingMapParameters,\n customShadingParameters: CustomShadingParameters,\n) => {\n if (customShadingParameters.grReflectIntensity !== undefined) {\n parameters.groundReflectionParameters.enabled =\n customShadingParameters.grReflectIntensity > 0;\n parameters.groundReflectionParameters.intensity = _clamp(\n customShadingParameters.grReflectIntensity,\n );\n }\n if (customShadingParameters.grReflectFadeOut !== undefined) {\n parameters.groundReflectionParameters.fadeOutDistance =\n (1 - _clamp(customShadingParameters.grReflectFadeOut)) * 4;\n }\n};\n","import type { Material, Object3D } from 'three';\nimport { Mesh, MeshPhysicalMaterial } from 'three';\nimport { MeshStandardMaterial } from 'three';\n\nexport const isTransparentMaterial = (\n material: Material | Material[],\n threshold: number,\n): boolean => {\n if (Array.isArray(material)) {\n return material.some((m) => isTransparentMaterial(m, threshold));\n }\n return (\n (material.transparent && material.opacity < threshold) ||\n material.alphaTest > 0\n );\n};\n\nexport const isTransmissiveMaterial = (\n material: Material | Material[],\n): boolean => {\n if (Array.isArray(material)) {\n return material.some((m) => isTransmissiveMaterial(m));\n }\n return material instanceof MeshPhysicalMaterial && material.transmission > 0;\n};\n\nexport interface RenderCache {\n dispose(): void;\n clear(): void;\n addLineOrPoint(object3d: Object3D): void;\n addMesh(mesh: Mesh): void;\n addObject(object3d: Object3D): void;\n onBeforeRender(): void;\n onAfterRender(): void;\n}\n\nexport interface ThreeObject3d {\n isLine?: boolean;\n isPoints?: boolean;\n isMesh?: boolean;\n}\n\nclass RenderCacheMapItem {\n public needsUpdate: boolean = true;\n private _cache: RenderCache | null = null;\n\n constructor(cache: RenderCache) {\n this._cache = cache;\n }\n\n public dispose() {\n this._cache?.dispose();\n }\n\n public clear() {\n this._cache?.clear();\n this.needsUpdate = true;\n }\n\n public update(object3d: Object3D) {\n if (!this.needsUpdate || !this._cache) {\n return;\n }\n object3d.traverse((object: Object3D | ThreeObject3d) => {\n if (\n (object as ThreeObject3d).isLine ||\n (object as ThreeObject3d).isPoints\n ) {\n this._cache?.addLineOrPoint(object as Object3D);\n } else if ((object as ThreeObject3d).isMesh) {\n this._cache?.addMesh(object as Mesh);\n } else {\n this._cache?.addObject(object as Object3D);\n }\n });\n this.needsUpdate = false;\n }\n\n public onBeforeRender(): void {\n this._cache?.onBeforeRender();\n }\n\n public onAfterRender(): void {\n this._cache?.onAfterRender();\n }\n}\n\nexport type CacheKey = any;\n\nexport class RenderCacheManager {\n private _cacheMap: Map<CacheKey, RenderCacheMapItem> = new Map();\n\n public dispose() {\n this._cacheMap.forEach((cache) => {\n cache.dispose();\n });\n }\n\n public registerCache(key: CacheKey, cache: RenderCache) {\n this._cacheMap.set(key, new RenderCacheMapItem(cache));\n }\n\n public clearCache() {\n this._cacheMap.forEach((cache) => {\n cache.clear();\n });\n }\n\n public clearObjectCache(key: CacheKey) {\n const cache = this._cacheMap.get(key);\n if (cache) {\n cache.clear();\n }\n }\n\n public onBeforeRender(key: CacheKey, object3d: Object3D): void {\n const cache = this._cacheMap.get(key);\n if (cache) {\n cache.update(object3d);\n cache.onBeforeRender();\n }\n }\n\n public onAfterRender(key: CacheKey): void {\n const cache = this._cacheMap.get(key);\n if (cache) {\n cache.onAfterRender();\n }\n }\n\n public render(key: CacheKey, object3d: Object3D, renderMethod: () => void) {\n const cache = this._cacheMap.get(key);\n if (cache) {\n cache.update(object3d);\n cache.onBeforeRender();\n }\n renderMethod();\n if (cache) {\n cache.onAfterRender();\n }\n }\n}\n\nexport class VisibilityRenderCache implements RenderCache {\n private _visibilityCache: Map<Object3D, boolean> = new Map();\n private _isObjectInvisible?: (object: any) => boolean;\n\n constructor(isObjectInvisible?: (object: any) => boolean) {\n this._isObjectInvisible = isObjectInvisible;\n }\n\n public dispose(): void {\n this._visibilityCache.clear();\n }\n\n public clear(): void {\n this._visibilityCache.clear();\n }\n\n public addLineOrPoint(object3d: Object3D): void {\n this._visibilityCache.set(object3d, object3d.visible);\n }\n\n public addMesh(mesh: Mesh): void {\n if (this._isObjectInvisible && this._isObjectInvisible(mesh)) {\n this._visibilityCache.set(mesh, mesh.visible);\n }\n }\n\n public addObject(object3d: Object3D): void {\n if (this._isObjectInvisible && this._isObjectInvisible(object3d)) {\n this._visibilityCache.set(object3d, object3d.visible);\n }\n }\n\n public onBeforeRender(): void {\n this._visibilityCache.forEach((_visible: boolean, object: Object3D) => {\n object.visible = false;\n });\n }\n\n public onAfterRender(): void {\n this._visibilityCache.forEach((visible: boolean, object: Object3D) => {\n object.visible = visible;\n });\n }\n}\n\nexport class DepthWriteRenderCache {\n private _depthWriteCache = new Set<MeshStandardMaterial>();\n private _doNotWriteDepth?: (mesh: Mesh) => boolean;\n\n constructor(doNotWriteDepth?: (object: any) => boolean) {\n this._doNotWriteDepth = doNotWriteDepth;\n }\n\n public dispose(): void {\n this._depthWriteCache.clear();\n }\n\n public clear(): void {\n this._depthWriteCache.clear();\n }\n\n public addLineOrPoint(_: Object3D): void {\n // do nothing\n }\n public addObject(_: Object3D): void {\n // do nothing\n }\n\n public addMesh(mesh: Mesh): void {\n if (\n this._doNotWriteDepth &&\n this._doNotWriteDepth(mesh) &&\n mesh.material instanceof MeshStandardMaterial &&\n mesh.material.depthWrite\n ) {\n this._depthWriteCache.add(mesh.material);\n }\n }\n\n public onBeforeRender(): void {\n this._depthWriteCache.forEach((material: MeshStandardMaterial) => {\n material.depthWrite = false;\n });\n }\n\n public onAfterRender(): void {\n this._depthWriteCache.forEach((material: MeshStandardMaterial) => {\n material.depthWrite = true;\n });\n }\n}\n\nexport interface ObjectCacheData {\n visible?: boolean;\n castShadow?: boolean;\n receiveShadow?: boolean;\n material?: Material | Material[];\n}\n\ninterface ObjectCacheEntry {\n originalObjectData: ObjectCacheData;\n updateObjectData: ObjectCacheData;\n}\n\nexport abstract class ObjectRenderCache implements RenderCache {\n private _objectCache = new Map<Object3D, ObjectCacheEntry>();\n\n public abstract dispose(): void;\n public abstract addLineOrPoint(object3d: Object3D): void;\n public abstract addMesh(mesh: Mesh): void;\n public abstract addObject(object3d: Object3D): void;\n\n public clear(): void {\n this._objectCache.clear();\n }\n\n public onBeforeRender(): void {\n this._objectCache.forEach((data: ObjectCacheEntry, object: Object3D) => {\n if (object instanceof Mesh) {\n // update the cache if properties of the object have changed\n if (\n object.material !== data.originalObjectData.material &&\n object.material !== data.updateObjectData.material\n ) {\n data.originalObjectData.material = object.material;\n }\n if (object.receiveShadow !== data.originalObjectData.receiveShadow) {\n data.originalObjectData.receiveShadow = object.receiveShadow;\n }\n if (object.castShadow !== data.originalObjectData.castShadow) {\n data.originalObjectData.castShadow = object.castShadow;\n }\n if (object.visible !== data.originalObjectData.visible) {\n data.originalObjectData.visible = object.visible;\n }\n }\n this._updateObject(object, data.updateObjectData);\n });\n }\n\n public onAfterRender(): void {\n this._objectCache.forEach((data: ObjectCacheEntry, object: Object3D) => {\n this._updateObject(object, data.originalObjectData);\n });\n }\n\n public addToCache(\n object: Object3D | Mesh,\n updateObjectData: ObjectCacheData,\n ): void {\n this._objectCache.set(object, {\n originalObjectData: {\n visible: object.visible,\n castShadow: object.castShadow,\n receiveShadow:\n object instanceof Mesh ? object.receiveShadow : undefined,\n material: object instanceof Mesh ? object.material : undefined,\n },\n updateObjectData,\n });\n }\n\n private _updateObject(object: Object3D, objectData: ObjectCacheData) {\n if (objectData.visible !== undefined) {\n object.visible = objectData.visible;\n }\n if (objectData.castShadow !== undefined) {\n object.castShadow = objectData.castShadow;\n }\n if (object instanceof Mesh && objectData.receiveShadow !== undefined) {\n (object as Mesh).receiveShadow = objectData.receiveShadow;\n }\n if (object instanceof Mesh && objectData.material !== undefined) {\n (object as Mesh).material = objectData.material as Material;\n }\n }\n}\n","import type { SceneVolume } from '../render-utility';\nimport { BlurPass } from '../render-utility';\nimport { BlurShader } from '../shader-utility';\nimport { VisibilityRenderCache } from '../render-cache';\nimport { ShadowGroundPlane } from '../objects/shadow-ground-plane';\nimport { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport type {\n Group,\n Layers,\n Scene,\n WebGLRenderer,\n MeshBasicMaterial,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport {\n CameraHelper,\n DoubleSide,\n MeshDepthMaterial,\n OrthographicCamera,\n WebGLRenderTarget,\n} from 'three';\n\nexport interface BakedGroundContactShadowParameters {\n [key: string]: any;\n enabled: boolean;\n cameraHelper: boolean;\n alwaysUpdate: boolean;\n fadeIn: boolean;\n blurMin: number;\n blurMax: number;\n fadeoutFalloff: number;\n fadeoutBias: number;\n opacity: number;\n maximumPlaneSize: number;\n planeSize: number;\n cameraFar: number;\n hardLayers: Layers | null;\n softLayers: Layers | null;\n polygonOffset: number;\n}\n\nexport interface BakedGroundContactShadowConstructorParameters {\n sharedShadowGroundPlane?: ShadowGroundPlane;\n shadowMapSize?: number;\n enabled?: boolean;\n cameraHelper?: boolean;\n alwaysUpdate?: boolean;\n fadeIn?: boolean;\n blurMin?: number;\n blurMax?: number;\n fadeoutFalloff?: number;\n fadeoutBias?: number;\n opacity?: number;\n maximumPlaneSize?: number;\n planeSize?: number;\n cameraFar?: number;\n hardLayers?: Layers | null;\n softLayers?: Layers | null;\n polygonOffset?: number;\n}\n\nconst castGroundContactShadow = (object: any): boolean => {\n if (!object.isMesh) {\n return false;\n }\n if (!object.castShadow && !object.userData?.meshId) {\n return false;\n }\n const material = object.material;\n return !material.transparent || material.opacity > 0.5;\n};\n\nexport class BakedGroundContactShadowPass extends RenderPass {\n public static addTestMesh: boolean = false;\n public shadowMapSize: number;\n public limitPlaneSize: boolean = true;\n public parameters: BakedGroundContactShadowParameters;\n private _renderer: WebGLRenderer | WebGPURenderer;\n public needsUpdate: boolean = true;\n public noNeedOfUpdateCount = 0;\n private _blurScale: number = 1;\n private _shadowScale: number = 1;\n private _groundGroup: Group;\n private _groundShadowFar: number;\n private _sharedShadowGroundPlane?: ShadowGroundPlane;\n private _shadowGroundPlane?: ShadowGroundPlane;\n private _groundContactCamera: GroundContactCamera;\n private _renderTargetBlur: WebGLRenderTarget;\n private _blurPass: BlurPass;\n public readonly renderTarget: WebGLRenderTarget;\n private _depthMaterial: MeshDepthMaterial;\n\n get shadowGroundPlane(): ShadowGroundPlane {\n let shadowGroundPlaneMesh = this._sharedShadowGroundPlane;\n if (!shadowGroundPlaneMesh) {\n this._shadowGroundPlane ??= new ShadowGroundPlane(\n this.renderTarget.texture,\n this.parameters,\n );\n shadowGroundPlaneMesh = this._shadowGroundPlane;\n }\n if (shadowGroundPlaneMesh.parent !== this._groundGroup) {\n this._groundGroup.add(shadowGroundPlaneMesh);\n }\n return shadowGroundPlaneMesh;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n renderer: WebGLRenderer | WebGPURenderer,\n groundGroup: Group,\n parameters: BakedGroundContactShadowConstructorParameters,\n ) {\n super(renderPassManager);\n this._groundGroup = groundGroup;\n this.shadowMapSize = parameters.shadowMapSize ?? 2048;\n this.parameters = this._getDefaultParameters(parameters);\n this._groundShadowFar = this.parameters.cameraFar;\n this._renderer = renderer;\n this.renderCacheManager?.registerCache(\n this,\n new VisibilityRenderCache((object: any) => {\n return (\n (object.isMesh && !castGroundContactShadow(object)) ||\n (object.name !== undefined &&\n ['Ground', 'Floor'].includes(object.name))\n );\n }),\n );\n this.renderTarget = new WebGLRenderTarget(\n this.shadowMapSize,\n this.shadowMapSize,\n );\n this.renderTarget.texture.generateMipmaps = false;\n this._renderTargetBlur = new WebGLRenderTarget(\n this.shadowMapSize,\n this.shadowMapSize,\n );\n this._renderTargetBlur.texture.generateMipmaps = false;\n\n this._sharedShadowGroundPlane = parameters?.sharedShadowGroundPlane;\n this.shadowGroundPlane.setShadowMap(this.renderTarget.texture);\n this.shadowGroundPlane.updateMaterial(this.parameters);\n this._groundContactCamera = new GroundContactCamera();\n this._groundGroup.add(this._groundContactCamera);\n\n this._depthMaterial = new MeshDepthMaterial();\n this._depthMaterial.userData.fadeoutBias = {\n value: this.parameters.fadeoutBias,\n };\n this._depthMaterial.userData.fadeoutFalloff = {\n value: this.parameters.fadeoutFalloff,\n };\n this._depthMaterial.onBeforeCompile = (shader) => {\n shader.uniforms.fadeoutBias = this._depthMaterial.userData.fadeoutBias;\n shader.uniforms.fadeoutFalloff =\n this._depthMaterial.userData.fadeoutFalloff;\n shader.fragmentShader = `\n uniform float fadeoutBias;\n uniform float fadeoutFalloff;\n ${shader.fragmentShader.replace(\n 'gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );',\n ShadowGroundPlane.alphaMap\n ? 'gl_FragColor = vec4(clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));'\n : 'gl_FragColor = vec4(vec3(0.0), clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));',\n )}\n `;\n };\n this._depthMaterial.side = DoubleSide;\n this._depthMaterial.depthTest = true;\n this._depthMaterial.depthWrite = true;\n this._blurPass = new BlurPass(BlurShader, {\n ...parameters,\n passRenderer: this.renderPassManager.passRenderer,\n });\n this.updatePlaneAndShadowCamera();\n }\n\n // eslint-disable-next-line complexity\n private _getDefaultParameters(\n parameters?: BakedGroundContactShadowConstructorParameters,\n ): BakedGroundContactShadowParameters {\n return {\n enabled: true,\n cameraHelper: false,\n alwaysUpdate: false,\n fadeIn: false,\n blurMin: 0.001,\n blurMax: 0.1,\n fadeoutFalloff: 0.9,\n fadeoutBias: 0.03,\n opacity: 0.5,\n maximumPlaneSize: 40,\n planeSize: 10,\n cameraFar: 3,\n hardLayers: null,\n softLayers: null,\n polygonOffset: 2,\n excludeGroundObjects: true,\n ...parameters,\n };\n }\n\n public dispose() {\n this.renderTarget.dispose();\n this._renderTargetBlur.dispose();\n this._blurPass.dispose();\n this._depthMaterial.dispose();\n }\n\n public updateParameters(parameters: BakedGroundContactShadowParameters) {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n }\n }\n if (parameters.cameraFar !== undefined) {\n this._groundShadowFar = this.parameters.cameraFar;\n }\n }\n\n public applyParameters() {\n this.shadowGroundPlane.updateMaterial(this.parameters);\n this._groundContactCamera.updateCameraHelper(this.parameters.cameraHelper);\n if (this._groundContactCamera.far !== this.parameters.cameraFar) {\n this.updatePlaneAndShadowCamera();\n }\n const fadeoutFalloff = this.parameters.fadeoutFalloff;\n if (this._depthMaterial.userData.fadeoutFalloff.value !== fadeoutFalloff) {\n this._depthMaterial.userData.fadeoutFalloff.value =\n this.parameters.fadeoutFalloff;\n }\n const fadeoutBias =\n this.parameters.fadeoutBias / this._groundContactCamera.far;\n if (this._depthMaterial.userData.fadeoutBias.value !== fadeoutBias) {\n this._depthMaterial.userData.fadeoutBias.value = fadeoutBias;\n }\n this.needsUpdate = true;\n }\n\n public setScale(groundContactShadowScale: number, _shadowScale?: number) {\n this._blurScale = groundContactShadowScale;\n this._shadowScale = _shadowScale ?? groundContactShadowScale;\n this.needsUpdate = true;\n }\n\n public updateBounds(sceneBounds: SceneVolume, groundLevel?: number) {\n this._groundShadowFar = this.parameters.cameraFar;\n if (this._groundShadowFar < sceneBounds.size.z) {\n this._groundShadowFar = sceneBounds.size.z * 1.01;\n }\n const maxPlanSideLength = Math.max(sceneBounds.size.x, sceneBounds.size.z);\n this.parameters.planeSize =\n maxPlanSideLength +\n 2 * Math.max(this._blurScale, this._shadowScale ?? 1, 1);\n if (\n this.limitPlaneSize &&\n this.parameters.planeSize > this.parameters.maximumPlaneSize\n ) {\n this.parameters.planeSize = this.parameters.maximumPlaneSize;\n this._groundGroup.position.set(0, groundLevel ?? 0, 0);\n } else {\n this._groundGroup.position.set(\n sceneBounds.center.x,\n groundLevel ?? 0,\n sceneBounds.center.z,\n );\n }\n this._groundGroup.updateMatrixWorld();\n this.updatePlaneAndShadowCamera();\n }\n\n public updatePlaneAndShadowCamera() {\n const size = this.parameters.planeSize;\n this.shadowGroundPlane.scale.x = size;\n this.shadowGroundPlane.scale.y = size;\n this._groundContactCamera.updateCameraFormPlaneSize(\n size,\n this._groundShadowFar,\n );\n this.needsUpdate = true;\n }\n\n public setGroundVisibilityLayers(visible: boolean) {\n this.shadowGroundPlane.setVisibilityLayers(visible);\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n this._groundContactCamera.updateCameraHelper(\n this.parameters.cameraHelper,\n this.scene,\n );\n if (!this.parameters.enabled) {\n if (this.needsUpdate) {\n this.needsUpdate = false;\n this.passRenderer.clear(\n renderer as WebGLRenderer,\n this.renderTarget,\n 0x000000,\n 1.0,\n );\n }\n return;\n }\n const maxIterations = 10;\n this.shadowGroundPlane.visible = this.parameters.enabled;\n const needsUpdate = this.parameters.alwaysUpdate || this.needsUpdate;\n if (!needsUpdate) {\n this.noNeedOfUpdateCount++;\n if (this.noNeedOfUpdateCount >= maxIterations) {\n return;\n }\n } else {\n this.noNeedOfUpdateCount = 0;\n }\n this.needsUpdate = false;\n\n const shadowGroundMaterial = this.shadowGroundPlane\n .material as MeshBasicMaterial;\n shadowGroundMaterial.opacity =\n this.parameters.alwaysUpdate || !this.parameters.fadeIn\n ? this.parameters.opacity\n : (this.parameters.opacity * (this.noNeedOfUpdateCount + 2)) /\n (maxIterations + 2);\n\n const initialClearAlpha = (this._renderer as WebGLRenderer).getClearAlpha();\n (this._renderer as WebGLRenderer).setClearAlpha(0);\n this._groundGroup.visible = false;\n this.shadowGroundPlane.visible = false;\n this._groundContactCamera.setCameraHelperVisibility(false);\n\n if (this.noNeedOfUpdateCount === 0) {\n this._renderGroundContact(this.scene);\n this._renderBlur();\n } else if (this.noNeedOfUpdateCount === 1) {\n this._renderBlur();\n }\n this._renderReduceBandingBlur();\n\n (this._renderer as WebGLRenderer).setRenderTarget(null);\n (this._renderer as WebGLRenderer).setClearAlpha(initialClearAlpha);\n this._groundGroup.visible = true;\n this.shadowGroundPlane.visible = this.parameters.enabled;\n this._groundContactCamera.setCameraHelperVisibility(\n this.parameters.cameraHelper,\n );\n }\n\n private _renderGroundContact(scene: Scene) {\n const initialBackground = scene.background;\n scene.background = null;\n scene.overrideMaterial = this._depthMaterial;\n (this._renderer as WebGLRenderer).setRenderTarget(this.renderTarget);\n this._renderer.clear();\n const autoClearBackup = (this._renderer as WebGLRenderer).autoClear;\n (this._renderer as WebGLRenderer).autoClear = false;\n if (this.parameters.hardLayers) {\n this._groundContactCamera.layers.mask = this.parameters.hardLayers.mask;\n this._groundContactCamera.updateCameraFarPlane(10);\n this._depthMaterial.userData.fadeoutBias.value = 0.99;\n this._renderer.render(scene, this._groundContactCamera);\n this._groundContactCamera.updateCameraFarPlane(this._groundShadowFar);\n this._depthMaterial.userData.fadeoutBias.value =\n this.parameters.fadeoutBias / this._groundShadowFar;\n }\n this._groundContactCamera.layers.enableAll();\n if (this.parameters.softLayers) {\n this._groundContactCamera.layers.mask = this.parameters.softLayers.mask;\n }\n if (this.renderCacheManager) {\n this.renderCacheManager.render(this, scene, () => {\n this._renderer.render(scene, this._groundContactCamera);\n });\n } else {\n this._renderer.render(scene, this._groundContactCamera);\n }\n (this._renderer as WebGLRenderer).autoClear = autoClearBackup;\n scene.overrideMaterial = null;\n scene.background = initialBackground;\n }\n\n private _renderBlur() {\n this._renderBlurPass(\n (this._blurScale * this.parameters.blurMin) / this.parameters.planeSize,\n (this._blurScale * this.parameters.blurMax) / this.parameters.planeSize,\n );\n }\n\n private _renderReduceBandingBlur() {\n const finalBlurAmount =\n (this._blurScale * 0.01) / this.parameters.planeSize;\n this._renderBlurPass(finalBlurAmount, finalBlurAmount);\n }\n\n private _renderBlurPass(uvMin: number, uvMax: number): void {\n this._blurPass.render(\n this._renderer as WebGLRenderer,\n [this.renderTarget, this._renderTargetBlur, this.renderTarget],\n [uvMin, uvMin],\n [uvMax, uvMax],\n );\n }\n}\n\nclass GroundContactCamera extends OrthographicCamera {\n private cameraHelper?: CameraHelper;\n\n constructor() {\n super(-1, 1, -1, 1, -1, 1);\n this.rotation.x = Math.PI; // make camera look upwards\n }\n\n public updateCameraFormPlaneSize(planeSize: number, farPlane: number) {\n this.left = -planeSize / 2;\n this.right = planeSize / 2;\n this.top = -planeSize / 2;\n this.bottom = planeSize / 2;\n this.near = 0;\n this.far = farPlane;\n this.updateProjectionMatrix();\n this.cameraHelper?.update();\n }\n\n public updateCameraFarPlane(farPlane: number) {\n this.far = farPlane;\n this.updateProjectionMatrix();\n this.cameraHelper?.update();\n }\n\n public updateCameraHelper(enabled: boolean, scene?: Scene) {\n if (enabled) {\n this.cameraHelper = this.cameraHelper ?? new CameraHelper(this);\n this.cameraHelper.visible = true;\n scene?.add(this.cameraHelper);\n } else if (this.cameraHelper?.parent) {\n this.cameraHelper?.removeFromParent();\n }\n }\n\n public setCameraHelperVisibility(visible: boolean) {\n if (this.cameraHelper) {\n this.cameraHelper.visible = visible;\n }\n }\n}\n","import type {\n Blending,\n Camera,\n MeshNormalMaterial,\n OrthographicCamera,\n PerspectiveCamera,\n} from 'three';\nimport { UniformsUtils, NoBlending, ShaderMaterial } from 'three';\n\nexport interface GBufferNormalDepthMaterialParameters {\n floatBufferType?: boolean;\n linearDepth?: boolean;\n camera?: Camera;\n blending?: Blending;\n}\n\nexport type GBufferNormalDepthMaterial =\n | NormalAndDepthRenderMaterial\n | MeshNormalMaterial;\n\nconst glslNormalAndDepthVertexShader = `varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n#endif\n\n void main() {\n vNormal = normalMatrix * normal;\n vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);\n #if LINEAR_DEPTH == 1\n vZ = viewPosition.z; \n #endif\n gl_Position = projectionMatrix * viewPosition;\n }`;\n\nconst glslNormalAndDepthFragmentShader = `varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n uniform float cameraNear;\n uniform float cameraFar;\n#endif\n\n void main() {\n #if FLOAT_BUFFER == 1\n vec3 normal = normalize(vNormal);\n #else\n vec3 normal = normalize(vNormal) * 0.5 + 0.5;\n #endif\n #if LINEAR_DEPTH == 1\n float depth = (-vZ - cameraNear) / (cameraFar - cameraNear);\n #else\n float depth = gl_FragCoord.z;\n #endif\n gl_FragColor = vec4(normal, depth);\n }`;\n\nexport class NormalAndDepthRenderMaterial extends ShaderMaterial {\n private static _normalAndDepthShader = {\n uniforms: {\n cameraNear: { value: 0.1 },\n cameraFar: { value: 1 },\n },\n defines: {\n FLOAT_BUFFER: 0,\n LINEAR_DEPTH: 0,\n },\n vertexShader: glslNormalAndDepthVertexShader,\n fragmentShader: glslNormalAndDepthFragmentShader,\n };\n\n constructor(parameters: GBufferNormalDepthMaterialParameters) {\n super({\n defines: Object.assign({\n ...NormalAndDepthRenderMaterial._normalAndDepthShader.defines,\n FLOAT_BUFFER: parameters?.floatBufferType ? 1 : 0,\n LINEAR_DEPTH: parameters?.linearDepth ? 1 : 0,\n }),\n uniforms: UniformsUtils.clone(\n NormalAndDepthRenderMaterial._normalAndDepthShader.uniforms,\n ),\n vertexShader:\n NormalAndDepthRenderMaterial._normalAndDepthShader.vertexShader,\n fragmentShader:\n NormalAndDepthRenderMaterial._normalAndDepthShader.fragmentShader,\n blending: parameters?.blending ?? NoBlending,\n });\n this.update(parameters);\n }\n\n public update(\n parameters?: GBufferNormalDepthMaterialParameters,\n ): NormalAndDepthRenderMaterial {\n if (parameters?.camera !== undefined) {\n const camera =\n (parameters?.camera as OrthographicCamera) ||\n (parameters?.camera as PerspectiveCamera);\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n }\n return this;\n }\n}\n","import { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport type { CopyTransformMaterialParameters } from '../shader-utility';\nimport {\n ALPHA_RGBA,\n ALPHA_TRANSFORM,\n CopyTransformMaterial,\n DEFAULT_UV_TRANSFORM,\n} from '../shader-utility';\nimport {\n isTransmissiveMaterial,\n isTransparentMaterial,\n ObjectRenderCache,\n} from '../render-cache';\nimport type { GBufferNormalDepthMaterial } from '../materials/normal-depth-material';\nimport { NormalAndDepthRenderMaterial } from '../materials/normal-depth-material';\nimport type {\n Camera,\n MagnificationTextureFilter,\n Mesh,\n Object3D,\n Scene,\n ShaderMaterial,\n Texture,\n TextureFilter,\n WebGLRenderer,\n Material,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport {\n DepthStencilFormat,\n DepthTexture,\n FloatType,\n MeshNormalMaterial,\n NearestFilter,\n NoBlending,\n UnsignedInt248Type,\n WebGLRenderTarget,\n} from 'three';\nimport { DIMENSIONING_GEOMETRY } from '../../../../../configurator-core/src/utils/dimensioning-helper';\n\nexport interface GBufferTextures {\n get isFloatGBufferWithRgbNormalAlphaDepth(): boolean;\n get gBufferTexture(): Texture;\n get depthBufferTexture(): Texture;\n get textureWithDepthValue(): Texture;\n}\n\nexport interface GBufferParameters {\n [key: string]: any;\n depthNormalScale: number;\n}\n\nexport interface GBufferRenderTargetsParameters {\n capabilities?: any;\n textureMinificationFilter?: TextureFilter;\n textureMagnificationFilter?: MagnificationTextureFilter;\n width?: number;\n height?: number;\n samples?: number;\n shared?: boolean;\n depthNormalScale?: number;\n}\n\nexport class GBufferRenderPass extends RenderPass implements GBufferTextures {\n public parameters: GBufferParameters;\n public readonly floatRgbNormalAlphaDepth: boolean = false;\n public readonly linearDepth: boolean = false;\n public copyToSeparateDepthBuffer: boolean = false;\n private _gBufferMaterialCache?: GBufferMaterialCache;\n private _targetMinificationTextureFilter: TextureFilter;\n private _targetMagnificationTextureFilter: MagnificationTextureFilter;\n private _width: number;\n private _height: number;\n private _samples: number;\n private _gBufferRenderMaterial?: GBufferNormalDepthMaterial;\n private _depthNormalRenderTarget?: WebGLRenderTarget;\n private _separateDeptRenderTarget?: WebGLRenderTarget;\n private _copyMaterial?: CopyTransformMaterial;\n private _shared: boolean;\n public needsUpdate: boolean = true;\n public drawGround: boolean = true;\n\n public set groundDepthWrite(value: boolean) {\n if (this._gBufferMaterialCache) {\n this._gBufferMaterialCache.groundDepthWrite = value;\n }\n }\n\n public get isFloatGBufferWithRgbNormalAlphaDepth(): boolean {\n return this.floatRgbNormalAlphaDepth;\n }\n public get gBufferTexture(): Texture {\n return this.depthNormalRenderTarget.texture;\n }\n public get depthBufferTexture(): Texture {\n return this.copyToSeparateDepthBuffer && this.floatRgbNormalAlphaDepth\n ? this.separateDeptRenderTarget.texture\n : (this.depthNormalRenderTarget.depthTexture as Texture);\n }\n\n public get textureWithDepthValue(): Texture {\n return this.floatRgbNormalAlphaDepth\n ? this.depthNormalRenderTarget.texture\n : (this.depthNormalRenderTarget.depthTexture as Texture);\n }\n\n public updateGBufferRenderMaterial(camera: Camera): Material {\n this._gBufferRenderMaterial =\n this._gBufferRenderMaterial ??\n (this.floatRgbNormalAlphaDepth\n ? new NormalAndDepthRenderMaterial({\n blending: NoBlending,\n floatBufferType: true,\n linearDepth: false,\n })\n : new MeshNormalMaterial({ blending: NoBlending }));\n if (this._gBufferRenderMaterial instanceof NormalAndDepthRenderMaterial) {\n this._gBufferRenderMaterial.update({ camera });\n }\n return this._gBufferRenderMaterial;\n }\n\n public get depthNormalRenderTarget(): WebGLRenderTarget {\n if (!this._depthNormalRenderTarget) {\n if (this.floatRgbNormalAlphaDepth) {\n this._depthNormalRenderTarget = new WebGLRenderTarget(\n this._width * this.parameters.depthNormalScale,\n this._height * this.parameters.depthNormalScale,\n {\n minFilter: this._targetMinificationTextureFilter,\n magFilter: this._targetMagnificationTextureFilter,\n type: FloatType,\n samples: this._samples,\n },\n );\n } else {\n const depthTexture = new DepthTexture(\n this._width * this.parameters.depthNormalScale,\n this._height * this.parameters.depthNormalScale,\n );\n depthTexture.format = DepthStencilFormat;\n depthTexture.type = UnsignedInt248Type;\n this._depthNormalRenderTarget = new WebGLRenderTarget(\n this._width * this.parameters.depthNormalScale,\n this._height * this.parameters.depthNormalScale,\n {\n minFilter: this._targetMinificationTextureFilter,\n magFilter: this._targetMagnificationTextureFilter,\n depthTexture,\n },\n );\n }\n }\n return this._depthNormalRenderTarget;\n }\n\n public get separateDeptRenderTarget(): WebGLRenderTarget {\n if (!this._separateDeptRenderTarget) {\n this._separateDeptRenderTarget = new WebGLRenderTarget(\n this._width * this.parameters.depthNormalScale,\n this._height * this.parameters.depthNormalScale,\n {\n minFilter: this._targetMinificationTextureFilter,\n magFilter: this._targetMagnificationTextureFilter,\n //format: RedFormat,\n type: FloatType,\n samples: 0,\n },\n );\n }\n return this._separateDeptRenderTarget;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n parameters?: GBufferRenderTargetsParameters,\n ) {\n super(renderPassManager);\n this.floatRgbNormalAlphaDepth = parameters?.capabilities?.isWebGL2 ?? false;\n if (this.renderCacheManager) {\n this._gBufferMaterialCache = new GBufferMaterialCache();\n this.renderCacheManager.registerCache(this, this._gBufferMaterialCache);\n }\n this.parameters = {\n depthNormalScale: parameters?.depthNormalScale ?? 1,\n };\n this._targetMinificationTextureFilter =\n parameters?.textureMinificationFilter ?? NearestFilter;\n this._targetMagnificationTextureFilter =\n parameters?.textureMagnificationFilter ?? NearestFilter;\n this._width = parameters?.width ?? 1024;\n this._height = parameters?.height ?? 1024;\n this._samples = parameters?.samples ?? 0;\n this._shared = parameters?.shared ?? false;\n }\n\n public dispose() {\n super.dispose();\n this._gBufferRenderMaterial?.dispose();\n this._depthNormalRenderTarget?.dispose();\n }\n\n public setSize(width: number, height: number) {\n this._width = width;\n this._height = height;\n this._depthNormalRenderTarget?.setSize(\n this._width * this.parameters.depthNormalScale,\n this._height * this.parameters.depthNormalScale,\n );\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n if (this._shared && !this.needsUpdate) {\n return;\n }\n this.needsUpdate = false;\n this.renderPassManager.setGroundVisibility(this.drawGround);\n if (this.renderCacheManager) {\n this.renderCacheManager.render(this, this.scene, () => {\n this._renderGBuffer(renderer, this.scene, this.camera);\n });\n } else {\n this._renderGBuffer(renderer, this.scene, this.camera);\n }\n this.renderPassManager.setGroundVisibility(false);\n if (this.floatRgbNormalAlphaDepth && this.copyToSeparateDepthBuffer) {\n this._copyDepthToSeparateDepthTexture(\n renderer as WebGLRenderer,\n this.depthNormalRenderTarget,\n );\n }\n }\n\n private _renderGBuffer(\n renderer: WebGLRenderer | WebGPURenderer,\n scene: Scene,\n camera: Camera,\n ) {\n this.passRenderer.renderWithOverrideMaterial(\n renderer as WebGLRenderer,\n scene,\n camera,\n this.updateGBufferRenderMaterial(camera),\n this.depthNormalRenderTarget,\n 0x7777ff,\n 1.0,\n );\n }\n\n protected getCopyMaterial(\n parameters?: CopyTransformMaterialParameters,\n ): ShaderMaterial {\n this._copyMaterial ??= new CopyTransformMaterial();\n return this._copyMaterial.update(parameters);\n }\n\n private _copyDepthToSeparateDepthTexture(\n renderer: WebGLRenderer,\n source: WebGLRenderTarget,\n ) {\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: source.texture,\n blending: NoBlending,\n colorTransform: ALPHA_TRANSFORM,\n colorBase: ALPHA_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n this.separateDeptRenderTarget,\n );\n }\n}\n\nexport class GBufferMaterialCache extends ObjectRenderCache {\n private _groundDepthWrite: boolean = true;\n\n set groundDepthWrite(value: boolean) {\n this._groundDepthWrite = value;\n }\n\n public constructor() {\n super();\n }\n\n public dispose(): void {\n // nothing to do\n }\n\n public addLineOrPoint(object3d: Object3D): void {\n this.addToCache(object3d, { visible: false });\n }\n\n public addMesh(mesh: Mesh): void {\n if (mesh.userData.isFloor) {\n this.addToCache(mesh, { visible: this._groundDepthWrite });\n } else if (mesh.visible) {\n if (isTransparentMaterial(mesh.material, 0.7)) {\n this.addToCache(mesh, { visible: false });\n } else if (isTransmissiveMaterial(mesh.material)) {\n this.addToCache(mesh, { visible: false });\n }\n }\n }\n\n public addObject(object3d: Object3D): void {\n if (object3d.name === DIMENSIONING_GEOMETRY) {\n this.addToCache(object3d, { visible: false });\n }\n }\n}\n","import { BlurPass } from '../render-utility';\nimport { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport {\n BlurShader,\n CopyTransformMaterial,\n FLIP_Y_UV_TRANSFORM,\n COLOR_COPY_BLEND_MODES,\n} from '../shader-utility';\nimport type {\n Camera,\n OrthographicCamera,\n Scene,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport {\n DepthTexture,\n Matrix4,\n NoBlending,\n PerspectiveCamera,\n RGBAFormat,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n Vector3,\n WebGLRenderTarget,\n} from 'three';\n\ninterface CameraOffsets {\n _offset: {\n left: number;\n top: number;\n right: number;\n bottom: number;\n };\n}\n\nexport interface GroundReflectionParameters {\n [key: string]: any;\n enabled: boolean;\n intensity: number;\n fadeOutDistance: number;\n fadeOutExponent: number;\n brightness: number;\n blurHorizontal: number;\n blurVertical: number;\n blurAscent: number;\n groundLevel: number;\n groundReflectionScale: number;\n renderTargetDownScale: number;\n}\n\nexport interface GroundReflectionConstructorParameters {\n enabled?: boolean;\n intensity?: number;\n fadeOutDistance?: number;\n fadeOutExponent?: number;\n brightness?: number;\n blurHorizontal?: number;\n blurVertical?: number;\n blurAscent?: number;\n groundLevel?: number;\n groundReflectionScale?: number;\n renderTargetDownScale?: number;\n}\n\nexport class GroundReflectionPass extends RenderPass {\n private _width: number;\n private _height: number;\n private _samples: number;\n public parameters: GroundReflectionParameters;\n public reflectionFadeInScale: number = 1;\n private _reflectionRenderTarget?: WebGLRenderTarget;\n private _intensityRenderTarget?: WebGLRenderTarget;\n private _blurRenderTarget?: WebGLRenderTarget;\n private _blurPass: BlurPass;\n private _reflectionIntensityMaterial: GroundReflectionIntensityMaterial;\n private _copyMaterial: CopyTransformMaterial;\n\n public get reflectionRenderTarget(): WebGLRenderTarget {\n this._reflectionRenderTarget =\n this._reflectionRenderTarget ?? this._newRenderTarget(true);\n return this._reflectionRenderTarget;\n }\n\n public get intensityRenderTarget(): WebGLRenderTarget {\n this._intensityRenderTarget =\n this._intensityRenderTarget ?? this._newRenderTarget(false);\n return this._intensityRenderTarget;\n }\n\n public get blurRenderTarget(): WebGLRenderTarget {\n this._blurRenderTarget =\n this._blurRenderTarget ?? this._newRenderTarget(false);\n return this._blurRenderTarget;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n width: number,\n height: number,\n samples: number,\n parameters: GroundReflectionConstructorParameters,\n ) {\n super(renderPassManager);\n this._width = width;\n this._height = height;\n this._samples = samples ?? 1;\n this.parameters = {\n enabled: false,\n intensity: 0.25,\n fadeOutDistance: 1,\n fadeOutExponent: 4,\n brightness: 1.0,\n blurHorizontal: 3.0,\n blurVertical: 6.0,\n blurAscent: 0,\n groundLevel: 0,\n groundReflectionScale: 1,\n renderTargetDownScale: 4,\n ...parameters,\n };\n this._copyMaterial = new CopyTransformMaterial(\n {},\n COLOR_COPY_BLEND_MODES.ADDITIVE,\n true,\n true,\n );\n this._updateCopyMaterial(null);\n this._reflectionIntensityMaterial = new GroundReflectionIntensityMaterial({\n width: this._width / this.parameters.renderTargetDownScale,\n height: this._height / this.parameters.renderTargetDownScale,\n });\n this._blurPass = new BlurPass(BlurShader, {\n ...parameters,\n passRenderer: this.renderPassManager.passRenderer,\n });\n }\n\n private _newRenderTarget(createDepthTexture: boolean): WebGLRenderTarget {\n const _width = this._width / this.parameters.renderTargetDownScale;\n const _height = this._height / this.parameters.renderTargetDownScale;\n const additionalParameters: any = {};\n if (createDepthTexture) {\n const depthTexture = new DepthTexture(_width, _height);\n additionalParameters.depthTexture = depthTexture;\n additionalParameters.samples = this._samples;\n } else {\n additionalParameters.samples = 1;\n }\n return new WebGLRenderTarget(_width, _height, {\n format: RGBAFormat,\n ...additionalParameters,\n });\n }\n\n public dispose() {\n super.dispose();\n this._reflectionRenderTarget?.dispose();\n this._intensityRenderTarget?.dispose();\n this._blurRenderTarget?.dispose();\n this._blurPass.dispose();\n this._reflectionIntensityMaterial.dispose();\n this._copyMaterial.dispose();\n }\n\n public setSize(width: number, height: number) {\n this._width = width;\n this._height = height;\n this._reflectionRenderTarget?.setSize(\n this._width / this.parameters.renderTargetDownScale,\n this._height / this.parameters.renderTargetDownScale,\n );\n this._intensityRenderTarget?.setSize(\n this._width / this.parameters.renderTargetDownScale,\n this._height / this.parameters.renderTargetDownScale,\n );\n this._blurRenderTarget?.setSize(\n this._width / this.parameters.renderTargetDownScale,\n this._height / this.parameters.renderTargetDownScale,\n );\n this._reflectionIntensityMaterial?.update({\n width: this._width / this.parameters.renderTargetDownScale,\n height: this._height / this.parameters.renderTargetDownScale,\n });\n }\n\n public updateParameters(parameters: GroundReflectionParameters) {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n }\n }\n }\n\n public updateBounds(groundLevel: number, groundReflectionScale: number) {\n this.parameters.groundLevel = groundLevel;\n this.parameters.groundReflectionScale = groundReflectionScale;\n }\n\n private _updateCopyMaterial(\n renderTarget: WebGLRenderTarget | null,\n reflectionFadeInScale: number = 1,\n ) {\n const intensity = this.parameters.intensity * reflectionFadeInScale;\n const brightness = this.parameters.brightness;\n this._copyMaterial.update({\n texture: renderTarget?.texture ?? undefined,\n // prettier-ignore\n colorTransform: new Matrix4().set(\n brightness, 0, 0, 0,\n 0, brightness, 0, 0,\n 0, 0, brightness, 0,\n 0, 0, 0, intensity\n ),\n multiplyChannels: 0,\n uvTransform: FLIP_Y_UV_TRANSFORM,\n });\n this._copyMaterial.depthTest = true;\n this._copyMaterial.depthWrite = false;\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n if (\n !this.parameters.enabled ||\n !(this.camera instanceof PerspectiveCamera)\n ) {\n return;\n }\n const groundReflectionCamera = this._createGroundReflectionCamera(\n this.camera,\n );\n this.renderCacheManager.render('groundReflection', this.scene, () => {\n this._renderGroundReflection(\n renderer as WebGLRenderer,\n this.scene,\n groundReflectionCamera,\n this.reflectionRenderTarget,\n );\n });\n this._renderGroundReflectionIntensity(\n renderer as WebGLRenderer,\n groundReflectionCamera,\n this.intensityRenderTarget,\n );\n if (\n this.parameters.blurHorizontal > 0 ||\n this.parameters.blurVertical > 0\n ) {\n this.blurReflection(renderer as WebGLRenderer, this.camera, [\n this.intensityRenderTarget,\n this.blurRenderTarget,\n this.intensityRenderTarget,\n ]);\n }\n this._updateCopyMaterial(\n this.intensityRenderTarget,\n this.reflectionFadeInScale,\n );\n this.passRenderer.renderScreenSpace(\n renderer as WebGLRenderer,\n this._copyMaterial,\n (renderer as WebGLRenderer).getRenderTarget(),\n );\n }\n\n private _renderGroundReflection(\n renderer: WebGLRenderer,\n scene: Scene,\n groundReflectionCamera: Camera,\n renderTarget: WebGLRenderTarget | undefined,\n ) {\n const renderTargetBackup = renderer.getRenderTarget();\n if (renderTarget) {\n renderer.setRenderTarget(renderTarget);\n this.passRenderer.clear(renderer, renderTarget, 0x000000, 0);\n }\n renderer.render(scene, groundReflectionCamera);\n if (renderTarget) {\n renderer.setRenderTarget(renderTargetBackup);\n }\n }\n\n private _renderGroundReflectionIntensity(\n renderer: WebGLRenderer,\n groundReflectionCamera: Camera,\n renderTarget: WebGLRenderTarget,\n ) {\n const renderTargetBackup = renderer.getRenderTarget();\n renderer.setRenderTarget(renderTarget);\n this.passRenderer.renderScreenSpace(\n renderer,\n this._reflectionIntensityMaterial.update({\n texture: this.reflectionRenderTarget.texture,\n depthTexture: this.reflectionRenderTarget.depthTexture as Texture,\n camera: groundReflectionCamera,\n groundLevel: this.parameters.groundLevel,\n fadeOutDistance:\n this.parameters.fadeOutDistance *\n this.parameters.groundReflectionScale,\n fadeOutExponent: this.parameters.fadeOutExponent,\n }),\n renderer.getRenderTarget(),\n );\n renderer.setRenderTarget(renderTargetBackup);\n }\n\n public blurReflection(\n renderer: WebGLRenderer,\n camera: Camera,\n renderTargets: WebGLRenderTarget[],\n ): void {\n const cameraUpVector = new Vector3(\n camera.matrixWorld.elements[4],\n camera.matrixWorld.elements[5],\n camera.matrixWorld.elements[6],\n );\n const blurHorMin = this.parameters.blurHorizontal / this._width;\n const blurVerMin =\n (this.parameters.blurVertical / this._height) *\n Math.abs(cameraUpVector.dot(new Vector3(0, 0, 1)));\n this._blurPass.render(\n renderer,\n renderTargets,\n [blurHorMin * 4, blurVerMin * 4],\n [\n blurHorMin * 4 * (1 + this.parameters.blurAscent),\n blurVerMin * 4 * (1 + this.parameters.blurAscent),\n ],\n );\n }\n\n private _createGroundReflectionCamera(camera: Camera): Camera {\n const groundReflectionCamera = camera.clone() as PerspectiveCamera;\n const cameraOffset = groundReflectionCamera as unknown as CameraOffsets;\n if (cameraOffset._offset) {\n cameraOffset._offset = {\n left: cameraOffset._offset.left,\n top: 1 - cameraOffset._offset.bottom,\n right: cameraOffset._offset.right,\n bottom: 1 - cameraOffset._offset.top,\n };\n }\n groundReflectionCamera.position.set(\n camera.position.x,\n -camera.position.y + 2 * this.parameters.groundLevel,\n camera.position.z,\n );\n //groundReflectionCamera.lookAt(0, 2 * groundLevel, 0);\n groundReflectionCamera.rotation.set(\n -camera.rotation.x,\n camera.rotation.y,\n -camera.rotation.z,\n );\n //groundReflectionCamera.scale.set(1, -1, 1);\n groundReflectionCamera.updateMatrixWorld();\n groundReflectionCamera.updateProjectionMatrix();\n return groundReflectionCamera;\n }\n}\n\nconst glslGroundReflectionIntensityVertexShader = `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }`;\n\nconst glslGroundReflectionIntensityFragmentShader = `\n uniform sampler2D tDiffuse;\n uniform sampler2D tDepth;\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform mat4 cameraProjectionMatrix;\n uniform mat4 cameraInverseProjectionMatrix;\n uniform mat4 inverseViewMatrix;\n uniform float groundLevel;\n uniform float fadeOutDistance;\n uniform float fadeOutExponent;\n varying vec2 vUv;\n\n #include <packing>\n\n float getDepth(const in vec2 screenPosition) {\n return texture2D(tDepth, screenPosition).x;\n }\n\n float getLinearDepth(const in vec2 screenPosition) {\n #if PERSPECTIVE_CAMERA == 1\n float fragCoordZ = texture2D(tDepth, screenPosition).x;\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return texture2D(tDepth, screenPosition).x;\n #endif\n }\n\n float getViewZ(const in float depth) {\n #if PERSPECTIVE_CAMERA == 1\n return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n #else\n return 0.0;//orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n #endif\n }\n\n vec3 getViewPosition(const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n float clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n vec4 clipPosition = vec4((vec3(screenPosition, depth) - 0.5) * 2.0, 1.0);\n clipPosition *= clipW;\n return (cameraInverseProjectionMatrix * clipPosition).xyz;\n }\n\n void main() {\n float verticalBias = 1.5 / resolution.y;\n vec2 uv = vUv.xy + vec2(0.0, verticalBias);\n float depth = getDepth(uv);\n float viewZ = getViewZ(depth);\n vec4 worldPosition = inverseViewMatrix * vec4(getViewPosition(uv, depth, viewZ), 1.0);\n float distance = worldPosition.y - groundLevel;\n vec2 diffuseTextureSize = vec2(textureSize(tDiffuse, 0 ));\n vec4 fragColor = texelFetch(tDiffuse, ivec2(uv * diffuseTextureSize), 0).rgba;\n #if LINEAR_TO_SRGB == 1\n fragColor.rgb = mix(fragColor.rgb * 12.92, 1.055 * pow(fragColor.rgb, vec3(0.41666)) - 0.055, step(0.0031308, fragColor.rgb));\n #endif\n float fadeOutAlpha = pow(clamp(1.0 - distance / fadeOutDistance, 0.0, 1.0), fadeOutExponent);\n fragColor.a *= fadeOutAlpha * step(depth, 0.9999);\n #if PREMULTIPLIED_ALPHA == 1\n gl_FragColor = vec4(fragColor.rgb * fragColor.a, fragColor.a);\n #else\n gl_FragColor = fragColor;\n #endif\n }`;\n\nexport interface GroundReflectionIntensityMaterialParameters {\n texture?: Texture;\n depthTexture?: Texture;\n camera?: Camera;\n groundLevel?: number;\n fadeOutDistance?: number;\n fadeOutExponent?: number;\n width?: number;\n height?: number;\n}\n\nexport class GroundReflectionIntensityMaterial extends ShaderMaterial {\n private static shader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n tDepth: { value: null as Texture | null },\n resolution: { value: new Vector2() },\n cameraNear: { value: 0.1 },\n cameraFar: { value: 1 },\n cameraProjectionMatrix: { value: new Matrix4() },\n cameraInverseProjectionMatrix: { value: new Matrix4() },\n inverseViewMatrix: { value: new Matrix4() },\n groundLevel: { value: 0 },\n fadeOutDistance: { value: 1 },\n fadeOutExponent: { value: 1 },\n },\n defines: {\n PERSPECTIVE_CAMERA: 1,\n LINEAR_TO_SRGB: 0,\n PREMULTIPLIED_ALPHA: 1,\n },\n vertexShader: glslGroundReflectionIntensityVertexShader,\n fragmentShader: glslGroundReflectionIntensityFragmentShader,\n };\n\n constructor(parameters?: GroundReflectionIntensityMaterialParameters) {\n super({\n defines: Object.assign(\n {},\n GroundReflectionIntensityMaterial.shader.defines,\n ),\n uniforms: UniformsUtils.clone(\n GroundReflectionIntensityMaterial.shader.uniforms,\n ),\n vertexShader: GroundReflectionIntensityMaterial.shader.vertexShader,\n fragmentShader: GroundReflectionIntensityMaterial.shader.fragmentShader,\n blending: NoBlending,\n });\n this.update(parameters);\n }\n\n public update(\n parameters?: GroundReflectionIntensityMaterialParameters,\n ): GroundReflectionIntensityMaterial {\n if (parameters?.texture !== undefined) {\n this.uniforms.tDiffuse.value = parameters?.texture;\n }\n if (parameters?.depthTexture !== undefined) {\n this.uniforms.tDepth.value = parameters?.depthTexture;\n }\n if (parameters?.width || parameters?.height) {\n const _width = parameters?.width ?? this.uniforms.resolution.value.x;\n const _height = parameters?.height ?? this.uniforms.resolution.value.y;\n this.uniforms.resolution.value.set(_width, _height);\n }\n if (parameters?.camera !== undefined) {\n const camera =\n (parameters?.camera as OrthographicCamera) ||\n (parameters?.camera as PerspectiveCamera);\n this.uniforms.cameraNear.value = camera.near;\n this.uniforms.cameraFar.value = camera.far;\n this.uniforms.cameraProjectionMatrix.value.copy(camera.projectionMatrix);\n this.uniforms.cameraInverseProjectionMatrix.value.copy(\n camera.projectionMatrixInverse,\n );\n this.uniforms.inverseViewMatrix.value.copy(camera.matrixWorld);\n }\n if (parameters?.groundLevel !== undefined) {\n this.uniforms.groundLevel.value = parameters?.groundLevel;\n }\n if (parameters?.fadeOutDistance !== undefined) {\n this.uniforms.fadeOutDistance.value = parameters?.fadeOutDistance;\n }\n if (parameters?.fadeOutExponent !== undefined) {\n this.uniforms.fadeOutExponent.value = parameters?.fadeOutExponent;\n }\n return this;\n }\n}\n","import {\n\tBackSide,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMesh,\n\tMeshBasicMaterial\n} from 'three';\n\n/**\n * Creates a visual aid for rect area lights.\n *\n * `RectAreaLightHelper` must be added as a child of the light.\n *\n * ```js\n * const light = new THREE.RectAreaLight( 0xffffbb, 1.0, 5, 5 );\n * const helper = new RectAreaLightHelper( light );\n * light.add( helper );\n * ```\n *\n * @augments Line\n * @three_import import { RectAreaLightHelper } from 'three/addons/helpers/RectAreaLightHelper.js';\n */\nclass RectAreaLightHelper extends Line {\n\n\t/**\n\t * Constructs a new rect area light helper.\n\t *\n\t * @param {RectAreaLight} light - The light to visualize.\n\t * @param {number|Color|string} [color] - The helper's color.\n\t * If this is not the set, the helper will take the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tconst positions = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineBasicMaterial( { fog: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light to visualize.\n\t\t *\n\t\t * @type {RectAreaLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The helper's color. If `undefined`, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string|undefined}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'RectAreaLightHelper';\n\n\t\t//\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { side: BackSide, fog: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld() {\n\n\t\tthis.scale.set( 0.5 * this.light.width, 0.5 * this.light.height, 1 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\t\t\tthis.children[ 0 ].material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// prevent hue shift\n\t\t\tconst c = this.material.color;\n\t\t\tconst max = Math.max( c.r, c.g, c.b );\n\t\t\tif ( max > 1 ) c.multiplyScalar( 1 / max );\n\n\t\t\tthis.children[ 0 ].material.color.copy( this.material.color );\n\n\t\t}\n\n\t\t// ignore world scale on light\n\t\tthis.matrixWorld.extractRotation( this.light.matrixWorld ).scale( this.scale ).copyPosition( this.light.matrixWorld );\n\n\t\tthis.children[ 0 ].matrixWorld.copy( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nexport { RectAreaLightHelper };\n","import type { Box3, ShaderLibShader, WebGLRenderer } from 'three';\nimport { MeshLambertMaterial, Vector2, Vector3, Vector4 } from 'three';\n\ninterface ThreeShader {\n defines?: { [key: string]: any };\n uniforms?: { [key: string]: any };\n}\n\nexport class IlluminationBufferMaterial extends MeshLambertMaterial {\n private static _enableGroundBoundary: boolean = false;\n private static _shadowFadeOut: Vector2 = new Vector2(0.1, 20);\n private static _sceneBoxMin: Vector3 = new Vector3(-1, -1, -1);\n private static _sceneBoxMax: Vector3 = new Vector3(1, 1, 1);\n private static _distributionProperties: Vector4 = new Vector4(1, 1, 1, 1);\n\n constructor(parameters?: any) {\n super(parameters);\n this.customProgramCacheKey = this._customProgramCacheKey;\n this.onBeforeCompile = this._onBeforeCompile;\n }\n\n public static setShadowParameters(\n enableGroundBoundary: boolean,\n directionalDependency: number,\n directionalExponent: number,\n groundBoundary: number,\n groundMapScale: number,\n distance: number,\n blur: number,\n ) {\n this._enableGroundBoundary = enableGroundBoundary;\n IlluminationBufferMaterial._distributionProperties.set(\n directionalDependency,\n directionalExponent,\n groundBoundary,\n groundMapScale,\n );\n IlluminationBufferMaterial._shadowFadeOut.set(distance, blur);\n }\n\n public static setBoundingBox(box: Box3) {\n IlluminationBufferMaterial._sceneBoxMin.copy(box.min);\n IlluminationBufferMaterial._sceneBoxMax.copy(box.max);\n }\n\n private _customProgramCacheKey() {\n return IlluminationBufferMaterial._enableGroundBoundary\n ? 'GROUND_BOUNDARY'\n : 'NO_GROUND_BOUNDARY';\n }\n\n private _onBeforeCompile(\n materialShader: ShaderLibShader,\n _renderer: WebGLRenderer,\n ) {\n materialShader.vertexShader = screenSpaceShadowMaterialVertexShader;\n materialShader.fragmentShader = screenSpaceShadowMaterialFragmentShader;\n (materialShader as ThreeShader).defines = Object.assign({\n ...(materialShader as ThreeShader).defines,\n DYNAMIC_SHADOW_RADIUS: '',\n GROUND_BOUNDARY: IlluminationBufferMaterial._enableGroundBoundary ? 1 : 0,\n });\n const uniforms = (materialShader as ThreeShader).uniforms;\n if (uniforms) {\n uniforms.distributionProperties = {\n value: IlluminationBufferMaterial._distributionProperties,\n };\n uniforms.shadowFadeOut = {\n value: IlluminationBufferMaterial._shadowFadeOut,\n };\n uniforms.sceneBoxMin = { value: IlluminationBufferMaterial._sceneBoxMin };\n uniforms.sceneBoxMax = { value: IlluminationBufferMaterial._sceneBoxMax };\n }\n }\n}\n\nconst screenSpaceShadowMaterialVertexShader = `\n#define LAMBERT\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n #include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n vWorldPosition = worldPosition.xyz;\n#else\n vWorldPosition = (modelMatrix * vec4(transformed, 1.)).xyz;\n#endif\n}\n`;\n\nconst screenSpaceShadowMaterialFragmentShader = `\n#define LAMBERT\n\nuniform vec3 diffuse;\nuniform float opacity;\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n uniform vec2 shadowFadeOut;\n #define fadeOutDistance shadowFadeOut.x\n #define fadeOutBlur shadowFadeOut.y\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n#endif\nuniform vec4 distributionProperties;\n#define directionalDependency distributionProperties.x\n#define directionalExponent distributionProperties.y\n#define groundBoundary distributionProperties.z\n#define groundMapScale distributionProperties.w\n\n#include <common>\n#include <packing>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvec2 getShadowDynamicScale() {\n vec2 dynamicScale = vec2(0.0, 1.0);\n#ifdef DYNAMIC_SHADOW_RADIUS\n if (fadeOutDistance > 0.0) {\n vec3 boxDistanceVec = max(vec3(0.0), max(sceneBoxMin - vWorldPosition, vWorldPosition - sceneBoxMax));\n float boxDistance = length(boxDistanceVec);\n float shadowBase = clamp(boxDistance / fadeOutDistance, 0.0, 1.0);\n dynamicScale = vec2(shadowBase, 1.0 - shadowBase);\n }\n#endif\n return dynamicScale;\n}\n\n\n#if defined( SHADOWMAP_TYPE_PCF )\nfloat getShadowDynamicRadius(sampler2DShadow shadowMap, float shadowBias, float shadowRadius, vec4 shadowCoord, vec2 shadowScale) {\n#else\nfloat getShadowDynamicRadius(sampler2D shadowMap, float shadowBias, float shadowRadius, vec4 shadowCoord, vec2 shadowScale) {\n#endif\n float dynamicRadius = shadowRadius;\n#ifdef DYNAMIC_SHADOW_RADIUS\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if (frustumTest && fadeOutDistance > 0.0) {\n dynamicRadius = shadowRadius + fadeOutBlur * max(0.0, shadowScale.x);\n }\n#endif\n return dynamicRadius;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t#include <logdepthbuf_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\t// accumulation\n\n\tvec3 geometryPosition = - vViewPosition;\n vec3 geometryNormal = normal;\n vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n vec3 accumulatedShadowLight = vec3(0.0);\n vec3 directionDependentShadowLight = vec3(1.0);\n float groundDistance = clamp((vWorldPosition.y - sceneBoxMin.y) * 100.0, 0.0, 1.0);\n vec2 dynamicScale = getShadowDynamicScale();\n\n #if ( NUM_DIR_LIGHTS > 0 )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n IncidentLight directLight;\n vec3 incidentLightSum = vec3(0.0);\n vec3 incidentShadowLight = vec3(0.0);\n float groundShadowFactor = 1.;\n float shadowFactor;\n float dynamicRadius;\n float dotNL;\n\n #pragma unroll_loop_start\n for ( int i = 0 ; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( GROUND_BOUNDARY == 1 && UNROLLED_LOOP_INDEX == 0 )\n\n directionalLightShadow = directionalLightShadows[ i ];\n dynamicRadius = fadeOutDistance * groundMapScale;\n groundShadowFactor = groundDistance < 0.5 ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, dynamicRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n #elif defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\n directionalLightShadow = directionalLightShadows[ i ];\n dynamicRadius = getShadowDynamicRadius(directionalShadowMap[i], directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[i], dynamicScale);\n shadowFactor = ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, dynamicRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n accumulatedShadowLight += directLight.color * shadowFactor * saturate(min(dotNL * 10.0 + 0.9, 1.0));\n dotNL = dot(dot(geometryNormal, geometryPosition) >= 0.0 ? -geometryNormal : geometryNormal, directLight.direction);\n incidentLightSum += directLight.color;\n incidentShadowLight += directLight.color * mix(1.0, shadowFactor, pow(clamp(dotNL, 0.0, 1.0), directionalExponent));\n\n #endif\n }\n #pragma unroll_loop_end\n\n directionDependentShadowLight = incidentShadowLight / ( incidentLightSum + 1. - step(0., incidentLightSum) );\n #else\n accumulatedShadowLight = vec3(1.0);\n #endif\n\n\t// modulation\n\n\tvec3 outgoingLight = mix(accumulatedShadowLight, directionDependentShadowLight, max(directionalDependency, 1.0 - groundDistance));\n #if GROUND_BOUNDARY == 1\n float groundWeight = 1. - groundShadowFactor + groundDistance - (1. - groundShadowFactor) * groundDistance;\n outgoingLight = mix(vec3(1.), outgoingLight, mix(dynamicScale.y, groundWeight, groundBoundary));\n #else\n outgoingLight = mix(vec3(1.), outgoingLight, dynamicScale.y);\n #endif\n\n\t#include <opaque_fragment>\n\t#include <premultiplied_alpha_fragment>\n}\n`;\n","import { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport { RectAreaLightHelper } from 'three/examples/jsm/helpers/RectAreaLightHelper.js';\nimport type { SceneVolume } from '../render-utility';\nimport { CameraUpdate } from '../render-utility';\nimport type { LightSource } from '../light-source-detection';\nimport { isTransparentMaterial, ObjectRenderCache } from '../render-cache';\nimport { IlluminationBufferMaterial } from '../materials/illumination-buffer-material';\nimport type { Enumify } from '#/common/src/utils/types';\nimport type {\n Box3,\n Camera,\n Layers,\n Light,\n Material,\n Mesh,\n Object3D,\n PerspectiveCamera,\n RectAreaLight,\n Scene,\n ShadowMapType,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport {\n BasicShadowMap,\n DirectionalLight,\n DoubleSide,\n LinearFilter,\n LineBasicMaterial,\n MeshBasicMaterial,\n MeshPhongMaterial,\n MeshStandardMaterial,\n NearestFilter,\n OrthographicCamera,\n PCFShadowMap,\n RedFormat,\n ShadowMaterial,\n SpotLight,\n Vector2,\n Vector3,\n VSMShadowMap,\n WebGLRenderTarget,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\n\nexport const SHADOW_LIGHT_SOURCE_TYPES = {\n DIRECTION_LIGHT_SHADOW: 'DirectionalLightShadow',\n SPOT_LIGHT_SHADOW: 'SpotLightShadow',\n} as const;\n\nexport type ShadowLightSourceType = Enumify<typeof SHADOW_LIGHT_SOURCE_TYPES>;\n\nexport interface ScreenSpaceShadowMapParameters {\n [key: string]: any;\n alwaysUpdate: boolean;\n enableShadowMap: boolean;\n enableGroundBoundary: boolean;\n layers: Layers | null;\n shadowLightSourceType: ShadowLightSourceType;\n maximumNumberOfLightSources: number;\n directionalDependency: number;\n directionalExponent: number;\n groundBoundary: number;\n fadeOutDistance: number;\n fadeOutBlur: number;\n}\n\nexport const defaultScreenSpaceShadowMapParameters: ScreenSpaceShadowMapParameters =\n {\n alwaysUpdate: false,\n enableShadowMap: true,\n enableGroundBoundary: true,\n layers: null,\n shadowLightSourceType: SHADOW_LIGHT_SOURCE_TYPES.DIRECTION_LIGHT_SHADOW,\n maximumNumberOfLightSources: -1,\n directionalDependency: 1.0,\n directionalExponent: 1.0,\n groundBoundary: 1.0,\n fadeOutDistance: 0.1,\n fadeOutBlur: 5.0,\n };\n\ninterface ActiveShadowLight {\n light: Light;\n intensity: number;\n groundShadow: boolean;\n}\n\nexport interface ShadowLightSource {\n getPosition(): Vector3;\n getShadowLight(): DirectionalLight | SpotLight;\n getOriginalLight(): Light | null;\n dispose(): void;\n addTo(object: Object3D): void;\n removeFrom(object: Object3D): void;\n updatePositionAndTarget(): void;\n updateBounds(sceneBounds: SceneVolume): void;\n forceShadowUpdate(): void;\n _updateShadowType(\n typeParameters: ShadowTypeParameters,\n shadowScale: number,\n ): void;\n prepareRenderShadow(): ActiveShadowLight[];\n finishRenderShadow(): void;\n}\n\nexport interface ScreenSpaceShadowMapConstructorParameters {\n samples?: number;\n shadowMapSize?: number;\n alwaysUpdate?: boolean;\n enableShadowMap?: boolean;\n layers?: Layers | null;\n shadowLightSourceType?: ShadowLightSourceType;\n maximumNumberOfLightSources?: number;\n directionalDependency?: number;\n directionalExponent?: number;\n groundBoundary?: number;\n fadeOutDistance?: number;\n fadeOutBlur?: number;\n}\n\nexport class ScreenSpaceShadowMapPass extends RenderPass {\n public parameters: ScreenSpaceShadowMapParameters;\n public needsUpdate: boolean = false;\n public drawGround: boolean = true;\n public shadowTypeNeedsUpdate: boolean = true;\n public shadowConfiguration = new ShadowTypeConfiguration();\n private _shadowLightSources: ShadowLightSource[] = [];\n private _shadowMapPassOverrideMaterialCache: ShadowMapPassOverrideMaterialCache;\n private _viewportSize: Vector2;\n private _samples: number;\n private _shadowScale: number = 1;\n private _groundMapScale: number = 1;\n private _shadowMapSize: number;\n public castShadow: boolean;\n private _shadowRenderTarget: WebGLRenderTarget;\n private _cameraUpdate: CameraUpdate = new CameraUpdate();\n\n public get shadowTexture(): Texture {\n return this._shadowRenderTarget.texture;\n }\n\n public set shadowOnGround(value: boolean) {\n this._shadowMapPassOverrideMaterialCache.shadowOnGround = value;\n }\n\n constructor(\n renderPassManager: RenderPassManager,\n viewportSize: Vector2,\n parameters: ScreenSpaceShadowMapConstructorParameters,\n ) {\n super(renderPassManager);\n this._viewportSize = new Vector2(viewportSize.x, viewportSize.y);\n this._samples = parameters?.samples ?? 0;\n this._shadowMapSize = parameters?.shadowMapSize ?? 1024;\n this.parameters = this._getScreenSpaceShadowMapParameters(parameters);\n this.castShadow = this.parameters.enableShadowMap;\n this._shadowMapPassOverrideMaterialCache =\n new ShadowMapPassOverrideMaterialCache();\n this.renderCacheManager?.registerCache(\n this,\n this._shadowMapPassOverrideMaterialCache,\n );\n const samples = this._samples;\n this._shadowRenderTarget = new WebGLRenderTarget(\n this._viewportSize.x,\n this._viewportSize.y,\n {\n samples,\n format: RedFormat,\n magFilter: this._samples > 0 ? LinearFilter : NearestFilter,\n minFilter: this._samples > 0 ? LinearFilter : NearestFilter,\n },\n );\n }\n\n private _getScreenSpaceShadowMapParameters(\n parameters?: ScreenSpaceShadowMapConstructorParameters,\n ): ScreenSpaceShadowMapParameters {\n return {\n ...defaultScreenSpaceShadowMapParameters,\n ...parameters,\n };\n }\n\n public dispose(): void {\n super.dispose();\n this._shadowLightSources.forEach((item) => item.dispose());\n this._shadowRenderTarget.dispose();\n this._shadowMapPassOverrideMaterialCache.dispose();\n }\n\n public updateParameters(parameters: ScreenSpaceShadowMapParameters) {\n for (const propertyName in parameters) {\n if (this.parameters.hasOwnProperty(propertyName)) {\n this.parameters[propertyName] = parameters[propertyName];\n }\n }\n }\n\n public updateBounds(sceneBounds: SceneVolume, scaleShadow: number) {\n const currentScale = this._shadowScale;\n this._shadowScale = scaleShadow;\n if (Math.abs(currentScale - this._shadowScale) > 0.00001) {\n this.shadowTypeNeedsUpdate = true;\n }\n this._shadowLightSources.forEach((item) => item.updateBounds(sceneBounds));\n if (this._shadowLightSources.length > 0) {\n const shadowCamera =\n this._shadowLightSources[0].getShadowLight().shadow?.camera;\n if (shadowCamera instanceof OrthographicCamera) {\n this._groundMapScale =\n (2 * this._shadowMapSize) /\n (Math.abs(shadowCamera.right - shadowCamera.left) +\n Math.abs(shadowCamera.top - shadowCamera.bottom));\n }\n } else {\n this._groundMapScale = 1;\n }\n this._shadowMapPassOverrideMaterialCache.setBoundingBox(sceneBounds.bounds);\n }\n\n public forceShadowUpdate() {\n this._shadowLightSources.forEach((item) => item.forceShadowUpdate());\n this.needsUpdate = true;\n }\n\n public getShadowLightSources(): Light[] {\n return this._shadowLightSources.map((item) => item.getShadowLight());\n }\n\n public findShadowLightSource(lightSource: Light): Light | undefined {\n return this._shadowLightSources\n .find((item) => item.getOriginalLight() === lightSource)\n ?.getShadowLight();\n }\n\n public addRectAreaLight(\n rectAreaLight: RectAreaLight,\n parent: Object3D,\n ): void {\n const rectAreaLightShadow = new RectAreaShadowLightSource(rectAreaLight, {\n shadowMapSize: this._shadowMapSize,\n shadowLightSourceType: this.parameters.shadowLightSourceType,\n });\n this._shadowLightSources.push(rectAreaLightShadow);\n rectAreaLightShadow.addTo(parent);\n rectAreaLightShadow.updatePositionAndTarget();\n this.needsUpdate = true;\n }\n\n public updateRectAreaLights(\n rectAreaLights: RectAreaLight[],\n parent: Object3D,\n ): void {\n const shadowLightSources = this._shadowLightSources;\n this._shadowLightSources = this._createShadowLightSourceArray(false);\n for (const lightSource of shadowLightSources) {\n if (lightSource instanceof RectAreaShadowLightSource) {\n const light = lightSource.getRectAreaLight();\n if (rectAreaLights.includes(light)) {\n lightSource.updatePositionAndTarget();\n this._shadowLightSources.push(lightSource);\n }\n }\n lightSource.removeFrom(parent);\n lightSource.dispose();\n }\n rectAreaLights.forEach((light) => {\n if (\n !this._shadowLightSources.find(\n (item) =>\n item instanceof RectAreaShadowLightSource &&\n item.getRectAreaLight() === light,\n )\n ) {\n this.addRectAreaLight(light, parent);\n }\n });\n this.needsUpdate = true;\n this.shadowTypeNeedsUpdate = true;\n }\n\n public createShadowFromLightSources(\n parent: Object3D,\n lightSources: LightSource[],\n ): void {\n for (const lightSource of this._shadowLightSources) {\n lightSource.removeFrom(parent);\n lightSource.dispose();\n }\n this._shadowLightSources = this._createShadowLightSourceArray(true);\n const maxIntensity =\n lightSources.length > 0\n ? Math.max(\n ...lightSources.map(\n (lightSource: LightSource) => lightSource.maxIntensity,\n ),\n )\n : 1;\n const lightIntensityScale = 1 / maxIntensity;\n this._addShadowFromLightSources(lightSources, lightIntensityScale);\n this._shadowLightSources.forEach((item) => {\n item.addTo(parent);\n item.updatePositionAndTarget();\n });\n this.needsUpdate = true;\n this.shadowTypeNeedsUpdate = true;\n }\n\n private _addShadowFromLightSources(\n lightSources: LightSource[],\n lightIntensityScale: number,\n ): void {\n const lightIntensityThreshold = 0.1;\n const lightDistanceScale = 7;\n lightSources.forEach((lightSource) => {\n const lightIntensity = lightSource.maxIntensity * lightIntensityScale;\n if (\n lightIntensity >= lightIntensityThreshold &&\n lightSource.position.z >= 0\n ) {\n const lightPosition = new Vector3(\n lightSource.position.x,\n lightSource.position.z,\n lightSource.position.y,\n ).multiplyScalar(lightDistanceScale);\n const environmentLightShadow = new EnvironmentShadowLightSource(\n lightPosition,\n lightIntensity,\n {\n shadowMapSize: this._shadowMapSize,\n shadowLightSourceType: this.parameters.shadowLightSourceType,\n },\n );\n this._shadowLightSources.push(environmentLightShadow);\n }\n });\n }\n\n private _createShadowLightSourceArray(\n groundBoundary: boolean,\n ): ShadowLightSource[] {\n const shadowLightSources: ShadowLightSource[] = [];\n if (groundBoundary) {\n const groundShadowLight = new GroundShadowLightSource(\n new Vector3(0, 7, 0),\n {\n shadowMapSize: this._shadowMapSize,\n },\n );\n shadowLightSources.push(groundShadowLight);\n }\n this.parameters.enableGroundBoundary = groundBoundary;\n return shadowLightSources;\n }\n\n public setSize(width: number, height: number): void {\n this._viewportSize = new Vector2(width, height);\n this._shadowRenderTarget.setSize(\n this._viewportSize.x,\n this._viewportSize.y,\n );\n }\n\n public updatePositionAndTarget(): void {\n this._shadowLightSources.forEach((item) => item.updatePositionAndTarget());\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n const needsUpdate =\n this.needsUpdate ||\n this.parameters.alwaysUpdate ||\n this._cameraUpdate.changed(this.camera);\n if (!needsUpdate) {\n return;\n }\n this.needsUpdate = false;\n if (this.shadowTypeNeedsUpdate) {\n this.shadowTypeNeedsUpdate = false;\n this.needsUpdate = true;\n this._updateShadowType(renderer as WebGLRenderer);\n }\n const sceneBackground = this.scene.background;\n const sceneEnvironment = this.scene.environment;\n const layersMaskBackup = this.camera.layers?.mask;\n this.scene.environment = null;\n this.scene.background = null;\n if (this.parameters.layers && this.camera.layers) {\n this.camera.layers.mask = this.parameters.layers.mask;\n }\n this.renderPassManager.setGroundVisibility(this.drawGround);\n this._renderSimpleShadowMapFromShadowLightSources(\n renderer as WebGLRenderer,\n this.scene,\n this.camera,\n );\n this.renderPassManager.setGroundVisibility(false);\n if (this.camera.layers != null) {\n this.camera.layers.mask = layersMaskBackup;\n }\n this.scene.environment = sceneEnvironment;\n this.scene.background = sceneBackground;\n }\n\n private _renderSimpleShadowMapFromShadowLightSources(\n renderer: WebGLRenderer,\n scene: Scene,\n camera: Camera,\n ) {\n this._shadowMapPassOverrideMaterialCache.setShadowParameters(\n this.parameters.enableGroundBoundary,\n this.parameters.directionalDependency,\n this.parameters.directionalExponent,\n this.parameters.groundBoundary,\n this._groundMapScale,\n this.parameters.fadeOutDistance * this._shadowScale,\n this.parameters.fadeOutBlur,\n );\n const activeShadowLights = this._getSortedShadowLightSources();\n if (activeShadowLights.length === 0) {\n this.passRenderer.clear(renderer, this._shadowRenderTarget, 0xffffff, 1);\n } else {\n this._setShadowLightSourcesIntensity(activeShadowLights);\n this.renderCacheManager?.render(this, scene, () => {\n this.passRenderer.render(\n renderer,\n scene,\n camera,\n this._shadowRenderTarget,\n 0xffffff,\n 1,\n );\n });\n this._shadowLightSources.forEach((item) => item.finishRenderShadow());\n }\n }\n\n private _getSortedShadowLightSources(): ActiveShadowLight[] {\n const activeShadowLights: ActiveShadowLight[] = [];\n this._shadowLightSources.forEach((item) =>\n activeShadowLights.push(...item.prepareRenderShadow()),\n );\n activeShadowLights.sort((a, b) => {\n if (\n (a.light.castShadow && !b.light.castShadow) ||\n (a.groundShadow && !b.groundShadow)\n ) {\n return -1;\n }\n if (\n (!a.light.castShadow && b.light.castShadow) ||\n (!a.groundShadow && b.groundShadow)\n ) {\n return 1;\n }\n return b.intensity - a.intensity;\n });\n return activeShadowLights;\n }\n\n private _setShadowLightSourcesIntensity(\n activeShadowLights: ActiveShadowLight[],\n ) {\n let sumOfShadowLightIntensity = 0;\n const maximumNumberOfLightSources =\n this.parameters.maximumNumberOfLightSources;\n let noOfLights = 0;\n activeShadowLights.forEach((shadowLight) => {\n if (\n maximumNumberOfLightSources < 0 ||\n noOfLights < maximumNumberOfLightSources\n ) {\n sumOfShadowLightIntensity += shadowLight.groundShadow\n ? 0\n : shadowLight.intensity;\n if (!shadowLight.groundShadow) {\n noOfLights++;\n }\n }\n });\n noOfLights = 0;\n activeShadowLights.forEach((shadowLight) => {\n if (\n (this.parameters.enableGroundBoundary || !shadowLight.groundShadow) &&\n (maximumNumberOfLightSources < 0 ||\n noOfLights < maximumNumberOfLightSources)\n ) {\n shadowLight.light.visible = true;\n shadowLight.light.intensity = shadowLight.groundShadow\n ? shadowLight.intensity\n : shadowLight.intensity / sumOfShadowLightIntensity;\n shadowLight.light.castShadow &&= this.castShadow;\n } else {\n shadowLight.light.visible = false;\n shadowLight.light.intensity = 0;\n shadowLight.light.castShadow = false;\n }\n if (!shadowLight.groundShadow) {\n noOfLights++;\n }\n });\n }\n\n private _updateShadowType(renderer: WebGLRenderer): void {\n renderer.shadowMap.type =\n this.shadowConfiguration.currentConfiguration.type;\n const castShadow =\n this.parameters.enableShadowMap &&\n this.shadowConfiguration.currentConfiguration.castShadow;\n renderer.shadowMap.enabled = castShadow;\n renderer.shadowMap.needsUpdate = true;\n this.castShadow =\n castShadow && this.shadowConfiguration.currentConfiguration.castShadow;\n this._shadowLightSources.forEach((item) =>\n item._updateShadowType(\n this.shadowConfiguration.currentConfiguration,\n this._shadowScale,\n ),\n );\n }\n\n public switchType(type: string): boolean {\n if (!this.shadowConfiguration.switchType(type)) {\n return false;\n }\n this.needsUpdate = true;\n this.shadowTypeNeedsUpdate = true;\n return true;\n }\n}\n\nexport const SHADOW_MATERIAL_TYPE = {\n DEFAULT: 'default',\n UNLIT: 'unlit',\n EMISSIVE: 'emissive',\n SHADOW: 'shadow',\n} as const;\n\nexport type ShadowMaterialType = Enumify<typeof SHADOW_MATERIAL_TYPE>;\n\nexport class ShadowMapPassOverrideMaterialCache extends ObjectRenderCache {\n static useModifiedMaterial: boolean = true;\n private _shadowObjectMaterial: Material;\n private _unlitMaterial: Material;\n private _emissiveMaterial: Material;\n private _receiveShadowMaterial: Material;\n private _boundingBoxSet: boolean = false;\n private _shadowOnGround: boolean = true;\n\n public set shadowOnGround(value: boolean) {\n this._shadowOnGround = value;\n }\n\n constructor() {\n super();\n this._shadowObjectMaterial = this._createShadowMaterial(\n SHADOW_MATERIAL_TYPE.DEFAULT,\n );\n this._unlitMaterial = this._createShadowMaterial(\n SHADOW_MATERIAL_TYPE.UNLIT,\n );\n this._emissiveMaterial = this._createShadowMaterial(\n SHADOW_MATERIAL_TYPE.EMISSIVE,\n );\n this._receiveShadowMaterial = this._createShadowMaterial(\n SHADOW_MATERIAL_TYPE.SHADOW,\n );\n }\n\n public dispose(): void {\n this._shadowObjectMaterial.dispose();\n this._unlitMaterial.dispose();\n this._emissiveMaterial.dispose();\n this._receiveShadowMaterial.dispose();\n }\n\n public setShadowParameters(\n enableGroundBoundary: boolean,\n directionalDependency: number,\n directionalExponent: number,\n groundBoundary: number,\n groundMapScale: number,\n distance: number,\n blur: number,\n ) {\n IlluminationBufferMaterial.setShadowParameters(\n enableGroundBoundary,\n directionalDependency,\n directionalExponent,\n groundBoundary,\n groundMapScale,\n distance,\n blur,\n );\n }\n\n public setBoundingBox(box: Box3) {\n this._boundingBoxSet = true;\n IlluminationBufferMaterial.setBoundingBox(box);\n }\n\n private _createShadowMaterial(type: ShadowMaterialType): Material {\n let material: Material;\n if (type === SHADOW_MATERIAL_TYPE.EMISSIVE) {\n material = new MeshBasicMaterial({\n color: 0xffffff,\n side: DoubleSide,\n });\n } else if (type === SHADOW_MATERIAL_TYPE.UNLIT) {\n material = new MeshBasicMaterial({\n color: 0xffffff,\n side: DoubleSide,\n });\n } else if (type === SHADOW_MATERIAL_TYPE.SHADOW) {\n material = new ShadowMaterial({\n side: DoubleSide,\n });\n } else if (ShadowMapPassOverrideMaterialCache.useModifiedMaterial) {\n material = this._createCustomerShadowMaterial();\n } else {\n material = new MeshPhongMaterial({\n color: 0xffffff,\n shininess: 0,\n polygonOffsetFactor: 0,\n polygonOffsetUnits: 0,\n side: DoubleSide,\n });\n }\n return material;\n }\n\n private _createCustomerShadowMaterial(): Material {\n return new IlluminationBufferMaterial({\n side: DoubleSide,\n });\n }\n\n public addLineOrPoint(object3d: Object3D): void {\n this.addToCache(object3d, { visible: false });\n }\n\n public addMesh(mesh: Mesh): void {\n if (mesh.visible) {\n this._setMeshMaterialAndVisibility(mesh);\n }\n }\n\n public addObject(object3d: Object3D): void {\n if ((object3d as any).isLight && !object3d.userData.shadowLightSource) {\n this.addToCache(object3d, { visible: false });\n }\n }\n\n private _setMeshMaterialAndVisibility(object: Mesh) {\n if (object.userData.isFloor) {\n this._setMeshShadowFloorMaterial(object);\n } else if (\n object.material &&\n object.receiveShadow &&\n !Array.isArray(object.material) &&\n !(object.material.transparent === true && object.material.opacity < 0.9)\n ) {\n this._setShadowMaterialForOpaqueObject(object);\n } else if (isTransparentMaterial(object.material, 0.9)) {\n this.addToCache(object, { visible: false });\n } else if (object.receiveShadow) {\n this.addToCache(object, {\n castShadow: false,\n material: this._receiveShadowMaterial,\n });\n } else {\n this.addToCache(object, { visible: false });\n }\n }\n\n private _setShadowMaterialForOpaqueObject(object: Mesh) {\n const material = object.material;\n if (\n material instanceof LineBasicMaterial ||\n material instanceof MeshBasicMaterial\n ) {\n this.addToCache(object, { material: this._unlitMaterial });\n } else if (material instanceof MeshStandardMaterial) {\n this._setMeshShadowStandardMaterial(object, material);\n } else {\n this.addToCache(object, {\n material: object.receiveShadow\n ? this._shadowObjectMaterial\n : this._unlitMaterial,\n });\n }\n }\n\n private _setMeshShadowStandardMaterial(\n object: Mesh,\n material: MeshStandardMaterial,\n ) {\n const isEmissive =\n material.emissiveIntensity > 0 &&\n (material.emissive.r > 0 ||\n material.emissive.g > 0 ||\n material.emissive.b > 0);\n this.addToCache(object, {\n castShadow: isEmissive ? false : object.castShadow,\n material: isEmissive\n ? this._emissiveMaterial\n : object.receiveShadow\n ? this._shadowObjectMaterial\n : this._unlitMaterial,\n });\n }\n\n private _setMeshShadowFloorMaterial(object: Mesh) {\n if (this._boundingBoxSet && this._shadowOnGround) {\n this.addToCache(object, {\n visible: true,\n castShadow: false,\n receiveShadow: true,\n material: this._shadowObjectMaterial,\n });\n } else {\n this.addToCache(object, { visible: false });\n }\n }\n}\n\nexport interface ShadowTypeParameters {\n castShadow: boolean;\n type: ShadowMapType;\n bias: number;\n normalBias: number;\n radius: number;\n}\n\nexport class ShadowTypeConfiguration {\n // see LightShadow - https://threejs.org/docs/#api/en/lights/shadows/LightShadow\n // bias: Shadow map bias, how much to add or subtract from the normalized depth when deciding whether a surface is in shadow.\n // This value depends on the normalized depth and must not be scaled with the size of the scene.\n // normalBias: Defines how much the _position used to query the shadow map is offset along the object normal.\n // This value is in world space units and must be scaled with the size of the scene.\n private static _noShadow: ShadowTypeParameters = {\n castShadow: false,\n type: PCFShadowMap,\n bias: 0,\n normalBias: 0,\n radius: 0,\n };\n private static _basicShadow: ShadowTypeParameters = {\n castShadow: true,\n type: BasicShadowMap,\n bias: -0.00005,\n normalBias: 0.005,\n radius: 0,\n };\n private static _pcfShadow: ShadowTypeParameters = {\n castShadow: true,\n type: PCFShadowMap,\n bias: -0.00005, // -0.0002,\n normalBias: 0.01,\n radius: 4,\n };\n private static _vcmShadow: ShadowTypeParameters = {\n castShadow: true,\n type: VSMShadowMap,\n bias: 0.0001,\n normalBias: 0,\n radius: 15,\n };\n public types = new Map<string, ShadowTypeParameters>([\n ['off', ShadowTypeConfiguration._noShadow],\n ['BasicShadowMap', ShadowTypeConfiguration._basicShadow],\n ['PCFShadowMap', ShadowTypeConfiguration._pcfShadow],\n ['VSMShadowMap', ShadowTypeConfiguration._vcmShadow],\n ]);\n private static _defaultType: ShadowTypeParameters =\n ShadowTypeConfiguration._pcfShadow;\n public shadowType: string = 'PCFShadowMap'; // 'VSMShadowMap'\n public currentConfiguration: ShadowTypeParameters =\n this.types.get(this.shadowType) ?? ShadowTypeConfiguration._defaultType;\n\n public switchType(type: any): boolean {\n if (!this.types.has(type)) {\n return false;\n }\n this.currentConfiguration =\n this.types.get(type) ?? ShadowTypeConfiguration._defaultType;\n return true;\n }\n}\n\nexport interface BaseShadowLightSourceParameters {\n shadowMapSize?: number;\n blurSamples?: number;\n}\n\nabstract class BaseShadowLightSource implements ShadowLightSource {\n protected _shadowLightSource: DirectionalLight | SpotLight;\n protected _shadowMapSize: number;\n protected _blurSamples: number;\n protected _isVisibleBackup: boolean = true;\n protected _castShadowBackup: boolean = true;\n\n constructor(\n lightSource: DirectionalLight | SpotLight,\n parameters: BaseShadowLightSourceParameters,\n ) {\n this._shadowMapSize = parameters?.shadowMapSize ?? 1024;\n this._blurSamples = parameters?.blurSamples ?? 8;\n this._shadowLightSource = lightSource;\n this._shadowLightSource.visible = false;\n this._shadowLightSource.castShadow = true;\n if (this._shadowLightSource.shadow) {\n this._shadowLightSource.shadow.mapSize = new Vector2(\n this._shadowMapSize,\n this._shadowMapSize,\n );\n this._shadowLightSource.shadow.blurSamples = this._blurSamples;\n this._shadowLightSource.shadow.autoUpdate = false;\n }\n this._shadowLightSource.userData.shadowLightSource = this;\n }\n\n getPosition(): Vector3 {\n return this._shadowLightSource.position;\n }\n\n public getShadowLight(): DirectionalLight | SpotLight {\n return this._shadowLightSource;\n }\n\n public getOriginalLight(): Light | null {\n return null;\n }\n\n public dispose(): void {\n this._shadowLightSource.dispose();\n }\n\n addTo(parent: Object3D): void {\n parent.add(this._shadowLightSource);\n }\n\n removeFrom(parent: Object3D): void {\n parent.remove(this._shadowLightSource);\n }\n\n public updatePositionAndTarget() {\n this._updateShadowPositionAndTarget(\n this.getPosition(),\n new Vector3(0, 0, 0),\n );\n }\n\n public updateBounds(sceneBounds: SceneVolume): void {\n if (this._shadowLightSource instanceof SpotLight) {\n const camera = this._shadowLightSource.shadow.camera;\n const cameraViewBounds = sceneBounds.bounds\n .clone()\n .applyMatrix4(camera.matrixWorldInverse);\n const near = Math.max(\n 0.001,\n Math.min(-cameraViewBounds.min.z, -cameraViewBounds.max.z),\n );\n const far = Math.max(-cameraViewBounds.min.z, -cameraViewBounds.max.z);\n const halfWidth = Math.max(\n Math.abs(cameraViewBounds.min.x),\n Math.abs(cameraViewBounds.max.x),\n );\n const halfHeight = Math.max(\n Math.abs(cameraViewBounds.min.y),\n Math.abs(cameraViewBounds.max.y),\n );\n const angle = Math.atan2(Math.hypot(halfHeight, halfWidth) * 1.05, near);\n camera.aspect = 1;\n camera.near = near;\n camera.far = far;\n this._shadowLightSource.angle = angle;\n } else if (this._shadowLightSource.shadow) {\n const camera = this._shadowLightSource.shadow.camera;\n sceneBounds.updateCameraViewVolumeFromBounds(camera);\n const c = camera as OrthographicCamera | PerspectiveCamera;\n c.far += c.far - c.near;\n c.updateProjectionMatrix();\n }\n if (this._shadowLightSource.shadow) {\n this._shadowLightSource.shadow.needsUpdate = true;\n }\n }\n\n public forceShadowUpdate(): void {\n if (this._shadowLightSource.shadow) {\n this._shadowLightSource.shadow.needsUpdate = true;\n }\n }\n\n protected _updateShadowPositionAndTarget(\n cameraPosition: Vector3,\n targetPosition: Vector3,\n ): void {\n if (this._shadowLightSource instanceof SpotLight) {\n const lightDirection = targetPosition.clone().sub(cameraPosition);\n const distance = lightDirection.length();\n lightDirection.normalize();\n const shadowCameraPosition = targetPosition\n .clone()\n .sub(lightDirection.clone().multiplyScalar(distance * 4));\n this._shadowLightSource.shadow.camera.position.copy(shadowCameraPosition);\n this._shadowLightSource.shadow.camera.position.copy(shadowCameraPosition);\n this._shadowLightSource.shadow.camera.lookAt(targetPosition);\n this._shadowLightSource.position.copy(shadowCameraPosition);\n this._shadowLightSource.lookAt(targetPosition);\n } else {\n this._shadowLightSource.position.copy(cameraPosition);\n this._shadowLightSource.lookAt(targetPosition);\n this._shadowLightSource.shadow?.camera.position.copy(cameraPosition);\n this._shadowLightSource.shadow?.camera.lookAt(targetPosition);\n }\n this._shadowLightSource.shadow?.camera.updateMatrixWorld();\n this._shadowLightSource.updateMatrixWorld();\n }\n\n public _updateShadowType(\n typeParameters: ShadowTypeParameters,\n shadowScale: number,\n ): void {\n const shadow = this._shadowLightSource.shadow;\n if (shadow) {\n shadow.bias = typeParameters.bias;\n shadow.normalBias = typeParameters.normalBias * shadowScale;\n shadow.radius = typeParameters.radius;\n shadow.needsUpdate = true;\n }\n }\n\n public prepareRenderShadow(): ActiveShadowLight[] {\n return [];\n }\n\n public finishRenderShadow(): void {\n return;\n }\n}\n\nexport interface DirectionalShadowLightSourceParameters\n extends BaseShadowLightSourceParameters {\n shadowLightSourceType?: ShadowLightSourceType;\n addHelper?: boolean;\n}\n\nexport class RectAreaShadowLightSource extends BaseShadowLightSource {\n private _rectAreaLight: RectAreaLight;\n private _rectLightHelper?: RectAreaLightHelper;\n\n constructor(\n rectAreaLight: RectAreaLight,\n parameters: DirectionalShadowLightSourceParameters,\n ) {\n let lightSource: DirectionalLight | SpotLight;\n switch (parameters?.shadowLightSourceType) {\n default:\n case SHADOW_LIGHT_SOURCE_TYPES.DIRECTION_LIGHT_SHADOW:\n lightSource = new DirectionalLight(0xffffff, 1);\n break;\n case SHADOW_LIGHT_SOURCE_TYPES.SPOT_LIGHT_SHADOW:\n lightSource = new SpotLight(0xffffff, 1, 0, Math.PI / 4, 0);\n break;\n }\n lightSource.position.copy(rectAreaLight.position);\n lightSource.lookAt(0, 0, 0);\n super(lightSource, parameters);\n this._rectAreaLight = rectAreaLight;\n this._rectAreaLight.userData.shadowLightSource = this;\n if (parameters?.addHelper) {\n this._rectLightHelper = new RectAreaLightHelper(this._rectAreaLight);\n (this._rectLightHelper.material as LineBasicMaterial).depthWrite = false;\n this._rectAreaLight.add(this._rectLightHelper);\n }\n }\n\n public getPosition(): Vector3 {\n return this._rectAreaLight.position;\n }\n\n public getRectAreaLight(): RectAreaLight {\n return this._rectAreaLight;\n }\n\n public getOriginalLight(): Light | null {\n return this._rectAreaLight;\n }\n\n public prepareRenderShadow(): ActiveShadowLight[] {\n this._isVisibleBackup = this._rectAreaLight.visible;\n this._castShadowBackup = this._shadowLightSource.castShadow;\n this._shadowLightSource.visible = this._rectAreaLight.visible;\n this._rectAreaLight.visible = false;\n if (!this._shadowLightSource.visible) {\n return [];\n }\n return [\n {\n light: this._shadowLightSource,\n intensity: this._rectAreaLight.intensity,\n groundShadow: false,\n },\n ];\n }\n\n public finishRenderShadow(): void {\n this._shadowLightSource.visible = false;\n this._shadowLightSource.castShadow = this._castShadowBackup;\n this._rectAreaLight.visible = this._isVisibleBackup;\n }\n}\n\nexport interface EnvironmentShadowLightSourceParameters\n extends BaseShadowLightSourceParameters {\n shadowLightSourceType?: ShadowLightSourceType;\n}\n\nexport class EnvironmentShadowLightSource extends BaseShadowLightSource {\n private _position: Vector3;\n private _intensity: number;\n\n constructor(\n position: Vector3,\n lightIntensity: number,\n parameters: EnvironmentShadowLightSourceParameters,\n ) {\n const directionalLight = new DirectionalLight(0xffffff, lightIntensity);\n directionalLight.position.copy(position);\n directionalLight.lookAt(0, 0, 0);\n directionalLight.updateMatrix();\n directionalLight.castShadow = true;\n super(directionalLight, parameters);\n this._position = position.clone();\n this._intensity = lightIntensity;\n }\n\n getPosition(): Vector3 {\n return this._position;\n }\n\n public prepareRenderShadow(): ActiveShadowLight[] {\n this._castShadowBackup = this._shadowLightSource.castShadow;\n this._shadowLightSource.visible = true;\n return [\n {\n light: this._shadowLightSource,\n intensity: this._intensity,\n groundShadow: false,\n },\n ];\n }\n\n public finishRenderShadow(): void {\n this._shadowLightSource.castShadow = this._castShadowBackup;\n this._shadowLightSource.visible = false;\n }\n}\n\nexport class GroundShadowLightSource extends BaseShadowLightSource {\n private _position: Vector3;\n\n constructor(\n position: Vector3,\n parameters: EnvironmentShadowLightSourceParameters,\n ) {\n const directionalLight = new DirectionalLight(0xffffff, 1);\n directionalLight.position.copy(position);\n directionalLight.lookAt(0, 0, 0);\n directionalLight.updateMatrix();\n directionalLight.castShadow = true;\n super(directionalLight, parameters);\n this._position = position.clone();\n }\n\n getPosition(): Vector3 {\n return this._position;\n }\n\n public prepareRenderShadow(): ActiveShadowLight[] {\n this._castShadowBackup = this._shadowLightSource.castShadow;\n this._shadowLightSource.visible = true;\n return [\n {\n light: this._shadowLightSource,\n intensity: 1,\n groundShadow: true,\n },\n ];\n }\n\n public finishRenderShadow(): void {\n this._shadowLightSource.castShadow = this._castShadowBackup;\n this._shadowLightSource.visible = false;\n }\n}\n","/**\n * @module CopyShader\n * @three_import import { CopyShader } from 'three/addons/shaders/CopyShader.js';\n */\n\n/**\n * Full-screen copy shader pass.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * @module FXAAShader\n * @three_import import { FXAAShader } from 'three/addons/shaders/FXAAShader.js';\n */\n\n/**\n * FXAA algorithm from NVIDIA, C# implementation by Jasper Flick, GLSL port by Dave Hoskins.\n *\n * References:\n * - {@link http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf}.\n * - {@link https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst FXAAShader = {\n\n\tname: 'FXAAShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n\n};\n\nexport { FXAAShader };\n","import { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js';\nimport { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js';\nimport type {\n Camera,\n Mesh,\n Object3D,\n Scene,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport {\n AdditiveBlending,\n Color,\n DoubleSide,\n Matrix4,\n NoBlending,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n Vector3,\n WebGLRenderTarget,\n} from 'three';\n\ninterface ThreeObject3d {\n isLine?: boolean;\n isMesh?: boolean;\n isPoints?: boolean;\n isSprite?: boolean;\n}\n\nexport interface OutlinePassParameters {\n downSampleRatio?: number;\n edgeDetectionFxaa?: boolean;\n}\n\nexport class OutlinePass extends RenderPass {\n public static BlurDirectionX = new Vector2(1.0, 0.0);\n public static BlurDirectionY = new Vector2(0.0, 1.0);\n public static highlightLines: boolean = true;\n public renderScene: Scene;\n public renderCamera: Camera;\n public selectedObjects: Object3D[];\n public visibleEdgeColor: Color;\n public hiddenEdgeColor: Color;\n public edgeGlow: number;\n public usePatternTexture: boolean;\n public patternTexture: Texture | null = null;\n public edgeThickness: number;\n public edgeStrength: number;\n public downSampleRatio: number;\n public pulsePeriod: number;\n public edgeDetectionFxaa: boolean;\n public _visibilityCache: Map<Object3D, boolean>;\n public resolution: Vector2;\n public renderTargetMaskBuffer: WebGLRenderTarget;\n public prepareMaskMaterial: ShaderMaterial;\n public renderTargetFxaaBuffer?: WebGLRenderTarget;\n public fxaaRenderMaterial?: ShaderMaterial;\n public renderTargetMaskDownSampleBuffer: WebGLRenderTarget;\n public renderTargetBlurBuffer1: WebGLRenderTarget;\n public renderTargetBlurBuffer2: WebGLRenderTarget;\n public edgeDetectionMaterial: ShaderMaterial;\n public renderTargetEdgeBuffer1: WebGLRenderTarget;\n public renderTargetEdgeBuffer2: WebGLRenderTarget;\n public separableBlurMaterial1: ShaderMaterial;\n public separableBlurMaterial2: ShaderMaterial;\n public overlayMaterial: ShaderMaterial;\n public copyUniforms: any;\n public materialCopy: ShaderMaterial;\n public oldClearColor: Color;\n public oldClearAlpha: number;\n public fsQuad: FullScreenQuad;\n public tempPulseColor1: Color;\n public tempPulseColor2: Color;\n public textureMatrix: Matrix4;\n public clearBackground: boolean = false;\n\n constructor(\n renderPassManager: RenderPassManager,\n resolution: Vector2,\n scene: Scene,\n camera: Camera,\n selectedObjects: Object3D[],\n parameters?: OutlinePassParameters,\n ) {\n super(renderPassManager);\n\n this.renderScene = scene;\n this.renderCamera = camera;\n this.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];\n this.visibleEdgeColor = new Color(1, 1, 1);\n this.hiddenEdgeColor = new Color(0.1, 0.04, 0.02);\n this.edgeGlow = 0.0;\n this.usePatternTexture = false;\n this.edgeThickness = 1.0;\n this.edgeStrength = 3.0;\n this.downSampleRatio = parameters?.downSampleRatio || 2;\n this.pulsePeriod = 0;\n this.edgeDetectionFxaa = parameters?.edgeDetectionFxaa || false;\n\n this._visibilityCache = new Map();\n\n this.resolution =\n resolution !== undefined\n ? new Vector2(resolution.x, resolution.y)\n : new Vector2(256, 256);\n\n const resx = Math.round(this.resolution.x / this.downSampleRatio);\n const resy = Math.round(this.resolution.y / this.downSampleRatio);\n\n this.renderTargetMaskBuffer = new WebGLRenderTarget(\n this.resolution.x,\n this.resolution.y,\n );\n this.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask';\n this.renderTargetMaskBuffer.texture.generateMipmaps = false;\n\n this.prepareMaskMaterial = this._getPrepareMaskMaterial(\n this.gBufferTextures?.isFloatGBufferWithRgbNormalAlphaDepth,\n );\n this.prepareMaskMaterial.side = DoubleSide;\n this.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ(\n this.prepareMaskMaterial.fragmentShader,\n this.renderCamera,\n );\n\n if (this.edgeDetectionFxaa) {\n this.fxaaRenderMaterial = new ShaderMaterial(FXAAShader);\n this.fxaaRenderMaterial.uniforms.tDiffuse.value =\n this.renderTargetMaskBuffer.texture;\n this.fxaaRenderMaterial.uniforms.resolution.value.set(\n 1 / this.resolution.x,\n 1 / this.resolution.y,\n );\n this.renderTargetFxaaBuffer = new WebGLRenderTarget(\n this.resolution.x,\n this.resolution.y,\n );\n this.renderTargetFxaaBuffer.texture.name = 'OutlinePass.fxaa';\n this.renderTargetFxaaBuffer.texture.generateMipmaps = false;\n }\n\n this.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget(resx, resy);\n this.renderTargetMaskDownSampleBuffer.texture.name =\n 'OutlinePass.depthDownSample';\n this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;\n\n this.renderTargetBlurBuffer1 = new WebGLRenderTarget(resx, resy);\n this.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1';\n this.renderTargetBlurBuffer1.texture.generateMipmaps = false;\n this.renderTargetBlurBuffer2 = new WebGLRenderTarget(\n Math.round(resx / 2),\n Math.round(resy / 2),\n );\n this.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2';\n this.renderTargetBlurBuffer2.texture.generateMipmaps = false;\n\n this.edgeDetectionMaterial = this._getEdgeDetectionMaterial();\n this.renderTargetEdgeBuffer1 = new WebGLRenderTarget(resx, resy);\n this.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1';\n this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;\n this.renderTargetEdgeBuffer2 = new WebGLRenderTarget(\n Math.round(resx / 2),\n Math.round(resy / 2),\n );\n this.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2';\n this.renderTargetEdgeBuffer2.texture.generateMipmaps = false;\n\n const MAX_EDGE_THICKNESS = 4;\n const MAX_EDGE_GLOW = 4;\n\n this.separableBlurMaterial1 =\n this._getSeperableBlurMaterial(MAX_EDGE_THICKNESS);\n this.separableBlurMaterial1.uniforms.texSize.value.set(resx, resy);\n this.separableBlurMaterial1.uniforms.kernelRadius.value = 1;\n this.separableBlurMaterial2 = this._getSeperableBlurMaterial(MAX_EDGE_GLOW);\n this.separableBlurMaterial2.uniforms.texSize.value.set(\n Math.round(resx / 2),\n Math.round(resy / 2),\n );\n this.separableBlurMaterial2.uniforms.kernelRadius.value = MAX_EDGE_GLOW;\n\n // Overlay material\n this.overlayMaterial = this._getOverlayMaterial();\n\n // copy material\n\n const copyShader = CopyShader;\n\n this.copyUniforms = UniformsUtils.clone(copyShader.uniforms);\n this.copyUniforms.opacity.value = 1.0;\n\n this.materialCopy = new ShaderMaterial({\n uniforms: this.copyUniforms,\n vertexShader: copyShader.vertexShader,\n fragmentShader: copyShader.fragmentShader,\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n });\n\n this.enabled = true;\n this.needsSwap = false;\n\n this.oldClearColor = new Color();\n this.oldClearAlpha = 1;\n\n this.fsQuad = new FullScreenQuad(undefined);\n\n this.tempPulseColor1 = new Color();\n this.tempPulseColor2 = new Color();\n this.textureMatrix = new Matrix4();\n\n function replaceDepthToViewZ(string: string, actualCamera: Camera) {\n // @ts-ignore -- wrong typing isPerspectiveCamera is there\n const type = actualCamera.isPerspectiveCamera\n ? 'perspective'\n : 'orthographic';\n\n return string.replace(/DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ');\n }\n }\n\n public dispose() {\n super.dispose();\n this.renderTargetMaskBuffer.dispose();\n this.renderTargetFxaaBuffer?.dispose();\n this.renderTargetMaskDownSampleBuffer.dispose();\n this.renderTargetBlurBuffer1.dispose();\n this.renderTargetBlurBuffer2.dispose();\n this.renderTargetEdgeBuffer1.dispose();\n this.renderTargetEdgeBuffer2.dispose();\n this.prepareMaskMaterial.dispose();\n this.fxaaRenderMaterial?.dispose();\n this.edgeDetectionMaterial.dispose();\n this.separableBlurMaterial1.dispose();\n this.separableBlurMaterial2.dispose();\n this.overlayMaterial.dispose();\n this.materialCopy.dispose();\n this.fsQuad.dispose();\n }\n\n public setSize(width: number, height: number) {\n this.renderTargetMaskBuffer.setSize(width, height);\n\n let resx = Math.round(width / this.downSampleRatio);\n let resy = Math.round(height / this.downSampleRatio);\n this.renderTargetMaskDownSampleBuffer.setSize(resx, resy);\n this.renderTargetBlurBuffer1.setSize(resx, resy);\n this.renderTargetEdgeBuffer1.setSize(resx, resy);\n this.separableBlurMaterial1.uniforms.texSize.value.set(resx, resy);\n\n resx = Math.round(resx / 2);\n resy = Math.round(resy / 2);\n\n this.renderTargetBlurBuffer2.setSize(resx, resy);\n this.renderTargetEdgeBuffer2.setSize(resx, resy);\n\n this.separableBlurMaterial2.uniforms.texSize.value.set(resx, resy);\n\n this.fxaaRenderMaterial?.uniforms.resolution.value.set(\n 1 / this.resolution.x,\n 1 / this.resolution.y,\n );\n this.renderTargetFxaaBuffer?.setSize(width, height);\n }\n\n private _canBeHighlighted(object: Object3D) {\n return (\n (object as ThreeObject3d).isMesh ||\n (OutlinePass.highlightLines && (object as ThreeObject3d).isLine)\n );\n }\n\n private _changeVisibilityOfSelectedObjects(bVisible: boolean) {\n const cache = this._visibilityCache;\n this.selectedObjects.forEach((selectedObject) =>\n selectedObject.traverse((object: Object3D) => {\n if (this._canBeHighlighted(object)) {\n if (bVisible === true) {\n object.visible = cache.get(object) as boolean;\n } else {\n cache.set(object, object.visible);\n object.visible = bVisible;\n }\n }\n }),\n );\n }\n\n private _changeVisibilityOfNonSelectedObjects(bVisible: boolean) {\n const cache = this._visibilityCache;\n const selectedMeshes: Mesh[] = [];\n this.selectedObjects.forEach((selectedObject) =>\n selectedObject.traverse((object: Object3D) => {\n if (this._canBeHighlighted(object)) {\n selectedMeshes.push(object as Mesh);\n }\n }),\n );\n\n this.renderScene.traverse((object: Object3D) => {\n if (\n this._canBeHighlighted(object) ||\n (object as ThreeObject3d).isSprite\n ) {\n let bFound = selectedMeshes.some(\n (selectedMesh) => selectedMesh.id === object.id,\n );\n if (bFound === false) {\n const visibility = object.visible;\n if (bVisible === false || cache.get(object) === true) {\n object.visible = bVisible;\n }\n cache.set(object, visibility);\n }\n } else if ((object as ThreeObject3d).isPoints) {\n if (bVisible === true) {\n object.visible = cache.get(object) as boolean; // restore\n } else {\n cache.set(object, object.visible);\n object.visible = bVisible;\n }\n }\n });\n }\n\n private _updateTextureMatrix() {\n // prettier-ignore\n this.textureMatrix.set(\n 0.5, 0.0, 0.0, 0.5,\n 0.0, 0.5, 0.0, 0.5,\n 0.0, 0.0, 0.5, 0.5,\n 0.0, 0.0, 0.0, 1.0\n );\n this.textureMatrix.multiply(this.renderCamera.projectionMatrix);\n this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse);\n }\n\n public render(\n renderer: WebGLRenderer | WebGPURenderer,\n _writeBuffer: WebGLRenderTarget | null,\n readBuffer: WebGLRenderTarget | null,\n _deltaTime: number,\n maskActive: boolean,\n ) {\n if (this.selectedObjects.length > 0) {\n (renderer as WebGLRenderer).getClearColor(this.oldClearColor);\n this.oldClearAlpha = (renderer as WebGLRenderer).getClearAlpha();\n const oldAutoClear = (renderer as WebGLRenderer).autoClear;\n\n if (this.clearBackground) {\n (renderer as WebGLRenderer).setClearColor(0x000000, 0xff);\n renderer.clear(true, false, false);\n }\n (renderer as WebGLRenderer).autoClear = false;\n\n if (maskActive) {\n (renderer as WebGLRenderer).state.buffers.stencil.setTest(false);\n }\n\n (renderer as WebGLRenderer).setClearColor(0xffffff, 1);\n\n // Make selected objects invisible\n this._changeVisibilityOfSelectedObjects(false);\n\n const currentBackground = this.renderScene.background;\n this.renderScene.background = null;\n\n // Make selected objects visible\n this._changeVisibilityOfSelectedObjects(true);\n this._visibilityCache.clear();\n\n // Update Texture Matrix for Depth compare\n this._updateTextureMatrix();\n\n // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n this._changeVisibilityOfNonSelectedObjects(false);\n this.renderScene.overrideMaterial = this.prepareMaskMaterial;\n this.prepareMaskMaterial.uniforms.cameraNearFar.value.set(\n // @ts-ignore -- wrong typing near is there\n this.renderCamera.near,\n // @ts-ignore -- wrong typing far is there\n this.renderCamera.far,\n );\n this.prepareMaskMaterial.uniforms.depthTexture.value =\n this.gBufferTextures.textureWithDepthValue;\n this.prepareMaskMaterial.uniforms.textureMatrix.value =\n this.textureMatrix;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetMaskBuffer);\n renderer.clear();\n renderer.render(this.renderScene, this.renderCamera);\n this.renderScene.overrideMaterial = null;\n this._changeVisibilityOfNonSelectedObjects(true);\n this._visibilityCache.clear();\n\n this.renderScene.background = currentBackground;\n\n // FXAA\n let renderTargetMaskBuffer = this.renderTargetMaskBuffer;\n if (\n this.edgeDetectionFxaa &&\n this.fxaaRenderMaterial &&\n this.renderTargetFxaaBuffer\n ) {\n this.fxaaRenderMaterial.uniforms.tDiffuse.value =\n this.renderTargetMaskBuffer.texture;\n this.fsQuad.material = this.fxaaRenderMaterial;\n (renderer as WebGLRenderer).setRenderTarget(\n this.renderTargetFxaaBuffer,\n );\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n renderTargetMaskBuffer = this.renderTargetFxaaBuffer;\n }\n\n // 2. Downsample to Half resolution\n this.fsQuad.material = this.materialCopy;\n this.copyUniforms.tDiffuse.value = renderTargetMaskBuffer.texture;\n (renderer as WebGLRenderer).setRenderTarget(\n this.renderTargetMaskDownSampleBuffer,\n );\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n\n this.tempPulseColor1.copy(this.visibleEdgeColor);\n this.tempPulseColor2.copy(this.hiddenEdgeColor);\n\n if (this.pulsePeriod > 0) {\n const scalar =\n (1 + 0.25) / 2 +\n (Math.cos((performance.now() * 0.01) / this.pulsePeriod) *\n (1.0 - 0.25)) /\n 2;\n this.tempPulseColor1.multiplyScalar(scalar);\n this.tempPulseColor2.multiplyScalar(scalar);\n }\n\n // 3. Apply Edge Detection Pass\n this.fsQuad.material = this.edgeDetectionMaterial;\n this.edgeDetectionMaterial.uniforms.maskTexture.value =\n this.renderTargetMaskDownSampleBuffer.texture;\n this.edgeDetectionMaterial.uniforms.texSize.value.set(\n this.renderTargetMaskDownSampleBuffer.width,\n this.renderTargetMaskDownSampleBuffer.height,\n );\n this.edgeDetectionMaterial.uniforms.visibleEdgeColor.value =\n this.tempPulseColor1;\n this.edgeDetectionMaterial.uniforms.hiddenEdgeColor.value =\n this.tempPulseColor2;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetEdgeBuffer1);\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n\n // 4. Apply Blur on Half res\n this.fsQuad.material = this.separableBlurMaterial1;\n this.separableBlurMaterial1.uniforms.colorTexture.value =\n this.renderTargetEdgeBuffer1.texture;\n this.separableBlurMaterial1.uniforms.direction.value =\n OutlinePass.BlurDirectionX;\n this.separableBlurMaterial1.uniforms.kernelRadius.value =\n this.edgeThickness;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetBlurBuffer1);\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n this.separableBlurMaterial1.uniforms.colorTexture.value =\n this.renderTargetBlurBuffer1.texture;\n this.separableBlurMaterial1.uniforms.direction.value =\n OutlinePass.BlurDirectionY;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetEdgeBuffer1);\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n\n // Apply Blur on quarter res\n this.fsQuad.material = this.separableBlurMaterial2;\n this.separableBlurMaterial2.uniforms.colorTexture.value =\n this.renderTargetEdgeBuffer1.texture;\n this.separableBlurMaterial2.uniforms.direction.value =\n OutlinePass.BlurDirectionX;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetBlurBuffer2);\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n this.separableBlurMaterial2.uniforms.colorTexture.value =\n this.renderTargetBlurBuffer2.texture;\n this.separableBlurMaterial2.uniforms.direction.value =\n OutlinePass.BlurDirectionY;\n (renderer as WebGLRenderer).setRenderTarget(this.renderTargetEdgeBuffer2);\n renderer.clear();\n this.fsQuad.render(renderer as WebGLRenderer);\n\n // Blend it additively over the input texture\n this.fsQuad.material = this.overlayMaterial;\n this.overlayMaterial.uniforms.maskTexture.value =\n renderTargetMaskBuffer.texture;\n this.overlayMaterial.uniforms.edgeTexture1.value =\n this.renderTargetEdgeBuffer1.texture;\n this.overlayMaterial.uniforms.edgeTexture2.value =\n this.renderTargetEdgeBuffer2.texture;\n this.overlayMaterial.uniforms.patternTexture.value = this.patternTexture;\n this.overlayMaterial.uniforms.edgeStrength.value = this.edgeStrength;\n this.overlayMaterial.uniforms.edgeGlow.value = this.edgeGlow;\n this.overlayMaterial.uniforms.usePatternTexture.value =\n this.usePatternTexture;\n\n if (maskActive) {\n (renderer as WebGLRenderer).state.buffers.stencil.setTest(true);\n }\n\n (renderer as WebGLRenderer).setRenderTarget(readBuffer);\n this.fsQuad.render(renderer as WebGLRenderer);\n\n (renderer as WebGLRenderer).setClearColor(\n this.oldClearColor,\n this.oldClearAlpha,\n );\n (renderer as WebGLRenderer).autoClear = oldAutoClear;\n }\n\n if (this.renderToScreen && readBuffer) {\n this.fsQuad.material = this.materialCopy;\n this.copyUniforms.tDiffuse.value = readBuffer.texture;\n (renderer as WebGLRenderer).setRenderTarget(null);\n this.fsQuad.render(renderer as WebGLRenderer);\n }\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n this.render(renderer, null, null, 0, false);\n }\n\n private _getPrepareMaskMaterial(floatAlphaDepth?: boolean) {\n return new ShaderMaterial({\n uniforms: {\n depthTexture: { value: null },\n cameraNearFar: { value: new Vector2(0.5, 0.5) },\n textureMatrix: { value: null },\n },\n\n defines: {\n FLOAT_ALPHA_DEPTH: floatAlphaDepth ? 1 : 0,\n },\n\n vertexShader: `#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}`,\n\n fragmentShader: `#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n #if FLOAT_ALPHA_DEPTH == 1\n\t\t\t\t\t float depth = texture2DProj( depthTexture, projTexCoord ).w;\n #else\n float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n #endif\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}`,\n });\n }\n\n private _getEdgeDetectionMaterial() {\n return new ShaderMaterial({\n uniforms: {\n maskTexture: { value: null },\n texSize: { value: new Vector2(0.5, 0.5) },\n visibleEdgeColor: { value: new Vector3(1.0, 1.0, 1.0) },\n hiddenEdgeColor: { value: new Vector3(1.0, 1.0, 1.0) },\n },\n\n vertexShader: `varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n fragmentShader: `varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}`,\n });\n }\n\n private _getSeperableBlurMaterial(maxRadius: number) {\n return new ShaderMaterial({\n defines: {\n MAX_RADIUS: maxRadius,\n },\n\n uniforms: {\n colorTexture: { value: null },\n texSize: { value: new Vector2(0.5, 0.5) },\n direction: { value: new Vector2(0.5, 0.5) },\n kernelRadius: { value: 1.0 },\n },\n\n vertexShader: `varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n fragmentShader: `#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}`,\n });\n }\n\n private _getOverlayMaterial() {\n return new ShaderMaterial({\n uniforms: {\n maskTexture: { value: null },\n edgeTexture1: { value: null },\n edgeTexture2: { value: null },\n patternTexture: { value: null },\n edgeStrength: { value: 1.0 },\n edgeGlow: { value: 1.0 },\n usePatternTexture: { value: 0.0 },\n },\n\n vertexShader: `varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n fragmentShader: `varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n }`,\n blending: AdditiveBlending,\n //blending: CustomBlending,\n depthTest: false,\n depthWrite: false,\n transparent: true,\n });\n }\n}\n","import type { Blending, Texture } from 'three';\nimport {\n AddEquation,\n DstAlphaFactor,\n DstColorFactor,\n ShaderMaterial,\n UniformsUtils,\n Vector2,\n ZeroFactor,\n} from 'three';\nimport type { Nullable } from '#/common/src/utils/types';\n\nconst BlendAoPassDepthShader = {\n uniforms: {\n tDiffuse: { value: null as Nullable<Texture> },\n },\n vertexShader: `\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }`,\n fragmentShader: `\n uniform highp sampler2D tDiffuse;\n varying vec2 vUv;\n\n void main() {\n vec4 textureColor = texture2D(tDiffuse, vUv);\n float aoPassDepth = dot(textureColor.wz, vec2(1.0/1024.0));\n gl_FragColor = vec4(vec3(aoPassDepth * aoPassDepth), 1.0);\n }`,\n};\n\nexport interface BlendAoPassDepthMaterialParameters {\n texture?: Nullable<Texture>;\n blending?: Blending;\n}\n\nexport class BlendAoPassDepthMaterial extends ShaderMaterial {\n private _intensity: Vector2 = new Vector2(1, 1);\n constructor(parameters?: BlendAoPassDepthMaterialParameters) {\n super({\n uniforms: UniformsUtils.clone(BlendAoPassDepthShader.uniforms),\n vertexShader: BlendAoPassDepthShader.vertexShader,\n fragmentShader: BlendAoPassDepthShader.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n blendSrc: DstColorFactor,\n blendDst: ZeroFactor,\n blendEquation: AddEquation,\n blendSrcAlpha: DstAlphaFactor,\n blendDstAlpha: ZeroFactor,\n blendEquationAlpha: AddEquation,\n });\n this.update(parameters);\n }\n\n public update(\n parameters?: BlendAoPassDepthMaterialParameters,\n ): BlendAoPassDepthMaterial {\n if (parameters?.texture !== undefined) {\n this.uniforms.tDiffuse.value = parameters.texture;\n }\n if (parameters?.blending !== undefined) {\n this.blending = parameters.blending;\n }\n return this;\n }\n}\n","import type { WebGPURenderer } from 'three/webgpu';\nimport {\n Color,\n DataTexture,\n FloatType,\n Mesh,\n MeshBasicMaterial,\n OrthographicCamera,\n PlaneGeometry,\n ShaderMaterial,\n Texture,\n UniformsUtils,\n UnsignedByteType,\n Vector2,\n Vector3,\n WebGLRenderer,\n WebGLRenderTarget,\n} from 'three';\n\nexport const sphereToEquirectangular = (pointOnSphere: Vector3): Vector2 => {\n const u = Math.atan2(pointOnSphere.y, pointOnSphere.x) / (2 * Math.PI) + 0.5;\n const v = Math.asin(pointOnSphere.z) / Math.PI + 0.5;\n return new Vector2(u, v);\n};\n\nexport const equirectangularToSphere = (uv: Vector2): Vector3 => {\n const theta = (uv.x - 0.5) * 2 * Math.PI;\n const phi = (uv.y - 0.5) * Math.PI;\n const length = Math.cos(phi);\n return new Vector3(\n Math.cos(theta) * length,\n Math.sin(theta) * length,\n Math.sin(phi),\n );\n};\n\nexport interface TextureConverterResult {\n texture: Texture;\n pixels: Uint8Array | Float32Array;\n sRgbaPixels: boolean;\n}\n\nexport class TextureConverter {\n private _colorRenderTarget?: WebGLRenderTarget;\n private _environmentMapDecodeTarget?: WebGLRenderTarget;\n private _equirectangularDecodeMaterial?: EnvironmentMapDecodeMaterial;\n private _pmremDecodeMaterial?: EnvironmentMapDecodeMaterial;\n private _camera?: OrthographicCamera;\n private _planeMesh?: Mesh;\n\n get colorRenderTarget(): WebGLRenderTarget {\n this._colorRenderTarget =\n this._colorRenderTarget ?? new WebGLRenderTarget();\n return this._colorRenderTarget;\n }\n\n public environmentMapDecodeTarget(\n renderer: WebGLRenderer | WebGPURenderer,\n ): WebGLRenderTarget {\n const targetType =\n renderer instanceof WebGLRenderer && renderer.capabilities.isWebGL2\n ? FloatType\n : UnsignedByteType;\n this._environmentMapDecodeTarget =\n this._environmentMapDecodeTarget ??\n new WebGLRenderTarget(1, 1, { type: targetType });\n return this._environmentMapDecodeTarget;\n }\n\n public environmentMapDecodeMaterial(\n decodePmrem: boolean,\n ): EnvironmentMapDecodeMaterial {\n if (decodePmrem) {\n this._equirectangularDecodeMaterial =\n this._equirectangularDecodeMaterial ??\n new EnvironmentMapDecodeMaterial(true, false);\n return this._equirectangularDecodeMaterial;\n } else {\n this._pmremDecodeMaterial =\n this._pmremDecodeMaterial ??\n new EnvironmentMapDecodeMaterial(false, false);\n return this._pmremDecodeMaterial;\n }\n }\n\n get camera(): OrthographicCamera {\n this._camera = this._camera ?? new OrthographicCamera(-1, 1, 1, -1, -1, 1);\n return this._camera;\n }\n\n public scaleTexture(\n renderer: WebGLRenderer | WebGPURenderer,\n texture: Texture,\n targetWidth: number,\n targetHeight: number,\n ): TextureConverterResult {\n this.colorRenderTarget.setSize(targetWidth, targetHeight);\n this._planeMesh =\n this._planeMesh ??\n new Mesh(\n new PlaneGeometry(2, 2),\n new MeshBasicMaterial({ map: texture }),\n );\n const renderTargetBackup = (renderer as WebGLRenderer).getRenderTarget();\n (renderer as WebGLRenderer).setRenderTarget(this.colorRenderTarget);\n (renderer as WebGLRenderer).render(this._planeMesh, this.camera);\n (renderer as WebGLRenderer).setRenderTarget(renderTargetBackup);\n const colorTexture = this.environmentMapDecodeTarget(renderer).texture;\n const pixelBuffer = new Uint8Array(targetWidth * targetHeight * 4);\n (renderer as WebGLRenderer).readRenderTargetPixels(\n this.colorRenderTarget,\n 0,\n 0,\n targetWidth,\n targetHeight,\n pixelBuffer,\n );\n return { texture: colorTexture, pixels: pixelBuffer, sRgbaPixels: false };\n }\n\n public newGrayscaleTexture(\n renderer: WebGLRenderer | WebGPURenderer,\n texture: Texture,\n targetWidth: number,\n targetHeight: number,\n ): TextureConverterResult {\n const decodeMaterial = this.environmentMapDecodeMaterial(\n texture.name === 'PMREM.cubeUv',\n );\n const envMapDecodeTarget = this.environmentMapDecodeTarget(renderer);\n envMapDecodeTarget.setSize(targetWidth, targetHeight);\n decodeMaterial.setSourceTexture(texture);\n this._planeMesh =\n this._planeMesh ?? new Mesh(new PlaneGeometry(2, 2), decodeMaterial);\n const renderTargetBackup = (renderer as WebGLRenderer).getRenderTarget();\n (renderer as WebGLRenderer).setRenderTarget(envMapDecodeTarget);\n (renderer as WebGLRenderer).render(this._planeMesh, this.camera);\n (renderer as WebGLRenderer).setRenderTarget(renderTargetBackup);\n const grayscaleTexture = envMapDecodeTarget.texture;\n const floatType = envMapDecodeTarget.texture.type === FloatType;\n const pixelBuffer: Uint8Array | Float32Array = floatType\n ? new Float32Array(targetWidth * targetHeight * 4)\n : new Uint8Array(targetWidth * targetHeight * 4);\n (renderer as WebGLRenderer).readRenderTargetPixels(\n envMapDecodeTarget,\n 0,\n 0,\n targetWidth,\n targetHeight,\n pixelBuffer,\n );\n return {\n texture: grayscaleTexture,\n pixels: pixelBuffer,\n sRgbaPixels: floatType,\n };\n }\n}\n\nconst EnvironmentMapDecodeShader = {\n uniforms: {\n tDiffuse: { value: null as Texture | null },\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }`,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n\n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n }\n return 0.5 * ( uv + 1.0 );\n }\n\n void main() {\n #if PMREM_DECODE == 1\n float altitude = (vUv.y - 0.5) * 3.141593;\n float azimuth = vUv.x * 2.0 * 3.141593;\n vec3 direction = vec3(\n cos(altitude) * cos(azimuth) * -1.0,\n sin(altitude),\n cos(altitude) * sin(azimuth) * -1.0\n );\n float face = getFace(direction);\n vec2 uv = getUV(direction, face) / vec2(3.0, 4.0);\n if (face > 2.5) {\n uv.y += 0.25;\n face -= 3.0;\n }\n uv.x += face / 3.0;\n vec4 color = texture2D(tDiffuse, uv);\n #else\n vec4 color = texture2D(tDiffuse, vUv);\n #endif\n #if GRAYSCALE_CONVERT == 1\n float grayscale = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));\n //float grayscale = dot(color.rgb, vec3(1.0/3.0));\n gl_FragColor = vec4(vec3(grayscale), 1.0);\n #else\n gl_FragColor = vec4(color.rgb, 1.0);\n #endif\n }`,\n};\n\nexport class EnvironmentMapDecodeMaterial extends ShaderMaterial {\n constructor(decodePmrem: boolean, grayscale: boolean) {\n super({\n uniforms: UniformsUtils.clone(EnvironmentMapDecodeShader.uniforms),\n vertexShader: EnvironmentMapDecodeShader.vertexShader,\n fragmentShader: EnvironmentMapDecodeShader.fragmentShader,\n defines: {\n PMREM_DECODE: decodePmrem ? 1 : 0,\n GRAYSCALE_CONVERT: grayscale ? 1 : 0,\n },\n });\n }\n\n setSourceTexture(map: Texture) {\n this.uniforms.tDiffuse.value = map;\n }\n}\n\nexport interface LightSourceDetectorParameters {\n numberOfSamples?: number;\n width?: number;\n height?: number;\n sampleThreshold?: number;\n}\n\nexport class LightSourceDetector {\n private _numberOfSamples: number;\n private _width: number;\n private _height: number;\n private _sampleThreshold: number;\n public readonly pointDistance: number;\n public readonly pixelDistance: number;\n public readonly samplePoints: Vector3[] = [];\n public readonly sampleUVs: Vector2[] = [];\n public grayscaleTexture: TextureConverterResult = {\n texture: new Texture(),\n pixels: new Uint8Array(0),\n sRgbaPixels: false,\n };\n public detectorTexture: Texture = new Texture();\n public detectorArray: Float32Array = new Float32Array(0);\n private _textureConverter?: TextureConverter;\n public lightSamples: LightSample[] = [];\n public lightGraph: LightGraph = new LightGraph(0);\n public lightSources: LightSource[] = [];\n private _grayScale = new Vector3(0.2126, 0.7152, 0.0722);\n\n constructor(parameters?: LightSourceDetectorParameters) {\n this._numberOfSamples = parameters?.numberOfSamples ?? 1000;\n this._width = parameters?.width ?? 1024;\n this._height = parameters?.height ?? 512;\n this._sampleThreshold = parameters?.sampleThreshold ?? 0.707;\n this.pointDistance =\n Math.sqrt(4 * Math.PI) / Math.sqrt(this._numberOfSamples);\n this.pixelDistance = (Math.sqrt(2) * Math.PI * 2) / this._width;\n this.samplePoints = this._createEquirectangularSamplePoints(\n this._numberOfSamples,\n );\n this.sampleUVs = this.samplePoints.map((point) =>\n sphereToEquirectangular(point),\n );\n }\n\n public detectLightSources(\n renderer: WebGLRenderer | WebGPURenderer,\n equirectangularTexture: Texture,\n ) {\n this._textureConverter = this._textureConverter ?? new TextureConverter();\n this.grayscaleTexture = this._textureConverter.newGrayscaleTexture(\n renderer,\n equirectangularTexture,\n this._width,\n this._height,\n );\n this.detectorArray = this._redFromRgbaToNormalizedFloatArray(\n this.grayscaleTexture.pixels,\n this.grayscaleTexture.sRgbaPixels,\n );\n this.detectorTexture = this._grayscaleTextureFromFloatArray(\n this.detectorArray,\n this._width,\n this._height,\n );\n this.lightSamples = this._filterLightSamples(this._sampleThreshold);\n this.lightGraph = this._findClusterSegments(\n this.lightSamples,\n this._sampleThreshold,\n );\n this.lightGraph.findConnectedComponents();\n this.lightSources = this.createLightSourcesFromLightGraph(\n this.lightSamples,\n this.lightGraph,\n );\n this.lightSources.sort((a, b) => b.maxIntensity - a.maxIntensity);\n }\n\n private _createEquirectangularSamplePoints = (\n numberOfPoints: number,\n ): Vector3[] => {\n const points: Vector3[] = [];\n for (let i = 0; i < numberOfPoints; i++) {\n const spiralAngle = i * Math.PI * (3 - Math.sqrt(5));\n const z = 1 - (i / (numberOfPoints - 1)) * 2;\n const radius = Math.sqrt(1 - z * z);\n const x = Math.cos(spiralAngle) * radius;\n const y = Math.sin(spiralAngle) * radius;\n points.push(new Vector3(x, y, z));\n }\n return points;\n };\n\n private _redFromRgbaToNormalizedFloatArray(\n rgba: Uint8Array | Float32Array,\n sRgbaPixels: boolean,\n exponent?: number,\n ): Float32Array {\n const floatArray = new Float32Array(rgba.length / 4);\n let minimumValue = 1;\n let maximumValue = 0;\n for (let i = 0; i < rgba.length / 4; ++i) {\n const color = new Color(...rgba.slice(i * 4, i * 4 + 3));\n if (rgba instanceof Float32Array) {\n color.convertSRGBToLinear();\n }\n const value = new Vector3(color.r, color.g, color.b).dot(this._grayScale);\n minimumValue = Math.min(minimumValue, value);\n maximumValue = Math.max(maximumValue, value);\n floatArray[i] = value;\n }\n if (exponent) {\n for (let i = 0; i < floatArray.length; ++i) {\n const normalizedValue = sRgbaPixels\n ? floatArray[i]\n : (floatArray[i] - minimumValue) / (maximumValue - minimumValue);\n floatArray[i] = Math.pow(normalizedValue, exponent);\n }\n } else if (!sRgbaPixels) {\n for (let i = 0; i < floatArray.length; ++i) {\n floatArray[i] =\n (floatArray[i] - minimumValue) / (maximumValue - minimumValue);\n }\n }\n return floatArray;\n }\n\n private _grayscaleTextureFromFloatArray(\n floatArray: Float32Array,\n _width: number,\n _height: number,\n ): Texture {\n const noOfPixels = _width * _height;\n const uint8data = new Uint8Array(4 * noOfPixels);\n for (let i = 0; i < noOfPixels; i++) {\n const grayscale = floatArray[i] * 255;\n uint8data[i * 4 + 0] = grayscale;\n uint8data[i * 4 + 1] = grayscale;\n uint8data[i * 4 + 2] = grayscale;\n uint8data[i * 4 + 3] = 255;\n }\n const dataTexture = new DataTexture(uint8data, _width, _height);\n dataTexture.needsUpdate = true;\n return dataTexture;\n }\n\n private _filterLightSamples(threshold: number): LightSample[] {\n const lightSamples: LightSample[] = [];\n for (let i = 0; i < this.sampleUVs.length; i++) {\n const uv = this.sampleUVs[i];\n const value = this._detectorTextureLuminanceValueFromUV(uv);\n if (value > threshold) {\n lightSamples.push(new LightSample(this.samplePoints[i], uv));\n }\n }\n return lightSamples;\n }\n\n private _detectorTextureLuminanceValueFromUV(uv: Vector2): number {\n const column = Math.floor(uv.x * this._width);\n const row = Math.floor(uv.y * this._height);\n const index = row * this._width + column;\n return this.detectorArray[index];\n }\n\n private _originalLuminanceValueFromUV(uv: Vector2): number {\n return this._detectorTextureLuminanceValueFromUV(uv) * 256;\n }\n\n private _findClusterSegments(\n samples: LightSample[],\n threshold: number,\n ): LightGraph {\n const stepDistance = this.pixelDistance * 2;\n const maxDistance = this.pointDistance * 1.5;\n const lightGraph = new LightGraph(samples.length);\n for (let i = 0; i < samples.length; i++) {\n for (let j = i + 1; j < samples.length; j++) {\n if (samples[i].position.angleTo(samples[j].position) < maxDistance) {\n const direction = samples[j].position\n .clone()\n .sub(samples[i].position);\n const steps = Math.floor(direction.length() / stepDistance);\n let inTreshold = true;\n let outOfTresholdCount = 0;\n for (let k = 1; k < steps; k++) {\n const step = direction.clone().multiplyScalar(k / steps);\n const uv = sphereToEquirectangular(\n samples[i].position.clone().add(step).normalize(),\n );\n const value = this._detectorTextureLuminanceValueFromUV(uv);\n if (value < threshold) {\n outOfTresholdCount++;\n if (outOfTresholdCount > 1) {\n inTreshold = false;\n break;\n }\n } else {\n outOfTresholdCount = 0;\n }\n }\n if (inTreshold) {\n lightGraph.adjacent[i].push(j);\n lightGraph.adjacent[j].push(i);\n lightGraph.edges.push([i, j]);\n }\n }\n }\n }\n return lightGraph;\n }\n\n private createLightSourcesFromLightGraph(\n samples: LightSample[],\n lightGraph: LightGraph,\n ): LightSource[] {\n const lightSources: LightSource[] = lightGraph.components\n .filter((component) => component.length > 1)\n .map(\n (component) =>\n new LightSource(component.map((index) => samples[index])),\n );\n lightSources.forEach((lightSource) =>\n lightSource.calculateLightSourceProperties((uv) =>\n this._originalLuminanceValueFromUV(uv),\n ),\n );\n return lightSources;\n }\n}\n\nexport class LightSample {\n public readonly position: Vector3;\n public readonly uv: Vector2;\n\n constructor(position: Vector3, uv: Vector2) {\n this.position = position;\n this.uv = uv;\n }\n}\n\nexport class LightGraph {\n public readonly noOfNodes: number;\n public edges: number[][] = [];\n public adjacent: number[][] = [];\n public components: number[][] = [];\n\n constructor(noOfNodes: number) {\n this.noOfNodes = noOfNodes;\n for (let i = 0; i < noOfNodes; i++) {\n this.adjacent.push([]);\n }\n }\n\n public findConnectedComponents() {\n const visited = new Array(this.noOfNodes).fill(false);\n this.components = [];\n for (let i = 0; i < this.noOfNodes; i++) {\n if (!visited[i]) {\n const component: number[] = [];\n this._dfs(i, visited, component);\n this.components.push(component);\n }\n }\n this.components.sort((a, b) => b.length - a.length);\n }\n\n private _dfs(node: number, visited: boolean[], component: number[]) {\n visited[node] = true;\n component.push(node);\n for (const adjacentNode of this.adjacent[node]) {\n if (!visited[adjacentNode]) {\n this._dfs(adjacentNode, visited, component);\n }\n }\n }\n}\n\nexport class LightSource {\n public readonly lightSamples: LightSample[];\n public position: Vector3 = new Vector3();\n public uv: Vector2 = new Vector2();\n public averageIntensity: number = 0;\n public maxIntensity: number = 0;\n public size: number = 0;\n\n constructor(lightSamples: LightSample[]) {\n this.lightSamples = lightSamples;\n }\n\n public calculateLightSourceProperties(\n luminanceFunction: (uv: Vector2) => number,\n ) {\n this.position = new Vector3();\n this.averageIntensity = 0;\n this.maxIntensity = 0;\n for (const lightSample of this.lightSamples) {\n this.position.add(lightSample.position);\n const luminanceValue = luminanceFunction(lightSample.uv);\n this.averageIntensity += luminanceValue;\n this.maxIntensity = Math.max(this.maxIntensity, luminanceValue);\n }\n this.averageIntensity /= this.lightSamples.length;\n this.position.normalize();\n this.uv = sphereToEquirectangular(this.position);\n let averageDistance = 0;\n for (const lightSample of this.lightSamples) {\n averageDistance += lightSample.position.distanceTo(this.position);\n }\n averageDistance /= this.lightSamples.length;\n this.size = averageDistance / Math.PI;\n }\n}\n","import { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport type { CopyTransformMaterialParameters } from '../shader-utility';\nimport {\n ALPHA_RGBA,\n ALPHA_TRANSFORM,\n CopyTransformMaterial,\n COLOR_COPY_BLEND_MODES,\n DEFAULT_TRANSFORM,\n DEFAULT_UV_TRANSFORM,\n FLIP_Y_UV_TRANSFORM,\n GRAYSCALE_TRANSFORM,\n LinearDepthRenderMaterial,\n RED_TRANSFORM,\n RGB_TRANSFORM,\n ZERO_RGBA,\n} from '../shader-utility';\nimport { ShadowAndAoPass } from './shadow-and-ao-pass';\nimport type { BlendAoAndAShadowMaterialParameters } from '../materials/blend-ao-and-shadow-material';\nimport { BlendAoAndAShadowMaterial } from '../materials/blend-ao-and-shadow-material';\nimport type { BlendAoPassDepthMaterialParameters } from '../materials/blend-ao-pass-depth-material';\nimport { BlendAoPassDepthMaterial } from '../materials/blend-ao-pass-depth-material';\nimport { EnvironmentMapDecodeMaterial } from '../light-source-detection';\nimport type { Camera, ShaderMaterial, Texture, WebGLRenderer } from 'three';\nimport { Color, Matrix4, NoBlending, OrthographicCamera, Vector4 } from 'three';\n\nexport class DebugPass extends RenderPass {\n private _environmentMapDecodeMaterial: EnvironmentMapDecodeMaterial;\n private _copyMaterial?: CopyTransformMaterial;\n private _blendAoAndShadowMaterial?: BlendAoAndAShadowMaterial;\n private _blendAoPassDepthMaterial?: BlendAoPassDepthMaterial;\n private _srgbToLinearCopyMaterial?: CopyTransformMaterial;\n private _depthRenderMaterial?: LinearDepthRenderMaterial;\n public debugOutput: string = '';\n\n constructor(renderPassManager: RenderPassManager) {\n super(renderPassManager);\n this._environmentMapDecodeMaterial = new EnvironmentMapDecodeMaterial(\n true,\n false,\n );\n this._environmentMapDecodeMaterial.blending = NoBlending;\n this._environmentMapDecodeMaterial.depthTest = false;\n }\n\n public dispose(): void {\n this._depthRenderMaterial?.dispose();\n this._copyMaterial?.dispose();\n this._srgbToLinearCopyMaterial?.dispose();\n }\n\n protected getCopyMaterial(\n parameters?: CopyTransformMaterialParameters,\n ): ShaderMaterial {\n this._copyMaterial = this._copyMaterial ?? new CopyTransformMaterial();\n return this._copyMaterial.update(parameters);\n }\n\n protected getBlendAoAndShadowMaterial(\n parameters?: BlendAoAndAShadowMaterialParameters,\n ): ShaderMaterial {\n this._blendAoAndShadowMaterial =\n this._blendAoAndShadowMaterial ??\n new BlendAoAndAShadowMaterial({\n blending: NoBlending,\n });\n return this._blendAoAndShadowMaterial.update(parameters);\n }\n\n protected getBlendAoPassDepthMaterial(\n parameters?: BlendAoPassDepthMaterialParameters,\n ): ShaderMaterial {\n this._blendAoPassDepthMaterial =\n this._blendAoPassDepthMaterial ??\n new BlendAoPassDepthMaterial({\n blending: NoBlending,\n });\n return this._blendAoPassDepthMaterial.update(parameters);\n }\n\n protected getSrgbToLinearCopyMaterial(\n parameters?: CopyTransformMaterialParameters,\n ): ShaderMaterial {\n this._srgbToLinearCopyMaterial =\n this._copyMaterial ??\n new CopyTransformMaterial(\n {},\n COLOR_COPY_BLEND_MODES.ADDITIVE,\n true,\n true,\n );\n return this._srgbToLinearCopyMaterial.update(parameters);\n }\n\n private _getDepthRenderMaterial(camera: Camera): LinearDepthRenderMaterial {\n this._depthRenderMaterial =\n this._depthRenderMaterial ??\n new LinearDepthRenderMaterial({\n depthTexture: this.gBufferTextures.textureWithDepthValue,\n depthFilter: this.gBufferTextures.isFloatGBufferWithRgbNormalAlphaDepth\n ? new Vector4(0, 0, 0, 1)\n : new Vector4(1, 0, 0, 0),\n });\n return this._depthRenderMaterial.update({ camera });\n }\n\n // eslint-disable-next-line complexity\n public renderPass(renderer: WebGLRenderer): void {\n switch (this.debugOutput) {\n default:\n break;\n case 'lineardepth':\n this.passRenderer.renderScreenSpace(\n renderer,\n this._getDepthRenderMaterial(this.camera),\n null,\n );\n break;\n case 'g-normal':\n if (this.gBufferTextures.isFloatGBufferWithRgbNormalAlphaDepth) {\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: this.gBufferTextures?.gBufferTexture,\n blending: NoBlending,\n // prettier-ignore\n colorTransform: new Matrix4().set(\n 0.5, 0, 0, 0,\n 0, 0.5, 0, 0,\n 0, 0, 0.5, 0,\n 0, 0, 0, 0,\n ),\n colorBase: new Vector4(0.5, 0.5, 0.5, 1),\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n } else {\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: this.gBufferTextures?.gBufferTexture,\n blending: NoBlending,\n colorTransform: RGB_TRANSFORM,\n colorBase: ALPHA_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n }\n break;\n case 'g-depth':\n if (this.gBufferTextures.isFloatGBufferWithRgbNormalAlphaDepth) {\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: this.gBufferTextures?.gBufferTexture,\n blending: NoBlending,\n colorTransform: ALPHA_TRANSFORM,\n colorBase: ALPHA_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n } else {\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: this.gBufferTextures?.depthBufferTexture,\n blending: NoBlending,\n colorTransform: RED_TRANSFORM,\n colorBase: ALPHA_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n }\n break;\n case 'ssao':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.aoAndSoftShadowRenderTarget\n .texture,\n blending: NoBlending,\n colorTransform: GRAYSCALE_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'ssaodenoise':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.denoiseRenderTargetTexture,\n blending: NoBlending,\n colorTransform: GRAYSCALE_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'shadowmap':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.screenSpaceShadowMapPass.shadowTexture,\n blending: NoBlending,\n colorTransform: GRAYSCALE_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'shadowsoft':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.aoAndSoftShadowRenderTarget\n .texture,\n blending: NoBlending,\n colorTransform: ShadowAndAoPass.shadowTransform,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'shadowdenoise':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.denoiseRenderTargetTexture,\n blending: NoBlending,\n colorTransform: ShadowAndAoPass.shadowTransform,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'shadowfadein':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.fadeRenderTarget.texture,\n blending: NoBlending,\n colorTransform: ShadowAndAoPass.shadowTransform,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'shadowandao':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getBlendAoAndShadowMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.denoiseRenderTargetTexture,\n blending: NoBlending,\n aoIntensity:\n this.renderPassManager.shadowAndAoPass.parameters.aoIntensity,\n shadowIntensity:\n this.renderPassManager.shadowAndAoPass.parameters.shadowIntensity,\n }),\n null,\n );\n break;\n case 'shadowandaodepth':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getBlendAoPassDepthMaterial({\n texture:\n this.renderPassManager.shadowAndAoPass.denoiseRenderTargetTexture,\n blending: NoBlending,\n }),\n null,\n );\n break;\n case 'materialao':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture: this.renderPassManager.aoPassMapTexture,\n blending: NoBlending,\n colorTransform: DEFAULT_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'groundreflection':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getSrgbToLinearCopyMaterial({\n texture:\n this.renderPassManager.groundReflectionPass.reflectionRenderTarget\n .texture,\n blending: NoBlending,\n colorTransform: DEFAULT_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: FLIP_Y_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'groundreflectionfinal':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getSrgbToLinearCopyMaterial({\n texture:\n this.renderPassManager.groundReflectionPass.intensityRenderTarget\n .texture,\n blending: NoBlending,\n colorTransform: DEFAULT_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: FLIP_Y_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'bakedgroundshadow':\n this.passRenderer.renderScreenSpace(\n renderer,\n this.getCopyMaterial({\n texture:\n this.renderPassManager.bakedGroundContactShadowPass.renderTarget\n .texture,\n blending: NoBlending,\n colorTransform: DEFAULT_TRANSFORM,\n colorBase: ZERO_RGBA,\n multiplyChannels: 0,\n uvTransform: DEFAULT_UV_TRANSFORM,\n }),\n null,\n );\n break;\n case 'environmentmap':\n this._environmentMapDecodeMaterial.setSourceTexture(\n this.scene.environment as Texture,\n );\n this.passRenderer.renderScreenSpace(\n renderer,\n this._environmentMapDecodeMaterial,\n null,\n );\n break;\n case 'lightsourcedetection':\n if (this.scene.userData?.environmentDefinition) {\n const aspect = this.renderPassManager.aspect;\n const environmentCamera = new OrthographicCamera(\n -1,\n 1,\n 1 / aspect,\n -1 / aspect,\n -1,\n 1,\n );\n const environmentScene =\n this.scene.userData?.environmentDefinition.createDebugScene(\n renderer,\n this.scene,\n this.renderPassManager.screenSpaceShadowMapPass.parameters\n .maximumNumberOfLightSources,\n );\n environmentScene.background = new Color(0xffffff);\n renderer.render(environmentScene, environmentCamera);\n }\n break;\n }\n }\n}\n","import { RenderPass } from './render-pass';\nimport type { RenderPassManager } from '../render-pass-manager';\nimport type { WebGLRenderer } from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport { DoubleSide, MeshStandardMaterial } from 'three';\n\nexport class SceneRenderPass extends RenderPass {\n public drawGround: boolean = true;\n public drawWithDebugMaterial = false;\n public grayDebugMaterial = new MeshStandardMaterial({\n color: 0xc0c0c0,\n side: DoubleSide,\n envMapIntensity: 0.4,\n });\n\n constructor(renderPassManager: RenderPassManager) {\n super(renderPassManager);\n }\n\n public dispose(): void {\n super.dispose();\n this.grayDebugMaterial.dispose();\n }\n\n public renderPass(renderer: WebGLRenderer | WebGPURenderer): void {\n this.renderCacheManager.onBeforeRender('floorDepthWrite', this.scene);\n this.renderPassManager.setGroundVisibility(this.drawGround);\n if (this.drawWithDebugMaterial) {\n this.renderCacheManager.render('debug', this.scene, () => {\n this.passRenderer.renderWithOverrideMaterial(\n renderer as WebGLRenderer,\n this.scene,\n this.camera,\n this.grayDebugMaterial,\n null,\n 0,\n 1,\n );\n });\n } else {\n renderer.render(this.scene, this.camera);\n }\n this.renderPassManager.setGroundVisibility(false);\n this.renderCacheManager.onAfterRender('floorDepthWrite');\n }\n}\n","import {\n type MeshStandardMaterial,\n type ShaderLibShader,\n type Texture,\n type WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport type { Nullable } from '#/common/src/utils/types';\nimport { isTransmissiveMaterial } from '../render-cache';\n\nexport class PostProcessingMaterialPlugin {\n public applyAoAndShadowToAlpha: boolean = false;\n private _aoPassMapUniform: { value: Nullable<Texture> } = { value: null };\n private _aoPassMapScaleUniform: { value: number } = { value: 1 };\n private _aoPassMapIntensityUniform: { value: number } = { value: 1 };\n private _shPassMapIntensityUniform: { value: number } = { value: 1 };\n private _reflectionPassMapUniform: { value: Nullable<Texture> } = {\n value: null,\n };\n private _reflectionPassMapScaleUniform: { value: number } = { value: 1 };\n private _reflectionPassMapIntensityUniform: { value: number } = { value: 0 };\n public applyReflectionPassMap: boolean = false;\n\n set aoPassMap(value: Nullable<Texture>) {\n this._aoPassMapUniform.value = value;\n }\n\n set aoPassMapScale(value: number) {\n this._aoPassMapScaleUniform.value = value;\n }\n\n set aoPassMapIntensity(value: number) {\n this._aoPassMapIntensityUniform.value = value;\n }\n\n set shPassMapIntensity(value: number) {\n this._shPassMapIntensityUniform.value = value;\n }\n\n set reflectionPassMap(value: Nullable<Texture>) {\n this._reflectionPassMapUniform.value = value;\n }\n\n set reflectionPassMapScale(value: number) {\n this._reflectionPassMapScaleUniform.value = value;\n }\n\n set reflectionPassMapIntensity(value: number) {\n this._reflectionPassMapIntensityUniform.value = value;\n }\n\n public static addPlugin(\n material: MeshStandardMaterial,\n ): PostProcessingMaterialPlugin | null {\n if (isTransmissiveMaterial(material)) {\n return null;\n }\n if (material.userData.postProcessingMaterialPlugin !== undefined) {\n return material.userData.postProcessingMaterialPlugin instanceof\n PostProcessingMaterialPlugin\n ? material.userData.postProcessingMaterialPlugin\n : null;\n }\n const plugin = new PostProcessingMaterialPlugin();\n material.userData.postProcessingMaterialPlugin = plugin;\n material.onBeforeCompile = (\n materialShader: ShaderLibShader,\n renderer: WebGLRenderer | WebGPURenderer,\n ) => plugin._onBeforeCompile(materialShader, renderer);\n material.customProgramCacheKey = () => plugin._customProgramCacheKey();\n return plugin;\n }\n\n private _isEnabled() {\n return (\n this._aoPassMapUniform.value !== undefined &&\n this._aoPassMapUniform.value !== null\n );\n }\n\n private _customProgramCacheKey() {\n let passMapKey: string = '';\n if (this._isEnabled()) {\n passMapKey += 'aoPassMap' + (this.applyAoAndShadowToAlpha ? 'Alpha' : '');\n }\n if (this.applyReflectionPassMap) {\n passMapKey += 'reflectionPassMap';\n }\n return passMapKey;\n }\n\n private _onBeforeCompile(\n materialShader: ShaderLibShader,\n _renderer: WebGLRenderer | WebGPURenderer,\n ) {\n const activatePlugIn = this._isEnabled() || this.applyReflectionPassMap;\n if (activatePlugIn) {\n let parsReplacement: string = this.applyAoAndShadowToAlpha\n ? '#define USE_APPLY_AO_AND_SHADOW_TO_ALPHA\\n'\n : '';\n parsReplacement += this.applyReflectionPassMap\n ? '#define USE_REFLECTION_PASS_MAP\\n'\n : '';\n parsReplacement += aoMapParsFragmentReplacement;\n materialShader.fragmentShader = materialShader.fragmentShader.replace(\n '#include <aomap_pars_fragment>',\n parsReplacement,\n );\n materialShader.fragmentShader = materialShader.fragmentShader.replace(\n '#include <aomap_fragment>',\n aoMapFragmentReplacement,\n );\n this._initUniforms(materialShader);\n }\n }\n\n private _initUniforms(materialShader: ShaderLibShader) {\n if (materialShader) {\n materialShader.uniforms.tAoPassMap = this._aoPassMapUniform;\n materialShader.uniforms.aoPassMapScale = this._aoPassMapScaleUniform;\n materialShader.uniforms.aoPassMapIntensity =\n this._aoPassMapIntensityUniform;\n materialShader.uniforms.shPassMapIntensity =\n this._shPassMapIntensityUniform;\n materialShader.uniforms.tReflectionPassMap =\n this._reflectionPassMapUniform;\n materialShader.uniforms.reflectionPassMapScale =\n this._reflectionPassMapScaleUniform;\n materialShader.uniforms.reflectionPassMapIntensity =\n this._reflectionPassMapIntensityUniform;\n }\n }\n}\n\nconst aoMapParsFragmentReplacement = /* glsl */ `\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n\n\tuniform highp sampler2D tAoPassMap;\n uniform float aoPassMapScale;\n uniform float aoPassMapIntensity;\n uniform float shPassMapIntensity;\n uniform sampler2D tReflectionPassMap;\n uniform float reflectionPassMapScale;\n uniform float reflectionPassMapIntensity;\n`;\n\nconst aoMapFragmentReplacement = /* glsl */ `\n#ifndef AOPASSMAP_SWIZZLE\n\t#define AOPASSMAP_SWIZZLE rg\n#endif\n\nfloat ambientOcclusion = 1.0;\nfloat shadowValue = 1.0;\n\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tambientOcclusion = texture2D( aoMap, vAoMapUv ).r;\n ambientOcclusion = ( ambientOcclusion - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n\n vec4 aoAndShadowMap = texelFetch( tAoPassMap, ivec2( gl_FragCoord.xy * aoPassMapScale ), 0 );\n vec2 aoAndShadow = aoAndShadowMap.rg;\n float depthDelta = abs( dot(aoAndShadowMap.wz, vec2(1.0/1024.0)) - gl_FragCoord.z );\n const ivec2 aoOffsetArray[8] = ivec2[8](\n ivec2(1, 0), ivec2(-1, 0), ivec2(0, 1), ivec2(0, -1), ivec2(1, 1), ivec2(-1, 1), ivec2(1, -1), ivec2(-1, -1));\n for (int aoOffsetI = 0; aoOffsetI < 8; aoOffsetI++) {\n aoAndShadowMap = texelFetch( tAoPassMap, ivec2( gl_FragCoord.xy * aoPassMapScale ) + aoOffsetArray[aoOffsetI], 0 );\n float testDepthDelta = abs( dot(aoAndShadowMap.wz, vec2(1.0/1024.0)) - gl_FragCoord.z );\n if (testDepthDelta < depthDelta) {\n aoAndShadow = aoAndShadowMap.rg;\n depthDelta = testDepthDelta;\n }\n }\n\n float aoPassMapValue = aoPassMapIntensity < 0.0 ? 1.0 : max(0.0, (aoAndShadow.r - 1.0) * aoPassMapIntensity + 1.0);\n shadowValue = shPassMapIntensity < 0.0 ? 1.0 : max(0.0, (aoAndShadow.g - 1.0) * shPassMapIntensity + 1.0);\n\n #ifdef USE_REFLECTION_PASS_MAP\n\n ivec2 reflectionPassMapSize = textureSize( tReflectionPassMap, 0 );\n vec2 reflectionPassMapUv = vec2( gl_FragCoord.x * reflectionPassMapScale, float(reflectionPassMapSize.y) - gl_FragCoord.y * reflectionPassMapScale );\n vec4 reflectionPassMapColor = texture2D( tReflectionPassMap, reflectionPassMapUv / vec2(reflectionPassMapSize) );\n if (reflectionPassMapColor.a > 0.0) reflectionPassMapColor.rgb /= reflectionPassMapColor.a;\n vec3 diffuseReflectionPassMapColor = reflectionPassMapColor.rgb * material.diffuseColor;\n reflectedLight.indirectDiffuse += diffuseReflectionPassMapColor * reflectionPassMapColor.a * reflectionPassMapIntensity;\n //reflectedLight.indirectDiffuse = mix(reflectedLight.indirectDiffuse, diffuseReflectionPassMapColor, reflectionPassMapColor.a * reflectionPassMapIntensity);\n\n #endif\n\n #if defined ( USE_APPLY_AO_AND_SHADOW_TO_ALPHA )\n diffuseColor.a = 1.0 - (1.0 - diffuseColor.a) * aoPassMapValue * shadowValue;\n #else\n ambientOcclusion = min( ambientOcclusion, aoPassMapValue );\n #endif\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion * shadowValue;\n\n\t#if defined( USE_CLEARCOAT )\n\t\tclearcoatSpecularIndirect *= ambientOcclusion * shadowValue;\n\t#endif\n\n\t#if defined( USE_SHEEN )\n\t\tsheenSpecularIndirect *= ambientOcclusion * shadowValue;\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\n float specularOcclusion = computeSpecularOcclusion( dotNV, ambientOcclusion * shadowValue, material.roughness );\n\t\treflectedLight.indirectSpecular *= specularOcclusion;\n\n #ifdef USE_REFLECTION_PASS_MAP\n reflectedLight.indirectSpecular += material.specularColor * reflectionPassMapColor.rgb * reflectionPassMapColor.a * reflectionPassMapIntensity * specularOcclusion;\n #endif\n\n\t#endif\n`;\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\n/**\n * This pass can be used to create a post processing effect\n * with a raw GLSL shader object. Useful for implementing custom\n * effects.\n *\n * ```js\n * const fxaaPass = new ShaderPass( FXAAShader );\n * composer.addPass( fxaaPass );\n * ```\n *\n * @augments Pass\n * @three_import import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';\n */\nclass ShaderPass extends Pass {\n\n\t/**\n\t * Constructs a new shader pass.\n\t *\n\t * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n\t * defines and uniforms. It's also valid to pass a custom shader material.\n\t * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n\t * the read buffer.\n\t */\n\tconstructor( shader, textureID = 'tDiffuse' ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The name of the texture uniform that should sample the read buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'tDiffuse'\n\t\t */\n\t\tthis.textureID = textureID;\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.uniforms = null;\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {?ShaderMaterial}\n\t\t */\n\t\tthis.material = null;\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the shader pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis._fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { ShaderPass } from './ShaderPass.js';\n\nconst LUTShader = {\n\n\tname: 'LUTShader',\n\n\tuniforms: {\n\n\t\tlut: { value: null },\n\t\tlutSize: { value: 0 },\n\n\t\ttDiffuse: { value: null },\n\t\tintensity: { value: 1.0 },\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}\n\n\t`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float lutSize;\n\t\tuniform sampler3D lut;\n\n\t\tvarying vec2 vUv;\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvoid main() {\n\n\t\t\tvec4 val = texture2D( tDiffuse, vUv );\n\t\t\tvec4 lutVal;\n\n\t\t\t// pull the sample in by half a pixel so the sample begins\n\t\t\t// at the center of the edge pixels.\n\t\t\tfloat pixelWidth = 1.0 / lutSize;\n\t\t\tfloat halfPixelWidth = 0.5 / lutSize;\n\t\t\tvec3 uvw = vec3( halfPixelWidth ) + val.rgb * ( 1.0 - pixelWidth );\n\n\n\t\t\tlutVal = vec4( texture( lut, uvw ).rgb, val.a );\n\n\t\t\tgl_FragColor = vec4( mix( val, lutVal, intensity ) );\n\n\t\t}\n\n\t`,\n\n};\n\n/**\n * Pass for color grading via lookup tables.\n *\n * ```js\n * const lutPass = new LUTPass( { lut: lut.texture3D } );\n * composer.addPass( lutPass );\n * ```\n *\n * @augments ShaderPass\n * @three_import import { LUTPass } from 'three/addons/postprocessing/LUTPass.js';\n */\nclass LUTPass extends ShaderPass {\n\n\t/**\n\t * Constructs a LUT pass.\n\t *\n\t * @param {{lut:Data3DTexture,intensity:number}} [options={}] - The pass options.\n\t */\n\tconstructor( options = {} ) {\n\n\t\tsuper( LUTShader );\n\n\t\t/**\n\t\t * The LUT as a 3D texture.\n\t\t *\n\t\t * @type {?Data3DTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.lut = options.lut || null;\n\n\t\t/**\n\t\t * The intensity.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 'intensity' in options ? options.intensity : 1;\n\n\t}\n\n\tset lut( v ) {\n\n\t\tconst material = this.material;\n\n\t\tif ( v !== this.lut ) {\n\n\t\t\tmaterial.uniforms.lut.value = null;\n\n\t\t\tif ( v ) {\n\n\t\t\t\tmaterial.uniforms.lutSize.value = v.image.width;\n\t\t\t\tmaterial.uniforms.lut.value = v;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tget lut() {\n\n\t\treturn this.material.uniforms.lut.value;\n\n\t}\n\n\tset intensity( v ) {\n\n\t\tthis.material.uniforms.intensity.value = v;\n\n\t}\n\n\tget intensity() {\n\n\t\treturn this.material.uniforms.intensity.value;\n\n\t}\n\n}\n\nexport { LUTPass };\n","import {\n\tClampToEdgeWrapping,\n\tData3DTexture,\n\tFileLoader,\n\tLinearFilter,\n\tLoader,\n\tUnsignedByteType,\n\tVector3,\n} from 'three';\n\n/**\n * A loader for the Cube LUT format.\n *\n * References:\n * - [Cube LUT Specification](https://web.archive.org/web/20220220033515/https://wwwimages2.adobe.com/content/dam/acom/en/products/speedgrade/cc/pdfs/cube-lut-specification-1.0.pdf)\n *\n * ```js\n * const loader = new LUTCubeLoader();\n * const map = loader.loadAsync( 'luts/Bourbon 64.CUBE' );\n * ```\n *\n * @augments Loader\n * @three_import import { LUTCubeLoader } from 'three/addons/loaders/LUTCubeLoader.js';\n */\nexport class LUTCubeLoader extends Loader {\n\n\t/**\n\t * Constructs a new Cube LUT loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(UnsignedByteType|FloatType)}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = UnsignedByteType;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(UnsignedByteType|FloatType)} type - The texture type to set.\n\t * @return {LUTCubeLoader} A reference to this loader.\n\t */\n\tsetType( type ) {\n\n\t\tthis.type = type;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Cube LUT asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({title:string,size:number,domainMin:Vector3,domainMax:Vector3,texture3D:Data3DTexture})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.load( url, text => {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( this.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given Cube LUT data and returns the resulting 3D data texture.\n\t *\n\t * @param {string} input - The raw Cube LUT data as a string.\n\t * @return {{title:string,size:number,domainMin:Vector3,domainMax:Vector3,texture3D:Data3DTexture}} The parsed Cube LUT.\n\t */\n\tparse( input ) {\n\n\t\tconst regExpTitle = /TITLE +\"([^\"]*)\"/;\n\t\tconst regExpSize = /LUT_3D_SIZE +(\\d+)/;\n\t\tconst regExpDomainMin = /DOMAIN_MIN +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n\t\tconst regExpDomainMax = /DOMAIN_MAX +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n\t\tconst regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n\n\t\tlet result = regExpTitle.exec( input );\n\t\tconst title = ( result !== null ) ? result[ 1 ] : null;\n\n\t\tresult = regExpSize.exec( input );\n\n\t\tif ( result === null ) {\n\n\t\t\tthrow new Error( 'LUTCubeLoader: Missing LUT_3D_SIZE information' );\n\n\t\t}\n\n\t\tconst size = Number( result[ 1 ] );\n\t\tconst length = size ** 3 * 4;\n\t\tconst data = this.type === UnsignedByteType ? new Uint8Array( length ) : new Float32Array( length );\n\n\t\tconst domainMin = new Vector3( 0, 0, 0 );\n\t\tconst domainMax = new Vector3( 1, 1, 1 );\n\n\t\tresult = regExpDomainMin.exec( input );\n\n\t\tif ( result !== null ) {\n\n\t\t\tdomainMin.set( Number( result[ 1 ] ), Number( result[ 2 ] ), Number( result[ 3 ] ) );\n\n\t\t}\n\n\t\tresult = regExpDomainMax.exec( input );\n\n\t\tif ( result !== null ) {\n\n\t\t\tdomainMax.set( Number( result[ 1 ] ), Number( result[ 2 ] ), Number( result[ 3 ] ) );\n\n\t\t}\n\n\t\tif ( domainMin.x > domainMax.x || domainMin.y > domainMax.y || domainMin.z > domainMax.z ) {\n\n\t\t\tthrow new Error( 'LUTCubeLoader: Invalid input domain' );\n\n\t\t}\n\n\t\tconst scale = this.type === UnsignedByteType ? 255 : 1;\n\t\tlet i = 0;\n\n\t\twhile ( ( result = regExpDataPoints.exec( input ) ) !== null ) {\n\n\t\t\tdata[ i ++ ] = Number( result[ 1 ] ) * scale;\n\t\t\tdata[ i ++ ] = Number( result[ 2 ] ) * scale;\n\t\t\tdata[ i ++ ] = Number( result[ 3 ] ) * scale;\n\t\t\tdata[ i ++ ] = scale;\n\n\t\t}\n\n\t\tconst texture3D = new Data3DTexture();\n\t\ttexture3D.image.data = data;\n\t\ttexture3D.image.width = size;\n\t\ttexture3D.image.height = size;\n\t\ttexture3D.image.depth = size;\n\t\ttexture3D.type = this.type;\n\t\ttexture3D.magFilter = LinearFilter;\n\t\ttexture3D.minFilter = LinearFilter;\n\t\ttexture3D.wrapS = ClampToEdgeWrapping;\n\t\ttexture3D.wrapT = ClampToEdgeWrapping;\n\t\ttexture3D.wrapR = ClampToEdgeWrapping;\n\t\ttexture3D.generateMipmaps = false;\n\t\ttexture3D.needsUpdate = true;\n\n\t\treturn {\n\t\t\ttitle,\n\t\t\tsize,\n\t\t\tdomainMin,\n\t\t\tdomainMax,\n\t\t\ttexture3D,\n\t\t};\n\n\t}\n\n}\n","import {\n\tLoader,\n\tTextureLoader,\n\tData3DTexture,\n\tRGBAFormat,\n\tUnsignedByteType,\n\tClampToEdgeWrapping,\n\tLinearFilter,\n} from 'three';\n\n/**\n * A loader for loading LUT images.\n *\n * ```js\n * const loader = new LUTImageLoader();\n * const map = loader.loadAsync( 'luts/NeutralLUT.png' );\n * ```\n *\n * @augments Loader\n * @three_import import { LUTImageLoader } from 'three/addons/loaders/LUTImageLoader.js';\n */\nexport class LUTImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new LUT loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether to vertically flip the LUT or not.\n\t\t *\n\t\t * Depending on the LUT's origin, the texture has green at the bottom (e.g. for Unreal)\n\t\t * or green at the top (e.g. for Unity URP Color Lookup). If you're using lut image strips\n\t\t * from a Unity pipeline, then set this property to `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flip = false;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded LUT\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({size:number,texture3D:Data3DTexture})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new TextureLoader( this.manager );\n\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, texture => {\n\n\t\t\ttry {\n\n\t\t\t\tlet imageData;\n\n\t\t\t\tif ( texture.image.width < texture.image.height ) {\n\n\t\t\t\t\timageData = this._getImageData( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\timageData = this._horz2Vert( texture );\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( this.parse( imageData.data, Math.min( texture.image.width, texture.image.height ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given LUT data and returns the resulting 3D data texture.\n\t *\n\t * @param {Uint8ClampedArray} dataArray - The raw LUT data.\n\t * @param {number} size - The LUT size.\n\t * @return {{size:number,texture3D:Data3DTexture}} An object representing the parsed LUT.\n\t */\n\tparse( dataArray, size ) {\n\n\t\tconst data = new Uint8Array( dataArray );\n\n\t\tconst texture3D = new Data3DTexture();\n\t\ttexture3D.image.data = data;\n\t\ttexture3D.image.width = size;\n\t\ttexture3D.image.height = size;\n\t\ttexture3D.image.depth = size;\n\t\ttexture3D.format = RGBAFormat;\n\t\ttexture3D.type = UnsignedByteType;\n\t\ttexture3D.magFilter = LinearFilter;\n\t\ttexture3D.minFilter = LinearFilter;\n\t\ttexture3D.wrapS = ClampToEdgeWrapping;\n\t\ttexture3D.wrapT = ClampToEdgeWrapping;\n\t\ttexture3D.wrapR = ClampToEdgeWrapping;\n\t\ttexture3D.generateMipmaps = false;\n\t\ttexture3D.needsUpdate = true;\n\n\t\treturn {\n\t\t\tsize,\n\t\t\ttexture3D,\n\t\t};\n\n\t}\n\n\t// internal\n\n\t_getImageData( texture ) {\n\n\t\tconst width = texture.image.width;\n\t\tconst height = texture.image.height;\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\tif ( this.flip === true ) {\n\n\t\t\tcontext.scale( 1, - 1 );\n\t\t\tcontext.translate( 0, - height );\n\n\t\t}\n\n\t\tcontext.drawImage( texture.image, 0, 0 );\n\n\t\treturn context.getImageData( 0, 0, width, height );\n\n\t}\n\n\t_horz2Vert( texture ) {\n\n\t\tconst width = texture.image.height;\n\t\tconst height = texture.image.width;\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\tif ( this.flip === true ) {\n\n\t\t\tcontext.scale( 1, - 1 );\n\t\t\tcontext.translate( 0, - height );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < width; i ++ ) {\n\n\t\t\tconst sy = i * width;\n\t\t\tconst dy = ( this.flip ) ? height - i * width : i * width;\n\t\t\tcontext.drawImage( texture.image, sy, 0, width, width, 0, dy, width, width );\n\n\t\t}\n\n\t\treturn context.getImageData( 0, 0, width, height );\n\n\t}\n\n}\n","import {\n\tClampToEdgeWrapping,\n\tData3DTexture,\n\tFileLoader,\n\tLinearFilter,\n\tLoader,\n\tRGBAFormat,\n\tUnsignedByteType,\n} from 'three';\n\n/**\n * A loader for the 3DL LUT format.\n *\n * References:\n * - [3D LUTs](http://download.autodesk.com/us/systemdocs/help/2011/lustre/index.html?url=./files/WSc4e151a45a3b785a24c3d9a411df9298473-7ffd.htm,topicNumber=d0e9492)\n * - [Format Spec for .3dl](https://community.foundry.com/discuss/topic/103636/format-spec-for-3dl?mode=Post&postID=895258)\n *\n * ```js\n * const loader = new LUT3dlLoader();\n * const map = loader.loadAsync( 'luts/Presetpro-Cinematic.3dl' );\n * ```\n *\n * @augments Loader\n * @three_import import { LUT3dlLoader } from 'three/addons/loaders/LUT3dlLoader.js';\n */\nexport class LUT3dlLoader extends Loader {\n\n\t/**\n\t * Constructs a new 3DL LUT loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(UnsignedByteType|FloatType)}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = UnsignedByteType;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(UnsignedByteType|FloatType)} type - The texture type to set.\n\t * @return {LUT3dlLoader} A reference to this loader.\n\t */\n\tsetType( type ) {\n\n\t\tthis.type = type;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded 3DL LUT asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({size:number,texture3D:Data3DTexture})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.load( url, text => {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( this.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given 3DL LUT data and returns the resulting 3D data texture.\n\t *\n\t * @param {string} input - The raw 3DL LUT data as a string.\n\t * @return {{size:number,texture3D:Data3DTexture}} The parsed 3DL LUT.\n\t */\n\tparse( input ) {\n\n\t\tconst regExpGridInfo = /^[\\d ]+$/m;\n\t\tconst regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n\n\t\t// The first line describes the positions of values on the LUT grid.\n\t\tlet result = regExpGridInfo.exec( input );\n\n\t\tif ( result === null ) {\n\n\t\t\tthrow new Error( 'LUT3dlLoader: Missing grid information' );\n\n\t\t}\n\n\t\tconst gridLines = result[ 0 ].trim().split( /\\s+/g ).map( Number );\n\t\tconst gridStep = gridLines[ 1 ] - gridLines[ 0 ];\n\t\tconst size = gridLines.length;\n\t\tconst sizeSq = size ** 2;\n\n\t\tfor ( let i = 1, l = gridLines.length; i < l; ++ i ) {\n\n\t\t\tif ( gridStep !== ( gridLines[ i ] - gridLines[ i - 1 ] ) ) {\n\n\t\t\t\tthrow new Error( 'LUT3dlLoader: Inconsistent grid size' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst dataFloat = new Float32Array( size ** 3 * 4 );\n\t\tlet maxValue = 0.0;\n\t\tlet index = 0;\n\n\t\twhile ( ( result = regExpDataPoints.exec( input ) ) !== null ) {\n\n\t\t\tconst r = Number( result[ 1 ] );\n\t\t\tconst g = Number( result[ 2 ] );\n\t\t\tconst b = Number( result[ 3 ] );\n\n\t\t\tmaxValue = Math.max( maxValue, r, g, b );\n\n\t\t\tconst bLayer = index % size;\n\t\t\tconst gLayer = Math.floor( index / size ) % size;\n\t\t\tconst rLayer = Math.floor( index / ( sizeSq ) ) % size;\n\n\t\t\t// b grows first, then g, then r.\n\t\t\tconst d4 = ( bLayer * sizeSq + gLayer * size + rLayer ) * 4;\n\t\t\tdataFloat[ d4 + 0 ] = r;\n\t\t\tdataFloat[ d4 + 1 ] = g;\n\t\t\tdataFloat[ d4 + 2 ] = b;\n\n\t\t\t++ index;\n\n\t\t}\n\n\t\t// Determine the bit depth to scale the values to [0.0, 1.0].\n\t\tconst bits = Math.ceil( Math.log2( maxValue ) );\n\t\tconst maxBitValue = Math.pow( 2, bits );\n\n\t\tconst data = this.type === UnsignedByteType ? new Uint8Array( dataFloat.length ) : dataFloat;\n\t\tconst scale = this.type === UnsignedByteType ? 255 : 1;\n\n\t\tfor ( let i = 0, l = data.length; i < l; i += 4 ) {\n\n\t\t\tconst i1 = i + 1;\n\t\t\tconst i2 = i + 2;\n\t\t\tconst i3 = i + 3;\n\n\t\t\t// Note: data is dataFloat when type is FloatType.\n\t\t\tdata[ i ] = dataFloat[ i ] / maxBitValue * scale;\n\t\t\tdata[ i1 ] = dataFloat[ i1 ] / maxBitValue * scale;\n\t\t\tdata[ i2 ] = dataFloat[ i2 ] / maxBitValue * scale;\n\t\t\tdata[ i3 ] = scale;\n\n\t\t}\n\n\t\tconst texture3D = new Data3DTexture();\n\t\ttexture3D.image.data = data;\n\t\ttexture3D.image.width = size;\n\t\ttexture3D.image.height = size;\n\t\ttexture3D.image.depth = size;\n\t\ttexture3D.format = RGBAFormat;\n\t\ttexture3D.type = this.type;\n\t\ttexture3D.magFilter = LinearFilter;\n\t\ttexture3D.minFilter = LinearFilter;\n\t\ttexture3D.wrapS = ClampToEdgeWrapping;\n\t\ttexture3D.wrapT = ClampToEdgeWrapping;\n\t\ttexture3D.wrapR = ClampToEdgeWrapping;\n\t\ttexture3D.generateMipmaps = false;\n\t\ttexture3D.needsUpdate = true;\n\n\t\treturn {\n\t\t\tsize,\n\t\t\ttexture3D,\n\t\t};\n\n\t}\n\n}\n","/**\n * @module OutputShader\n * @three_import import { OutputShader } from 'three/addons/shaders/OutputShader.js';\n */\n\n/**\n * Performs tone mapping and color space conversion for\n * FX workflows.\n *\n * Used by {@link OutputPass}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst OutputShader = {\n\n\tname: 'OutputShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'toneMappingExposure': { value: 1 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include <tonemapping_pars_fragment>\n\t\t#include <colorspace_pars_fragment>\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n\n};\n\nexport { OutputShader };\n","import {\n\tColorManagement,\n\tRawShaderMaterial,\n\tUniformsUtils,\n\tLinearToneMapping,\n\tReinhardToneMapping,\n\tCineonToneMapping,\n\tAgXToneMapping,\n\tACESFilmicToneMapping,\n\tNeutralToneMapping,\n\tCustomToneMapping,\n\tSRGBTransfer\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { OutputShader } from '../shaders/OutputShader.js';\n\n/**\n * This pass is responsible for including tone mapping and color space conversion\n * into your pass chain. In most cases, this pass should be included at the end\n * of each pass chain. If a pass requires sRGB input (e.g. like FXAA), the pass\n * must follow `OutputPass` in the pass chain.\n *\n * The tone mapping and color space settings are extracted from the renderer.\n *\n * ```js\n * const outputPass = new OutputPass();\n * composer.addPass( outputPass );\n * ```\n *\n * @augments Pass\n * @three_import import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';\n */\nclass OutputPass extends Pass {\n\n\t/**\n\t * Constructs a new output pass.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag indicates that this is an output pass.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOutputPass = true;\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( OutputShader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {RawShaderMaterial}\n\t\t */\n\t\tthis.material = new RawShaderMaterial( {\n\t\t\tname: OutputShader.name,\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: OutputShader.vertexShader,\n\t\t\tfragmentShader: OutputShader.fragmentShader\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t\tthis._outputColorSpace = null;\n\t\tthis._toneMapping = null;\n\n\t}\n\n\t/**\n\t * Performs the output pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'toneMappingExposure' ].value = renderer.toneMappingExposure;\n\n\t\t// rebuild defines if required\n\n\t\tif ( this._outputColorSpace !== renderer.outputColorSpace || this._toneMapping !== renderer.toneMapping ) {\n\n\t\t\tthis._outputColorSpace = renderer.outputColorSpace;\n\t\t\tthis._toneMapping = renderer.toneMapping;\n\n\t\t\tthis.material.defines = {};\n\n\t\t\tif ( ColorManagement.getTransfer( this._outputColorSpace ) === SRGBTransfer ) this.material.defines.SRGB_TRANSFER = '';\n\n\t\t\tif ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === NeutralToneMapping ) this.material.defines.NEUTRAL_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === CustomToneMapping ) this.material.defines.CUSTOM_TONE_MAPPING = '';\n\n\t\t\tthis.material.needsUpdate = true;\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.renderToScreen === true ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { OutputPass };\n","import { CameraUpdate, PassRenderer } from './render-utility';\nimport { BakedGroundContactShadowPass } from './pass/baked-ground-contact-shadow-pass';\nimport { GBufferRenderPass } from './pass/gbuffer-render-pass';\nimport { GroundReflectionPass } from './pass/ground-reflection-pass';\nimport { ScreenSpaceShadowMapPass } from './pass/screen-space-shadow-map-pass';\nimport { ShadowAndAoPass } from './pass/shadow-and-ao-pass';\nimport type { ShadowBlurType } from './pass/shadow-and-ao-pass';\nimport { OutlinePass } from './pass/outline-pass';\nimport type { OutlineRenderer } from './outline-renderer';\nimport { DebugPass } from './pass/debug-pass';\nimport { SHADOW_BLUR_TYPES } from './pass/shadow-and-ao-pass';\nimport { SceneRenderPass } from './pass/scene-render-pass';\nimport type { SceneRenderer, SceneRendererParameters } from './scene-renderer';\nimport { HalfFloatType, WebGLRenderTarget } from 'three';\nimport type { ThreeObject3d } from './render-cache';\nimport { PostProcessingMaterialPlugin } from './materials/postprocessing-material-plugin';\nimport {\n LinearFilter,\n MeshStandardMaterial,\n NearestFilter,\n Vector2,\n} from 'three';\nimport type {\n Mesh,\n Object3D,\n Camera,\n Scene,\n Texture,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport { LUTPass } from 'three/examples/jsm/postprocessing/LUTPass.js';\nimport type { LUTCubeResult } from 'three/examples/jsm/loaders/LUTCubeLoader.js';\nimport { LUTCubeLoader } from 'three/examples/jsm/loaders/LUTCubeLoader.js';\nimport type { LUTImageResult } from 'three/examples/jsm/loaders/LUTImageLoader.js';\nimport { LUTImageLoader } from 'three/examples/jsm/loaders/LUTImageLoader.js';\nimport type { LUT3dlResult } from 'three/examples/jsm/loaders/LUT3dlLoader.js';\nimport { LUT3dlLoader } from 'three/examples/jsm/loaders/LUT3dlLoader.js';\nimport { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js';\nimport inject from '../../di/inject';\nimport type InitData from '../../utils/init-data';\nimport { getMaxSamples } from '../../utils/threejs-utils';\n\ninterface _passUpdateStates {\n updateGBuffer: boolean;\n updateGroundReflection: boolean;\n updateScreenSpaceShadow: boolean;\n updateShadowAndAoPass: boolean;\n updateOutlinePass: boolean;\n updateDebugPass: boolean;\n}\n\ninterface DynamicPassUpdateRequirements {\n needsUpdate: boolean;\n shadowOnCameraChange: ShadowBlurType;\n intensityScale: number;\n}\n\nexport interface LutPassParameters {\n [key: string]: any;\n enabled: boolean;\n lut: string;\n intensity: number;\n}\n\nconst defaultLutPassParameters: LutPassParameters = {\n enabled: false,\n intensity: 1,\n lut: 'Bourbon 64',\n};\n\nexport class RenderPassManager {\n public _creator_: string;\n public materialsNeedUpdate: boolean = true;\n private _sceneRenderer: SceneRenderer;\n private _passRenderer: PassRenderer = new PassRenderer();\n private _sceneRenderPass: SceneRenderPass;\n private _bakedGroundContactShadowPass: BakedGroundContactShadowPass;\n private _gBufferRenderPass: GBufferRenderPass;\n private _groundReflectionPass: GroundReflectionPass;\n private _screenSpaceShadowMapPass: ScreenSpaceShadowMapPass;\n private _shadowAndAoPass: ShadowAndAoPass;\n private _outlinePass: OutlinePass | null = null;\n private _debugPass: DebugPass | null = null;\n private _scene?: Scene;\n private _camera?: Camera;\n private _cameraUpdate: CameraUpdate = new CameraUpdate();\n private _cameraChanged: boolean = true;\n private _noUpdateNeededCount = 0;\n private _noOStaticFrames = 0;\n private _maxSamples: number = 1;\n private _passUpdateStates: _passUpdateStates = {\n updateGroundReflection: false,\n updateGBuffer: false,\n updateScreenSpaceShadow: false,\n updateShadowAndAoPass: false,\n updateOutlinePass: false,\n updateDebugPass: false,\n };\n public aoPassMapTexture: Texture | null = null;\n private _lutMap: Map<\n string,\n LUTImageResult | LUT3dlResult | LUTCubeResult | null\n > = new Map<string, LUTImageResult>();\n private _lutPass: LUTPass;\n private _lutPassParameters: LutPassParameters = defaultLutPassParameters;\n public lutPassNeedsUpdate: boolean = false;\n private _renderToRenderTarget: boolean = false;\n private _outputPass: OutputPass;\n private _passRenderTarget?: WebGLRenderTarget;\n private _passPassRenderTarget?: WebGLRenderTarget;\n\n @inject\n private _initData: InitData;\n\n public get passRenderer(): PassRenderer {\n return this._passRenderer;\n }\n\n public get scene(): Scene {\n return this._scene as Scene;\n }\n\n public get camera(): Camera {\n return this._camera as Camera;\n }\n\n public get aspect(): number {\n return this._sceneRenderer.width / this._sceneRenderer.height;\n }\n\n public get cameraChanged(): boolean {\n return this._cameraChanged;\n }\n\n public get noOStaticFrames(): number {\n return this._noOStaticFrames;\n }\n\n public get renderCacheManager() {\n return this._sceneRenderer.renderCacheManager;\n }\n\n private get parameters(): SceneRendererParameters {\n return this._sceneRenderer.parameters;\n }\n\n public get sceneRenderPass(): SceneRenderPass {\n return this._sceneRenderPass;\n }\n\n public get bakedGroundContactShadowPass(): BakedGroundContactShadowPass {\n return this._bakedGroundContactShadowPass;\n }\n\n public get gBufferRenderPass(): GBufferRenderPass {\n return this._gBufferRenderPass;\n }\n\n public get groundReflectionPass(): GroundReflectionPass {\n return this._groundReflectionPass;\n }\n\n public get screenSpaceShadowMapPass(): ScreenSpaceShadowMapPass {\n return this._screenSpaceShadowMapPass;\n }\n\n public get shadowAndAoPass(): ShadowAndAoPass {\n return this._shadowAndAoPass;\n }\n\n public get lutPassParameters(): LutPassParameters {\n return this._lutPassParameters;\n }\n\n public get lutMaps(): string[] {\n return Array.from(this._lutMap.keys());\n }\n\n public get outlinePass(): OutlinePass | null {\n return this._outlinePass;\n }\n\n public get outlineRenderer(): OutlineRenderer {\n return this._sceneRenderer.outlineRenderer;\n }\n\n public get debugPass(): DebugPass {\n this._debugPass ??= new DebugPass(this);\n return this._debugPass;\n }\n\n public get debugOutput(): string {\n return this._sceneRenderer.debugOutput;\n }\n\n constructor(creator: string, sceneRender: SceneRenderer) {\n this._creator_ = creator;\n this._sceneRenderer = sceneRender;\n this._maxSamples = getMaxSamples(this._sceneRenderer.renderer);\n const linearAoFilter = this._sceneRenderer.linearAoFilter;\n const gBufferAndAoSamples = linearAoFilter ? this._maxSamples : 0;\n const shadowSamples = linearAoFilter ? this._maxSamples : 0;\n this._sceneRenderPass = new SceneRenderPass(this);\n this._bakedGroundContactShadowPass = new BakedGroundContactShadowPass(\n this,\n this._sceneRenderer.renderer,\n this._sceneRenderer.groundGroup,\n {\n sharedShadowGroundPlane: this._sceneRenderer.shadowAndAoGroundPlane,\n },\n );\n this._gBufferRenderPass = new GBufferRenderPass(this, {\n shared: true,\n capabilities: (this._sceneRenderer.renderer as WebGLRenderer)\n .capabilities,\n width: this._sceneRenderer.width,\n height: this._sceneRenderer.height,\n samples: gBufferAndAoSamples,\n textureMinificationFilter: linearAoFilter ? LinearFilter : NearestFilter,\n textureMagnificationFilter: linearAoFilter ? LinearFilter : NearestFilter,\n });\n this._groundReflectionPass = new GroundReflectionPass(\n this,\n this._sceneRenderer.width,\n this._sceneRenderer.height,\n this._maxSamples,\n {},\n );\n this._screenSpaceShadowMapPass = new ScreenSpaceShadowMapPass(\n this,\n new Vector2(this._sceneRenderer.width, this._sceneRenderer.height),\n {\n samples: shadowSamples,\n alwaysUpdate: false,\n },\n );\n this._shadowAndAoPass = new ShadowAndAoPass(\n this,\n this._sceneRenderer.width,\n this._sceneRenderer.height,\n gBufferAndAoSamples,\n );\n this._lutPass = new LUTPass({\n lut: undefined,\n intensity: 1,\n });\n this._outputPass = new OutputPass();\n }\n\n public dispose() {\n this._sceneRenderPass.dispose();\n this._bakedGroundContactShadowPass.dispose();\n this._gBufferRenderPass.dispose();\n this._groundReflectionPass.dispose();\n this._screenSpaceShadowMapPass.dispose();\n this._shadowAndAoPass.dispose();\n this._outlinePass?.dispose();\n this._lutPass.dispose();\n this._outputPass.dispose();\n this._passRenderTarget?.dispose();\n this._passPassRenderTarget?.dispose();\n }\n\n public setSize(width: number, height: number): void {\n this._gBufferRenderPass.setSize(width, height);\n this._groundReflectionPass.setSize(width, height);\n this._screenSpaceShadowMapPass.setSize(width, height);\n this._shadowAndAoPass.setSize(width, height);\n this._outlinePass?.setSize(width, height);\n const devicePixelRatio = this._sceneRenderer.renderer.getPixelRatio();\n const deviceWith = width * devicePixelRatio;\n const deviceHeight = height * devicePixelRatio;\n this._lutPass.setSize(deviceWith, deviceHeight);\n this._outputPass.setSize(deviceWith, deviceHeight);\n this._passRenderTarget?.setSize(deviceWith, deviceHeight);\n this._passPassRenderTarget?.setSize(deviceWith, deviceHeight);\n }\n\n public loadLutImage(name: string, url: string): void {\n this._lutMap.set(name, null);\n const loader = new LUTImageLoader();\n loader.load(url, (result: LUTImageResult) => {\n this._lutMap.set(name, result);\n });\n }\n\n public loadLutCube(name: string, url: string): void {\n this._lutMap.set(name, null);\n const loader = new LUTCubeLoader();\n loader.load(url, (result: LUTCubeResult) => {\n this._lutMap.set(name, result);\n });\n }\n\n public loadLut3dl(name: string, url: string): void {\n this._lutMap.set(name, null);\n const loader = new LUT3dlLoader();\n loader.load(url, (result: LUT3dlResult) => {\n this._lutMap.set(name, result);\n });\n }\n\n public createOutlinePass(): OutlinePass {\n if (!this._outlinePass) {\n this._outlinePass = new OutlinePass(\n this,\n new Vector2(this._sceneRenderer.width, this._sceneRenderer.height),\n this.scene,\n this.camera,\n [],\n {\n downSampleRatio: 2,\n edgeDetectionFxaa: true,\n },\n );\n }\n return this._outlinePass;\n }\n\n public getRenderPassRenderTarget(\n renderer: WebGLRenderer | WebGPURenderer,\n ): WebGLRenderTarget | null {\n if (!this._lutPassParameters.enabled) {\n return null;\n }\n this._passRenderTarget =\n this._passRenderTarget ??\n new WebGLRenderTarget(\n this._sceneRenderer.width * renderer.getPixelRatio(),\n this._sceneRenderer.height * renderer.getPixelRatio(),\n { type: HalfFloatType, samples: this._maxSamples },\n );\n return this._passRenderTarget;\n }\n\n public getPostPassRenderTarget(\n renderer: WebGLRenderer | WebGPURenderer,\n ): WebGLRenderTarget | null {\n if (!this._lutPassParameters.enabled) {\n return null;\n }\n this._passPassRenderTarget =\n this._passPassRenderTarget ??\n new WebGLRenderTarget(\n this._sceneRenderer.width * renderer.getPixelRatio(),\n this._sceneRenderer.height * renderer.getPixelRatio(),\n { type: HalfFloatType },\n );\n return this._passPassRenderTarget;\n }\n\n public setGroundVisibility(visible: boolean): void {\n this._sceneRenderer.shadowAndAoGroundPlane.setVisibility(visible);\n }\n\n public updatePasses(\n _renderer: WebGLRenderer | WebGPURenderer,\n scene: Scene,\n camera: Camera,\n ) {\n this._scene = scene;\n this._camera = camera;\n this._cameraChanged = this._cameraUpdate.changed(camera);\n const updateRequirements = this._evaluateIfShadowAndAoUpdateIsNeeded();\n this._renderToRenderTarget = this._lutPassParameters.enabled;\n this._updateSceneRenderPass();\n this._updateBakedGroundContactShadowPass();\n this._updateGBufferPass(updateRequirements);\n this._updateGroundReflectionPass(updateRequirements);\n this._updateScreenSpaceShadowPass(updateRequirements);\n this._updateShadowAndAoPass(updateRequirements);\n this._updateLutPass();\n this._updateOutlinePass();\n this._updateDebugPass();\n }\n\n private _evaluateIfShadowAndAoUpdateIsNeeded(): DynamicPassUpdateRequirements {\n const updateNow =\n this._shadowAndAoPass.parameters.alwaysUpdate ||\n this._screenSpaceShadowMapPass.needsUpdate ||\n this._screenSpaceShadowMapPass.shadowTypeNeedsUpdate;\n let needsUpdate =\n (this._shadowAndAoPass.parameters.enabled ||\n this._groundReflectionPass.parameters.enabled) &&\n this._cameraChanged;\n let intensityScale = 1;\n if (needsUpdate) {\n this._noUpdateNeededCount = 0;\n this._noOStaticFrames = 0;\n }\n if (!updateNow) {\n this._noUpdateNeededCount++;\n needsUpdate =\n this._noUpdateNeededCount >= this.parameters.effectSuspendFrames;\n intensityScale = Math.max(\n 0,\n Math.min(\n 1,\n (this._noUpdateNeededCount - this.parameters.effectSuspendFrames) /\n this.parameters.effectFadeInFrames,\n ),\n );\n }\n if (!updateNow && intensityScale === 1) {\n this._noOStaticFrames++;\n }\n needsUpdate = updateNow || needsUpdate;\n const shadowOnCameraChange =\n !needsUpdate || intensityScale < 0.99\n ? this.parameters.shadowOnCameraChange\n : SHADOW_BLUR_TYPES.OFF;\n return { needsUpdate, shadowOnCameraChange, intensityScale };\n }\n\n private _dynamicChanges(\n updateRequirements: DynamicPassUpdateRequirements,\n ): boolean {\n return (\n updateRequirements.needsUpdate ||\n updateRequirements.shadowOnCameraChange !== SHADOW_BLUR_TYPES.OFF\n );\n }\n\n private _updateSceneRenderPass() {\n this._sceneRenderPass.drawWithDebugMaterial = false;\n }\n\n private _updateBakedGroundContactShadowPass() {\n const limitPlaneSize = this._bakedGroundContactShadowPass.limitPlaneSize;\n this._bakedGroundContactShadowPass.limitPlaneSize =\n this._bakedGroundContactShadowPass.parameters.enabled;\n if (\n limitPlaneSize !== this._bakedGroundContactShadowPass.limitPlaneSize ||\n this._bakedGroundContactShadowPass.needsUpdate\n ) {\n this._bakedGroundContactShadowPass.updateBounds(\n this._sceneRenderer.boundingVolume,\n this._sceneRenderer.groundLevel,\n );\n }\n this._sceneRenderPass.drawGround =\n this._bakedGroundContactShadowPass.parameters.enabled ||\n this._shadowAndAoPass.parameters.applyToMaterial;\n }\n\n private _updateGBufferPass(\n updateRequirements: DynamicPassUpdateRequirements,\n ) {\n this._passUpdateStates.updateGBuffer = false;\n this._gBufferRenderPass.needsUpdate =\n updateRequirements.needsUpdate ||\n updateRequirements.shadowOnCameraChange === SHADOW_BLUR_TYPES.POISSON;\n this.gBufferRenderPass.drawGround =\n this._sceneRenderer.boundingVolumeSet &&\n this._shadowAndAoPass.parameters.aoOnGround;\n }\n\n private _updateGroundReflectionPass(\n updateRequirements: DynamicPassUpdateRequirements,\n ) {\n this._passUpdateStates.updateGroundReflection = false;\n if (\n this._groundReflectionPass.parameters.enabled &&\n this._dynamicChanges(updateRequirements) &&\n (!this.parameters.suspendGroundReflection ||\n updateRequirements.needsUpdate)\n ) {\n this._groundReflectionPass.reflectionFadeInScale = this.parameters\n .suspendGroundReflection\n ? updateRequirements.intensityScale\n : 1.0;\n this._passUpdateStates.updateGroundReflection = true;\n }\n }\n\n private _updateScreenSpaceShadowPass(\n updateRequirements: DynamicPassUpdateRequirements,\n ) {\n if (!this._dynamicChanges(updateRequirements)) {\n this._passUpdateStates.updateScreenSpaceShadow = false;\n return;\n }\n this._screenSpaceShadowMapPass.parameters.alwaysUpdate =\n this._shadowAndAoPass.parameters.alwaysUpdate;\n this._screenSpaceShadowMapPass.drawGround =\n this._shadowAndAoPass.parameters.shadowOnGround;\n this._passUpdateStates.updateScreenSpaceShadow =\n this._shadowAndAoPass.parameters.shadowIntensity > 0;\n this._passUpdateStates.updateScreenSpaceShadow = true;\n this._passUpdateStates.updateGBuffer = true;\n }\n\n private _updateShadowAndAoPass(\n updateRequirements: DynamicPassUpdateRequirements,\n ) {\n if (!this._dynamicChanges(updateRequirements)) {\n this._passUpdateStates.updateShadowAndAoPass = false;\n return;\n }\n this._shadowAndAoPass.shadowAndAoPassSettings = {\n shadowMapTexture: this._screenSpaceShadowMapPass.shadowTexture,\n shadowBlurType: updateRequirements.needsUpdate\n ? SHADOW_BLUR_TYPES.FULL\n : updateRequirements.shadowOnCameraChange,\n shadowFadeInBlurType: updateRequirements.shadowOnCameraChange,\n shadowFadeInMix: 1 - updateRequirements.intensityScale,\n noOStaticFrames: this.noOStaticFrames,\n };\n this._passUpdateStates.updateShadowAndAoPass = true;\n this._passUpdateStates.updateGBuffer = true;\n }\n\n private _updateLutPass() {\n if (!this._lutPassParameters.enabled || !this.lutPassNeedsUpdate) {\n return;\n }\n this.lutPassNeedsUpdate = false;\n this._lutPass.enabled = this._lutPassParameters.enabled;\n this._lutPass.intensity = this._lutPassParameters.intensity;\n if (this._lutMap.has(this._lutPassParameters.lut)) {\n const lut = this._lutMap.get(this._lutPassParameters.lut);\n if (lut?.texture3D) {\n this._lutPass.lut = lut.texture3D;\n }\n }\n }\n\n private _updateOutlinePass() {\n if (\n !this.outlineRenderer.outlinePassActivated ||\n !this.outlineRenderer.outlinePass\n ) {\n this._passUpdateStates.updateOutlinePass = false;\n return;\n }\n this.outlineRenderer.outlinePass.renderToScreen = false;\n this.outlineRenderer.outlinePass.clearBackground = false;\n this._passUpdateStates.updateOutlinePass = true;\n this._passUpdateStates.updateGBuffer = true;\n }\n\n private _updateDebugPass() {\n if (\n !this.debugOutput ||\n this.debugOutput === '' ||\n this.debugOutput === 'off'\n ) {\n this._passUpdateStates.updateDebugPass = false;\n return;\n }\n if (this.debugOutput === 'outline' && this.outlineRenderer.outlinePass) {\n this.outlineRenderer.outlinePass.clearBackground = true;\n this._passUpdateStates.updateDebugPass = false;\n return;\n }\n if (this.debugOutput === 'color' || this.debugOutput === 'grayscale') {\n this._passUpdateStates.updateGroundReflection = false;\n this._passUpdateStates.updateGBuffer = false;\n this._passUpdateStates.updateScreenSpaceShadow = false;\n this._passUpdateStates.updateShadowAndAoPass = false;\n this._passUpdateStates.updateOutlinePass = false;\n this._passUpdateStates.updateDebugPass = false;\n this._sceneRenderPass.drawWithDebugMaterial =\n this.debugOutput === 'grayscale';\n return;\n }\n this.debugPass.debugOutput = this.debugOutput;\n this._passUpdateStates.updateDebugPass = true;\n }\n\n private _updateMaterials(\n renderer: WebGLRenderer | WebGPURenderer,\n scene: Scene,\n ) {\n if (\n !this.materialsNeedUpdate ||\n !this._shadowAndAoPass.parameters.applyToMaterial\n ) {\n return;\n }\n this.aoPassMapTexture = this._shadowAndAoPass.denoiseRenderTargetTexture;\n const devicePixelRatio: number = renderer.getPixelRatio();\n this.materialsNeedUpdate = false;\n scene.traverse((object: Object3D) => {\n if ((object as ThreeObject3d).isMesh) {\n const material = (object as Mesh).material;\n if (material instanceof MeshStandardMaterial) {\n this._updateMaterial(object as Mesh, material, devicePixelRatio);\n }\n }\n });\n }\n\n private _updateMaterial(\n object: Mesh,\n material: MeshStandardMaterial,\n devicePixelRatio: number,\n ) {\n const plugIn = PostProcessingMaterialPlugin.addPlugin(material);\n if (plugIn) {\n this._updatePlugInAo(plugIn, object, material, devicePixelRatio);\n this._updatePlugInReflection(plugIn, object);\n material.needsUpdate = false;\n }\n }\n\n private _updatePlugInAo(\n plugIn: PostProcessingMaterialPlugin,\n object: Mesh,\n material: MeshStandardMaterial,\n devicePixelRatio: number,\n ) {\n const applyAoToMaterial =\n this._shadowAndAoPass.parameters.enabled &&\n this._shadowAndAoPass.parameters.applyToMaterial &&\n this.aoPassMapTexture !== null &&\n (material.name === 'ShadowGroundPlaneMaterial' ||\n (object.receiveShadow &&\n (!material.transparent || material.alphaTest >= 0.9)));\n const aoEnabled =\n applyAoToMaterial && this._shadowAndAoPass.parameters.aoIntensity > 0.01;\n const shadowEnabled =\n applyAoToMaterial &&\n this._screenSpaceShadowMapPass.enabled &&\n this._shadowAndAoPass.parameters.shadowIntensity > 0.01;\n plugIn.applyAoAndShadowToAlpha =\n material.name === 'ShadowGroundPlaneMaterial';\n plugIn.aoPassMapIntensity = aoEnabled\n ? this._shadowAndAoPass.parameters.aoIntensity * 2\n : -1.0;\n plugIn.shPassMapIntensity = shadowEnabled\n ? this._shadowAndAoPass.parameters.shadowIntensity * 2\n : -1.0;\n plugIn.aoPassMapScale = 1 / devicePixelRatio;\n plugIn.aoPassMap = this.aoPassMapTexture;\n }\n\n private _updatePlugInReflection(\n plugIn: PostProcessingMaterialPlugin,\n object: Mesh,\n ) {\n const reflectionPassTexture =\n this._groundReflectionPass.intensityRenderTarget.texture;\n const isFloor = object.userData.isPlanFloor;\n const reflectionEnabled =\n isFloor &&\n this._groundReflectionPass.parameters.enabled &&\n (reflectionPassTexture !== null || reflectionPassTexture !== undefined);\n const intensity = this._groundReflectionPass.parameters.intensity;\n plugIn.applyReflectionPassMap = reflectionEnabled;\n plugIn.reflectionPassMapIntensity = reflectionEnabled\n ? Math.pow(intensity, 0.5)\n : 0;\n plugIn.reflectionPassMapScale =\n 1 /\n (this._groundReflectionPass.parameters.renderTargetDownScale *\n devicePixelRatio);\n plugIn.reflectionPassMap = reflectionEnabled ? reflectionPassTexture : null;\n }\n\n public renderPasses(renderer: WebGLRenderer, scene: Scene): void {\n const passRenderTarget = this.getRenderPassRenderTarget(renderer);\n const postPassRenderTarget = this.getPostPassRenderTarget(renderer);\n renderer.setRenderTarget(passRenderTarget);\n this._bakedGroundContactShadowPass.renderPass(renderer);\n if (this._passUpdateStates.updateGBuffer) {\n this._gBufferRenderPass.renderPass(renderer);\n }\n if (this._passUpdateStates.updateScreenSpaceShadow) {\n this._screenSpaceShadowMapPass.renderPass(renderer);\n }\n if (this._passUpdateStates.updateShadowAndAoPass) {\n this._shadowAndAoPass.renderPass(renderer);\n }\n this._updateMaterials(renderer, scene);\n this._sceneRenderPass.renderPass(renderer as WebGLRenderer);\n if (this._passUpdateStates.updateGroundReflection) {\n this._groundReflectionPass.renderPass(renderer);\n }\n if (\n this._passUpdateStates.updateShadowAndAoPass &&\n !this._shadowAndAoPass.parameters.applyToMaterial\n ) {\n this._shadowAndAoPass.renderToTarget(renderer);\n }\n if (this._lutPassParameters.enabled) {\n renderer.setRenderTarget(postPassRenderTarget);\n this._outputPass.renderToScreen = false;\n this._outputPass.render(\n renderer as WebGLRenderer,\n renderer.getRenderTarget() as WebGLRenderTarget,\n passRenderTarget as WebGLRenderTarget,\n 0,\n false,\n );\n renderer.setRenderTarget(null);\n this._lutPass.renderToScreen = true;\n this._lutPass.render(\n renderer as WebGLRenderer,\n renderer.getRenderTarget() as WebGLRenderTarget,\n postPassRenderTarget as WebGLRenderTarget,\n 0,\n false,\n );\n }\n if (this._passUpdateStates.updateOutlinePass) {\n this._outlinePass?.renderPass(renderer as WebGLRenderer);\n }\n if (this._passUpdateStates.updateDebugPass) {\n this._debugPass?.renderPass(renderer as WebGLRenderer);\n }\n }\n}\n","import { SceneVolume } from './render-utility';\nimport type { CopyTransformMaterial } from './shader-utility';\nimport type { GBufferParameters } from './pass/gbuffer-render-pass';\nimport type { GBufferRenderPass } from './pass/gbuffer-render-pass';\nimport { ShadowGroundPlane } from './objects/shadow-ground-plane';\nimport type { BakedGroundContactShadowParameters } from './pass/baked-ground-contact-shadow-pass';\nimport type { BakedGroundContactShadowPass } from './pass/baked-ground-contact-shadow-pass';\nimport type { GroundReflectionParameters } from './pass/ground-reflection-pass';\nimport type { GroundReflectionPass } from './pass/ground-reflection-pass';\nimport type { ScreenSpaceShadowMapParameters } from './pass/screen-space-shadow-map-pass';\nimport type { ScreenSpaceShadowMapPass } from './pass/screen-space-shadow-map-pass';\nimport type {\n ShadowAndAoPassParameters,\n ShadowBlurType,\n} from './pass/shadow-and-ao-pass';\nimport type { ShadowAndAoPass } from './pass/shadow-and-ao-pass';\nimport { SHADOW_BLUR_TYPES } from './pass/shadow-and-ao-pass';\nimport type { OutlineParameters } from './outline-renderer';\nimport { OutlineRenderer } from './outline-renderer';\nimport type { DebugPass } from './pass/debug-pass';\nimport type { LightSource } from './light-source-detection';\nimport { DIMENSIONING_GEOMETRY } from '../../../../configurator-core/src/utils/dimensioning-helper';\nimport {\n mapCustomShadingParameters,\n mergeRendererParameters,\n getInteractionParameters,\n getShadingParameters,\n SCENE_SHADING_TYPES,\n} from './shading-settings';\nimport type {\n CustomShadingParameters,\n SceneShadingType,\n} from './shading-settings';\nimport {\n DepthWriteRenderCache,\n isTransmissiveMaterial,\n RenderCacheManager,\n VisibilityRenderCache,\n} from './render-cache';\nimport type { LutPassParameters } from './render-pass-manager';\nimport { RenderPassManager } from './render-pass-manager';\nimport type { SceneRenderPass } from './pass/scene-render-pass';\nimport type { Nullable, Enumify } from '#/common/src/utils/types';\nimport type {\n Box3,\n Camera,\n ColorRepresentation,\n Object3D,\n PerspectiveCamera,\n RectAreaLight,\n Scene,\n} from 'three';\nimport type { WebGLRenderer } from 'three';\nimport { Group, Mesh } from 'three';\nimport inject from '../../di/inject';\nimport type InitData from '../../utils/init-data';\n\nexport { type BakedGroundContactShadowParameters } from './pass/baked-ground-contact-shadow-pass';\nexport { type OutlineParameters } from './outline-renderer';\nexport {\n type ShadowParameters,\n type ShadowAndAoPassParameters,\n} from './pass/shadow-and-ao-pass';\nexport { type AORenderPassParameters } from './pass/ao-pass';\nexport { type GroundReflectionParameters } from './pass/ground-reflection-pass';\n\ninterface WithUserData {\n userData?: Record<string, any>;\n}\n\nexport const QUALITY_LEVELS = {\n HIGHEST: 'highest',\n HIGH: 'high',\n MEDIUM: 'medium',\n LOW: 'low',\n} as const;\n\nexport type QualityLevel = Enumify<typeof QUALITY_LEVELS>;\n\nexport type QualityMap = Map<QualityLevel, any>;\n\nexport interface LutImageDefinition {\n name: string;\n url: string;\n type: string;\n}\n\nexport interface OutlineCustomParameters {\n outlineVisibleEdgeColor: ColorRepresentation;\n outlineHiddenEdgeColor: ColorRepresentation;\n}\n\nexport interface SceneRendererParameters {\n gBufferRenderTargetParameters: GBufferParameters;\n shAndAoPassParameters: ShadowAndAoPassParameters;\n screenSpaceShadowMapParameters: ScreenSpaceShadowMapParameters;\n groundReflectionParameters: GroundReflectionParameters;\n bakedGroundContactShadowParameters: BakedGroundContactShadowParameters;\n outlineParameters: OutlineParameters;\n effectSuspendFrames: number;\n effectFadeInFrames: number;\n suspendGroundReflection: boolean;\n shadowOnCameraChange: ShadowBlurType;\n}\n\nexport interface SceneRendererChangeParameters {\n shadowType?: string;\n shAndAoPassParameters?: ShadowAndAoPassParameters;\n screenSpaceShadowMapParameters?: ScreenSpaceShadowMapParameters;\n groundReflectionParameters?: GroundReflectionParameters;\n bakedGroundContactShadowParameters?: BakedGroundContactShadowParameters;\n outlineParameters?: OutlineParameters;\n effectSuspendFrames?: number;\n effectFadeInFrames?: number;\n suspendGroundReflection?: boolean;\n shadowOnCameraChange?: ShadowBlurType;\n}\n\nexport class SceneRenderer {\n public _creator_: string;\n public parameters: SceneRendererParameters;\n public debugOutput = 'off';\n public outputColorSpace = '';\n public toneMapping = '';\n public linearAoFilter = true;\n public environmentLights = false;\n public enableObjectSelection: boolean = true;\n public groundLevel: number = 0;\n public uiInteractionMode: boolean = false;\n public renderer: WebGLRenderer;\n public width: number = 0;\n public height: number = 0;\n public boundingVolume = new SceneVolume();\n public boundingVolumeSet: boolean = false;\n public renderCacheManager: RenderCacheManager = new RenderCacheManager();\n private _renderPassManager: RenderPassManager;\n private _shadowAndAoGroundPlane: ShadowGroundPlane;\n public outlineRenderer: OutlineRenderer;\n public selectedObjects: Object3D[] = [];\n private _copyMaterial?: CopyTransformMaterial;\n public readonly groundGroup: Group = new Group();\n private _shadingType: SceneShadingType = SCENE_SHADING_TYPES.DEFAULT;\n private _qualityLevel: QualityLevel = QUALITY_LEVELS.HIGHEST;\n private _qualityMap: QualityMap = new Map<QualityLevel, any>();\n private _customShadingParameters: Nullable<CustomShadingParameters> = null;\n private _customOutlineParameters?: OutlineCustomParameters;\n\n @inject\n private _initData: InitData;\n\n public get sceneRenderPass(): SceneRenderPass {\n return this._renderPassManager.sceneRenderPass;\n }\n\n public get bakedGroundContactShadowPass(): BakedGroundContactShadowPass {\n return this._renderPassManager.bakedGroundContactShadowPass;\n }\n\n public get gBufferRenderPass(): GBufferRenderPass {\n return this._renderPassManager.gBufferRenderPass;\n }\n\n public get groundReflectionPass(): GroundReflectionPass {\n return this._renderPassManager.groundReflectionPass;\n }\n\n public get screenSpaceShadowMapPass(): ScreenSpaceShadowMapPass {\n return this._renderPassManager.screenSpaceShadowMapPass;\n }\n\n public get shadowAndAoPass(): ShadowAndAoPass {\n return this._renderPassManager.shadowAndAoPass;\n }\n\n public get lutPassParameters(): LutPassParameters {\n return this._renderPassManager.lutPassParameters;\n }\n\n public get lutMaps(): string[] {\n return this._renderPassManager.lutMaps;\n }\n\n public get debugPass(): DebugPass {\n return this._renderPassManager.debugPass;\n }\n\n public get shadowAndAoGroundPlane(): ShadowGroundPlane {\n return this._shadowAndAoGroundPlane;\n }\n\n public constructor(\n creator: string,\n renderer: WebGLRenderer,\n width: number,\n height: number,\n linearAoFilter?: boolean,\n ) {\n this._creator_ = creator;\n this.width = width;\n this.height = height;\n this.linearAoFilter = linearAoFilter ?? true;\n this.renderer = renderer;\n this.renderCacheManager.registerCache(\n 'inivisibleGround',\n new VisibilityRenderCache((object: any) => {\n return object === this.groundGroup;\n }),\n );\n this.renderCacheManager.registerCache(\n 'groundReflection',\n new VisibilityRenderCache((object: any) => {\n if (object === this.groundGroup) {\n return true;\n } else if (object.name === DIMENSIONING_GEOMETRY) {\n return true;\n } else if (\n object instanceof Mesh &&\n isTransmissiveMaterial((object as Mesh).material)\n ) {\n return true;\n }\n return false;\n }),\n );\n this.renderCacheManager.registerCache('debug', new VisibilityRenderCache());\n this.renderCacheManager.registerCache(\n 'floorDepthWrite',\n new DepthWriteRenderCache((mesh: Mesh) => {\n return mesh.userData?.isFloor;\n }),\n );\n this._shadowAndAoGroundPlane = new ShadowGroundPlane(null);\n this.groundGroup.rotateX(-Math.PI / 2);\n this._renderPassManager = new RenderPassManager(creator, this);\n this.outlineRenderer = new OutlineRenderer(\n this._renderPassManager,\n null,\n {},\n );\n this.parameters = {\n gBufferRenderTargetParameters: this.gBufferRenderPass.parameters,\n bakedGroundContactShadowParameters:\n this.bakedGroundContactShadowPass.parameters,\n screenSpaceShadowMapParameters: this.screenSpaceShadowMapPass.parameters,\n shAndAoPassParameters: this.shadowAndAoPass.parameters,\n groundReflectionParameters: this.groundReflectionPass.parameters,\n outlineParameters: this.outlineRenderer.parameters,\n effectSuspendFrames: 0,\n effectFadeInFrames: 0,\n suspendGroundReflection: false,\n shadowOnCameraChange: SHADOW_BLUR_TYPES.OFF,\n };\n this._addEventListeners(this.renderer);\n }\n\n private _addEventListeners(renderer: WebGLRenderer) {\n if (!renderer.domElement) {\n return;\n }\n renderer.domElement.addEventListener('webglcontextlost', () => {\n console.log('webglcontextlost');\n });\n renderer.domElement.addEventListener('webglcontextrestored', () => {\n console.log('webglcontextrestored');\n this._forceEnvironmentMapUpdate(this.renderer);\n });\n }\n\n public dispose(): void {\n this._copyMaterial?.dispose();\n this._renderPassManager.dispose();\n this.renderer.dispose();\n }\n\n public setSize(width: number, height: number): void {\n this.width = width;\n this.height = height;\n this._renderPassManager.setSize(width, height);\n this.renderer.setSize(width, height);\n }\n\n public loadLutImages(luts: LutImageDefinition[]): void {\n for (const lut of luts) {\n const url = lut.url;\n if (lut.type === 'image') {\n this._renderPassManager.loadLutImage(lut.name, url);\n } else if (lut.type === 'cube') {\n this._renderPassManager.loadLutCube(lut.name, url);\n } else if (lut.type === '3dl') {\n this._renderPassManager.loadLut3dl(lut.name, url);\n }\n }\n }\n\n public getQualityLevel() {\n return this._qualityLevel;\n }\n\n public setShadingType(shadingType: SceneShadingType): void {\n if (this._shadingType === shadingType) {\n return;\n }\n this._shadingType = shadingType;\n this.applyCurrentParameters();\n }\n\n public setQualityLevel(qualityLevel: QualityLevel): void {\n if (this._qualityLevel === qualityLevel) {\n return;\n }\n if (this._qualityMap.has(this._qualityLevel)) {\n this._qualityLevel = qualityLevel;\n }\n this.applyCurrentParameters();\n }\n\n public setQualityMap(qualityMap: QualityMap) {\n this._qualityMap = qualityMap;\n this.applyCurrentParameters();\n }\n\n public setCustomShadingParameters(\n customShadingParameters: CustomShadingParameters | null,\n ) {\n this._customShadingParameters = customShadingParameters;\n this.applyCurrentParameters();\n this.requestUpdateOfPasses();\n }\n\n public setQualityMapAndShadingParameters(\n qualityMap: QualityMap,\n customShadingParameters: CustomShadingParameters | null,\n ) {\n this._qualityMap = qualityMap;\n this._customShadingParameters = customShadingParameters;\n this.applyCurrentParameters();\n this.requestUpdateOfPasses();\n }\n\n public setCustomOutlineParameters(\n customOutlineParameters: OutlineCustomParameters,\n ) {\n this._customOutlineParameters = customOutlineParameters;\n this.applyCurrentParameters();\n }\n\n public applyCurrentParameters() {\n const parameterArray: Array<Record<string, object>> = [];\n if (this._qualityMap.has(this._qualityLevel)) {\n parameterArray.push(this._qualityMap.get(this._qualityLevel));\n }\n const shadingTypeParameters = getShadingParameters(this._shadingType);\n if (shadingTypeParameters) {\n parameterArray.push(shadingTypeParameters);\n }\n const uiInteractionParameters = getInteractionParameters(\n this.uiInteractionMode,\n );\n if (uiInteractionParameters) {\n parameterArray.push(uiInteractionParameters);\n }\n if (this._customShadingParameters) {\n parameterArray.push(\n mapCustomShadingParameters(this._customShadingParameters),\n );\n }\n if (this._customOutlineParameters) {\n parameterArray.push({\n outlineParameters: {\n visibleEdgeColor:\n this._customOutlineParameters.outlineVisibleEdgeColor,\n hiddenEdgeColor: this._customOutlineParameters.outlineHiddenEdgeColor,\n },\n });\n }\n if (parameterArray.length > 0) {\n const parameters = mergeRendererParameters(...parameterArray);\n this.updateParameters(parameters as SceneRendererChangeParameters);\n this.bakedGroundContactShadowPass.applyParameters();\n }\n }\n\n public requestUpdateOfPasses() {\n this.gBufferRenderPass.needsUpdate = true;\n this.screenSpaceShadowMapPass.needsUpdate = true;\n this.shadowAndAoPass.needsUpdate = true;\n this.shadowAndAoPass.softShadowPass.needsUpdate = true;\n this._renderPassManager.materialsNeedUpdate = true;\n }\n\n public clearCache() {\n this.renderCacheManager.clearCache();\n this._renderPassManager.materialsNeedUpdate = true;\n }\n\n public forceShadowUpdates(updateBakedGroundShadow: boolean): void {\n this.clearCache();\n this.gBufferRenderPass.needsUpdate = true;\n this.screenSpaceShadowMapPass.forceShadowUpdate();\n this.shadowAndAoPass.needsUpdate = true;\n if (updateBakedGroundShadow) {\n this.bakedGroundContactShadowPass.needsUpdate = true;\n }\n }\n\n public forceLutPassUpdate() {\n this._renderPassManager.lutPassNeedsUpdate = true;\n this._renderPassManager.materialsNeedUpdate = true;\n }\n\n public updateParameters(parameters: SceneRendererChangeParameters) {\n if (parameters.shadowType) {\n this.screenSpaceShadowMapPass.switchType(parameters.shadowType);\n }\n if (parameters.shAndAoPassParameters !== undefined) {\n this.shadowAndAoPass.updateParameters(parameters.shAndAoPassParameters);\n }\n if (parameters.bakedGroundContactShadowParameters !== undefined) {\n this.bakedGroundContactShadowPass.updateParameters(\n parameters.bakedGroundContactShadowParameters,\n );\n }\n if (parameters.screenSpaceShadowMapParameters !== undefined) {\n this.screenSpaceShadowMapPass.updateParameters(\n parameters.screenSpaceShadowMapParameters,\n );\n }\n if (parameters.groundReflectionParameters !== undefined) {\n this.groundReflectionPass.updateParameters(\n parameters.groundReflectionParameters,\n );\n }\n if (parameters.outlineParameters !== undefined) {\n this.outlineRenderer.updateParameters(parameters.outlineParameters);\n }\n if (parameters.effectSuspendFrames !== undefined) {\n this.parameters.effectSuspendFrames = parameters.effectSuspendFrames;\n }\n if (parameters.effectFadeInFrames !== undefined) {\n this.parameters.effectFadeInFrames = parameters.effectFadeInFrames;\n }\n if (parameters.suspendGroundReflection !== undefined) {\n this.parameters.suspendGroundReflection =\n parameters.suspendGroundReflection;\n }\n if (parameters.shadowOnCameraChange !== undefined) {\n this.parameters.shadowOnCameraChange = parameters.shadowOnCameraChange;\n }\n }\n\n public addRectAreaLight(\n rectAreaLight: RectAreaLight,\n parent: Object3D,\n ): void {\n this.environmentLights = false;\n this.screenSpaceShadowMapPass.addRectAreaLight(rectAreaLight, parent);\n this.shadowAndAoPass.needsUpdate = true;\n }\n\n public updateRectAreaLights(\n rectAreaLights: RectAreaLight[],\n parent: Object3D,\n ): void {\n if (rectAreaLights.length > 0) {\n this.environmentLights = false;\n }\n this.screenSpaceShadowMapPass.updateRectAreaLights(rectAreaLights, parent);\n this.shadowAndAoPass.needsUpdate = true;\n }\n\n public createShadowFromLightSources(\n parent: Object3D,\n lightSources: LightSource[],\n ): void {\n this.environmentLights = true;\n this.screenSpaceShadowMapPass.createShadowFromLightSources(\n parent,\n lightSources,\n );\n this.shadowAndAoPass.needsUpdate = true;\n }\n\n public selectObjects(selectedObjects: Object3D[]) {\n this.selectedObjects = selectedObjects;\n }\n\n public updateBounds(bounds: Box3, scaleShadowAndAo: boolean) {\n this.clearCache();\n const sceneBounds = bounds.clone();\n if (sceneBounds.min.y > this.groundLevel) {\n sceneBounds.min.y = this.groundLevel;\n }\n this.boundingVolumeSet = true;\n this.gBufferRenderPass.groundDepthWrite =\n this.shadowAndAoPass.parameters.aoOnGround;\n this.boundingVolume.updateFromBox(sceneBounds);\n const size = this.boundingVolume.size;\n const shadowAndAoScale = (size.x + size.y + size.z) / 3;\n const minBoundsSize = Math.min(size.x, size.y, size.z);\n const maxBoundsSize = Math.max(size.x, size.y, size.z);\n const defaultScale =\n minBoundsSize < 0.5 ? minBoundsSize / 0.5 : size.z > 5 ? size.z / 5 : 1;\n this.bakedGroundContactShadowPass.setScale(\n scaleShadowAndAo ? shadowAndAoScale : defaultScale,\n shadowAndAoScale,\n );\n this.groundReflectionPass.updateBounds(\n this.groundLevel,\n Math.min(1, maxBoundsSize),\n );\n this.screenSpaceShadowMapPass.updateBounds(\n this.boundingVolume,\n shadowAndAoScale,\n );\n this.shadowAndAoPass.updateBounds(\n this.boundingVolume,\n scaleShadowAndAo ? shadowAndAoScale : Math.min(1, maxBoundsSize * 2),\n );\n }\n\n public updateNearAndFarPlaneOfPerspectiveCamera(\n camera: PerspectiveCamera,\n minimumFar?: number,\n ) {\n // bring the near and far plane as close as possible to geometry\n // this is very likely the most important part for a glitch free and nice SSAO\n const nearFar = this.boundingVolume.getNearAndFarForPerspectiveCamera(\n camera.position,\n 3,\n );\n camera.near = Math.max(0.00001, nearFar[0] * 0.9);\n camera.far = Math.max(minimumFar ?? camera.near, nearFar[1]);\n camera.updateProjectionMatrix();\n }\n\n private _forceEnvironmentMapUpdate(renderer: WebGLRenderer) {\n const rendererUserData = (renderer as WithUserData).userData;\n if (rendererUserData?.environmentTexture) {\n const environmentTexture = rendererUserData.environmentTexture;\n rendererUserData.environmentTexture = undefined;\n environmentTexture.dispose();\n }\n }\n\n private _updateEnvironment(renderer: WebGLRenderer, scene: Scene) {\n if (!scene.userData?.environmentDefinition) {\n return;\n }\n if (!(renderer as WithUserData).userData) {\n (renderer as WithUserData).userData = {};\n }\n const rendererUserData = (renderer as WithUserData).userData as Record<\n string,\n any\n >;\n\n if (\n scene.userData?.environmentDefinition.needsUpdate ||\n !rendererUserData.environmentTexture ||\n rendererUserData.environmentDefinition !==\n scene.userData.environmentDefinition\n ) {\n const environmentDefinition = scene.userData.environmentDefinition;\n rendererUserData.environmentDefinition = environmentDefinition;\n rendererUserData.environmentTexture =\n environmentDefinition.createNewEnvironment(renderer);\n if (scene.userData.shadowFromEnvironment) {\n const maxNoOfLightSources = environmentDefinition.maxNoOfLightSources;\n if (maxNoOfLightSources !== undefined) {\n this.screenSpaceShadowMapPass.parameters.maximumNumberOfLightSources =\n maxNoOfLightSources;\n }\n this.createShadowFromLightSources(\n scene,\n environmentDefinition.lightSources,\n );\n }\n }\n scene.environment = rendererUserData?.environmentTexture;\n if (scene.userData.showEnvironmentBackground) {\n scene.background = scene.environment;\n } else if (scene.background === scene.environment) {\n scene.background = null;\n }\n }\n\n public render(scene: Scene, camera: Camera): void {\n if (!camera?.projectionMatrix) {\n return;\n }\n scene.add(this.groundGroup);\n this._updateEnvironment(this.renderer, scene);\n this.outlineRenderer.updateOutline(\n scene,\n camera,\n this.enableObjectSelection ? this.selectedObjects : [],\n );\n this._renderPassManager.updatePasses(this.renderer, scene, camera);\n this._renderPassManager.renderPasses(this.renderer, scene);\n scene.remove(this.groundGroup);\n }\n}\n"],"x_google_ignoreList":[1,2,20,23,24,31,32,33,34,35,36,37],"mappings":"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AAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAC9H;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAC9H;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAC9H;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAC9H;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;IAAG;IAAG;GAC9H;IAAE;IAAG;IAAG;IAAG;IAAG;GAAE;IAAE;IAAG;IAAG;I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"}
|