UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 6.14 kB
import{_ as e}from"../../../chunks/tslib.es6.js";import{makeHandle as t,handlesGroup as r,destroyHandle as i}from"../../../core/handleUtils.js";import{isNone as s,isSome as n}from"../../../core/maybe.js";import{debounce as a,isPromiseLike as o}from"../../../core/promiseUtils.js";import{on as d}from"../../../core/reactiveUtils.js";import{property as l}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/accessorSupport/ensureType.js";import"../../../core/arrayUtils.js";import{subclass as m}from"../../../core/accessorSupport/decorators/subclass.js";import{toExtent as p}from"../../../geometry/support/aaBoundingRect.js";import{MediaElementView as h}from"../../../layers/support/MediaElementView.js";import{DrapeSourceType as c}from"./interfaces.js";import{LayerView3D as u}from"./LayerView3D.js";import{DRAPED_Z as y}from"../terrain/OverlayRenderer.js";import{Attribute as _}from"../webgl-engine/lib/Attribute.js";import{PowerOfTwoResizeMode as g}from"../webgl-engine/lib/basicInterfaces.js";import{Geometry as f}from"../webgl-engine/lib/Geometry.js";import{DirtyOperation as E,DirtyState as w}from"../webgl-engine/lib/ModelDirtyTypes.js";import{RenderGeometry as D}from"../webgl-engine/lib/RenderGeometry.js";import{Texture as v}from"../webgl-engine/lib/Texture.js";import{UpdatePolicy as R}from"../webgl-engine/lib/UpdatePolicy.js";import{VertexAttribute as b}from"../webgl-engine/lib/VertexAttribute.js";import{ImageMaterial as T}from"../webgl-engine/materials/ImageMaterial.js";import j from"../../layers/LayerView.js";import{TextureWrapMode as x}from"../../webgl/enums.js";let M=class extends(u(j)){constructor(){super(...arguments),this.type="media-3d",this.drapeSourceType=c.RasterImage,this.updatePolicy=R.ASYNC,this._uidToElement=new Map,this._renderedElements=new Map,this._lastDrapingExtent=null,this._update=a((async(e,t,r)=>{const i=await this._collectMediaElements(e,t,r);this._synchronizeRenderElements(i)}),0)}initialize(){this._renderer=this.view.basemapTerrain.overlayManager.registerGeometryDrapeSource(this);const e=()=>this._updateWithLastDrapingExtent();this.handles.add([t((()=>this.view.basemapTerrain.overlayManager.unregisterDrapeSource(this))),d((()=>this.layer.effectiveSource),"change",e),d((()=>this.layer.effectiveSource),"refresh",e)]),this.updatingHandles.add((()=>this.suspended),e)}setDrapingExtent(e,t){this._lastDrapingExtent={overlays:e,spatialReference:t},this._updateWithLastDrapingExtent()}getHit(e){const t=this._uidToElement.get(e);return t?{type:"media",element:t,layer:this.layer}:null}_updateWithLastDrapingExtent(){if(s(this._lastDrapingExtent)||this.suspended)return void(this._renderer&&this._synchronizeRenderElements(new Set));const{overlays:e,spatialReference:t}=this._lastDrapingExtent;this.updatingHandles.addPromise(this._update(e,t).catch((()=>{})))}async _collectMediaElements(e,t,r){const i=this.layer.effectiveSource;return s(i)?new Set:new Set((await Promise.all(e.map((e=>i.queryElements(p(e.extent,t),{signal:r}))))).flat())}_synchronizeRenderElements(e){this._synchronizeRenderElementsRemove(e),this._synchronizeRenderElementsAdd(e)}_synchronizeRenderElementsRemove(e){const t=new Set,r=[];this._renderedElements.forEach(((i,s)=>{e.has(s)||(t.add(s),n(i.renderData)&&r.push(i.renderData.renderGeometry),this._removeElement(s,i))})),this._renderer.removeGeometries(r,E.REMOVE)}_synchronizeRenderElementsAdd(e){for(const t of e)this._renderedElements.has(t)||this._createRenderElement(t)}_removeElement(e,{renderData:t,handle:r}){this._destroyRenderData(t),this._renderedElements.delete(e),this._uidToElement.delete(e.uid),r.remove()}async _createRenderElement(e){const t=new h({spatialReference:this.view.spatialReference,element:e}),s={renderData:null,handle:r([this.updatingHandles.add((()=>e.opacity),(e=>{n(s.renderData)&&s.renderData.material.setParameters({opacity:e})})),this.updatingHandles.add((()=>t.coords),(e=>{n(s.renderData)?this._updateGeometry(s,s.renderData,e):this._initializeRenderData(t,s)})),this.updatingHandles.add((()=>e.content),(()=>this._initializeRenderData(t,s))),i(t)])};this._renderedElements.set(e,s),this._uidToElement.set(e.uid,e),this.updatingHandles.addPromise(e.load().catch((()=>{}))),this._initializeRenderData(t,s)}_initializeRenderData(e,t){const{coords:r,element:i}=e;if(s(r)||s(i.content))return void(t.renderData=this._destroyRenderData(t.renderData));if(n(t.renderData))return;const a=this._createTexture(i.content);this.view._stage.add(a);const d=this.view._stage.loadImmediate(a);o(d)&&this.updatingHandles.addPromise(d);const l=new T({initTextureTransparent:!0,textureId:a.id,opacity:i.opacity,transparent:!0}),m=this._positionVertexBufferFromCoordinates(r),p=[0,0,1,0,1,1,0,1],h=[0,1,2,0,2,3],c=new f(l,[[b.POSITION,new _(m,3,!0)],[b.UV0,new _(p,2,!0)]],[[b.POSITION,h],[b.UV0,h]]),u=new D(c,{layerUid:this.layer.uid,graphicUid:i.uid});this._renderer.addGeometries([u],E.ADD),t.renderData={renderGeometry:u,texture:a,material:l}}_updateGeometry(e,t,r){if(s(r))return void(e.renderData=this._destroyRenderData(e.renderData));const i=this._positionVertexBufferFromCoordinates(r);t.renderGeometry.vertexAttributes.get(b.POSITION).data=i,this._renderer.modifyGeometries([t.renderGeometry],w.GEOMETRY)}_positionVertexBufferFromCoordinates(e){const[t,r,i,s]=e.rings[0];return[t[0],t[1],y,s[0],s[1],y,i[0],i[1],y,r[0],r[1],y]}_destroyRenderData(e){return s(e)||(this.view._stage.remove(e.texture),this._renderer.removeGeometries([e.renderGeometry],E.REMOVE),e.material.dispose()),null}_createTexture(e){const t=e instanceof HTMLImageElement?e.naturalWidth:e.width,r=e instanceof HTMLImageElement?e.naturalHeight:e.height;return new v(e,{wrap:{s:x.CLAMP_TO_EDGE,t:x.CLAMP_TO_EDGE},preMultiplyAlpha:!0,width:t,height:r,mipmap:!0,powerOfTwoResizeMode:g.STRETCH,updateCallback:()=>this.view.basemapTerrain.overlayManager.setDrawTexturesDirty()})}get test(){const e=this;return{get numberOfElements(){return e._renderedElements.size}}}};e([l({readOnly:!0})],M.prototype,"type",void 0),e([l()],M.prototype,"layer",void 0),M=e([m("esri.views.3d.layers.MediaLayerView3D")],M);const S=M;export{S as default};