@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 2.85 kB
JavaScript
import e from"../../../core/Collection.js";import t from"../../../core/Logger.js";import{removeMaybe as r}from"../../../core/maybe.js";import{watch as n,initial as s}from"../../../core/reactiveUtils.js";import i from"./RenderContext.js";import{ShaderOutput as d}from"../webgl-engine/core/shaderLibrary/ShaderOutput.js";import{RenderSlot as a}from"../webgl-engine/lib/RenderSlot.js";class o{constructor(){this._renderers=new e}add(e,t){this._findOrCreateStageRenderer(e).add(t)}remove(e,t){const r=this._findStageRenderer(e);r&&(r.remove(t),0===r.renderers.length&&(r.destroy(),this._renderers.remove(r)))}_findStageRenderer(e){return this._renderers.find((t=>t.view===e))}_findOrCreateStageRenderer(e){let t=this._findStageRenderer(e);return t||(t=new h(e),this._renderers.add(t)),t}}class h{constructor(t){this.view=t,this.canRender=!0,this.renderers=new e,this.context=null,this._readyWatchHandle=n((()=>t.ready),(e=>{e?(this.context=new i(this.view),this.view._stage.addRenderPlugin([a.OPAQUE_MATERIAL,a.TRANSPARENT_MATERIAL],this)):(this.renderers.forEach((e=>c(e,"dispose",this.context))),this.context=null)}),s)}destroy(){this.renderers.drain((e=>{this.context&&c(e,"dispose",this.context)})),this.view._stage?.removeRenderPlugin(this),this._readyWatchHandle=r(this._readyWatchHandle),this.context=null}add(e){this.renderers.includes(e)?t.getLogger("esri.views.3d.externalRenderers.ExternalRendererStore").warn("add(): Cannot add external renderer: renderer has already been added"):(this.renderers.add(e),this.context&&(this._webglStateReset(),c(e,"setup",this.context),this.view._stage.renderView.requestRender()))}remove(e){const t=this.renderers.indexOf(e);-1!==t&&(this.renderers.removeAt(t),this.context&&(c(e,"dispose",this.context),this.view._stage.renderView.requestRender()))}initializeRenderContext(e){this.context.rctx=e.renderContext.rctx,this.renderers.length>0&&this._webglStateReset(),this.renderers.forEach((e=>c(e,"setup",this.context)))}uninitializeRenderContext(){}render(e){0===this.renderers.length||e.output!==d.Color||e.bindParameters.slot!==a.OPAQUE_MATERIAL&&e.bindParameters.slot!==a.TRANSPARENT_MATERIAL||(this._updateContext(e),this._webglStateReset(),this.renderers.forEach((t=>{switch(e.bindParameters.slot){case a.OPAQUE_MATERIAL:c(t,"render",this.context);break;case a.TRANSPARENT_MATERIAL:c(t,"renderTransparent",this.context)}})))}_updateContext(e){this.context.camera.copyFrom(e.bindParameters.camera),this.context.sunLight=e.bindParameters.lighting.legacy,this.context._renderTargetHelper=e.offscreenRenderingHelper}_webglStateReset(){this.context.rctx.resetState(),this.context._renderTargetHelper?.bindFramebuffer()}get needsTransparentPass(){return this.renderers.some((e=>"function"==typeof e.renderTransparent))}}function c(e,t,r){"function"==typeof e[t]&&null!=r&&e[t]?.(r)}export{o as default};