@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 8.68 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import t from"../../../core/Error.js";import{makeHandle as i,handlesGroup as r,destroyHandle as n}from"../../../core/handleUtils.js";import"../../../core/has.js";import{isIterable as s}from"../../../core/iteratorUtils.js";import{getProjectiveTransform as a}from"../../../core/perspectiveUtils.js";import{debounce as o,isPromiseLike as d}from"../../../core/promiseUtils.js";import{watch as l,syncAndInitial as h,on as m}from"../../../core/reactiveUtils.js";import{property as c,subclass as p}from"../../../core/accessorSupport/decorators.js";import{create as g}from"../../../core/libs/gl-matrix-2/factories/mat3f64.js";import{toExtent as u}from"../../../geometry/support/aaBoundingRect.js";import{MediaElementView as y}from"../../../layers/support/MediaElementView.js";import{LayerView3D as _}from"./LayerView3D.js";import{MediaLayerInteraction as f}from"./support/MediaLayerInteraction.js";import{drapedZ as v}from"../terrain/OverlayRenderer.js";import{Attribute as w}from"../webgl-engine/lib/Attribute.js";import{Geometry as E}from"../webgl-engine/lib/Geometry.js";import{ManagedTexture as D}from"../webgl-engine/lib/ManagedTexture.js";import{Object3DHighlightStateID as R}from"../webgl-engine/lib/Object3DStateID.js";import{RenderGeometry as b}from"../webgl-engine/lib/RenderGeometry.js";import{ImageMaterial as j}from"../webgl-engine/materials/ImageMaterial.js";import x from"../../layers/MediaLayerView.js";import{getHighlightName as A}from"../../support/highlightOptionsUtils.js";import{isInEffectiveScaleRange as H}from"../../support/layerViewUtils.js";let M=class extends(_(x)){get interactive(){return this._interaction.enabled}set interactive(e){this._interaction&&(this._interaction.enabled=e)}get selectedElement(){return this._interaction.selectedElement}set selectedElement(e){this._interaction&&(this._interaction.selectedElement=e)}get visibleAtCurrentScale(){return H(this.layer.effectiveScaleRange,this.view.scale)}get usedMemory(){return Array.from(this._renderElements.values()).reduce((e,t)=>e+(t.getRenderData()?.texture.usedMemory??0),0)}constructor(e){super(e),this.type="media-3d",this.drapeSourceType=1,this.updatePolicy=1,this.ignoresMemoryFactor=!0,this.unloadedMemory=0,this._uidToElement=new Map,this._highlightedElements=new Map,this._elementsInHighlightedId=new Map,this._renderElements=new Map,this._lastDrapingExtent=null,this._update=o(async(e,t,i)=>{const r=await this._collectMediaElements(e,t,i);this._synchronizeRenderElements(r)},0);const{view:t,layer:i}=e;this._interaction=new f({view:t,layer:i}),this.addHandles(l(()=>this.interactionOptions,e=>this._interaction.options=e,h))}initialize(){const{view:e,layer:t}=this;this._renderer=e.overlayManager.registerGeometryDrapeSource(this);const r=()=>this._updateWithLastDrapingExtent();this.addHandles([i(()=>e.overlayManager.unregisterDrapeSource(this)),m(()=>t.effectiveSource,"change",r),m(()=>t.effectiveSource,"refresh",r)]),this._updatingHandles.add(()=>this.suspended,r)}destroy(){this._synchronizeRenderElements(new Set)}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}highlight(e,t){const r=A(t),n=new R(r),a=s(e)?Array.from(e):[e];this._elementsInHighlightedId.set(n,a);for(const i of a){const e=this._highlightedElements.get(i);e?e.add(n):this._highlightedElements.set(i,new Set([n]));const t=this._renderElements.get(i)?.getRenderData();t&&(t.renderGeometry.geometry.addHighlight(n),this._renderer.modifyGeometries([t.renderGeometry],8))}return i(()=>{const e=this._elementsInHighlightedId.get(n);if(e){for(const t of e){const e=this._highlightedElements.get(t);if(!e)continue;e.delete(n);const i=this._renderElements.get(t)?.getRenderData();i&&(i.renderGeometry.geometry.removeHighlight(n),this._renderer.modifyGeometries([i.renderGeometry],8)),0===e.size&&this._highlightedElements.delete(t)}this._elementsInHighlightedId.delete(n)}})}isUpdating(){return super.isUpdating()||this._interaction.updating}_updateWithLastDrapingExtent(){if(null==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,i){const r=this.layer.effectiveSource;return null==r?new Set:new Set((await Promise.all(e.map(e=>r.queryElements(u(e.extent,t),{signal:i})))).flat())}_synchronizeRenderElements(e){this._synchronizeRenderElementsRemove(e),this._synchronizeRenderElementsAdd(e)}_synchronizeRenderElementsRemove(e){this._renderElements.forEach((t,i)=>{e.has(i)||(this._removeElement(i,t),this.emit("element-render-changed",{element:i}))})}_synchronizeRenderElementsAdd(e){for(const t of e)this._renderElements.has(t)||this._createRenderElement(t)}_removeElement(e,t){this._destroyRenderData(e,t),this._renderElements.delete(e),this._uidToElement.delete(e.uid),t.handle.remove()}_createRenderElement(e){const t=new y({spatialReference:this.view.spatialReference,element:e}),i=new S(r([this._updatingHandles.add(()=>e.opacity,e=>i.getRenderData()?.material.setParameters({opacity:e})),this._updatingHandles.add(()=>t.coords,()=>{i.data?this._updateGeometry(t,i):this._initializeRenderData(t,i)}),this._updatingHandles.add(()=>e.content,()=>this._initializeRenderData(t,i)),n(t)]));this._renderElements.set(e,i),this._uidToElement.set(e.uid,e),this._updatingHandles.addPromise(e.load().catch(()=>{})),this._initializeRenderData(t,i)}_initializeRenderData(e,t){const{coords:i,element:r}=e,{contentWidth:n,contentHeight:s}=r;if(null==i||null==r.content)return void this._destroyRenderData(r,t);if(t.data)return;const a=this._createTexture(r.content),o=a.load(this.view.stage.renderView.renderingContext),l=()=>{if(!a.loaded)return;this.view.stage.addTexture(a);const e=new j({draped:!0,managedTexture:a,opacity:r.opacity,perspectiveInterpolation:!0}),o=this._getPositionAttributeArray(i),d=[0,0,1,0,1,1,0,1],l=this._getPerspectiveDivideAttributeArray(o,n,s),h=[0,1,2,0,2,3],m=new E(e,[["position",new w(o,h,3,!0)],["uv0",new w(d,h,2,!0)],["perspectiveDivide",new w(l,h,1,!0)]]),c=new b(m,{layerViewUid:this.uid,graphicUid:r.uid}),p=this._highlightedElements.get(r);p?.forEach(e=>c.geometry.addHighlight(e)),this._renderer.addGeometries([c],0),t.data=new I(c,a,e),this.emit("element-render-changed",{element:r})};d(o)?(t.data=a,this._updatingHandles.addPromise(o),o.then(l).catch(()=>a.dispose())):l()}_updateGeometry(e,t){const{coords:i,element:r}=e;if(null==i||null==r.content)return void this._destroyRenderData(r,t);const n=t.getRenderData();if(!n)return;const s=this._getPositionAttributeArray(i);n.renderGeometry.geometry.setAttributeData("position",s);const a=this._getPerspectiveDivideAttributeArray(s,r.contentWidth,r.contentHeight);n.renderGeometry.geometry.setAttributeData("perspectiveDivide",a),n.renderGeometry.geometry.invalidateBoundingInfo(),this._renderer.modifyGeometries([n.renderGeometry],2),this.emit("element-render-changed",{element:r})}_getPositionAttributeArray(e){const[t,i,r,n]=e.rings[0];return[t[0],t[1],v,n[0],n[1],v,r[0],r[1],v,i[0],i[1],v]}_getPerspectiveDivideAttributeArray(e,t,i){a(G,[0,0,t,0,t,i,0,i],[e[0],e[1],e[3],e[4],e[6],e[7],e[9],e[10]]);const r=G[6]/G[8]*t,n=G[7]/G[8]*i;return[1,1+r,1+r+n,1+n]}_destroyRenderData(e,t){const i=t.data;if(null==i)return;if(t.data=null,"dispose"in i)return void i.dispose();const r=i.texture;r.unload(),this.view.stage.removeTexture(r),this._renderer.removeGeometries([i.renderGeometry],2),this.emit("element-render-changed",{element:e})}_createTexture(e){const i=e instanceof HTMLImageElement?e.naturalWidth:e.width,r=e instanceof HTMLImageElement?e.naturalHeight:e.height;if("getFrame"in e)throw new t("media-layer-view-3d","animation is not supported");return new D(e,{wrap:{s:33071,t:33071},preMultiplyAlpha:!0,width:i,height:r,mipmap:!0,updateCallback:()=>this.view.overlayManager.requestRender()})}get test(){}};e([c({readOnly:!0})],M.prototype,"type",void 0),e([c()],M.prototype,"interactive",null),e([c()],M.prototype,"selectedElement",null),e([c({readOnly:!0})],M.prototype,"visibleAtCurrentScale",null),M=e([p("esri.views.3d.layers.MediaLayerView3D")],M);const G=g();class S{constructor(e){this.handle=e}getRenderData(){return this.data&&"type"in this.data&&"RenderData"===this.data.type?this.data:null}}class I{constructor(e,t,i){this.renderGeometry=e,this.texture=t,this.material=i,this.type="RenderData"}}const z=M;export{z as default};