@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 2.88 kB
JavaScript
import e from"../../../../../core/Error.js";import r from"../../../../../core/Logger.js";import{disposeMaybe as t,isSome as s}from"../../../../../core/maybe.js";import{WGLDrawPhase as i}from"../enums.js";import a from"../VertexStream.js";import{createProgramTemplate as n}from"../shaders/BlendPrograms.js";import{BlendFactor as o,TextureType as d,PixelFormat as u,PixelType as f,TextureWrapMode as c,TextureSamplingMode as m}from"../../../../webgl/enums.js";import{Texture as h}from"../../../../webgl/Texture.js";const l=r.getLogger("esri.views.2d.engine.webgl.effects.blendEffects.BlendEffect");class _{constructor(){this._size=[0,0]}dispose(e){this._backBufferTexture=t(this._backBufferTexture),this._quad=t(this._quad)}draw(r,t,s,a,d){const{context:u,drawPhase:f}=r;if(this._setupShader(u),a&&"normal"!==a&&f!==i.LABEL)return void this._drawBlended(r,t,s,a,d);const c=n("normal"),m=u.programCache.acquire(c.shaders.vertexShader,c.shaders.fragmentShader,c.attributes);if(!m)return void l.error(new e("mapview-BlendEffect",'Error creating shader program for blend mode "normal"'));u.useProgram(m),t.setSamplingMode(s),u.bindTexture(t,0),m.setUniform1i("u_layerTexture",0),m.setUniform1f("u_opacity",d),u.setBlendingEnabled(!0),u.setBlendFunction(o.ONE,o.ONE_MINUS_SRC_ALPHA);const h=this._quad;h.draw(),h.unbind(),m.dispose()}_drawBlended(r,t,i,a,d){const{context:u,state:f,pixelRatio:c,inFadeTransition:m}=r,{size:h}=f,_=u.getBoundFramebufferObject();let p,b;if(s(_)){const e=_.descriptor;p=e.width,b=e.height}else p=Math.round(c*h[0]),b=Math.round(c*h[1]);this._createOrResizeTexture(r,p,b);const g=this._backBufferTexture;_.copyToTexture(0,0,p,b,0,0,g),u.setStencilTestEnabled(!1),u.setStencilWriteMask(0),u.setBlendingEnabled(!0),u.setDepthTestEnabled(!1),u.setDepthWriteEnabled(!1);const x=n(a),T=u.programCache.acquire(x.shaders.vertexShader,x.shaders.fragmentShader,x.attributes);if(!T)return void l.error(new e("mapview-BlendEffect",`Error creating shader program for blend mode ${a}`));u.useProgram(T),g.setSamplingMode(i),u.bindTexture(g,0),T.setUniform1i("u_backbufferTexture",0),t.setSamplingMode(i),u.bindTexture(t,1),T.setUniform1i("u_layerTexture",1),T.setUniform1f("u_opacity",d),T.setUniform1f("u_inFadeOpacity",m?1:0),u.setBlendFunction(o.ONE,o.ZERO);const E=this._quad;E.draw(),E.unbind(),T.dispose(),u.setBlendFunction(o.ONE,o.ONE_MINUS_SRC_ALPHA)}_setupShader(e){this._quad||(this._quad=new a(e,[-1,-1,1,-1,-1,1,1,1]))}_createOrResizeTexture(e,r,t){const{context:s}=e;null!==this._backBufferTexture&&r===this._size[0]&&t===this._size[1]||(this._backBufferTexture?this._backBufferTexture.resize(r,t):this._backBufferTexture=new h(s,{target:d.TEXTURE_2D,pixelFormat:u.RGBA,internalFormat:u.RGBA,dataType:f.UNSIGNED_BYTE,wrapMode:c.CLAMP_TO_EDGE,samplingMode:m.LINEAR,flipped:!1,width:r,height:t}),this._size[0]=r,this._size[1]=t)}}export{_ as BlendEffect};