@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.56 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{disposeMaybe as e}from"../../../../../../core/maybe.js";import{pt2px as t}from"../../../../../../core/screenUtils.js";import r from"../../VertexStream.js";import{BlendFactor as s,PixelFormat as i,TextureWrapMode as o}from"../../../../../webgl/enums.js";import{FramebufferObject as a}from"../../../../../webgl/FramebufferObject.js";import{Texture as n}from"../../../../../webgl/Texture.js";import{TextureDescriptor as l}from"../../../../../webgl/TextureDescriptor.js";const u=[1,0],h=[0,1];class _{constructor(){this._layerFBOTexture=null,this._horizontalBlurFBO=null,this._verticalBlurFBO=null,this._size=[0,0],this._quad=null,this._programDesc={blur:{vsPath:"post-processing/pp",fsPath:"post-processing/blur/gaussianBlur",attributes:new Map([["a_position",0]])},composite:{vsPath:"post-processing/pp",fsPath:"post-processing/drop-shadow/composite",attributes:new Map([["a_position",0]])},blit:{vsPath:"post-processing/pp",fsPath:"post-processing/blit",attributes:new Map([["a_position",0]])}}}dispose(){this._layerFBOTexture=e(this._layerFBOTexture),this._horizontalBlurFBO=e(this._horizontalBlurFBO),this._verticalBlurFBO=e(this._verticalBlurFBO)}draw(e,i,o){const{context:a,state:n,painter:l}=e,{materialManager:_}=l,c=this._programDesc,p=i.width,m=i.height,f=[Math.round(p),Math.round(m)],{blurRadius:B,offsetX:d,offsetY:b,color:O}=o,F=[t(d),t(b)];this._createOrResizeResources(e,p,m,f);const w=this._horizontalBlurFBO,T=this._verticalBlurFBO;a.setStencilWriteMask(0),a.setStencilTestEnabled(!1),a.setDepthWriteEnabled(!1),a.setDepthTestEnabled(!1);const x=this._layerFBOTexture;i.copyToTexture(0,0,p,m,0,0,x),this._quad||(this._quad=new r(a,[-1,-1,1,-1,-1,1,1,1])),a.setViewport(0,0,f[0],f[1]);const g=this._quad;g.bind(),a.setBlendingEnabled(!1);const z=_.getProgram(c.blur,[{name:"radius",value:Math.ceil(B)}]);a.useProgram(z),a.bindFramebuffer(w),a.bindTexture(i.colorTexture,4),z.setUniform1i("u_colorTexture",4),z.setUniform2fv("u_texSize",f),z.setUniform2fv("u_direction",u),z.setUniform1f("u_sigma",B),g.draw(),a.bindFramebuffer(T),a.bindTexture(w?.colorTexture,5),z.setUniform1i("u_colorTexture",5),z.setUniform2fv("u_direction",h),g.draw(),a.bindFramebuffer(i),a.setViewport(0,0,p,m);const M=_.getProgram(c.composite);a.useProgram(M),a.bindTexture(T?.colorTexture,2),M.setUniform1i("u_blurTexture",2),a.bindTexture(x,3),M.setUniform1i("u_layerFBOTexture",3),M.setUniform4fv("u_shadowColor",[O[3]*(O[0]/255),O[3]*(O[1]/255),O[3]*(O[2]/255),O[3]]),M.setUniformMatrix3fv("u_displayViewMat3",n.displayMat3),M.setUniform2fv("u_shadowOffset",F),g.draw(),a.setBlendingEnabled(!0),a.setStencilTestEnabled(!0),a.setBlendFunction(s.ONE,s.ONE_MINUS_SRC_ALPHA),g.unbind()}_createOrResizeResources(e,t,r,s){const{context:u}=e;if(!this._horizontalBlurFBO||this._size[0]!==t||this._size[1]!==r){if(this._size[0]=t,this._size[1]=r,this._horizontalBlurFBO)this._horizontalBlurFBO.resize(s[0],s[1]);else{const e=new l(s[0],s[1]);e.internalFormat=i.RGBA,e.wrapMode=o.CLAMP_TO_EDGE,this._horizontalBlurFBO=new a(u,e)}if(this._verticalBlurFBO)this._verticalBlurFBO.resize(s[0],s[1]);else{const e=new l(s[0],s[1]);e.internalFormat=i.RGBA,e.wrapMode=o.CLAMP_TO_EDGE,this._verticalBlurFBO=new a(u,e)}if(this._layerFBOTexture)this._layerFBOTexture.resize(t,r);else{const e=new l;e.internalFormat=i.RGBA,e.wrapMode=o.CLAMP_TO_EDGE,e.width=t,e.height=r,this._layerFBOTexture=new n(u,e)}}}}export{_ as DropShadow};