UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 8.2 kB
import{_ as e}from"../../../../chunks/tslib.es6.js";import t from"../../../../core/Accessor.js";import r from"../../../../core/Handles.js";import{unwrap as s,isNone as n}from"../../../../core/maybe.js";import{watch as i,sync as o,when as a,on as c,initial as u}from"../../../../core/reactiveUtils.js";import{property as h}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/accessorSupport/ensureType.js";import"../../../../core/arrayUtils.js";import{subclass as d}from"../../../../core/accessorSupport/decorators/subclass.js";import{a as f,k as p,c as _}from"../../../../chunks/vec3.js";import{c as l}from"../../../../chunks/vec3f64.js";import{create as m}from"../../../../geometry/support/ray.js";import y from"../debugFlags.js";import{PointGraphics as C}from"../debugUtils.js";import{PropertiesPool as O}from"../PropertiesPool.js";import{fromRenderAtEye as A}from"../geometryUtils/ray.js";import{CameraOnSurface as g}from"./CameraOnSurface.js";import{CenterOnSurface as w}from"./CenterOnSurface.js";import{ContentGeometryUpdates as I}from"./ContentGeometryUpdates.js";import{Focus as S}from"./Focus.js";import{StableSurfaceCenter as v}from"./StableSurfaceCenter.js";import{SurfaceGeometryUpdates as b}from"./SurfaceGeometryUpdates.js";import{newIntersector as R}from"../../webgl-engine/lib/Intersector.js";import{StoreResults as T}from"../../webgl-engine/lib/IntersectorInterfaces.js";import{TERRAIN_ID as P}from"../../webgl-engine/lib/verticalOffsetUtils.js";import{TaskPriority as j}from"../../../support/Scheduler.js";let U=class extends t{constructor(e){super(e),this._handles=new r,this._tmpRay=m(),this._centerRayDirty=!0,this._surfaceAltitudeAtCenter=0,this._surfaceAltitudeAtCenterDirty=!0,this._contentAltitudeAtCenter=0,this._contentAltitudeAtCenterDirty=!0,this._propertiesPool=new O({renderPointOfView:E},this),this.renderPointOfView=l(),this._pois=new Array,this._debugCenters=new Map}initialize(){const{state:e,basemapTerrain:t,renderCoordsHelper:r,map:n}=this.view;this._surfaceIntersector=R(e.viewingMode),e.isGlobal?this._surfaceIntersector.options.backfacesTerrain=!1:this._surfaceIntersector.options.backfacesTerrain=!0,this._surfaceIntersector.options.invisibleTerrain=!1,this._surfaceIntersector.options.store=T.MIN,this._contentIntersector=R(e.viewingMode);const h=()=>this._estimateSurfaceAltitudeAtCenter(),d=this.view.resourceController.scheduler,f=s(this.view.basemapTerrain?.elevationQueryCache),p={state:e,scheduler:d,surface:t,renderCoordsHelper:r};this._set("centerOnSurfaceInfrequent",new w({...p,task:j.POINT_OF_INTEREST_INFREQUENT,estimateSurfaceAltitudeAtCenter:h})),this._set("centerOnSurfaceFrequent",new w({...p,task:j.POINT_OF_INTEREST_FREQUENT,estimateSurfaceAltitudeAtCenter:h})),this._set("centerOnContent",new w({...p,task:j.POINT_OF_INTEREST_FREQUENT,estimateSurfaceAltitudeAtCenter:()=>this._estimateContentAltitudeAtCenter()})),this._set("cameraOnSurface",new g({...p,cache:f,task:j.POINT_OF_INTEREST_INFREQUENT,map:n})),this._set("surfaceGeometryUpdates",new b({...p,centerOnSurfaces:[this.centerOnSurfaceFrequent,this.centerOnContent,this.centerOnSurfaceInfrequent]})),this._set("contentGeometryUpdates",new I({contentLayerViews:this.view.allLayerViews,renderCoordsHelper:r})),this._set("surfaceOrigin",new v({cache:f,view:this.view})),this._set("focus",new S({state:e,scheduler:d,surface:t,renderCoordsHelper:r,centerOnSurface:this.centerOnSurfaceInfrequent,estimateSurfaceIntersectionAtRenderPoint:(e,t)=>this._estimateSurfaceIntersectionAtRenderPoint(e,this.view.state.contentCamera,t)})),this._pois.push(this.centerOnContent,this.centerOnSurfaceFrequent,this.centerOnSurfaceInfrequent,this.cameraOnSurface,this.focus);const _=this.view.graphics;this._debugCenters.set(this.centerOnContent,new C(_,"red","CenterOnContent")),this._debugCenters.set(this.centerOnSurfaceFrequent,new C(_,"red","CenterOnSurface")),this._debugCenters.set(this.centerOnSurfaceInfrequent,new C(_,"red","CenterOnSurface")),this._debugCenters.set(this.cameraOnSurface,new C(_,"blue","CameraOnSurface")),this._debugCenters.set(this.focus,new C(_,"green","Focus")),this._handles.add([i((()=>e.contentCamera),(e=>this._cameraChanged(e)),o),i((()=>t.extent),(()=>this._updateCenterPointsOfInterest())),a((()=>!t.updating),(()=>this._updateCenterPointsOfInterest()),o),c((()=>this.surfaceGeometryUpdates.events),"request-update",(()=>this._updateCenterPointsOfInterest())),c((()=>this.contentGeometryUpdates.events),"request-update",(()=>this._updateCenterOnContent())),a((()=>y.SHOW_POI),(e=>this._setDebug(e)),u)]),this._cameraChanged(this.view.state.contentCamera);for(const s of this._pois)s.runTask()}destroy(){this._setDebug(!1),this._handles.destroy(),this._propertiesPool.destroy();for(const e of this._pois)e.destroy();this.surfaceOrigin.destroy()}get updating(){return!(!this.surfaceGeometryUpdates?.updating&&!this._pois.some((e=>e.updating)))}get _centerRay(){return this._centerRayDirty&&(this._centerRayCached=this.view.sceneIntersectionHelper.getCenterRayWithSubpixelOffset(this.view.state.contentCamera,this._tmpRay),this._centerRayDirty=!1),this._centerRayCached}_estimateContentAltitudeAtCenter(){if(!this._contentAltitudeAtCenterDirty)return this._contentAltitudeAtCenter;this._contentAltitudeAtCenterDirty=!1;const e=this._centerRay;return n(e)||(this.view.sceneIntersectionHelper.intersectRay(e,this._contentIntersector,D,N)?this._contentAltitudeAtCenter=this.view.renderCoordsHelper.getAltitude(D):this._contentAltitudeAtCenter=this._estimateSurfaceAltitudeAtCenter()),this._contentAltitudeAtCenter}_estimateSurfaceAltitudeAtCenter(){if(!this.view.basemapTerrain)return 0;if(!this._surfaceAltitudeAtCenterDirty)return this._surfaceAltitudeAtCenter;this._surfaceAltitudeAtCenterDirty=!1;const e=this._centerRay;if(n(e))return this._surfaceAltitudeAtCenter;const t=e.origin,r=f(D,e.origin,e.direction);return this._surfaceIntersector.resetWithRay(e,this.view.state.contentCamera),this.view.basemapTerrain.intersect(this._surfaceIntersector,null,t,r),this._surfaceIntersector.results.min.getIntersectionPoint(D)&&(this._surfaceAltitudeAtCenter=this.view.renderCoordsHelper.getAltitude(D)),this._surfaceAltitudeAtCenter}_estimateSurfaceIntersectionAtRenderPoint(e,t,r){const s=A(t,e,F);if(n(s))return null;const i=s.origin,o=f(D,s.origin,s.direction);return this._surfaceIntersector.resetWithRay(s,t),this.view.basemapTerrain.intersect(this._surfaceIntersector,null,i,o),this._surfaceIntersector.results.min.getIntersectionPoint(r)?r:null}_cameraChanged(e){this._updateCenterPointsOfInterest();const t=e.eye;p(this.renderPointOfView,t)||this._set("renderPointOfView",_(this._propertiesPool.get("renderPointOfView"),t))}_updateCenterPointsOfInterest(){this._centerRayDirty=!0,this._surfaceAltitudeAtCenterDirty=!0,this._contentAltitudeAtCenterDirty=!0;for(const e of this._pois)e.updateRenderLocation()}_updateCenterOnContent(){this._contentAltitudeAtCenterDirty=!0,this.centerOnContent.updateRenderLocation()}_setDebug(e){if(!e)return this._debugCenters.forEach((e=>e.hide())),void this._handles.remove("debug");for(const t of this._pois)this._handles.add(i((()=>t.renderLocation),(e=>this._debugCenters.get(t)?.show(e,t.renderCoordsHelper.spatialReference)),u),"debug")}get test(){return{update:()=>{this.surfaceGeometryUpdates.runTask();for(const e of this._pois)e.runTask()},surfaceGeometryUpdates:this.surfaceGeometryUpdates}}};e([h({readOnly:!0})],U.prototype,"centerOnContent",void 0),e([h({readOnly:!0})],U.prototype,"centerOnSurfaceFrequent",void 0),e([h({readOnly:!0})],U.prototype,"centerOnSurfaceInfrequent",void 0),e([h({readOnly:!0})],U.prototype,"cameraOnSurface",void 0),e([h({readOnly:!0})],U.prototype,"focus",void 0),e([h({readOnly:!0})],U.prototype,"renderPointOfView",void 0),e([h({readOnly:!0})],U.prototype,"surfaceOrigin",void 0),e([h({readOnly:!0})],U.prototype,"contentGeometryUpdates",void 0),e([h({readOnly:!0})],U.prototype,"surfaceGeometryUpdates",void 0),e([h({constructOnly:!0})],U.prototype,"view",void 0),e([h({readOnly:!0})],U.prototype,"updating",null),U=e([d("esri.views.3d.support.PointsOfInterest")],U);const E=Array,D=l(),F=m(),N={exclude:new Set([P])};export{U as PointsOfInterest};