UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 14.8 kB
{"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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"}