@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 7.11 kB
JavaScript
import e from"../../../core/Logger.js";import{disposeMaybe as t,releaseMaybe as r,isNone as i,isSome as s}from"../../../core/maybe.js";import{Z as o}from"../../../chunks/vec2f64.js";import{RasterColorizerStretchType as n}from"../../2d/engine/imagery/enums.js";import{VectorTileRendererHelper3D as a}from"../../2d/engine/vectorTiles/VectorTileRendererHelper3D.js";import{BlendLayersTechniqueConfiguration as h,BlendLayersTechnique as l}from"./BlendLayersTechnique.js";import{LayerClass as u}from"./LayerClass.js";import{RasterColorizerTechniqueConfiguration as c,RasterColorizerTechnique as d}from"./RasterColorizerTechnique.js";import{MultiSizeFramebuffer as _}from"./support/MultiSizeFramebuffer.js";import{LayerBlendMode as f}from"../webgl-engine/core/shaderLibrary/output/BlendOptions.js";import{PremultipliedAlphaSource as p,BlendLayersOutput as b,BaseOpacityMode as g}from"../webgl-engine/core/shaderLibrary/terrain/TileBackground.glsl.js";import{a as T}from"../../../chunks/BlendLayers.glsl.js";import{BindParameters as m}from"../webgl-engine/lib/BindParameters.js";import{Pos2Tex as y}from"../webgl-engine/lib/DefaultVertexBufferLayouts.js";import{createQuadVAO as x}from"../webgl-engine/lib/glUtil3D.js";import{PrimitiveType as C,ClearBufferBit as B,TextureType as q}from"../../webgl/enums.js";import{Texture as O}from"../../webgl/Texture.js";import{vertexCount as I}from"../../webgl/Util.js";const L=e.getLogger("esri.views.3d.terrain");class w{constructor(e,t){this._rctx=e,this._techniqueRepository=t,this._fbos=[],this._vectorTileHelper=new a,this._bindParameters=new m(null,null,null),this._blendLayersTechniqueConfig=new h,this._current=0,this._lastUsedIds=new Array,this._lastCreatedBufferId=0,this._onHoldIds=new Array,this._vaoQuad=x(this._rctx,y)}dispose(){this._fbos.forEach(t),this._fbos=null,this._vtFBO=t(this._vtFBO),this._vaoQuad=t(this._vaoQuad),this._vectorTileHelper=t(this._vectorTileHelper),this._backgroundTechnique=r(this._backgroundTechnique),this._applyOpacityTechnique=r(this._applyOpacityTechnique),this._blendLayersTechnique=r(this._blendLayersTechnique)}_getBlendLayersTechnique(e,t,r,i=p.Off,s=T.BelowLayer){return this._blendLayersTechniqueConfig.output=t,this._blendLayersTechniqueConfig.blendMode=e,this._blendLayersTechniqueConfig.baseOpacityMode=r,this._blendLayersTechniqueConfig.premultipliedSource=i,this._blendLayersTechniqueConfig.background=s,this._blendLayersTechnique=this._techniqueRepository.releaseAndAcquire(l,this._blendLayersTechniqueConfig,this._blendLayersTechnique),this._blendLayersTechnique}drawBackground(e,t){const r=this._getBlendLayersTechnique(f.Normal,t?b.ColorComposite:b.GridComposite,g.NotRequired,p.Off,T.Only),i=this._rctx.bindTechnique(r,e,this._bindParameters);this._render(i)}_render(e){this._rctx.bindVAO(this._vaoQuad),e.assertCompatibleVertexAttributeLocations(this._vaoQuad),this._rctx.drawArrays(C.TRIANGLE_STRIP,0,I(this._vaoQuad,"geometry"))}drawGroup(e,t,r,i,s,o=p.On){t===b.Composite&&(e.fboTexture=this._fbos[this.getLastOnHoldId()].get(r).colorTexture),e.texture=this.currentFBO(r).colorTexture,this.closeGroup(r);const n=this._getBlendLayersTechnique(i,t,s,o),a=this._rctx.bindTechnique(n,e,this._bindParameters);this._render(a)}drawRasterData(e,t,r,s,o,n=p.Off){if(i(e.texture))return;e.fboTexture=t===b.GroupBackgroundComposite||s===f.Normal&&o===g.NotRequired&&n===p.Off?null:this.switch(r).colorTexture;const a=this._getBlendLayersTechnique(s,t,o,n),h=this._rctx.bindTechnique(a,e,this._bindParameters);this._render(h)}drawImageryTileData(e,t,r,i,s,o){const n=o.sourceLayerInfo.data;if(!n.source)return;if(o.tile.surface.layerViewByIndex(o.layerIndex,u.MAP).ensureSymbolizerParameters(n),!n.bind(this._rctx))return;e.fboTexture=i===f.Normal&&s===g.NotRequired?null:this.switch(r).colorTexture;const a=this._getRasterColorizerTechnique(n,t,i,s);n.opacity=e.opacity;const h=n.getUniforms();h.scale=o.scale,h.offset=o.offset,h.backgroundColor=e.backgroundColor,h.fboTexture=e.fboTexture,h.baseOpacity=e.baseOpacity;const l=this._rctx.bindTechnique(a,h,null);this._render(l)}_getRasterColorizerTechnique(e,t,r,s){const o=e.symbolizerParameters,a=["stretch","lut","hillshade"].indexOf(o.type);return i(this._rasterColorizerConfig)&&(this._rasterColorizerConfig=new c,this._rctx.gl.getExtension("WEBGL_color_buffer_float"),this._rctx.gl.getExtension("OES_texture_float")),this._rasterColorizerConfig.output=t,this._rasterColorizerConfig.blendMode=r,this._rasterColorizerConfig.baseOpacityMode=s,this._rasterColorizerConfig.colorizerType=a,this._rasterColorizerConfig.applyColormap=!!o.colormap,this._rasterColorizerConfig.stretchType=e.hasStretchTypeNone()?n.Noop:n.PerBand,this._rasterColorizerTechnique=this._techniqueRepository.releaseAndAcquire(d,this._rasterColorizerConfig,this._rasterColorizerTechnique),this._rasterColorizerTechnique}drawVectorData(e,t,r,n,a,h,l,c,d){const T=this._rctx,m=h.sourceLayerInfo.data,y=h.tile.surface.layerViewByIndex(h.layerIndex,u.MAP),x=a===g.Required||e.opacity<1||n!==f.Normal||t!==b.Composite,C=x?p.On:p.Off;this._getBlendLayersTechnique(n,t,a,C).bindPipelineState(T);let q=null,O=null;x?(O=this.currentFBO(r),i(this._vtFBO)&&(this._vtFBO=new _(this._rctx)),q=this._vtFBO.get(r),T.bindFramebuffer(q),this._clearCurrentFBO()):d&&T.clearSafe(B.DEPTH_BUFFER_BIT);try{this._vectorTileHelper.render(T,h.sourceLod,m,y.painter,y.layer.styleRepository,y.schemaHelper,Math.round(1/h.scale),h.offset,c,l)}catch(I){L.warnOnce("A render call containing vector tiles did not resolve correctly.",I)}return!s(q)||(T.bindFramebuffer(O),e.texture=q.colorTexture,e.offset=o,e.scale=1,this.drawRasterData(e,t,r,n,a,C),d)}copyFBOToTexture(e){const t=this._rctx,r=t.bindTexture(e.texture,O.TEXTURE_UNIT_FOR_UPDATES),i=e.descriptor;t.gl.copyTexImage2D(q.TEXTURE_2D,0,i.pixelFormat,0,0,i.width,i.height,0),e.generateMipmap(),t.bindTexture(r,O.TEXTURE_UNIT_FOR_UPDATES)}_clearCurrentFBO(){this._rctx.setClearColor(0,0,0,0),this._rctx.setClearDepth(1),this._rctx.clearSafe(B.COLOR_BUFFER_BIT|B.DEPTH_BUFFER_BIT)}_initFBO(e,t,r){this._rctx.bindFramebuffer(e),r&&(this._rctx.setViewport(0,0,t,t),this._clearCurrentFBO())}ensureBuffer(e){this._lastUsedIds.length=0,this._lastUsedIds.push(1),this._lastCreatedBufferId=1,this._onHoldIds.length=0,this.bind(e)}bind(e,t=0,r=!0){if(this._current=t,t>=this._fbos.length)for(let i=this._fbos.length;i<=t;i++)this._fbos.push(new _(this._rctx));this._initFBO(this._fbos[t].get(e),e,r)}_bindNextFreeBuffer(e){this._lastUsedIds.length>0?this.bind(e,this._lastUsedIds.pop()):(this._lastCreatedBufferId++,this.bind(e,this._lastCreatedBufferId))}openGroup(e){this._onHoldIds.push(this._current),this._bindNextFreeBuffer(e)}switch(e){const t=this.currentFBO(e),r=this._current;return this._bindNextFreeBuffer(e),this._lastUsedIds.push(r),t}getLastOnHoldId(){return this._onHoldIds[this._onHoldIds.length-1]}closeGroup(e){const t=this._current;this._bindNextFreeBuffer(e),this._lastUsedIds.push(t),this._lastUsedIds.push(this._onHoldIds.pop())}unbind(){this._rctx.bindFramebuffer(null)}currentFBO(e){return this._fbos[this._current].get(e)}}export{w as TileCompositor};