@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 2.41 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{simplePipelineState as e}from"../../utils.js";import{Technique as t}from"../Technique.js";import{TechniqueType as r}from"../TechniqueType.js";import{BlendShader as s}from"../shaders/BlendShader.js";import{OpacityShader as i}from"../shaders/OpacityShader.js";import{BlendFactor as u,PixelFormat as o,TextureWrapMode as n}from"../../../../../../webgl/enums.js";import{Texture as a}from"../../../../../../webgl/Texture.js";import{TextureDescriptor as c}from"../../../../../../webgl/TextureDescriptor.js";class f extends t{constructor(){super(...arguments),this.type=r.Blend,this._backBufferTexture=null,this.shaders={blend:new s,opacity:new i}}shutdown(){super.shutdown(),null!==this._backBufferTexture&&(this._backBufferTexture.dispose(),this._backBufferTexture=null)}render(t,r){const{context:s,state:i,pixelRatio:o,inFadeTransition:n,painter:a}=t,{size:c}=i,f=s.getBoundFramebufferObject();let h,l;null!=f?(h=f.width,l=f.height):(h=Math.round(o*c[0]),l=Math.round(o*c[1]));const{blendMode:d}=r;if("normal"===d){const t={shader:this.shaders.opacity,uniforms:{config:{layerTexture:{texture:r.colorTexture,unit:0},opacity:r.config.opacity}},defines:null,optionalAttributes:null,useComputeBuffer:!1};return a.setPipelineState(e),void a.submitDrawMesh(s,t,a.quadMesh)}const p=this._createOrResizeTexture(t,h,l);f.copyToTexture(0,0,h,l,0,0,p);const x={color:{write:[!0,!0,!0,!0],blendMode:"custom",blendParameters:{srcRGB:u.ONE,dstRGB:u.ZERO,srcAlpha:u.ONE,dstAlpha:u.ZERO}},depth:!1,stencil:!1};a.setPipelineState(x);const b={backbufferTexture:{texture:p,unit:0},layerTexture:{texture:r.colorTexture,unit:1},inFadeOpacity:n?1:0,...r.config},T={shader:this.shaders.blend,uniforms:{config:b},defines:{blendMode:d},optionalAttributes:null,useComputeBuffer:!1};a.submitDrawMesh(s,T,a.quadMesh)}_createOrResizeTexture(e,t,r){const{context:s}=e;if(null!==this._backBufferTexture&&this._backBufferTexture.descriptor?.width===t&&this._backBufferTexture.descriptor?.height===r)return this._backBufferTexture;if(null===this._backBufferTexture){const e=new c;e.internalFormat=o.RGBA,e.wrapMode=n.CLAMP_TO_EDGE,e.width=t,e.height=r,this._backBufferTexture=new a(s,e)}else this._backBufferTexture.resize(t,r);return this._backBufferTexture}}export{f as BlendTechnique};