@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.33 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{_ as e}from"../../chunks/tslib.es6.js";import o from"../../core/Accessor.js";import{equals as r}from"../../core/arrayUtils.js";import t from"../../core/Collection.js";import s from"../../core/Error.js";import i from"../../core/Logger.js";import{mapCollection as n}from"../../core/mapCollectionUtils.js";import{destroyMaybe as a}from"../../core/maybe.js";import{watch as m,syncAndInitial as c}from"../../core/reactiveUtils.js";import{convertToSpatialReferenceUnit as p,convertFromSpatialReferenceUnit as l}from"../../core/unitUtils.js";import{property as u}from"../../core/accessorSupport/decorators/property.js";import"../../core/has.js";import{subclass as f}from"../../core/accessorSupport/decorators/subclass.js";import{e as h}from"../../chunks/earcut.js";import{create as d}from"../../core/libs/gl-matrix-2/factories/mat4f64.js";import{create as g}from"../../core/libs/gl-matrix-2/factories/vec3f64.js";import{getReferenceEllipsoid as y}from"../../geometry/ellipsoidUtils.js";import j from"../../geometry/Point.js";import{project as w}from"../../geometry/projectionUtils.js";import{execute as v}from"../../geometry/operators/gx/operatorDensify.js";import{execute as _}from"../../geometry/operators/gx/operatorSimplify.js";import{fromSpatialReference as A,fromPolygon as x,toPolygon as b}from"../../geometry/operators/support/apiConverter.js";import{computeTranslationToOriginAndRotation as R}from"../../geometry/projection/computeTranslationToOriginAndRotation.js";import{newDoubleArray as M}from"../../geometry/support/DoubleArray.js";import{earth as N}from"../../geometry/support/Ellipsoid.js";import{newIndexArray as k}from"../../geometry/support/Indices.js";import{t as C}from"../../chunks/vec3.js";import{ViewingMode as U}from"../ViewingMode.js";import{ElevationContext as V}from"./layers/graphics/ElevationContext.js";import{extrudePolygon as G}from"./layers/graphics/Graphics3DExtrudeSymbolLayer.js";import{computeCentroid as H}from"./layers/graphics/graphicUtils.js";import{geometryToRenderInfo as F}from"./support/renderInfoUtils/polygon.js";import{FocusAreaColorNode as I}from"./webgl-engine/effects/focusArea/FocusAreaColorNode.js";import{FocusAreaGeometry as P,FocusAreaMaskNode as E}from"./webgl-engine/effects/focusArea/FocusAreaMaskNode.js";import{FocusAreaOutlineItem as S}from"./webgl-engine/effects/focusArea/FocusAreaOutlineItem.js";const D=2e4;let L=class extends o{constructor(e){super(e),this._volumes=new Map,this._elevationContext=new V,this._outlineMap=new t}initialize(){this.addHandles([m((()=>this.polygons),(e=>this._updateVolumes(e)),c)]),this._outlineMap=n((()=>this.areas?.areas),(e=>new S({area:e,view:this.view})),{recycleItems:!0})}destroy(){this.removeAllHandles(),this._outlineMap.destroy()}get areas(){return this.view.map?.focusAreas}get enabledAreas(){return this.areas?.areas.toArray().filter((({enabled:e})=>e))??[]}get style(){return this.areas?.style??"bright"}get polygons(){return this.enabledAreas.reduce(((e,o)=>e.concat(o.geometries.toArray())),new Array)}containsGeometry(e){if(0===this.polygons.length)return!0;const o=new j(e);return this.polygons.some((e=>e.contains(o)))}_updateVolumes(e){this._extrude(e),this._ensureRenderNodes()}_extrude(e){if(!this.view.renderCoordsHelper||r(Array.from(this._volumes.keys()),e))return;const o=this.view.renderCoordsHelper,t=g(),n=o.viewingMode===U.Global,a=d(),m=d(),c=this.view.spatialReference,u=A(c),f=y(c).radius/N.radius,j=p(5e5*f,"meters",c,!0);n||o.worldUpAtPosition([0,0,0],t);const V=new Map;for(const r of e){const e=this._volumes.get(r);if(e)V.set(r,e);else try{const e=c.equals(r.spatialReference)?r:w(r,c),s=Math.max(e.extent.width,e.extent.height),i=l(s,c,"meters",!0),p=Math.max(5*i,D*f),d=n?f/10:f,g=this._reduceGeometryHeight(e,p,d),y=H(g);if(null==y)continue;const A=x(g),N=_(A,u,!1)??A,U=v(N,j,0,0),I=b(U,c);if(null==I)continue;R(c,[y.x,y.y,0],a,o.spatialReference),m[12]=-a[12],m[13]=-a[13],m[14]=-a[14];const E=F(I,this.view.elevationProvider,o,this._elevationContext),{polygons:S,mapPositions:L,position:O}=E,q=new Array;for(const o of S){const e=o.count,r=h(o.mapPositions,o.holeIndices,3);if(0===r.length)continue;const s=r.length,i=6*e,c=i+s,l=M(3*i),u=k(c),f=k(s);G(O,L,r,o,l,null,null,null,u,f,p,t,n),C(l,l,m);const d=new P(l,f,u,p,[a[12],a[13],a[14]]);q.push(d)}V.set(r,q)}catch(I){i.getLogger(this).error(new s("focusareasview:projection-failed","Failed to project focus area geometry to view spatial reference",{geometry:r,error:I}))}}this._volumes=V,this._maskRenderNode?.updateGeometries()}_ensureRenderNodes(){this.view.stage&&(0===this.volumes.size?(this._maskRenderNode=a(this._maskRenderNode),this._colorRenderNode=a(this._colorRenderNode)):(this._maskRenderNode??=new E({focusAreasView:this}),this._colorRenderNode??=new I({focusAreasView:this}),this.view.stage.renderView.requestRender()))}_reduceGeometryHeight(e,o,r){const t=-12e5*r,s=Math.max(-o/2,t),i=e.rings.map((e=>e.map((e=>[e[0],e[1],s])))),n=e.clone();return n.rings=i,n.hasZ=!0,n}get volumes(){return this._volumes}};e([u()],L.prototype,"_volumes",void 0),e([u({constructOnly:!0})],L.prototype,"view",void 0),L=e([f("esri.views.3d.FocusAreasView")],L);export{L as FocusAreasView};