UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) 3.02 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import e from"../../VertexStream.js";import{BlendFactor as t,PixelFormat as s,TextureWrapMode as r}from"../../../../../webgl/enums.js";import{FramebufferObject as i}from"../../../../../webgl/FramebufferObject.js";import{TextureDescriptor as a}from"../../../../../webgl/TextureDescriptor.js";const n=[1,0],o=[0,1];class u{constructor(){this._blurFBO=null,this._size=[0,0],this._programDesc={gaussianBlur:{vsPath:"post-processing/pp",fsPath:"post-processing/blur/gaussianBlur",attributes:new Map([["a_position",0]])},radialBlur:{vsPath:"post-processing/pp",fsPath:"post-processing/blur/radial-blur",attributes:new Map([["a_position",0]])},blit:{vsPath:"post-processing/pp",fsPath:"post-processing/blit",attributes:new Map([["a_position",0]])}}}dispose(){this._blurFBO&&(this._blurFBO.dispose(),this._blurFBO=null)}draw(t,s,r){const{context:i}=t,{type:a,radius:n}=r;if(0===n)return;this._createOrResizeResources(t),this._quad||(this._quad=new e(i,[-1,-1,1,-1,-1,1,1,1]));const o=this._quad;o.bind(),"blur"===a?this._gaussianBlur(t,s,n):this._radialBlur(t,s),o.unbind()}_gaussianBlur(e,s,r){const{context:i,state:a,painter:u,pixelRatio:l}=e,{size:d}=a,{materialManager:b}=u,c=this._programDesc,_=this._quad,p=[Math.round(l*d[0]),Math.round(l*d[1])],h=this._blurFBO,m=b.getProgram(c.gaussianBlur,[{name:"radius",value:Math.ceil(r)}]);i.useProgram(m),i.setBlendingEnabled(!1),i.bindFramebuffer(h),i.bindTexture(s.colorTexture,4),m.setUniform1i("u_colorTexture",4),m.setUniform2fv("u_texSize",p),m.setUniform2fv("u_direction",n),m.setUniform1f("u_sigma",r),_.draw(),i.bindFramebuffer(s),i.setStencilWriteMask(0),i.setStencilTestEnabled(!1),i.setDepthWriteEnabled(!1),i.setDepthTestEnabled(!1),i.bindTexture(h?.colorTexture,5),m.setUniform1i("u_colorTexture",5),m.setUniform2fv("u_direction",o),_.draw(),i.setBlendingEnabled(!0),i.setBlendFunction(t.ONE,t.ONE_MINUS_SRC_ALPHA),i.setStencilTestEnabled(!0)}_radialBlur(e,s){const{context:r,painter:i}=e,{materialManager:a}=i,n=this._programDesc,o=this._quad,u=this._blurFBO;r.bindFramebuffer(u);const l=a.getProgram(n.radialBlur);r.useProgram(l),r.setBlendingEnabled(!1),r.bindTexture(s.colorTexture,4),l.setUniform1i("u_colorTexture",4),o.draw(),r.bindFramebuffer(s),r.setStencilWriteMask(0),r.setStencilTestEnabled(!1),r.setDepthWriteEnabled(!1),r.setDepthTestEnabled(!1),r.setBlendingEnabled(!0);const d=a.getProgram(n.blit);r.useProgram(d),r.bindTexture(u?.colorTexture,5),d.setUniform1i("u_texture",5),r.setBlendFunction(t.ONE,t.ONE_MINUS_SRC_ALPHA),o.draw()}_createOrResizeResources(e){const{context:t,state:n,pixelRatio:o}=e,{size:u}=n,l=Math.round(o*u[0]),d=Math.round(o*u[1]);if(!this._blurFBO||this._size[0]!==l||this._size[1]!==d)if(this._size[0]=l,this._size[1]=d,this._blurFBO)this._blurFBO.resize(l,d);else{const e=new a(l,d);e.internalFormat=s.RGBA,e.wrapMode=r.CLAMP_TO_EDGE,this._blurFBO=new i(t,e)}}}export{u as Blur};