{"version":3,"file":"SSRPass.cjs","sources":["../../src/postprocessing/SSRPass.js"],"sourcesContent":["import {\n  AddEquation,\n  Color,\n  NormalBlending,\n  DepthTexture,\n  SrcAlphaFactor,\n  OneMinusSrcAlphaFactor,\n  MeshNormalMaterial,\n  MeshBasicMaterial,\n  NearestFilter,\n  NoBlending,\n  ShaderMaterial,\n  UniformsUtils,\n  UnsignedShortType,\n  WebGLRenderTarget,\n  HalfFloatType,\n} from 'three'\nimport { Pass, FullScreenQuad } from './Pass'\nimport { SSRShader } from '../shaders/SSRShader'\nimport { SSRBlurShader } from '../shaders/SSRShader'\nimport { SSRDepthShader } from '../shaders/SSRShader'\nimport { CopyShader } from '../shaders/CopyShader'\n\nclass SSRPass extends Pass {\n  static OUTPUT = {\n    Default: 0,\n    SSR: 1,\n    Beauty: 3,\n    Depth: 4,\n    Normal: 5,\n    Metalness: 7,\n  }\n  constructor({ renderer, scene, camera, width, height, selects, bouncing = false, groundReflector }) {\n    super()\n\n    this.width = width !== undefined ? width : 512\n    this.height = height !== undefined ? height : 512\n\n    this.clear = true\n\n    this.renderer = renderer\n    this.scene = scene\n    this.camera = camera\n    this.groundReflector = groundReflector\n\n    this.opacity = SSRShader.uniforms.opacity.value\n    this.output = 0\n\n    this.maxDistance = SSRShader.uniforms.maxDistance.value\n    this.thickness = SSRShader.uniforms.thickness.value\n\n    this.tempColor = new Color()\n\n    this._selects = selects\n    this.selective = Array.isArray(this._selects)\n    Object.defineProperty(this, 'selects', {\n      get() {\n        return this._selects\n      },\n      set(val) {\n        if (this._selects === val) return\n        this._selects = val\n        if (Array.isArray(val)) {\n          this.selective = true\n          this.ssrMaterial.defines.SELECTIVE = true\n          this.ssrMaterial.needsUpdate = true\n        } else {\n          this.selective = false\n          this.ssrMaterial.defines.SELECTIVE = false\n          this.ssrMaterial.needsUpdate = true\n        }\n      },\n    })\n\n    this._bouncing = bouncing\n    Object.defineProperty(this, 'bouncing', {\n      get() {\n        return this._bouncing\n      },\n      set(val) {\n        if (this._bouncing === val) return\n        this._bouncing = val\n        if (val) {\n          this.ssrMaterial.uniforms['tDiffuse'].value = this.prevRenderTarget.texture\n        } else {\n          this.ssrMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n        }\n      },\n    })\n\n    this.blur = true\n\n    this._distanceAttenuation = SSRShader.defines.DISTANCE_ATTENUATION\n    Object.defineProperty(this, 'distanceAttenuation', {\n      get() {\n        return this._distanceAttenuation\n      },\n      set(val) {\n        if (this._distanceAttenuation === val) return\n        this._distanceAttenuation = val\n        this.ssrMaterial.defines.DISTANCE_ATTENUATION = val\n        this.ssrMaterial.needsUpdate = true\n      },\n    })\n\n    this._fresnel = SSRShader.defines.FRESNEL\n    Object.defineProperty(this, 'fresnel', {\n      get() {\n        return this._fresnel\n      },\n      set(val) {\n        if (this._fresnel === val) return\n        this._fresnel = val\n        this.ssrMaterial.defines.FRESNEL = val\n        this.ssrMaterial.needsUpdate = true\n      },\n    })\n\n    this._infiniteThick = SSRShader.defines.INFINITE_THICK\n    Object.defineProperty(this, 'infiniteThick', {\n      get() {\n        return this._infiniteThick\n      },\n      set(val) {\n        if (this._infiniteThick === val) return\n        this._infiniteThick = val\n        this.ssrMaterial.defines.INFINITE_THICK = val\n        this.ssrMaterial.needsUpdate = true\n      },\n    })\n\n    // beauty render target with depth buffer\n\n    const depthTexture = new DepthTexture()\n    depthTexture.type = UnsignedShortType\n    depthTexture.minFilter = NearestFilter\n    depthTexture.magFilter = NearestFilter\n\n    this.beautyRenderTarget = new WebGLRenderTarget(this.width, this.height, {\n      minFilter: NearestFilter,\n      magFilter: NearestFilter,\n      type: HalfFloatType,\n      depthTexture: depthTexture,\n      depthBuffer: true,\n    })\n\n    //for bouncing\n    this.prevRenderTarget = new WebGLRenderTarget(this.width, this.height, {\n      minFilter: NearestFilter,\n      magFilter: NearestFilter,\n    })\n\n    // normal render target\n\n    this.normalRenderTarget = new WebGLRenderTarget(this.width, this.height, {\n      minFilter: NearestFilter,\n      magFilter: NearestFilter,\n      type: HalfFloatType,\n    })\n\n    // metalness render target\n\n    this.metalnessRenderTarget = new WebGLRenderTarget(this.width, this.height, {\n      minFilter: NearestFilter,\n      magFilter: NearestFilter,\n      type: HalfFloatType,\n    })\n\n    // ssr render target\n\n    this.ssrRenderTarget = new WebGLRenderTarget(this.width, this.height, {\n      minFilter: NearestFilter,\n      magFilter: NearestFilter,\n    })\n\n    this.blurRenderTarget = this.ssrRenderTarget.clone()\n    this.blurRenderTarget2 = this.ssrRenderTarget.clone()\n    // this.blurRenderTarget3 = this.ssrRenderTarget.clone();\n\n    // ssr material\n\n    this.ssrMaterial = new ShaderMaterial({\n      defines: Object.assign({}, SSRShader.defines, {\n        MAX_STEP: Math.sqrt(this.width * this.width + this.height * this.height),\n      }),\n      uniforms: UniformsUtils.clone(SSRShader.uniforms),\n      vertexShader: SSRShader.vertexShader,\n      fragmentShader: SSRShader.fragmentShader,\n      blending: NoBlending,\n    })\n\n    this.ssrMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n    this.ssrMaterial.uniforms['tNormal'].value = this.normalRenderTarget.texture\n    this.ssrMaterial.defines.SELECTIVE = this.selective\n    this.ssrMaterial.needsUpdate = true\n    this.ssrMaterial.uniforms['tMetalness'].value = this.metalnessRenderTarget.texture\n    this.ssrMaterial.uniforms['tDepth'].value = this.beautyRenderTarget.depthTexture\n    this.ssrMaterial.uniforms['cameraNear'].value = this.camera.near\n    this.ssrMaterial.uniforms['cameraFar'].value = this.camera.far\n    this.ssrMaterial.uniforms['thickness'].value = this.thickness\n    this.ssrMaterial.uniforms['resolution'].value.set(this.width, this.height)\n    this.ssrMaterial.uniforms['cameraProjectionMatrix'].value.copy(this.camera.projectionMatrix)\n    this.ssrMaterial.uniforms['cameraInverseProjectionMatrix'].value.copy(this.camera.projectionMatrixInverse)\n\n    // normal material\n\n    this.normalMaterial = new MeshNormalMaterial()\n    this.normalMaterial.blending = NoBlending\n\n    // metalnessOn material\n\n    this.metalnessOnMaterial = new MeshBasicMaterial({\n      color: 'white',\n    })\n\n    // metalnessOff material\n\n    this.metalnessOffMaterial = new MeshBasicMaterial({\n      color: 'black',\n    })\n\n    // blur material\n\n    this.blurMaterial = new ShaderMaterial({\n      defines: Object.assign({}, SSRBlurShader.defines),\n      uniforms: UniformsUtils.clone(SSRBlurShader.uniforms),\n      vertexShader: SSRBlurShader.vertexShader,\n      fragmentShader: SSRBlurShader.fragmentShader,\n    })\n    this.blurMaterial.uniforms['tDiffuse'].value = this.ssrRenderTarget.texture\n    this.blurMaterial.uniforms['resolution'].value.set(this.width, this.height)\n\n    // blur material 2\n\n    this.blurMaterial2 = new ShaderMaterial({\n      defines: Object.assign({}, SSRBlurShader.defines),\n      uniforms: UniformsUtils.clone(SSRBlurShader.uniforms),\n      vertexShader: SSRBlurShader.vertexShader,\n      fragmentShader: SSRBlurShader.fragmentShader,\n    })\n    this.blurMaterial2.uniforms['tDiffuse'].value = this.blurRenderTarget.texture\n    this.blurMaterial2.uniforms['resolution'].value.set(this.width, this.height)\n\n    // // blur material 3\n\n    // this.blurMaterial3 = new ShaderMaterial({\n    //   defines: Object.assign({}, SSRBlurShader.defines),\n    //   uniforms: UniformsUtils.clone(SSRBlurShader.uniforms),\n    //   vertexShader: SSRBlurShader.vertexShader,\n    //   fragmentShader: SSRBlurShader.fragmentShader\n    // });\n    // this.blurMaterial3.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture;\n    // this.blurMaterial3.uniforms['resolution'].value.set(this.width, this.height);\n\n    // material for rendering the depth\n\n    this.depthRenderMaterial = new ShaderMaterial({\n      defines: Object.assign({}, SSRDepthShader.defines),\n      uniforms: UniformsUtils.clone(SSRDepthShader.uniforms),\n      vertexShader: SSRDepthShader.vertexShader,\n      fragmentShader: SSRDepthShader.fragmentShader,\n      blending: NoBlending,\n    })\n    this.depthRenderMaterial.uniforms['tDepth'].value = this.beautyRenderTarget.depthTexture\n    this.depthRenderMaterial.uniforms['cameraNear'].value = this.camera.near\n    this.depthRenderMaterial.uniforms['cameraFar'].value = this.camera.far\n\n    // material for rendering the content of a render target\n\n    this.copyMaterial = new ShaderMaterial({\n      uniforms: UniformsUtils.clone(CopyShader.uniforms),\n      vertexShader: CopyShader.vertexShader,\n      fragmentShader: CopyShader.fragmentShader,\n      transparent: true,\n      depthTest: false,\n      depthWrite: false,\n      blendSrc: SrcAlphaFactor,\n      blendDst: OneMinusSrcAlphaFactor,\n      blendEquation: AddEquation,\n      blendSrcAlpha: SrcAlphaFactor,\n      blendDstAlpha: OneMinusSrcAlphaFactor,\n      blendEquationAlpha: AddEquation,\n      // premultipliedAlpha:true,\n    })\n\n    this.fsQuad = new FullScreenQuad(null)\n\n    this.originalClearColor = new Color()\n  }\n\n  dispose() {\n    // dispose render targets\n\n    this.beautyRenderTarget.dispose()\n    this.prevRenderTarget.dispose()\n    this.normalRenderTarget.dispose()\n    this.metalnessRenderTarget.dispose()\n    this.ssrRenderTarget.dispose()\n    this.blurRenderTarget.dispose()\n    this.blurRenderTarget2.dispose()\n    // this.blurRenderTarget3.dispose();\n\n    // dispose materials\n\n    this.normalMaterial.dispose()\n    this.metalnessOnMaterial.dispose()\n    this.metalnessOffMaterial.dispose()\n    this.blurMaterial.dispose()\n    this.blurMaterial2.dispose()\n    this.copyMaterial.dispose()\n    this.depthRenderMaterial.dispose()\n\n    // dipsose full screen quad\n\n    this.fsQuad.dispose()\n  }\n\n  render(renderer, writeBuffer /*, readBuffer, deltaTime, maskActive */) {\n    // render beauty and depth\n\n    renderer.setRenderTarget(this.beautyRenderTarget)\n    renderer.clear()\n    if (this.groundReflector) {\n      this.groundReflector.visible = false\n      this.groundReflector.doRender(this.renderer, this.scene, this.camera)\n      this.groundReflector.visible = true\n    }\n\n    renderer.render(this.scene, this.camera)\n    if (this.groundReflector) this.groundReflector.visible = false\n\n    // render normals\n\n    this.renderOverride(renderer, this.normalMaterial, this.normalRenderTarget, 0, 0)\n\n    // render metalnesses\n\n    if (this.selective) {\n      this.renderMetalness(renderer, this.metalnessOnMaterial, this.metalnessRenderTarget, 0, 0)\n    }\n\n    // render SSR\n\n    this.ssrMaterial.uniforms['opacity'].value = this.opacity\n    this.ssrMaterial.uniforms['maxDistance'].value = this.maxDistance\n    this.ssrMaterial.uniforms['thickness'].value = this.thickness\n    this.renderPass(renderer, this.ssrMaterial, this.ssrRenderTarget)\n\n    // render blur\n\n    if (this.blur) {\n      this.renderPass(renderer, this.blurMaterial, this.blurRenderTarget)\n      this.renderPass(renderer, this.blurMaterial2, this.blurRenderTarget2)\n      // this.renderPass(renderer, this.blurMaterial3, this.blurRenderTarget3);\n    }\n\n    // output result to screen\n\n    switch (this.output) {\n      case SSRPass.OUTPUT.Default:\n        if (this.bouncing) {\n          this.copyMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n          this.copyMaterial.blending = NoBlending\n          this.renderPass(renderer, this.copyMaterial, this.prevRenderTarget)\n\n          if (this.blur) this.copyMaterial.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture\n          else this.copyMaterial.uniforms['tDiffuse'].value = this.ssrRenderTarget.texture\n          this.copyMaterial.blending = NormalBlending\n          this.renderPass(renderer, this.copyMaterial, this.prevRenderTarget)\n\n          this.copyMaterial.uniforms['tDiffuse'].value = this.prevRenderTarget.texture\n          this.copyMaterial.blending = NoBlending\n          this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n        } else {\n          this.copyMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n          this.copyMaterial.blending = NoBlending\n          this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n\n          if (this.blur) this.copyMaterial.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture\n          else this.copyMaterial.uniforms['tDiffuse'].value = this.ssrRenderTarget.texture\n          this.copyMaterial.blending = NormalBlending\n          this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n        }\n\n        break\n      case SSRPass.OUTPUT.SSR:\n        if (this.blur) this.copyMaterial.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture\n        else this.copyMaterial.uniforms['tDiffuse'].value = this.ssrRenderTarget.texture\n        this.copyMaterial.blending = NoBlending\n        this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n\n        if (this.bouncing) {\n          if (this.blur) this.copyMaterial.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture\n          else this.copyMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n          this.copyMaterial.blending = NoBlending\n          this.renderPass(renderer, this.copyMaterial, this.prevRenderTarget)\n\n          this.copyMaterial.uniforms['tDiffuse'].value = this.ssrRenderTarget.texture\n          this.copyMaterial.blending = NormalBlending\n          this.renderPass(renderer, this.copyMaterial, this.prevRenderTarget)\n        }\n\n        break\n\n      case SSRPass.OUTPUT.Beauty:\n        this.copyMaterial.uniforms['tDiffuse'].value = this.beautyRenderTarget.texture\n        this.copyMaterial.blending = NoBlending\n        this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n\n        break\n\n      case SSRPass.OUTPUT.Depth:\n        this.renderPass(renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer)\n\n        break\n\n      case SSRPass.OUTPUT.Normal:\n        this.copyMaterial.uniforms['tDiffuse'].value = this.normalRenderTarget.texture\n        this.copyMaterial.blending = NoBlending\n        this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n\n        break\n\n      case SSRPass.OUTPUT.Metalness:\n        this.copyMaterial.uniforms['tDiffuse'].value = this.metalnessRenderTarget.texture\n        this.copyMaterial.blending = NoBlending\n        this.renderPass(renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer)\n\n        break\n\n      default:\n        console.warn('THREE.SSRPass: Unknown output type.')\n    }\n  }\n\n  renderPass(renderer, passMaterial, renderTarget, clearColor, clearAlpha) {\n    // save original state\n    this.originalClearColor.copy(renderer.getClearColor(this.tempColor))\n    const originalClearAlpha = renderer.getClearAlpha(this.tempColor)\n    const originalAutoClear = renderer.autoClear\n\n    renderer.setRenderTarget(renderTarget)\n\n    // setup pass state\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    this.fsQuad.material = passMaterial\n    this.fsQuad.render(renderer)\n\n    // restore original state\n    renderer.autoClear = originalAutoClear\n    renderer.setClearColor(this.originalClearColor)\n    renderer.setClearAlpha(originalClearAlpha)\n  }\n\n  renderOverride(renderer, overrideMaterial, renderTarget, clearColor, clearAlpha) {\n    this.originalClearColor.copy(renderer.getClearColor(this.tempColor))\n    const originalClearAlpha = renderer.getClearAlpha(this.tempColor)\n    const originalAutoClear = renderer.autoClear\n\n    renderer.setRenderTarget(renderTarget)\n    renderer.autoClear = false\n\n    clearColor = overrideMaterial.clearColor || clearColor\n    clearAlpha = overrideMaterial.clearAlpha || clearAlpha\n\n    if (clearColor !== undefined && clearColor !== null) {\n      renderer.setClearColor(clearColor)\n      renderer.setClearAlpha(clearAlpha || 0.0)\n      renderer.clear()\n    }\n\n    this.scene.overrideMaterial = overrideMaterial\n    renderer.render(this.scene, this.camera)\n    this.scene.overrideMaterial = null\n\n    // restore original state\n\n    renderer.autoClear = originalAutoClear\n    renderer.setClearColor(this.originalClearColor)\n    renderer.setClearAlpha(originalClearAlpha)\n  }\n\n  renderMetalness(renderer, overrideMaterial, renderTarget, clearColor, clearAlpha) {\n    this.originalClearColor.copy(renderer.getClearColor(this.tempColor))\n    const originalClearAlpha = renderer.getClearAlpha(this.tempColor)\n    const originalAutoClear = renderer.autoClear\n\n    renderer.setRenderTarget(renderTarget)\n    renderer.autoClear = false\n\n    clearColor = overrideMaterial.clearColor || clearColor\n    clearAlpha = overrideMaterial.clearAlpha || clearAlpha\n\n    if (clearColor !== undefined && clearColor !== null) {\n      renderer.setClearColor(clearColor)\n      renderer.setClearAlpha(clearAlpha || 0.0)\n      renderer.clear()\n    }\n\n    this.scene.traverseVisible((child) => {\n      child._SSRPassBackupMaterial = child.material\n      if (this._selects.includes(child)) {\n        child.material = this.metalnessOnMaterial\n      } else {\n        child.material = this.metalnessOffMaterial\n      }\n    })\n    renderer.render(this.scene, this.camera)\n    this.scene.traverseVisible((child) => {\n      child.material = child._SSRPassBackupMaterial\n    })\n\n    // restore original state\n\n    renderer.autoClear = originalAutoClear\n    renderer.setClearColor(this.originalClearColor)\n    renderer.setClearAlpha(originalClearAlpha)\n  }\n\n  setSize(width, height) {\n    this.width = width\n    this.height = height\n\n    this.ssrMaterial.defines.MAX_STEP = Math.sqrt(width * width + height * height)\n    this.ssrMaterial.needsUpdate = true\n    this.beautyRenderTarget.setSize(width, height)\n    this.prevRenderTarget.setSize(width, height)\n    this.ssrRenderTarget.setSize(width, height)\n    this.normalRenderTarget.setSize(width, height)\n    this.metalnessRenderTarget.setSize(width, height)\n    this.blurRenderTarget.setSize(width, height)\n    this.blurRenderTarget2.setSize(width, height)\n    // this.blurRenderTarget3.setSize(width, height);\n\n    this.ssrMaterial.uniforms['resolution'].value.set(width, height)\n    this.ssrMaterial.uniforms['cameraProjectionMatrix'].value.copy(this.camera.projectionMatrix)\n    this.ssrMaterial.uniforms['cameraInverseProjectionMatrix'].value.copy(this.camera.projectionMatrixInverse)\n\n    this.blurMaterial.uniforms['resolution'].value.set(width, height)\n    this.blurMaterial2.uniforms['resolution'].value.set(width, height)\n  }\n}\n\nexport { SSRPass }\n"],"names":["Pass","SSRShader","Color","DepthTexture","UnsignedShortType","NearestFilter","WebGLRenderTarget","HalfFloatType","ShaderMaterial","UniformsUtils","NoBlending","MeshNormalMaterial","MeshBasicMaterial","SSRBlurShader","SSRDepthShader","CopyShader","SrcAlphaFactor","OneMinusSrcAlphaFactor","AddEquation","FullScreenQuad","NormalBlending"],"mappings":"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"}