@roomle/web-sdk 3.10.0-alpha.5 → 3.10.0-alpha.6
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/ConfiguratorKernel.wasm +0 -0
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{api-DJoArPcI.mjs → api-D64AfPG6.mjs} +2 -2
- package/lib/{api-DJoArPcI.mjs.map → api-D64AfPG6.mjs.map} +1 -1
- package/lib/asset-loader.worker-CHyN7JB1.mjs.map +1 -1
- package/lib/budgeteer.sw-BCLEIWCW.mjs.map +1 -1
- package/lib/{common-utils-DMk5jc_R.mjs → common-utils-uHp4dDZQ.mjs} +20 -17
- package/lib/{common-utils-DMk5jc_R.mjs.map → common-utils-uHp4dDZQ.mjs.map} +1 -1
- package/lib/{component-dimensioning-Bo5U4LwJ.mjs → component-dimensioning-lu16QjEZ.mjs} +2 -2
- package/lib/{component-dimensioning-Bo5U4LwJ.mjs.map → component-dimensioning-lu16QjEZ.mjs.map} +1 -1
- package/lib/{component-raycast-helper-BwRJfce2.mjs → component-raycast-helper-DRE5bxWr.mjs} +3 -3
- package/lib/{component-raycast-helper-BwRJfce2.mjs.map → component-raycast-helper-DRE5bxWr.mjs.map} +1 -1
- package/lib/configurator-C3LkQHDF.mjs +2 -0
- package/lib/{configurator-BGTlYsAz.mjs → configurator-CEHN5oY2.mjs} +4 -4
- package/lib/{configurator-BGTlYsAz.mjs.map → configurator-CEHN5oY2.mjs.map} +1 -1
- package/lib/{glb-viewer-Bpr7dSuq.mjs → glb-viewer-C03QVqRZ.mjs} +5 -5
- package/lib/{glb-viewer-Bpr7dSuq.mjs.map → glb-viewer-C03QVqRZ.mjs.map} +1 -1
- package/lib/glb-viewer-vQQ5RF-e.mjs +2 -0
- package/lib/{highlight-coordinator-Dweh3BSu.mjs → highlight-coordinator-DZReLBh6.mjs} +2 -2
- package/lib/{highlight-coordinator-Dweh3BSu.mjs.map → highlight-coordinator-DZReLBh6.mjs.map} +1 -1
- package/lib/{homag-intelligence-D11ORwRA.mjs → homag-intelligence-CaflKydn.mjs} +3 -3
- package/lib/{homag-intelligence-D11ORwRA.mjs.map → homag-intelligence-CaflKydn.mjs.map} +1 -1
- package/lib/{imos-ix-poc-export-helper-D2KaQu_v.mjs → imos-ix-poc-export-helper-D6oTPQr3.mjs} +2 -2
- package/lib/{imos-ix-poc-export-helper-D2KaQu_v.mjs.map → imos-ix-poc-export-helper-D6oTPQr3.mjs.map} +1 -1
- package/lib/{main-C2IL3ar7.mjs → main-BkA09a6W.mjs} +8216 -8190
- package/lib/main-BkA09a6W.mjs.map +1 -0
- package/lib/{material-viewer-ChuyspP3.mjs → material-viewer-Nkl4Qx29.mjs} +5 -5
- package/lib/{material-viewer-ChuyspP3.mjs.map → material-viewer-Nkl4Qx29.mjs.map} +1 -1
- package/lib/packages-CNXXlUsV.mjs +4 -0
- package/lib/{planner-BVsxip3_.mjs → planner-DsChoUH0.mjs} +3 -3
- package/lib/{planner-BVsxip3_.mjs.map → planner-DsChoUH0.mjs.map} +1 -1
- package/lib/planner-Z2m78Y_4.mjs +2 -0
- package/lib/roomle-headless.d.ts +157 -51
- package/lib/roomle-headless.js +8 -8
- package/lib/roomle-sdk.d.ts +157 -51
- package/lib/roomle-sdk.js +7 -7
- package/lib/{roomle-webgpu-renderer-NhCn2iM-.mjs → roomle-webgpu-renderer-OGrZqd3w.mjs} +4 -4
- package/lib/{roomle-webgpu-renderer-NhCn2iM-.mjs.map → roomle-webgpu-renderer-OGrZqd3w.mjs.map} +1 -1
- package/lib/{scene-renderer-rrWFY9B9.mjs → scene-renderer-kbl6O83T.mjs} +3 -3
- package/lib/{scene-renderer-rrWFY9B9.mjs.map → scene-renderer-kbl6O83T.mjs.map} +1 -1
- package/lib/{script-loader-DFhN_ZHC.mjs → script-loader-vbm5pELp.mjs} +2 -2
- package/lib/{script-loader-DFhN_ZHC.mjs.map → script-loader-vbm5pELp.mjs.map} +1 -1
- package/lib/{shading-settings-BWeccIZv.mjs → shading-settings-BXL0haNX.mjs} +2 -2
- package/lib/{shading-settings-BWeccIZv.mjs.map → shading-settings-BXL0haNX.mjs.map} +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/wasm_modern/ConfiguratorKernel.wasm +0 -0
- 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-83r4i8j_.mjs → stats-helper-B4ejVlyj.mjs} +2 -2
- package/lib/{stats-helper-83r4i8j_.mjs.map → stats-helper-B4ejVlyj.mjs.map} +1 -1
- package/lib/{threejs-utils-cTSWDuZN.mjs → threejs-utils-DQCcy2fJ.mjs} +2 -2
- package/lib/{threejs-utils-cTSWDuZN.mjs.map → threejs-utils-DQCcy2fJ.mjs.map} +1 -1
- package/lib/{tools-core-BXc5X-bq.mjs → tools-core-f9Mqfmi2.mjs} +3 -3
- package/lib/{tools-core-BXc5X-bq.mjs.map → tools-core-f9Mqfmi2.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/configurator-BDdNLPig.mjs +0 -2
- package/lib/glb-viewer-C1M1v4Da.mjs +0 -2
- package/lib/main-C2IL3ar7.mjs.map +0 -1
- package/lib/packages-D26IfYP3.mjs +0 -4
- package/lib/planner-n1B1oBcW.mjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shading-settings-BWeccIZv.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/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/shading-settings.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 { 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 { 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"],"x_google_ignoreList":[1,2],"mappings":"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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;IAAG;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"}
|
|
1
|
+
{"version":3,"file":"shading-settings-BXL0haNX.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/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/shading-settings.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 { 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 { 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"],"x_google_ignoreList":[1,2],"mappings":"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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;IAAG;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "roomle-core-hsc", "version": "2.81.0
|
|
1
|
+
{"name": "roomle-core-hsc", "version": "2.81.0" }
|
package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm
CHANGED
|
Binary file
|
|
Binary file
|
package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm
CHANGED
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e, t } from "./rolldown-runtime-DgwB9i60.mjs";
|
|
2
|
-
import { t as n } from "./scene-renderer-
|
|
2
|
+
import { t as n } from "./scene-renderer-kbl6O83T.mjs";
|
|
3
3
|
import { n as r, r as i, t as a } from "./decorate-CTUwswpM.mjs";
|
|
4
4
|
//#endregion
|
|
5
5
|
//#region packages/common-core/src/utils/stats-helper.ts
|
|
@@ -93,4 +93,4 @@ a([i, r("design:type", Object)], s.prototype, "_cacheHolder", void 0);
|
|
|
93
93
|
//#endregion
|
|
94
94
|
export { s as default };
|
|
95
95
|
|
|
96
|
-
//# sourceMappingURL=stats-helper-
|
|
96
|
+
//# sourceMappingURL=stats-helper-B4ejVlyj.mjs.map
|