UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.05 kB
import e from"../../VertexStream.js";import{BlendFactor as t,TargetType as r,DepthStencilTargetType as s,TextureType as i,PixelFormat as a,PixelType as n,TextureWrapMode as o,TextureSamplingMode as u}from"../../../../../webgl/enums.js";import{FramebufferObject as l}from"../../../../../webgl/FramebufferObject.js";const d=[1,0],_=[0,1];class b{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,r,s){const{context:i}=t,{type:a,radius:n}=s;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,r,n):this._radialBlur(t,r),o.unbind()}_gaussianBlur(e,r,s){const{context:i,state:a,painter:n,pixelRatio:o}=e,{size:u}=a,{materialManager:l}=n,b=this._programDesc,p=this._quad,c=[Math.round(o*u[0]),Math.round(o*u[1])],h=this._blurFBO,g=l.getProgram(b.gaussianBlur,[{name:"radius",value:Math.ceil(s)}]);i.useProgram(g),i.setBlendingEnabled(!1),i.bindFramebuffer(h),i.bindTexture(r.colorTexture,4),g.setUniform1i("u_colorTexture",4),g.setUniform2fv("u_texSize",c),g.setUniform2fv("u_direction",d),g.setUniform1f("u_sigma",s),p.draw(),i.bindFramebuffer(r),i.setStencilWriteMask(0),i.setStencilTestEnabled(!1),i.setDepthWriteEnabled(!1),i.setDepthTestEnabled(!1),i.bindTexture(h?.colorTexture,5),g.setUniform1i("u_colorTexture",5),g.setUniform2fv("u_direction",_),p.draw(),i.setBlendingEnabled(!0),i.setBlendFunction(t.ONE,t.ONE_MINUS_SRC_ALPHA),i.setStencilTestEnabled(!0)}_radialBlur(e,r){const{context:s,painter:i}=e,{materialManager:a}=i,n=this._programDesc,o=this._quad,u=this._blurFBO;s.bindFramebuffer(u);const l=a.getProgram(n.radialBlur);s.useProgram(l),s.setBlendingEnabled(!1),s.bindTexture(r.colorTexture,4),l.setUniform1i("u_colorTexture",4),o.draw(),s.bindFramebuffer(r),s.setStencilWriteMask(0),s.setStencilTestEnabled(!1),s.setDepthWriteEnabled(!1),s.setDepthTestEnabled(!1),s.setBlendingEnabled(!0);const d=a.getProgram(n.blit);s.useProgram(d),s.bindTexture(u?.colorTexture,5),d.setUniform1i("u_texture",5),s.setBlendFunction(t.ONE,t.ONE_MINUS_SRC_ALPHA),o.draw()}_createOrResizeResources(e){const{context:t,state:d,pixelRatio:_}=e,{size:b}=d,p=Math.round(_*b[0]),c=Math.round(_*b[1]);this._blurFBO&&this._size[0]===p&&this._size[1]===c||(this._size[0]=p,this._size[1]=c,this._blurFBO?this._blurFBO.resize(p,c):this._blurFBO=new l(t,{colorTarget:r.TEXTURE,depthStencilTarget:s.NONE,width:p,height:c},{target:i.TEXTURE_2D,pixelFormat:a.RGBA,internalFormat:a.RGBA,dataType:n.UNSIGNED_BYTE,wrapMode:o.CLAMP_TO_EDGE,samplingMode:u.LINEAR,flipped:!1,width:p,height:c}))}}export{b as Blur};