{"version":3,"file":"Lensflare.cjs","sources":["../../src/objects/Lensflare.js"],"sourcesContent":["import {\n  AdditiveBlending,\n  Box2,\n  BufferGeometry,\n  ClampToEdgeWrapping,\n  Color,\n  DataTexture,\n  InterleavedBuffer,\n  InterleavedBufferAttribute,\n  Mesh,\n  MeshBasicMaterial,\n  NearestFilter,\n  RGBAFormat,\n  RawShaderMaterial,\n  Vector2,\n  Vector3,\n  Vector4,\n} from 'three'\n\nconst geometry = new BufferGeometry()\n\nconst float32Array = new Float32Array([-1, -1, 0, 0, 0, 1, -1, 0, 1, 0, 1, 1, 0, 1, 1, -1, 1, 0, 0, 1])\n\nconst interleavedBuffer = new InterleavedBuffer(float32Array, 5)\n\ngeometry.setIndex([0, 1, 2, 0, 2, 3])\ngeometry.setAttribute('position', new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false))\ngeometry.setAttribute('uv', new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false))\n\nclass Lensflare extends Mesh {\n  static Geometry = geometry\n\n  constructor() {\n    super(Lensflare.Geometry, new MeshBasicMaterial({ opacity: 0, transparent: true }))\n\n    this.isLensflare = true\n\n    this.type = 'Lensflare'\n    this.frustumCulled = false\n    this.renderOrder = Infinity\n\n    //\n\n    const positionScreen = new Vector3()\n    const positionView = new Vector3()\n\n    // textures\n    const tempMap = new DataTexture(new Uint8Array(16 * 16 * 3), 16, 16, RGBAFormat)\n    tempMap.minFilter = NearestFilter\n    tempMap.magFilter = NearestFilter\n    tempMap.wrapS = ClampToEdgeWrapping\n    tempMap.wrapT = ClampToEdgeWrapping\n\n    const occlusionMap = new DataTexture(new Uint8Array(16 * 16 * 3), 16, 16, RGBAFormat)\n    occlusionMap.minFilter = NearestFilter\n    occlusionMap.magFilter = NearestFilter\n    occlusionMap.wrapS = ClampToEdgeWrapping\n    occlusionMap.wrapT = ClampToEdgeWrapping\n\n    // material\n\n    const geometry = Lensflare.Geometry\n\n    const material1a = new RawShaderMaterial({\n      uniforms: {\n        scale: { value: null },\n        screenPosition: { value: null },\n      },\n      vertexShader: /* glsl */ `\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tattribute vec3 position;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\n\n\t\t\t\t}`,\n\n      fragmentShader: /* glsl */ `\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 1.0 );\n\n\t\t\t\t}`,\n      depthTest: true,\n      depthWrite: false,\n      transparent: false,\n    })\n\n    const material1b = new RawShaderMaterial({\n      uniforms: {\n        map: { value: tempMap },\n        scale: { value: null },\n        screenPosition: { value: null },\n      },\n      vertexShader: /* glsl */ `\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tattribute vec3 position;\n\t\t\t\tattribute vec2 uv;\n\n\t\t\t\tvarying vec2 vUV;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUV = uv;\n\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\n\n\t\t\t\t}`,\n\n      fragmentShader: /* glsl */ `\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform sampler2D map;\n\n\t\t\t\tvarying vec2 vUV;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = texture2D( map, vUV );\n\n\t\t\t\t}`,\n      depthTest: false,\n      depthWrite: false,\n      transparent: false,\n    })\n\n    // the following object is used for occlusionMap generation\n\n    const mesh1 = new Mesh(geometry, material1a)\n\n    //\n\n    const elements = []\n\n    const shader = LensflareElement.Shader\n\n    const material2 = new RawShaderMaterial({\n      uniforms: {\n        map: { value: null },\n        occlusionMap: { value: occlusionMap },\n        color: { value: new Color(0xffffff) },\n        scale: { value: new Vector2() },\n        screenPosition: { value: new Vector3() },\n      },\n      vertexShader: shader.vertexShader,\n      fragmentShader: shader.fragmentShader,\n      blending: AdditiveBlending,\n      transparent: true,\n      depthWrite: false,\n    })\n\n    const mesh2 = new Mesh(geometry, material2)\n\n    this.addElement = function (element) {\n      elements.push(element)\n    }\n\n    //\n\n    const scale = new Vector2()\n    const screenPositionPixels = new Vector2()\n    const validArea = new Box2()\n    const viewport = new Vector4()\n\n    this.onBeforeRender = function (renderer, scene, camera) {\n      renderer.getCurrentViewport(viewport)\n\n      const invAspect = viewport.w / viewport.z\n      const halfViewportWidth = viewport.z / 2.0\n      const halfViewportHeight = viewport.w / 2.0\n\n      let size = 16 / viewport.w\n      scale.set(size * invAspect, size)\n\n      validArea.min.set(viewport.x, viewport.y)\n      validArea.max.set(viewport.x + (viewport.z - 16), viewport.y + (viewport.w - 16))\n\n      // calculate position in screen space\n\n      positionView.setFromMatrixPosition(this.matrixWorld)\n      positionView.applyMatrix4(camera.matrixWorldInverse)\n\n      if (positionView.z > 0) return // lensflare is behind the camera\n\n      positionScreen.copy(positionView).applyMatrix4(camera.projectionMatrix)\n\n      // horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n      screenPositionPixels.x = viewport.x + positionScreen.x * halfViewportWidth + halfViewportWidth - 8\n      screenPositionPixels.y = viewport.y + positionScreen.y * halfViewportHeight + halfViewportHeight - 8\n\n      // screen cull\n\n      if (validArea.containsPoint(screenPositionPixels)) {\n        // save current RGB to temp texture\n\n        renderer.copyFramebufferToTexture(screenPositionPixels, tempMap)\n\n        // render pink quad\n\n        let uniforms = material1a.uniforms\n        uniforms['scale'].value = scale\n        uniforms['screenPosition'].value = positionScreen\n\n        renderer.renderBufferDirect(camera, null, geometry, material1a, mesh1, null)\n\n        // copy result to occlusionMap\n\n        renderer.copyFramebufferToTexture(screenPositionPixels, occlusionMap)\n\n        // restore graphics\n\n        uniforms = material1b.uniforms\n        uniforms['scale'].value = scale\n        uniforms['screenPosition'].value = positionScreen\n\n        renderer.renderBufferDirect(camera, null, geometry, material1b, mesh1, null)\n\n        // render elements\n\n        const vecX = -positionScreen.x * 2\n        const vecY = -positionScreen.y * 2\n\n        for (let i = 0, l = elements.length; i < l; i++) {\n          const element = elements[i]\n\n          const uniforms = material2.uniforms\n\n          uniforms['color'].value.copy(element.color)\n          uniforms['map'].value = element.texture\n          uniforms['screenPosition'].value.x = positionScreen.x + vecX * element.distance\n          uniforms['screenPosition'].value.y = positionScreen.y + vecY * element.distance\n\n          size = element.size / viewport.w\n          const invAspect = viewport.w / viewport.z\n\n          uniforms['scale'].value.set(size * invAspect, size)\n\n          material2.uniformsNeedUpdate = true\n\n          renderer.renderBufferDirect(camera, null, geometry, material2, mesh2, null)\n        }\n      }\n    }\n\n    this.dispose = function () {\n      material1a.dispose()\n      material1b.dispose()\n      material2.dispose()\n\n      tempMap.dispose()\n      occlusionMap.dispose()\n\n      for (let i = 0, l = elements.length; i < l; i++) {\n        elements[i].texture.dispose()\n      }\n    }\n  }\n}\n\n//\n\nclass LensflareElement {\n  static Shader = {\n    uniforms: {\n      map: { value: null },\n      occlusionMap: { value: null },\n      color: { value: null },\n      scale: { value: null },\n      screenPosition: { value: null },\n    },\n\n    vertexShader: /* glsl */ `\n\n\t\tprecision highp float;\n\n\t\tuniform vec3 screenPosition;\n\t\tuniform vec2 scale;\n\n\t\tuniform sampler2D occlusionMap;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUV;\n\t\tvarying float vVisibility;\n\n\t\tvoid main() {\n\n\t\t\tvUV = uv;\n\n\t\t\tvec2 pos = position.xy;\n\n\t\t\tvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\n\n\t\t\tvVisibility =        visibility.r / 9.0;\n\t\t\tvVisibility *= 1.0 - visibility.g / 9.0;\n\t\t\tvVisibility *=       visibility.b / 9.0;\n\n\t\t\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n\n\t\t}`,\n\n    fragmentShader: /* glsl */ `\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D map;\n\t\tuniform vec3 color;\n\n\t\tvarying vec2 vUV;\n\t\tvarying float vVisibility;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texture = texture2D( map, vUV );\n\t\t\ttexture.a *= vVisibility;\n\t\t\tgl_FragColor = texture;\n\t\t\tgl_FragColor.rgb *= color;\n\n\t\t}`,\n  }\n\n  constructor(texture, size = 1, distance = 0, color = new Color(0xffffff)) {\n    this.texture = texture\n    this.size = size\n    this.distance = distance\n    this.color = color\n  }\n}\n\nexport { Lensflare, LensflareElement }\n"],"names":["BufferGeometry","InterleavedBuffer","InterleavedBufferAttribute","Mesh","MeshBasicMaterial","Vector3","DataTexture","RGBAFormat","NearestFilter","ClampToEdgeWrapping","geometry","RawShaderMaterial","Color","Vector2","AdditiveBlending","Box2","Vector4","uniforms","invAspect"],"mappings":"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"}