UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.81 kB
import{disposeMaybe as e}from"../../../../../../core/maybe.js";import{pt2px as t}from"../../../../../../core/screenUtils.js";import r from"../../VertexStream.js";import{BlendFactor as i,TargetType as s,DepthStencilTargetType as o,TextureType as a,PixelFormat as l,PixelType as n,TextureWrapMode as u,TextureSamplingMode as h}from"../../../../../webgl/enums.js";import{FramebufferObject as p}from"../../../../../webgl/FramebufferObject.js";import{Texture as _}from"../../../../../webgl/Texture.js";const d=[1,0],c=[0,1];class m{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,s,o){const{context:a,state:l,painter:n}=e,{materialManager:u}=n,h=this._programDesc,p=s.width,_=s.height,m=[Math.round(p),Math.round(_)],{blurRadius:B,offsetX:T,offsetY:f,color:g}=o,E=[t(T),t(f)];this._createOrResizeResources(e,p,_,m);const b=this._horizontalBlurFBO,F=this._verticalBlurFBO;a.setStencilWriteMask(0),a.setStencilTestEnabled(!1),a.setDepthWriteEnabled(!1),a.setDepthTestEnabled(!1);const O=this._layerFBOTexture;s.copyToTexture(0,0,p,_,0,0,O),this._quad||(this._quad=new r(a,[-1,-1,1,-1,-1,1,1,1])),a.setViewport(0,0,m[0],m[1]);const x=this._quad;x.bind(),a.setBlendingEnabled(!1);const w=u.getProgram(h.blur,[{name:"radius",value:Math.ceil(B)}]);a.useProgram(w),a.bindFramebuffer(b),a.bindTexture(s.colorTexture,4),w.setUniform1i("u_colorTexture",4),w.setUniform2fv("u_texSize",m),w.setUniform2fv("u_direction",d),w.setUniform1f("u_sigma",B),x.draw(),a.bindFramebuffer(F),a.bindTexture(b?.colorTexture,5),w.setUniform1i("u_colorTexture",5),w.setUniform2fv("u_direction",c),x.draw(),a.bindFramebuffer(s),a.setViewport(0,0,p,_);const M=u.getProgram(h.composite);a.useProgram(M),a.bindTexture(F?.colorTexture,2),M.setUniform1i("u_blurTexture",2),a.bindTexture(O,3),M.setUniform1i("u_layerFBOTexture",3),M.setUniform4fv("u_shadowColor",[g[3]*(g[0]/255),g[3]*(g[1]/255),g[3]*(g[2]/255),g[3]]),M.setUniformMatrix3fv("u_displayViewMat3",l.displayMat3),M.setUniform2fv("u_shadowOffset",E),x.draw(),a.setBlendingEnabled(!0),a.setStencilTestEnabled(!0),a.setBlendFunction(i.ONE,i.ONE_MINUS_SRC_ALPHA),x.unbind()}_createOrResizeResources(e,t,r,i){const{context:d}=e;this._horizontalBlurFBO&&this._size[0]===t&&this._size[1]===r||(this._size[0]=t,this._size[1]=r,this._horizontalBlurFBO?this._horizontalBlurFBO.resize(i[0],i[1]):this._horizontalBlurFBO=new p(d,{colorTarget:s.TEXTURE,depthStencilTarget:o.NONE,width:i[0],height:i[1]},{target:a.TEXTURE_2D,pixelFormat:l.RGBA,internalFormat:l.RGBA,dataType:n.UNSIGNED_BYTE,wrapMode:u.CLAMP_TO_EDGE,samplingMode:h.LINEAR,flipped:!1,width:i[0],height:i[1]}),this._verticalBlurFBO?this._verticalBlurFBO.resize(i[0],i[1]):this._verticalBlurFBO=new p(d,{colorTarget:s.TEXTURE,depthStencilTarget:o.NONE,width:i[0],height:i[1]},{target:a.TEXTURE_2D,pixelFormat:l.RGBA,internalFormat:l.RGBA,dataType:n.UNSIGNED_BYTE,wrapMode:u.CLAMP_TO_EDGE,samplingMode:h.LINEAR,flipped:!1,width:i[0],height:i[1]}),this._layerFBOTexture?this._layerFBOTexture.resize(t,r):this._layerFBOTexture=new _(d,{target:a.TEXTURE_2D,pixelFormat:l.RGBA,internalFormat:l.RGBA,dataType:n.UNSIGNED_BYTE,wrapMode:u.CLAMP_TO_EDGE,samplingMode:h.LINEAR,flipped:!1,width:t,height:r}))}}export{m as DropShadow};