{"version":3,"file":"OutlinePass.cjs","sources":["../../src/postprocessing/OutlinePass.ts"],"sourcesContent":["import { Pass, FullScreenQuad } from './Pass'\nimport {\n  AdditiveBlending,\n  Camera,\n  Color,\n  DoubleSide,\n  Line,\n  Matrix4,\n  Mesh,\n  MeshDepthMaterial,\n  NoBlending,\n  Object3D,\n  PerspectiveCamera,\n  Points,\n  RGBADepthPacking,\n  Scene,\n  ShaderMaterial,\n  Sprite,\n  Texture,\n  UniformsUtils,\n  Vector2,\n  Vector3,\n  WebGLRenderer,\n  WebGLRenderTarget,\n} from 'three'\nimport { CopyShader } from '../shaders/CopyShader'\n\nclass OutlinePass extends Pass {\n  public renderScene: Scene\n  public renderCamera: Camera\n  public selectedObjects: Object3D[]\n  public visibleEdgeColor: Color\n  public hiddenEdgeColor: Color\n  public edgeGlow: number\n  public usePatternTexture: boolean\n  public edgeThickness: number\n  public edgeStrength: number\n  public downSampleRatio: number\n  public pulsePeriod: number\n  public resolution: Vector2\n  public renderTargetMaskBuffer: WebGLRenderTarget\n  public depthMaterial: MeshDepthMaterial\n  public prepareMaskMaterial: ShaderMaterial\n  public renderTargetDepthBuffer: WebGLRenderTarget\n  public renderTargetMaskDownSampleBuffer: WebGLRenderTarget\n  public renderTargetBlurBuffer1: WebGLRenderTarget\n  public renderTargetBlurBuffer2: WebGLRenderTarget\n  public edgeDetectionMaterial: ShaderMaterial\n  public renderTargetEdgeBuffer1: WebGLRenderTarget\n  public renderTargetEdgeBuffer2: WebGLRenderTarget\n  public separableBlurMaterial1: ShaderMaterial\n  public separableBlurMaterial2: ShaderMaterial\n  public overlayMaterial: ShaderMaterial\n  public materialCopy: ShaderMaterial\n  public oldClearAlpha: number\n  public fsQuad: FullScreenQuad\n  public tempPulseColor1: Color\n  public tempPulseColor2: Color\n  public textureMatrix: Matrix4\n  public patternTexture?: Texture\n\n  private _visibilityCache: Map<Object3D, boolean>\n  private _oldClearColor: Color\n\n  public copyUniforms\n\n  public BlurDirectionX = new Vector2(1.0, 0.0)\n  public BlurDirectionY = new Vector2(0.0, 1.0)\n\n  constructor(resolution: Vector2, scene: Scene, camera: Camera, selectedObjects?: Object3D[]) {\n    super()\n\n    this.renderScene = scene\n    this.renderCamera = camera\n    this.selectedObjects = selectedObjects !== undefined ? selectedObjects : []\n    this.visibleEdgeColor = new Color(1, 1, 1)\n    this.hiddenEdgeColor = new Color(0.1, 0.04, 0.02)\n    this.edgeGlow = 0.0\n    this.usePatternTexture = false\n    this.edgeThickness = 1.0\n    this.edgeStrength = 3.0\n    this.downSampleRatio = 2\n    this.pulsePeriod = 0\n\n    this._visibilityCache = new Map()\n\n    this.resolution = resolution !== undefined ? new Vector2(resolution.x, resolution.y) : new Vector2(256, 256)\n\n    const resx = Math.round(this.resolution.x / this.downSampleRatio)\n    const resy = Math.round(this.resolution.y / this.downSampleRatio)\n\n    this.renderTargetMaskBuffer = new WebGLRenderTarget(this.resolution.x, this.resolution.y)\n    this.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask'\n    this.renderTargetMaskBuffer.texture.generateMipmaps = false\n\n    this.depthMaterial = new MeshDepthMaterial()\n    this.depthMaterial.side = DoubleSide\n    this.depthMaterial.depthPacking = RGBADepthPacking\n    this.depthMaterial.blending = NoBlending\n\n    this.prepareMaskMaterial = this.getPrepareMaskMaterial()\n    this.prepareMaskMaterial.side = DoubleSide\n    this.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ(\n      this.prepareMaskMaterial.fragmentShader,\n      this.renderCamera as PerspectiveCamera,\n    )\n\n    this.renderTargetDepthBuffer = new WebGLRenderTarget(this.resolution.x, this.resolution.y)\n    this.renderTargetDepthBuffer.texture.name = 'OutlinePass.depth'\n    this.renderTargetDepthBuffer.texture.generateMipmaps = false\n\n    this.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget(resx, resy)\n    this.renderTargetMaskDownSampleBuffer.texture.name = 'OutlinePass.depthDownSample'\n    this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false\n\n    this.renderTargetBlurBuffer1 = new WebGLRenderTarget(resx, resy)\n    this.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1'\n    this.renderTargetBlurBuffer1.texture.generateMipmaps = false\n    this.renderTargetBlurBuffer2 = new WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2))\n    this.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2'\n    this.renderTargetBlurBuffer2.texture.generateMipmaps = false\n\n    this.edgeDetectionMaterial = this.getEdgeDetectionMaterial()\n    this.renderTargetEdgeBuffer1 = new WebGLRenderTarget(resx, resy)\n    this.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1'\n    this.renderTargetEdgeBuffer1.texture.generateMipmaps = false\n    this.renderTargetEdgeBuffer2 = new WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2))\n    this.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2'\n    this.renderTargetEdgeBuffer2.texture.generateMipmaps = false\n\n    const MAX_EDGE_THICKNESS = 4\n    const MAX_EDGE_GLOW = 4\n\n    this.separableBlurMaterial1 = this.getSeperableBlurMaterial(MAX_EDGE_THICKNESS)\n    this.separableBlurMaterial1.uniforms['texSize'].value.set(resx, resy)\n    this.separableBlurMaterial1.uniforms['kernelRadius'].value = 1\n    this.separableBlurMaterial2 = this.getSeperableBlurMaterial(MAX_EDGE_GLOW)\n    this.separableBlurMaterial2.uniforms['texSize'].value.set(Math.round(resx / 2), Math.round(resy / 2))\n    this.separableBlurMaterial2.uniforms['kernelRadius'].value = MAX_EDGE_GLOW\n\n    // Overlay material\n    this.overlayMaterial = this.getOverlayMaterial()\n\n    // copy material\n    if (CopyShader === undefined) console.error('THREE.OutlinePass relies on CopyShader')\n\n    const copyShader = CopyShader\n\n    this.copyUniforms = UniformsUtils.clone(copyShader.uniforms)\n    this.copyUniforms['opacity'].value = 1.0\n\n    this.materialCopy = new ShaderMaterial({\n      uniforms: this.copyUniforms,\n      vertexShader: copyShader.vertexShader,\n      fragmentShader: copyShader.fragmentShader,\n      blending: NoBlending,\n      depthTest: false,\n      depthWrite: false,\n      transparent: true,\n    })\n\n    this.enabled = true\n    this.needsSwap = false\n\n    this._oldClearColor = new Color()\n    this.oldClearAlpha = 1\n\n    this.fsQuad = new FullScreenQuad(this.materialCopy)\n\n    this.tempPulseColor1 = new Color()\n    this.tempPulseColor2 = new Color()\n    this.textureMatrix = new Matrix4()\n\n    function replaceDepthToViewZ(string: string, camera: PerspectiveCamera): string {\n      const type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic'\n\n      return string.replace(/DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ')\n    }\n  }\n\n  public dispose(): void {\n    this.renderTargetMaskBuffer.dispose()\n    this.renderTargetDepthBuffer.dispose()\n    this.renderTargetMaskDownSampleBuffer.dispose()\n    this.renderTargetBlurBuffer1.dispose()\n    this.renderTargetBlurBuffer2.dispose()\n    this.renderTargetEdgeBuffer1.dispose()\n    this.renderTargetEdgeBuffer2.dispose()\n  }\n\n  public setSize(width: number, height: number): void {\n    this.renderTargetMaskBuffer.setSize(width, height)\n    this.renderTargetDepthBuffer.setSize(width, height)\n\n    let resx = Math.round(width / this.downSampleRatio)\n    let resy = Math.round(height / this.downSampleRatio)\n    this.renderTargetMaskDownSampleBuffer.setSize(resx, resy)\n    this.renderTargetBlurBuffer1.setSize(resx, resy)\n    this.renderTargetEdgeBuffer1.setSize(resx, resy)\n    this.separableBlurMaterial1.uniforms['texSize'].value.set(resx, resy)\n\n    resx = Math.round(resx / 2)\n    resy = Math.round(resy / 2)\n\n    this.renderTargetBlurBuffer2.setSize(resx, resy)\n    this.renderTargetEdgeBuffer2.setSize(resx, resy)\n\n    this.separableBlurMaterial2.uniforms['texSize'].value.set(resx, resy)\n  }\n\n  public changeVisibilityOfSelectedObjects(bVisible: boolean): void {\n    const cache = this._visibilityCache\n\n    function gatherSelectedMeshesCallBack(object: Object3D): void {\n      if ((object as Mesh).isMesh) {\n        if (bVisible === true) {\n          object.visible = cache.get(object) as boolean\n        } else {\n          cache.set(object, object.visible)\n          object.visible = bVisible\n        }\n      }\n    }\n\n    for (let i = 0; i < this.selectedObjects.length; i++) {\n      const selectedObject = this.selectedObjects[i]\n      selectedObject.traverse(gatherSelectedMeshesCallBack)\n    }\n  }\n\n  public changeVisibilityOfNonSelectedObjects(bVisible: boolean): void {\n    const cache = this._visibilityCache\n    const selectedMeshes: Object3D[] = []\n\n    function gatherSelectedMeshesCallBack(object: Object3D): void {\n      if ((object as Mesh).isMesh) selectedMeshes.push(object)\n    }\n\n    for (let i = 0; i < this.selectedObjects.length; i++) {\n      const selectedObject = this.selectedObjects[i]\n      selectedObject.traverse(gatherSelectedMeshesCallBack)\n    }\n\n    function VisibilityChangeCallBack(object: Object3D): void {\n      if ((object as Mesh).isMesh || (object as Sprite).isSprite) {\n        // only meshes and sprites are supported by OutlinePass\n\n        let bFound = false\n\n        for (let i = 0; i < selectedMeshes.length; i++) {\n          const selectedObjectId = selectedMeshes[i].id\n\n          if (selectedObjectId === object.id) {\n            bFound = true\n            break\n          }\n        }\n\n        if (bFound === false) {\n          const visibility = object.visible\n\n          if (bVisible === false || cache.get(object) === true) {\n            object.visible = bVisible\n          }\n\n          cache.set(object, visibility)\n        }\n      } else if ((object as Points).isPoints || (object as Line).isLine) {\n        // the visibilty of points and lines is always set to false in order to\n        // not affect the outline computation\n\n        if (bVisible === true) {\n          object.visible = cache.get(object) as boolean // restore\n        } else {\n          cache.set(object, object.visible)\n          object.visible = bVisible\n        }\n      }\n    }\n\n    this.renderScene.traverse(VisibilityChangeCallBack)\n  }\n\n  public updateTextureMatrix(): void {\n    this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0)\n    this.textureMatrix.multiply(this.renderCamera.projectionMatrix)\n    this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse)\n  }\n\n  public render(\n    renderer: WebGLRenderer,\n    writeBuffer: WebGLRenderTarget,\n    readBuffer: WebGLRenderTarget,\n    deltaTime: number,\n    maskActive: boolean,\n  ): void {\n    if (this.selectedObjects.length > 0) {\n      renderer.getClearColor(this._oldClearColor)\n      this.oldClearAlpha = renderer.getClearAlpha()\n      const oldAutoClear = renderer.autoClear\n\n      renderer.autoClear = false\n\n      if (maskActive) renderer.state.buffers.stencil.setTest(false)\n\n      renderer.setClearColor(0xffffff, 1)\n\n      // Make selected objects invisible\n      this.changeVisibilityOfSelectedObjects(false)\n\n      const currentBackground = this.renderScene.background\n      this.renderScene.background = null\n\n      // 1. Draw Non Selected objects in the depth buffer\n      this.renderScene.overrideMaterial = this.depthMaterial\n      renderer.setRenderTarget(this.renderTargetDepthBuffer)\n      renderer.clear()\n      renderer.render(this.renderScene, this.renderCamera)\n\n      // Make selected objects visible\n      this.changeVisibilityOfSelectedObjects(true)\n      this._visibilityCache.clear()\n\n      // Update Texture Matrix for Depth compare\n      this.updateTextureMatrix()\n\n      // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n      this.changeVisibilityOfNonSelectedObjects(false)\n      this.renderScene.overrideMaterial = this.prepareMaskMaterial\n      this.prepareMaskMaterial.uniforms['cameraNearFar'].value.set(\n        (this.renderCamera as PerspectiveCamera).near,\n        (this.renderCamera as PerspectiveCamera).far,\n      )\n      this.prepareMaskMaterial.uniforms['depthTexture'].value = this.renderTargetDepthBuffer.texture\n      this.prepareMaskMaterial.uniforms['textureMatrix'].value = this.textureMatrix\n      renderer.setRenderTarget(this.renderTargetMaskBuffer)\n      renderer.clear()\n      renderer.render(this.renderScene, this.renderCamera)\n      this.renderScene.overrideMaterial = null\n      this.changeVisibilityOfNonSelectedObjects(true)\n      this._visibilityCache.clear()\n\n      this.renderScene.background = currentBackground\n\n      // 2. Downsample to Half resolution\n      this.fsQuad.material = this.materialCopy\n      this.copyUniforms['tDiffuse'].value = this.renderTargetMaskBuffer.texture\n      renderer.setRenderTarget(this.renderTargetMaskDownSampleBuffer)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n\n      this.tempPulseColor1.copy(this.visibleEdgeColor)\n      this.tempPulseColor2.copy(this.hiddenEdgeColor)\n\n      if (this.pulsePeriod > 0) {\n        const scalar = (1 + 0.25) / 2 + (Math.cos((performance.now() * 0.01) / this.pulsePeriod) * (1.0 - 0.25)) / 2\n        this.tempPulseColor1.multiplyScalar(scalar)\n        this.tempPulseColor2.multiplyScalar(scalar)\n      }\n\n      // 3. Apply Edge Detection Pass\n      this.fsQuad.material = this.edgeDetectionMaterial\n      this.edgeDetectionMaterial.uniforms['maskTexture'].value = this.renderTargetMaskDownSampleBuffer.texture\n      this.edgeDetectionMaterial.uniforms['texSize'].value.set(\n        this.renderTargetMaskDownSampleBuffer.width,\n        this.renderTargetMaskDownSampleBuffer.height,\n      )\n      this.edgeDetectionMaterial.uniforms['visibleEdgeColor'].value = this.tempPulseColor1\n      this.edgeDetectionMaterial.uniforms['hiddenEdgeColor'].value = this.tempPulseColor2\n      renderer.setRenderTarget(this.renderTargetEdgeBuffer1)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n\n      // 4. Apply Blur on Half res\n      this.fsQuad.material = this.separableBlurMaterial1\n      this.separableBlurMaterial1.uniforms['colorTexture'].value = this.renderTargetEdgeBuffer1.texture\n      this.separableBlurMaterial1.uniforms['direction'].value = this.BlurDirectionX\n      this.separableBlurMaterial1.uniforms['kernelRadius'].value = this.edgeThickness\n      renderer.setRenderTarget(this.renderTargetBlurBuffer1)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n      this.separableBlurMaterial1.uniforms['colorTexture'].value = this.renderTargetBlurBuffer1.texture\n      this.separableBlurMaterial1.uniforms['direction'].value = this.BlurDirectionY\n      renderer.setRenderTarget(this.renderTargetEdgeBuffer1)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n\n      // Apply Blur on quarter res\n      this.fsQuad.material = this.separableBlurMaterial2\n      this.separableBlurMaterial2.uniforms['colorTexture'].value = this.renderTargetEdgeBuffer1.texture\n      this.separableBlurMaterial2.uniforms['direction'].value = this.BlurDirectionX\n      renderer.setRenderTarget(this.renderTargetBlurBuffer2)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n      this.separableBlurMaterial2.uniforms['colorTexture'].value = this.renderTargetBlurBuffer2.texture\n      this.separableBlurMaterial2.uniforms['direction'].value = this.BlurDirectionY\n      renderer.setRenderTarget(this.renderTargetEdgeBuffer2)\n      renderer.clear()\n      this.fsQuad.render(renderer)\n\n      // Blend it additively over the input texture\n      this.fsQuad.material = this.overlayMaterial\n      this.overlayMaterial.uniforms['maskTexture'].value = this.renderTargetMaskBuffer.texture\n      this.overlayMaterial.uniforms['edgeTexture1'].value = this.renderTargetEdgeBuffer1.texture\n      this.overlayMaterial.uniforms['edgeTexture2'].value = this.renderTargetEdgeBuffer2.texture\n      this.overlayMaterial.uniforms['patternTexture'].value = this.patternTexture\n      this.overlayMaterial.uniforms['edgeStrength'].value = this.edgeStrength\n      this.overlayMaterial.uniforms['edgeGlow'].value = this.edgeGlow\n      this.overlayMaterial.uniforms['usePatternTexture'].value = this.usePatternTexture\n\n      if (maskActive) renderer.state.buffers.stencil.setTest(true)\n\n      renderer.setRenderTarget(readBuffer)\n      this.fsQuad.render(renderer)\n\n      renderer.setClearColor(this._oldClearColor, this.oldClearAlpha)\n      renderer.autoClear = oldAutoClear\n    }\n\n    if (this.renderToScreen) {\n      this.fsQuad.material = this.materialCopy\n      this.copyUniforms['tDiffuse'].value = readBuffer.texture\n      renderer.setRenderTarget(null)\n      this.fsQuad.render(renderer)\n    }\n  }\n\n  public getPrepareMaskMaterial(): ShaderMaterial {\n    return new ShaderMaterial({\n      uniforms: {\n        depthTexture: { value: null },\n        cameraNearFar: { value: new Vector2(0.5, 0.5) },\n        textureMatrix: { value: null },\n      },\n\n      vertexShader: `#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\t\t\t\tvoid main() {\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\t\t\t\t\tvPosition = mvPosition;\n\t\t\t\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\t\t\t\t}`,\n\n      fragmentShader: `#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\t\t\t\t}`,\n    })\n  }\n\n  public getEdgeDetectionMaterial(): ShaderMaterial {\n    return new ShaderMaterial({\n      uniforms: {\n        maskTexture: { value: null },\n        texSize: { value: new Vector2(0.5, 0.5) },\n        visibleEdgeColor: { value: new Vector3(1.0, 1.0, 1.0) },\n        hiddenEdgeColor: { value: new Vector3(1.0, 1.0, 1.0) },\n      },\n\n      vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n      fragmentShader: `varying vec2 vUv;\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}`,\n    })\n  }\n\n  public getSeperableBlurMaterial(maxRadius: number): ShaderMaterial {\n    return new ShaderMaterial({\n      defines: {\n        MAX_RADIUS: maxRadius,\n      },\n\n      uniforms: {\n        colorTexture: { value: null },\n        texSize: { value: new Vector2(0.5, 0.5) },\n        direction: { value: new Vector2(0.5, 0.5) },\n        kernelRadius: { value: 1.0 },\n      },\n\n      vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n      fragmentShader: `#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, kernelRadius);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat w = gaussianPdf(uvOffset.x, kernelRadius);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}`,\n    })\n  }\n\n  public getOverlayMaterial(): ShaderMaterial {\n    return new ShaderMaterial({\n      uniforms: {\n        maskTexture: { value: null },\n        edgeTexture1: { value: null },\n        edgeTexture2: { value: null },\n        patternTexture: { value: null },\n        edgeStrength: { value: 1.0 },\n        edgeGlow: { value: 1.0 },\n        usePatternTexture: { value: 0.0 },\n      },\n\n      vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n      fragmentShader: `varying vec2 vUv;\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n\t\t\t\t}`,\n      blending: AdditiveBlending,\n      depthTest: false,\n      depthWrite: false,\n      transparent: true,\n    })\n  }\n}\n\nexport { OutlinePass }\n"],"names":["Pass","Vector2","Color","WebGLRenderTarget","MeshDepthMaterial","DoubleSide","RGBADepthPacking","NoBlending","CopyShader","UniformsUtils","ShaderMaterial","FullScreenQuad","Matrix4","camera","Vector3","AdditiveBlending"],"mappings":"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"}