UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 7.69 kB
import{isSome as e,isNone as t,disposeMaybe as s}from"../../../../core/maybe.js";import{brushes as r}from"../brushes.js";import i from"../vectorTiles/shaders/VTLMaterialManager.js";import{BitBlitRenderer as n}from"./BitBlitRenderer.js";import{WGLDrawPhase as o,WGLGeometryType as a,WGLSymbologyType as l}from"./enums.js";import h from"./MaterialManager.js";import f from"./TextureManager.js";import{TextureUploadManager as c}from"./TextureUploadManager.js";import{WorldExtentClipRenderer as _}from"./WorldExtentClipRenderer.js";import{AnimationEffect as d}from"./effects/AnimationEffect.js";import{BlendEffect as u}from"./effects/BlendEffect.js";import{FeatureEffect as E}from"./effects/FeatureEffect.js";import p from"./effects/HighlightEffect.js";import{HittestEffect as b}from"./effects/HittestEffect.js";import{HittestEffectVTL as g}from"./effects/HittestEffectVTL.js";import{EffectManager as T}from"./effects/post-processing/EffectManager.js";import m from"./painter/RenderPass.js";import{ContextType as C}from"../../../webgl/context-util.js";import{TextureType as M,PixelFormat as F,PixelType as R,TextureSamplingMode as w,TextureWrapMode as B,TargetType as S,DepthStencilTargetType as O,RenderbufferFormat as x,BlendFactor as P,CompareFunction as L}from"../../../webgl/enums.js";import{FramebufferObject as N}from"../../../webgl/FramebufferObject.js";import{Renderbuffer as D}from"../../../webgl/Renderbuffer.js";function I(e,t){switch(e){case a.LINE:return r.line;case a.TEXT:return r.text;case a.LABEL:return r.label;case a.FILL:return t===l.DOT_DENSITY?r.dotDensity:r.fill;case a.MARKER:switch(t){case l.HEATMAP:return r.heatmap;case l.PIE_CHART:return r.pieChart;default:return r.marker}}}class j{constructor(e,t,s){this.context=e,this._blitRenderer=new n,this._worldExtentClipRenderer=new _,this._isClippedToWorldExtent=!1,this._brushCache=new Map,this._lastWidth=null,this._lastHeight=null,this._prevFBO=null,this._vtlMaterialManager=new i,this._blendEffect=new u,this._stencilBuf=null,this._fbos=null,this._fboPool=[],this._renderTarget=null,this.effects={highlight:new p,hittest:new b,hittestVTL:new g,integrate:new d,insideEffect:new E("inside"),outsideEffect:new E("outside")},this.materialManager=new h(e),this.textureManager=new f(t,s,e.type===C.WEBGL2),this.textureUploadManager=new c(e,t),this._effectsManager=new T}get vectorTilesMaterialManager(){return this._vtlMaterialManager}getRenderTarget(){return this._renderTarget}setRenderTarget(e){this._renderTarget=e}getFbos(e,t){if(e!==this._lastWidth||t!==this._lastHeight){if(this._lastWidth=e,this._lastHeight=t,this._fbos){for(const s in this._fbos)this._fbos[s].resize(e,t);return this._fbos}const s={target:M.TEXTURE_2D,pixelFormat:F.RGBA,dataType:R.UNSIGNED_BYTE,samplingMode:w.NEAREST,wrapMode:B.CLAMP_TO_EDGE,width:e,height:t},r={colorTarget:S.TEXTURE,depthStencilTarget:O.DEPTH_STENCIL_RENDER_BUFFER},i=new D(this.context,{width:e,height:t,internalFormat:x.DEPTH_STENCIL});this._stencilBuf=i,this._fbos={output:new N(this.context,r,s,i),blend:new N(this.context,r,s,i),effect0:new N(this.context,r,s,i)}}return this._fbos}acquireFbo(e,t){let s;s=this._fboPool.length>0?this._fboPool.pop():new N(this.context,{colorTarget:S.TEXTURE,depthStencilTarget:O.DEPTH_STENCIL_RENDER_BUFFER},{target:M.TEXTURE_2D,pixelFormat:F.RGBA,dataType:R.UNSIGNED_BYTE,samplingMode:w.NEAREST,wrapMode:B.CLAMP_TO_EDGE,width:e,height:t},this._stencilBuf);const r=s.descriptor;return r.width===e&&r.height===t||s.resize(e,t),s}releaseFbo(e){this._fboPool.push(e)}getSharedStencilBuffer(){return this._stencilBuf}beforeRenderLayers(t,s=null){const{width:r,height:i}=t.getViewport();this._prevFBO=t.getBoundFramebufferObject();const n=this.getFbos(r,i);if(t.bindFramebuffer(n?.output),t.setColorMask(!0,!0,!0,!0),e(s)){const{r:e,g:r,b:i,a:n}=s.color;t.setClearColor(n*e/255,n*r/255,n*i/255,n)}else t.setClearColor(0,0,0,0);t.setDepthWriteEnabled(!0),t.setClearDepth(1),t.clear(t.gl.COLOR_BUFFER_BIT|t.gl.DEPTH_BUFFER_BIT),t.setDepthWriteEnabled(!1)}beforeRenderLayer(e,t,s){const{context:r,blendMode:i,effects:n,requireFBO:o,drawPhase:a}=e;if(o||A(a,i,n,s))r.bindFramebuffer(this._fbos?.blend),r.setColorMask(!0,!0,!0,!0),r.setClearColor(0,0,0,0),r.setDepthWriteEnabled(!0),r.setClearDepth(1),r.clear(r.gl.COLOR_BUFFER_BIT|r.gl.DEPTH_BUFFER_BIT),r.setDepthWriteEnabled(!1);else{const e=this._getOutputFBO();r.bindFramebuffer(e)}r.setDepthWriteEnabled(!1),r.setDepthTestEnabled(!1),r.setStencilTestEnabled(!0),r.setClearStencil(t),r.setStencilWriteMask(255),r.clear(r.gl.STENCIL_BUFFER_BIT)}compositeLayer(s,r){const{context:i,blendMode:n,effects:a,requireFBO:l,drawPhase:h}=s;if(l||A(h,n,a,r)){e(a)&&a.length>0&&h===o.MAP&&this._applyEffects(s,a);const l=this._getOutputFBO();i.bindFramebuffer(l),i.setStencilTestEnabled(!1),i.setStencilWriteMask(0),i.setBlendingEnabled(!0),i.setBlendFunctionSeparate(P.ONE,P.ONE_MINUS_SRC_ALPHA,P.ONE,P.ONE_MINUS_SRC_ALPHA),i.setColorMask(!0,!0,!0,!0);const f=t(n)||h===o.HIGHLIGHT?"normal":n,c=this._fbos;c?.blend.colorTexture&&this._blendEffect.draw(s,c.blend.colorTexture,w.NEAREST,f,r)}}renderLayers(e){e.bindFramebuffer(this._prevFBO);const t=this._getOutputFBO();t&&(e.setDepthTestEnabled(!1),e.setStencilWriteMask(0),this._isClippedToWorldExtent?(e.setStencilTestEnabled(!0),e.setStencilFunction(L.EQUAL,1,255)):e.setStencilTestEnabled(!1),this.blitTexture(e,t.colorTexture,w.NEAREST))}prepareDisplay(t,s,r){const{context:i}=t;if(i.bindFramebuffer(this._prevFBO),i.setColorMask(!0,!0,!0,!0),e(s)){const{r:e,g:t,b:r,a:n}=s.color;i.setClearColor(n*e/255,n*t/255,n*r/255,n)}else i.setClearColor(0,0,0,0);i.setStencilWriteMask(255),i.setClearStencil(0),i.clear(i.gl.COLOR_BUFFER_BIT|i.gl.STENCIL_BUFFER_BIT),this._isClippedToWorldExtent=this._worldExtentClipRenderer.render(t,r)}dispose(){if(this.materialManager.dispose(),this.textureManager.dispose(),this.textureUploadManager.destroy(),this._blitRenderer=s(this._blitRenderer),this._worldExtentClipRenderer=s(this._worldExtentClipRenderer),this._brushCache&&(this._brushCache.forEach((e=>e.dispose())),this._brushCache.clear(),this._brushCache=null),this._fbos)for(const e in this._fbos)this._fbos[e]&&this._fbos[e].dispose();for(const e of this._fboPool)e.dispose();if(this._fboPool.length=0,this.effects)for(const e in this.effects)this.effects[e]&&this.effects[e].dispose();this._effectsManager.dispose(),this._vtlMaterialManager=s(this._vtlMaterialManager),this._prevFBO=null}getBrush(e,t){const s=I(e,t);let r=this._brushCache.get(s);return void 0===r&&(r=new s,this._brushCache.set(s,r)),r}renderObject(e,t,s,i){const n=r[s];if(!n)return;let o=this._brushCache.get(n);void 0===o&&(o=new n,this._brushCache.set(n,o)),o.prepareState(e,i),o.draw(e,t,i)}renderObjects(e,t,s,i){const n=r[s];if(!n)return;let o=this._brushCache.get(n);void 0===o&&(o=new n,this._brushCache.set(n,o)),o.drawMany(e,t,i)}registerRenderPass(e){const t=e.brushes.map((e=>(this._brushCache.has(e)||this._brushCache.set(e,new e),this._brushCache.get(e))));return new m(t,e)}blitTexture(e,t,s,r=1){e.setBlendingEnabled(!0),e.setBlendFunctionSeparate(P.ONE,P.ONE_MINUS_SRC_ALPHA,P.ONE,P.ONE_MINUS_SRC_ALPHA),e.setColorMask(!0,!0,!0,!0),this._blitRenderer.render(e,t,s,r)}getPostProcessingEffects(e){return this._effectsManager.getPostProcessingEffects(e)}_getOutputFBO(){return null!=this._renderTarget?this._renderTarget:this._fbos?.output??null}_applyEffects(e,t){const s=this._fbos?.blend;if(!s)return;const{context:r}=e,i=this._effectsManager.getPostProcessingEffects(t);for(const{postProcessingEffect:n,effect:o}of i)r.bindFramebuffer(s),n.draw(e,s,o)}}function A(t,s,r,i){return t!==o.HIGHLIGHT&&(1!==i||e(s)&&"normal"!==s||e(r)&&r.length>0)}export{j as default};