UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 4.91 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{disposeMaybe as t}from"../../../../../../core/maybe.js";import e from"../../VertexStream.js";import{BlendFactor as s,PixelFormat as i,TextureWrapMode as r}from"../../../../../webgl/enums.js";import{FramebufferObject as o}from"../../../../../webgl/FramebufferObject.js";import{TextureDescriptor as n}from"../../../../../webgl/TextureDescriptor.js";const a=5,u=[1,0],l=[0,1],m=[1,.8,.6,.4,.2],_=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];class h{constructor(){this._intensityFBO=null,this._compositeFBO=null,this._mipsFBOs=new Array(a),this._nMips=a,this._kernelSizeArray=[3,5,7,9,11],this._size=[0,0],this._programDesc={luminosityHighPass:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/luminosityHighPass",attributes:new Map([["a_position",0]])},gaussianBlur:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/gaussianBlur",attributes:new Map([["a_position",0]])},composite:{vsPath:"post-processing/pp",fsPath:"post-processing/bloom/composite",attributes:new Map([["a_position",0]])},blit:{vsPath:"post-processing/pp",fsPath:"post-processing/blit",attributes:new Map([["a_position",0]])}}}dispose(){if(this._quad=t(this._quad),this._intensityFBO=t(this._intensityFBO),this._compositeFBO=t(this._compositeFBO),this._mipsFBOs){for(let t=0;t<this._nMips;t++)this._mipsFBOs[t]&&(this._mipsFBOs[t].horizontal.dispose(),this._mipsFBOs[t].vertical.dispose());this._mipsFBOs=null}}draw(t,i,r){const{width:o,height:n}=i,{context:h,painter:p}=t,{materialManager:c}=p,d=h.gl,f=this._programDesc,{strength:b,radius:F,threshold:O}=r;this._quad||(this._quad=new e(h,[-1,-1,1,-1,-1,1,1,1])),this._createOrResizeResources(t,o,n),h.setStencilTestEnabled(!1),h.setBlendingEnabled(!0),h.setBlendFunction(s.ONE,s.ONE_MINUS_SRC_ALPHA),h.setStencilWriteMask(0);const B=this._quad;B.bind(),h.bindFramebuffer(this._intensityFBO);const g=c.getProgram(f.luminosityHighPass);h.useProgram(g),h.bindTexture(i.colorTexture,0),g.setUniform1i("u_texture",0),g.setUniform3fv("u_defaultColor",[0,0,0]),g.setUniform1f("u_defaultOpacity",0),g.setUniform1f("u_luminosityThreshold",O),g.setUniform1f("u_smoothWidth",.01);const T=[Math.round(o/2),Math.round(n/2)];h.setViewport(0,0,T[0],T[1]),h.setClearColor(0,0,0,0),h.clear(d.COLOR_BUFFER_BIT),B.draw(),h.setBlendingEnabled(!1);let x=this._intensityFBO.colorTexture;for(let e=0;e<this._nMips;e++){const t=c.getProgram(f.gaussianBlur,[{name:"radius",value:this._kernelSizeArray[e]}]);h.useProgram(t),h.bindTexture(x,e+1),t.setUniform1i("u_colorTexture",e+1),t.setUniform2fv("u_texSize",T),t.setUniform2fv("u_direction",u),h.setViewport(0,0,T[0],T[1]);const s=this._mipsFBOs[e];h.bindFramebuffer(s.horizontal),B.draw(),x=s.horizontal.colorTexture,h.bindFramebuffer(s.vertical),h.bindTexture(x,e+1),t.setUniform2fv("u_direction",l),B.draw(),x=s.vertical.colorTexture,T[0]=Math.round(T[0]/2),T[1]=Math.round(T[1]/2)}h.setViewport(0,0,o,n);const w=c.getProgram(f.composite,[{name:"nummips",value:a}]);h.bindFramebuffer(this._compositeFBO),h.useProgram(w),w.setUniform1f("u_bloomStrength",b),w.setUniform1f("u_bloomRadius",F),w.setUniform1fv("u_bloomFactors",m),w.setUniform3fv("u_bloomTintColors",_),h.bindTexture(this._mipsFBOs[0].vertical.colorTexture,1),w.setUniform1i("u_blurTexture1",1),h.bindTexture(this._mipsFBOs[1].vertical.colorTexture,2),w.setUniform1i("u_blurTexture2",2),h.bindTexture(this._mipsFBOs[2].vertical.colorTexture,3),w.setUniform1i("u_blurTexture3",3),h.bindTexture(this._mipsFBOs[3].vertical.colorTexture,4),w.setUniform1i("u_blurTexture4",4),h.bindTexture(this._mipsFBOs[4].vertical.colorTexture,5),w.setUniform1i("u_blurTexture5",5),B.draw(),h.bindFramebuffer(i),h.setBlendingEnabled(!0);const M=c.getProgram(f.blit);h.useProgram(M),h.bindTexture(this._compositeFBO.colorTexture,6),M.setUniform1i("u_texture",6),h.setBlendFunction(s.ONE,s.ONE),B.draw(),B.unbind(),h.setBlendFunction(s.ONE,s.ONE_MINUS_SRC_ALPHA),h.setStencilTestEnabled(!0)}_createOrResizeResources(t,e,s){const{context:a}=t;if(this._compositeFBO&&this._size[0]===e&&this._size[1]===s)return;this._size[0]=e,this._size[1]=s;const u=[Math.round(e/2),Math.round(s/2)];if(this._compositeFBO)this._compositeFBO.resize(e,s);else{const t=new n(e,s);t.internalFormat=i.RGBA,t.wrapMode=r.CLAMP_TO_EDGE,this._compositeFBO=new o(a,t)}if(this._intensityFBO)this._intensityFBO.resize(u[0],u[1]);else{const t=new n(u[0],u[1]);t.internalFormat=i.RGBA,t.wrapMode=r.CLAMP_TO_EDGE,this._intensityFBO=new o(a,t)}for(let l=0;l<this._nMips;l++){if(this._mipsFBOs[l])this._mipsFBOs[l].horizontal.resize(u[0],u[1]),this._mipsFBOs[l].vertical.resize(u[0],u[1]);else{const t=new n(u[0],u[1]);t.internalFormat=i.RGBA,t.wrapMode=r.CLAMP_TO_EDGE,this._mipsFBOs[l]={horizontal:new o(a,t),vertical:new o(a,t)}}u[0]=Math.round(u[0]/2),u[1]=Math.round(u[1]/2)}}}export{h as Bloom};