@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 13.8 kB
JavaScript
import{_ as e}from"../../../chunks/tslib.es6.js";import r from"../../../core/Accessor.js";import t from"../../../core/Evented.js";import s from"../../../core/Handles.js";import{someMap as i}from"../../../core/MapUtils.js";import{releaseMaybe as o,disposeMaybe as a,destroyMaybe as n,isSome as h,isNone as d,unwrapOr as l}from"../../../core/maybe.js";import c from"../../../core/PooledArray.js";import{watch as p,syncAndInitial as u,on as _}from"../../../core/reactiveUtils.js";import{someSet as m}from"../../../core/SetUtils.js";import{property as g}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/accessorSupport/ensureType.js";import"../../../core/arrayUtils.js";import{subclass as y}from"../../../core/accessorSupport/decorators/subclass.js";import{x as R,f as T}from"../../../chunks/mat4.js";import{s as f}from"../../../chunks/vec3.js";import{f as w}from"../../../chunks/vec3f64.js";import{ViewingMode as b}from"../../ViewingMode.js";import{DrapeTargetType as v,DrapeSourceType as x,DrapedRenderGroup as O}from"../layers/interfaces.js";import S from"../support/debugFlags.js";import{OverlayIndex as D,RenderTargetType as j}from"./interfaces.js";import{Overlay as P}from"./Overlay.js";import{OverlayFramebufferObject as E}from"./OverlayFramebufferObject.js";import{OverlayRenderTarget as A}from"./OverlayRenderTarget.js";import{ShaderOutput as C}from"../webgl-engine/core/shaderLibrary/ShaderOutput.js";import{T as F}from"../../../chunks/TextureOnly.glsl.js";import{ShaderTechniqueRepository as q}from"../webgl-engine/core/shaderTechnique/ShaderTechniqueRepository.js";import{Camera as M}from"../webgl-engine/lib/Camera.js";import{GLMaterialRepository as U}from"../webgl-engine/lib/GLMaterialRepository.js";import{createEmptyDepthTexture as V,createQuadVAO as W}from"../webgl-engine/lib/glUtil3D.js";import{GridLocalOriginFactory as L}from"../webgl-engine/lib/GridLocalOriginFactory.js";import{RenderOccludedFlag as B}from"../webgl-engine/lib/Material.js";import{OverlayRenderContext as H}from"../webgl-engine/lib/RenderContext.js";import{RenderSlot as I}from"../webgl-engine/lib/RenderSlot.js";import{ShadowMap as N}from"../webgl-engine/lib/ShadowMap.js";import{SortedRenderGeometryRenderer as G}from"../webgl-engine/lib/SortedRenderGeometryRenderer.js";import{SSAOHelper as k}from"../webgl-engine/lib/SSAOHelper.js";import{TextureTechnique as z}from"../webgl-engine/lib/TextureTechnique.js";import{TextureTechniqueConfiguration as Y}from"../webgl-engine/lib/TextureTechniqueConfiguration.js";import{TransparencyPassType as X}from"../webgl-engine/lib/TransparencyPassType.js";import{UpdatePolicy as J}from"../webgl-engine/lib/UpdatePolicy.js";import{AmbientLight as K}from"../webgl-engine/lighting/Lightsources.js";import{StippleTextureRepository as Q}from"../webgl-engine/materials/StippleTextureRepository.js";import{TaskPriority as Z,noBudget as $}from"../../support/Scheduler.js";import{ClearBufferBit as ee,PrimitiveType as re,TextureType as te,PixelFormat as se,PixelType as ie,TextureSamplingMode as oe}from"../../webgl/enums.js";import{Texture as ae}from"../../webgl/Texture.js";import{vertexCount as ne}from"../../webgl/Util.js";let he=class extends r{get _bindParameters(){return this._renderContext.bindParameters}get rctx(){return this._rctx}get materialRepository(){return this._materialRepository}get screenToWorldRatio(){return this._screenToWorldRatio}get localOriginFactory(){return this._localOriginFactory}constructor(e){super(e),this._overlays=null,this._overlayRenderTarget=null,this._hasHighlights=!1,this._rendersOccluded=!1,this._hasWater=!1,this._handles=new s,this._renderers=new Map,this._sortedDrapeSourceRenderersDirty=!1,this._sortedRenderers=new c,this._passParameters=new F,this._rctx=null,this._materialRepository=null,this._screenToWorldRatio=1,this._localOriginFactory=null,this._camera=new M,this.worldToPCSRatio=1,this.events=new t,this.longitudeCyclical=null}initialize(){const e=this.view._stage.renderView;this._rctx=e.renderingContext;const r=e.waterTextureRepository;this._stippleTextureRepository=new Q(e.renderingContext),this._shaderTechniqueRepository=new q({rctx:this._rctx,viewingMode:b.Local,stippleTextureRepository:this._stippleTextureRepository,waterTextureRepository:r}),this._renderContext=new H(this._rctx,new N(this._rctx,this.view.state.viewingMode),new k(this.view,this._shaderTechniqueRepository,this._rctx,(()=>{}))),this._handles.add([p((()=>r.updating),(()=>this.events.emit("content-changed")),u),p((()=>this.spatialReference),(e=>this._localOriginFactory=new L(e)),u),_((()=>this.view.allLayerViews),"after-changes",(()=>this._sortedDrapeSourceRenderersDirty=!0))]),this._materialRepository=new U(e.textureRepository,this._shaderTechniqueRepository,(e=>{(e.renderOccluded&pe)>0!==this._rendersOccluded&&this._updateRendersOccluded(),this.events.emit("content-changed"),this.notifyChange("updating"),this.notifyChange("isEmpty")}),(()=>this.events.emit("content-changed"))),this._bindParameters.slot=I.DRAPED_MATERIAL,this._bindParameters.highlightDepthTexture=V(this._rctx),this._camera.near=1,this._camera.far=1e4,this._camera.relativeElevation=null,this._bindParameters.camera=this._camera,this._bindParameters.transparencyPassType=X.NONE,this._bindParameters.newLighting.noonFactor=0,this._bindParameters.newLighting.globalFactor=0,this._bindParameters.newLighting.set([new K(w(1,1,1))]),this._handles.add(this.view.resourceController.scheduler.registerTask(Z.STAGE,this))}destroy(){this._handles.destroy(),this._renderers.forEach((e=>e.destroy())),this._renderers.clear(),this._debugTextureTechnique=o(this._debugTextureTechnique),this._passParameters.texture=a(this._passParameters.texture),this._bindParameters.highlightDepthTexture=a(this._bindParameters.highlightDepthTexture),this._shaderTechniqueRepository=n(this._shaderTechniqueRepository),this._temporaryFBO=a(this._temporaryFBO),this._quadVAO=a(this._quadVAO),this.disposeOverlays()}get updating(){return this._sortedDrapeSourceRenderersDirty||i(this._renderers,(e=>e.updating))}get hasOverlays(){return h(this._overlays)&&h(this._overlayRenderTarget)}get gpuMemoryUsage(){return h(this._overlayRenderTarget)?this._overlayRenderTarget.gpuMemoryUsage:0}createGeometryDrapeSourceRenderer(e){return this.createDrapeSourceRenderer(e,G)}createDrapeSourceRenderer(e,r,t){const s=this._renderers.get(e);h(s)&&s.destroy();const i=new r({...t,rendererContext:this,drapeSource:e});return this._renderers.set(e,i),this._sortedDrapeSourceRenderersDirty=!0,"fullOpacity"in e&&this._handles.add(p((()=>e.fullOpacity),(()=>this.events.emit("content-changed"))),e),i}removeDrapeSourceRenderer(e){if(d(e))return;const r=this._renderers.get(e);d(r)||(this._sortedDrapeSourceRenderersDirty=!0,this._renderers.delete(e),this._handles.remove(e),r.destroy())}collectUnusedRenderTargetMemory(e){let r=!1;if(h(this._overlayRenderTarget))for(const t of this._overlayRenderTarget.renderTargets){const[s,i]=this.overlays,o=s.validTargets[t.type]||!i.validTargets[t.type];r=this._overlayRenderTarget.validateUsageForTarget(o,t,e)||r}return r}get overlays(){return l(this._overlays,[])}ensureDrapeTargets(e){h(this._overlays)&&this._overlays.forEach((r=>r.hasTargetWithoutRasterImage=m(e,(e=>e.drapeTargetType===v.WithoutRasterImage))))}ensureDrapeSources(e){h(this._overlays)&&this._overlays.forEach((r=>{r.hasDrapedFeatureSource=m(e,(e=>e.drapeSourceType===x.Features)),r.hasDrapedRasterSource=m(e,(e=>e.drapeSourceType===x.RasterImage))}))}ensureOverlays(e,r){d(this._overlays)&&(this._overlayRenderTarget=new A(this._rctx),this._overlays=[new P(D.INNER,this._overlayRenderTarget),new P(D.OUTER,this._overlayRenderTarget)]),this.ensureDrapeTargets(e),this.ensureDrapeSources(r)}disposeOverlays(){this._overlays=null,this._overlayRenderTarget=a(this._overlayRenderTarget),this.events.emit("textures-disposed")}get running(){return this.updating}runTask(e){this._processDrapeSources(e,(()=>!0))}_processDrapeSources(e,r){let t=!1;for(const[s,i]of this._renderers){if(e.done)break;(s.destroyed||r(s))&&(i.commitChanges()&&(t=!0,e.madeProgress()))}this._sortedDrapeSourceRenderersDirty&&(this._sortedDrapeSourceRenderersDirty=!1,t=!0,this._updateSortedDrapeSourceRenderers()),t&&(h(this._overlays)&&0===this._renderers.size&&this.disposeOverlays(),this.notifyChange("updating"),this.notifyChange("isEmpty"),this.events.emit("content-changed"),this._updateHasHighlights(),this._updateRendersOccluded(),this._updateHasWater())}processSyncDrapeSources(){this._processDrapeSources($,(e=>e.updatePolicy===J.SYNC))}get isEmpty(){return!S.OVERLAY_DRAW_DEBUG_TEXTURE&&!i(this._renderers,(e=>!e.isEmpty))}get hasHighlights(){return this._hasHighlights}get hasWater(){return this._hasWater}get rendersOccluded(){return this._rendersOccluded}updateAnimation(e){let r=!1;return this._renderers.forEach((t=>r=t.updateAnimation(e)||r)),r}updateDrapeSourceOrder(){this._sortedDrapeSourceRenderersDirty=!0}drawTarget(e,r,t){const s=e.canvasGeometries;if(0===s.numViews)return!1;this._screenToWorldRatio=t*e.mapUnitsPerPixel;const i=r.output;if(this.isEmpty||i===C.Highlight&&!this.hasHighlights||i===C.Normal&&!this.hasWater||!e.hasSomeSizedView())return!1;const o=r.fbo;if(!o.isValid())return!1;const a=2*e.resolution,n=e.resolution;o.resize(a,n);const d=this._rctx;if(this._camera.pixelRatio=e.pixelRatio*t,this._renderContext.output=i,this._bindParameters.screenToWorldRatio=this._screenToWorldRatio,this._bindParameters.screenToPCSRatio=this._screenToWorldRatio*this.worldToPCSRatio,this._bindParameters.slot=i===C.Normal?I.DRAPED_WATER:I.DRAPED_MATERIAL,e.applyViewport(this._rctx),o.bind(d),e.index===D.INNER&&(d.setClearColor(0,0,0,0),d.clearSafe(ee.COLOR_BUFFER_BIT)),r.type===j.Occluded&&(this._renderContext.renderOccludedMask=pe),S.OVERLAY_DRAW_DEBUG_TEXTURE&&r.type!==j.Occluded)for(let h=0;h<s.numViews;h++)this._setViewParameters(s.extents[h],e),this._drawDebugTexture(e.resolution,le[e.index]);return this._renderers.size>0&&this._sortedRenderers.forAll((({drapeSource:t,renderer:l})=>{if(r.type===j.ColorNoRasterImage&&t.drapeSourceType===x.RasterImage)return;const{fullOpacity:c}=t,p=h(c)&&c<1&&i===C.Color;p&&(this.bindTemporaryFramebuffer(this._rctx,a,n),d.clearSafe(ee.COLOR_BUFFER_BIT));for(let r=0;r<s.numViews;r++)this._setViewParameters(s.extents[r],e),l.render(this._renderContext);p&&h(this._temporaryFBO)&&(o.bind(d),this.view._stage.renderView.compositingHelper.compositeOverlay(this._renderContext.bindParameters,this._temporaryFBO.getTexture(),c,e.index))})),d.bindFramebuffer(null),o.generateMipMap(),this._renderContext.resetRenderOccludedMask(),!0}bindTemporaryFramebuffer(e,r,t){d(this._temporaryFBO)&&(this._temporaryFBO=new E(e,!1)),this._temporaryFBO.resize(r,t),this._temporaryFBO.bind(e)}async reloadShaders(){await this._shaderTechniqueRepository.reloadAll()}notifyContentChanged(){this.events.emit("content-changed")}intersect(e,r,t,s){let i=0;for(const o of this._renderers.values())i=o.intersect?.(e,r,t,s,i)??i}_updateSortedDrapeSourceRenderers(){if(this._sortedRenderers.clear(),0===this._renderers.size)return;const e=this.view.map.allLayers;this._renderers.forEach(((r,t)=>{const s=e.indexOf(t.layer),i=s>=0,o=this._renderers.size*(t.renderGroup??(i?O.MapLayer:O.ViewLayer))+(i?s:0);this._sortedRenderers.push(new de(t,r,o))})),this._sortedRenderers.sort(((e,r)=>e.index-r.index))}_setViewParameters(e,r){const t=this._camera;t.viewport=[0,0,r.resolution,r.resolution],R(t.projectionMatrix,0,e[2]-e[0],0,e[3]-e[1],t.near,t.far),T(t.viewMatrix,[-e[0],-e[1],0])}_updateHasWater(){const e=i(this._renderers,(e=>e.hasWater));e!==this._hasWater&&(this._hasWater=e,this.events.emit("has-water",e))}_updateHasHighlights(){const e=i(this._renderers,(e=>e.hasHighlights));e!==this._hasHighlights&&(this._hasHighlights=e,this.events.emit("has-highlights",e))}_updateRendersOccluded(){const e=i(this._renderers,(e=>e.rendersOccluded));e!==this._rendersOccluded&&(this._rendersOccluded=e,this.events.emit("renders-occluded",e))}_drawDebugTexture(e,r){this._ensureDebugPatternResources(e,e,r);const t=this._rctx;t.bindTechnique(this._debugTextureTechnique,this._passParameters,null),t.bindVAO(this._quadVAO),t.drawArrays(re.TRIANGLE_STRIP,0,ne(this._quadVAO,"geometry"))}_ensureDebugPatternResources(e,r,t){if(f(this._passParameters.color,t[0],t[1],t[2]),this._passParameters.texture)return;const s=new Uint8Array(e*r*4);let i=0;for(let a=0;a<r;a++)for(let t=0;t<e;t++){const o=Math.floor(t/10),n=Math.floor(a/10);o<2||n<2||10*o>e-20||10*n>r-20?(s[i++]=255,s[i++]=255,s[i++]=255,s[i++]=255):(s[i++]=255,s[i++]=255,s[i++]=255,s[i++]=1&o&&1&n?1&t^1&a?0:255:1&o^1&n?0:128)}this._passParameters.texture=new ae(this._rctx,{target:te.TEXTURE_2D,pixelFormat:se.RGBA,dataType:ie.UNSIGNED_BYTE,samplingMode:oe.NEAREST,width:e,height:r},s);const o=new Y;o.hasAlpha=!0,this._debugTextureTechnique=this._shaderTechniqueRepository.acquire(z,o),this._quadVAO=W(this._rctx)}get test(){return{drapedRenderers:Array.from(this._renderers.values()),getDrapeSourceRenderer:e=>this._renderers.get(e)}}};e([g()],he.prototype,"_sortedDrapeSourceRenderersDirty",void 0),e([g({autoDestroy:!0})],he.prototype,"_shaderTechniqueRepository",void 0),e([g({autoDestroy:!0})],he.prototype,"_stippleTextureRepository",void 0),e([g({constructOnly:!0})],he.prototype,"view",void 0),e([g()],he.prototype,"worldToPCSRatio",void 0),e([g()],he.prototype,"spatialReference",void 0),e([g({type:Boolean,readOnly:!0})],he.prototype,"updating",null),e([g()],he.prototype,"isEmpty",null),he=e([y("esri.views.3d.terrain.OverlayRenderer")],he);class de{constructor(e,r,t){this.drapeSource=e,this.renderer=r,this.index=t}}const le=[[1,.5,.5],[.5,.5,1]],ce=-2,pe=B.OccludeAndTransparent;export{ce as DRAPED_Z,he as OverlayRenderer,pe as overlayRenderOccludedFlag};