UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 16.7 kB
import{_ as e}from"../../../chunks/tslib.es6.js";import t from"../../../Camera.js";import i from"../../../Viewpoint.js";import r from"../../../core/Accessor.js";import a from"../../../core/Logger.js";import{isNone as s,isSome as n,destroyMaybe as o}from"../../../core/maybe.js";import{watch as l,on as h,sync as p,when as c}from"../../../core/reactiveUtils.js";import{addFrameTask as d}from"../../../core/scheduling.js";import{createScreenPoint as m}from"../../../core/screenUtils.js";import{property as v}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/accessorSupport/ensureType.js";import"../../../core/arrayUtils.js";import{subclass as u}from"../../../core/accessorSupport/decorators/subclass.js";import{d as g}from"../../../chunks/vec3.js";import{d as w}from"../../../chunks/vec3f64.js";import{s as y}from"../../../chunks/vec4.js";import{c as C}from"../../../chunks/vec4f64.js";import _ from"../../../geometry/Extent.js";import f from"../../../geometry/Point.js";import{canProject as R}from"../../../geometry/support/webMercatorUtils.js";import{ViewingMode as x}from"../../ViewingMode.js";import{applyAll as P}from"../camera/constraintUtils.js";import{cameraOnContentAlongViewDirection as S,surfaceElevationBelowRenderLocation as T}from"../camera/intersectionUtils.js";import{ConstraintsManager as O}from"./ConstraintsManager.js";import{Frustum as b}from"./Frustum.js";import{GoToOperation as I}from"./GoToOperation.js";import{SurfaceCollisionCorrectionController as j}from"./controllers/SurfaceCollisionCorrectionController.js";import{internalToExternal as M,externalToInternal as E,toExtent as A,distanceToScale as N,scaleToZoom as H,fromExtent as L,OrientationMode as B,getObserverForPointAtDistance as U,scaleToDistance as D,zoomToScale as V}from"../support/cameraUtils.js";import{PropertiesPool as k}from"../support/PropertiesPool.js";import{fromCamera as z,toCamera as G}from"../support/viewpointUtils.js";import{Camera as F,PaddingSide as q}from"../webgl-engine/lib/Camera.js";import{RenderFeature as W}from"../webgl-engine/lib/RenderFeature.js";import{RenderState as J}from"../../support/RenderState.js";let K=class extends r{get camera(){const e=this._get("camera");if(!this.ready)return e;const t=M(this.view,this.view.state.camera,Z);return t&&e&&t.equals(e)?e:t.clone()}set camera(e){this._updatePropertyBeforeReady("camera",e)||(this.view.elevationProvider?.enableElevationCache(!0),this.setStateCamera(E(this.view,e),{applyConstraints:!1})||a.getLogger(this.declaredClass).error("#camera=","Invalid camera",e),this.view.elevationProvider?.enableElevationCache(!1))}get contentCamera(){const e=this._get("contentCamera");if(!this.ready)return e;const t=M(this.view,this.view.state.contentCamera,Z);return t&&e&&t.equals(e)?e:t.clone()}set contentCamera(e){if(this._updatePropertyBeforeReady("contentCamera",e))return;const t=E(this.view,e);s(t)?this.view.state.contentCamera=null:(this._updateElevation(t),this.view.state.contentCamera=t)}installContentCameraReset(e){if(this.removeHandles(ie),this.test.contentCameraResetState.clear(),!this.view.state.fixedContentCamera)return!1;const t=this.zoom,i=this.view.state.camera.distance**2,r=w(this.view.state.camera.center),a=e.sticky?this.contentCamera.clone():null;return this.addHandles([l((()=>this.contentCamera),(()=>{e.sticky||(this.removeHandles(ie),this.test.contentCameraResetState.clear())})),l((()=>this.zoom),(e=>{void 0!==e&&void 0!==t&&(this.test.contentCameraResetState.set("view.zoom",Math.abs(e-t)/2),Math.abs(e-t)>2?this.contentCamera=null:this.view.state.fixedContentCamera||(this.contentCamera=a))})),l((()=>this.view.state.camera),(e=>{const t=g(r,e.center);this.test.contentCameraResetState.set("camera.center",t/i),t>i?this.contentCamera=null:this.view.state.fixedContentCamera||(this.contentCamera=a)}))],ie),!0}get center(){return this.ready?this.view.pointsOfInterest.centerOnContent.location:this._get("center")}set center(e){this._updatePropertyBeforeReady("center",e)||(e?this.isCompatible(e)?this.setStateCamera(this._centerToCamera(e),{applyConstraints:!0})?this.view.pointsOfInterest.centerOnContent.runTask():a.getLogger(this.declaredClass).error("#center=","Invalid center",e):a.getLogger(this.declaredClass).error("#center=","Center has an incompatible spatial reference (center: "+(e.spatialReference?e.spatialReference.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",e):a.getLogger(this.declaredClass).error("#center=","Center may not be null or undefined"))}get extent(){if(!this.ready)return this._get("extent");const e=this.view,t=A(e,e.state.camera,e.pointsOfInterest.centerOnContent.renderLocation);return n(t)?t:this._get("extent")}set extent(e){this._updatePropertyBeforeReady("extent",e)||(e?this.isCompatible(e)?this.setStateCamera(this._extentToCamera(e),{applyConstraints:!0})||a.getLogger(this.declaredClass).error("#extent=","Invalid extent",e):a.getLogger(this.declaredClass).error("#extent=","Extent has an incompatible spatial reference (extent: "+(e.spatialReference?e.spatialReference.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",e):a.getLogger(this.declaredClass).error("#extent=","Extent may not be null or undefined"))}get frustum(){const e=this._propertiesPool.get("frustum");return e.renderCoordsHelper=this.view.renderCoordsHelper,e.update(this.view.state.camera),e}get hasInitialView(){return!!this.view.get("map.initialViewProperties.viewpoint")}get scale(){if(this.ready){const e=this.view.pointsOfInterest.centerOnContent;return N(this.view,e.distance,e.location.latitude)}return this._get("scale")}set scale(e){this._updatePropertyBeforeReady("scale",e)||this.setStateCamera(this._scaleToCamera(e),{applyConstraints:!0})||a.getLogger(this.declaredClass).error("#scale=","Invalid scale",e)}get padding(){if(!this.ready)return this._get("padding");const e=this.view.state.camera,t=e.padding,i=e.pixelRatio,r=this._get("padding"),a=Math.round(t[q.TOP]/i),s=Math.round(t[q.RIGHT]/i),n=Math.round(t[q.BOTTOM]/i),o=Math.round(t[q.LEFT]/i);return null!=r&&r.top===a&&r.right===s&&r.bottom===n&&r.left===o?r:{top:a,right:s,bottom:n,left:o}}set padding(e){this._updatePropertyBeforeReady("padding",e)||(this._paddingToArray(e,this.view.state.camera.pixelRatio,ee),this.view.state.updateCamera((e=>e.padding=ee)))}_paddingToArray(e,t,i){e?y(i,e.top||0,e.right||0,e.bottom||0,e.left||0):y(i,0,0,0,0);for(let r=0;r<4;r++)i[r]=Math.round(i[r]*t)}get screenCenter(){const e=this.padding;return m((this.view.width-(e.left+e.right))/2+e.left,(this.view.height-(e.top+e.bottom))/2+e.top)}get viewpoint(){return this.ready?z(this.view,this.camera):this._get("viewpoint")}set viewpoint(e){if(!this._updatePropertyBeforeReady("viewpoint",e))if(e)if(this.isCompatible(e))this.setStateCamera(this._viewpointToCamera(e),{applyConstraints:!e.camera})||a.getLogger(this.declaredClass).error("#viewpoint=","Invalid viewpoint",e);else{const t=n(e.camera)?e.camera.position:e.targetGeometry,i=n(t)&&t.spatialReference;a.getLogger(this.declaredClass).error("#viewpoint=","Viewpoint has an incompatible spatial reference (viewpoint: "+(i?i.wkid:"none")+", view: "+this.view.spatialReference?.wkid+")",e)}else a.getLogger(this.declaredClass).error("#viewpoint=","Viewpoint may not be null or undefined")}get zoom(){return this.ready?H(this.view,this.scale):this._get("zoom")}set zoom(e){this._updatePropertyBeforeReady("zoom",e)||void 0===e||this.setStateCamera(this._zoomToCamera(e),{applyConstraints:!0})||a.getLogger(this.declaredClass).error("#zoom=","Invalid zoom",e)}get _pixelRatio(){return n(this._devicePixelRatioOverride)?this._devicePixelRatioOverride:this._usePhysicalPixelRendering?this._windowDevicePixelRatio:Math.min(this._windowDevicePixelRatio,this.view?.qualitySettings.maximumPixelRatio)}get _rasterPixelRatio(){return n(this._devicePixelRatioOverride)?this._devicePixelRatioOverride:this._usePhysicalPixelRenderingAny?this._windowDevicePixelRatio:Math.min(this._windowDevicePixelRatio,this.view.qualitySettings.maximumPixelRatio)}get _usePhysicalPixelRendering(){return this.view?._stage?.renderer.isFeatureEnabled(W.PhysicalPixelRendering)??!1}get _usePhysicalPixelRenderingAny(){const e=this.view?._stage?.renderer;return e&&(e.isFeatureEnabled(W.PhysicalPixelRendering,J.IDLE)||e.isFeatureEnabled(W.PhysicalPixelRendering,J.INTERACTING)||e.isFeatureEnabled(W.PhysicalPixelRendering,J.ANIMATING))}constructor(e){super(e),this._propertiesPool=new k({frustum:b},this),this._cameraSetByUser=!1,this._gotoOperation=null,this.constraintsManager=null,this.ready=!1,this._windowDevicePixelRatio=1,this._devicePixelRatioOverride=null,this._cameraChangeTime=0,this._updatingIgnoreRenderState=!1,this.test={viewStateManager:this,contentCameraResetState:new Map,setDevicePixelRatio:e=>this._devicePixelRatioOverride=e,renderState:null,get maximumPixelRatio(){return this.viewStateManager.view.qualitySettings.maximumPixelRatio},set updatingIgnoreRenderState(e){this.viewStateManager._updatingIgnoreRenderState=e},get updatingIgnoreRenderState(){return this.viewStateManager._updatingIgnoreRenderState||n(this.renderState)}}}initialize(){this._cameraChangeTime=performance.now(),this.addHandles([h((()=>this.view.state.events),"before-camera-change",(e=>e&&this._updateElevation(e))),l((()=>this.view.state?.camera),((e,t)=>this._cameraChangedHandler(e,t)),p)]),c((()=>this.view.state?.camera),(e=>this._updateElevation(e)),{once:!0,sync:!0}),this.addHandles([d({prepare:()=>this._prepareFrame()}),l((()=>this.view.state.cameraController),(()=>{this._cameraSetByUser=!0,this.removeHandles(te)})),h((()=>this.view.state.events),"camera-projection-changed",(()=>this.notifyChange("scale")))])}destroy(){this.exit(),this._propertiesPool=o(this._propertiesPool)}init(){this.constraintsManager=new O({view:this.view}),this._prepareFrame();const e=this._getInitialProperties();this._cameraSetByUser=!1,this._set("ready",!0);for(const t of e)this.set(t.name,t.value);if(!this._cameraSetByUser){const e=this.view.get("map.initialViewProperties.viewpoint")||this.view.initialExtent;e&&this.isCompatible(e)?this._setInitialView(e):this.view.state.viewingMode===x.Local&&this.addHandles(c((()=>this.view.basemapTerrain.ready),(()=>{this.removeHandles(te),this._setInitialView(this.view.dataExtent)}),{once:!0,initial:!0}),te)}}exit(){this._cancelGoToOperation(),this.ready&&(this._override("padding",this.padding),this._set("ready",!1),this._clearOverride("hasInitialView"),this._cameraSetByUser=!1,this.removeHandles(te),this.constraintsManager=o(this.constraintsManager))}async goTo(e,t){const i={animate:!0,...t};return n(this._gotoOperation)&&this._gotoOperation.abort(i.animate),this._gotoOperation=new I(e,i,this.view),this.view.resourceController.scheduler.stopFrame(),this._gotoOperation}debugSetCameraOnContent(){this.setStateCamera(S(this.view),{applyConstraints:!1})}step(e){const t=this.view.state,i=t?.cameraController;i&&(t.updateCamera((t=>i.stepController(e,t))),i.steppingFinished&&i.finishController())}_cancelGoToOperation(){n(this._gotoOperation)&&(this._gotoOperation.abort(),this._gotoOperation=null)}_getInitialProperties(){const e=new Set,t=[];for(const{propertyName:i,overrides:r}of X){const a=e.has(i),s=this._isOverridden(i);!a&&s&&t.push({name:i,value:this._get(i)}),this._clearOverride(i),(a||s)&&r.forEach((t=>e.add(t)))}return t}_setInitialView(e){if(s(e)||this._cameraSetByUser)return;if(e instanceof t)return void this.setStateCamera(E(this.view,e),{applyConstraints:!1});if(e instanceof i){if(e.targetGeometry instanceof _){const t=L(this.view,e.targetGeometry,0,.5,B.LOCKED);return void(n(t)&&this.setStateCamera(E(this.view,t),{applyConstraints:!0}))}const t={applyConstraints:!e.camera},i=this._viewpointToCamera(e);return void this.setStateCamera(i,t)}const r=L(this.view,e,0,.5,B.LOCKED);n(r)&&this.setStateCamera(E(this.view,r),{applyConstraints:!0})}_updatePropertyBeforeReady(e,t){return!this.ready&&(this._override(e,t),t&&Q.includes(e)&&this._override("hasInitialView",!0),!0)}isCompatible(e){return!s(e)&&(e instanceof i?e.camera?this.isCompatible(e.camera):this.isCompatible(e.targetGeometry):e instanceof t?this.isCompatible(e.position):e.spatialReference&&R(e.spatialReference,this.view.spatialReference))}_getPreservingHeadingTilt(e=Y){return this._cameraSetByUser?(e.heading=this.camera.heading,e.tilt=this.camera.tilt):(e.heading=0,e.tilt=.5),e}_centerPointAtDistanceToCamera(e,t,i=$){const{heading:r,tilt:a}=this._getPreservingHeadingTilt(),n=U(this.view,r,a,e,t,B.ADJUST);return s(n)?null:(i.copyFrom(this.view.state.camera),i.eye=n.eye,i.center=n.center,i.up=n.up,i)}_centerToCamera(e){const t=this.view.pointsOfInterest.centerOnContent;t.runTask();const i=t.distance;return this._centerPointAtDistanceToCamera(e,i)}_extentToCamera(e){const{heading:t,tilt:i}=this._getPreservingHeadingTilt(),r=L(this.view,e,t,i,B.ADJUST,Z);return r?E(this.view,r):null}_scaleToCamera(e){if(null==e)return null;const t=this.view.pointsOfInterest.centerOnContent;t.runTask();const i=t.renderLocation,r=t.location.latitude;if(null==r)return null;const a=D(this.view,e,r);return this._centerPointAtDistanceToCamera(i,a)}_zoomToCamera(e){return this._scaleToCamera(V(this.view,e))}_viewpointToCamera(e){return E(this.view,G(this.view,e))}setStateCamera(e,t){return!(s(e)||!this.view.state.stopActiveCameraController())&&(this._cameraSetByUser=!0,t.doNotCancelGoToOperation||this._cancelGoToOperation(),this.view.state.updateCamera((i=>{t.positionAndOrientationOnly?(i.eye=e.eye,i.center=e.center,i.up=e.up):i.copyFrom(e),t.applyConstraints&&P(this.view,i)})),t.applyConstraints||(this.view.state.cameraController=new j({view:this.view,desiredCamera:e})),!0)}_prepareFrame(){const{surface:e,canvas:t}=this.view;if(!e||!t)return;this._windowDevicePixelRatio=window.devicePixelRatio;const i=this._pixelRatio,r=Math.round(e.clientWidth*i),a=Math.round(e.clientHeight*i);if(0!==r&&0!==a&&(t.width===r&&t.height===a||(t.width=r,t.height=a),this.view.state)){const e=this.view.state.camera;e.fullWidth===r&&e.fullHeight===a&&e.pixelRatio===i||($.copyFrom(e),$.pixelRatio!==i&&(this._paddingToArray(this.padding,i,ee),$.padding=ee),$.fullWidth=r,$.fullHeight=a,$.pixelRatio=i,this.view.state.camera=$),this._updateViewState()}}_updateElevation(e){const t=this.view.basemapTerrain&&this.view.basemapTerrain.spatialReference,i=this.view.renderCoordsHelper?.getAltitude(e.eye)??0,r=t?T(this.view,e.eye):0;e.relativeElevation=i-r}_updateViewState(){n(this.test.renderState)?this.view.state.mode=this.test.renderState:this.view.animation?this.view.state.mode=J.ANIMATING:this.view.interacting?this.view.state.mode=J.INTERACTING:(this.view.state.mode===J.ANIMATING&&(this._cameraChangeTime=0),performance.now()-this._cameraChangeTime<=re?this.view.state.mode=J.INTERACTING:this.view.state.mode=J.IDLE),this.view.state.rasterPixelRatio=this._rasterPixelRatio,this.view.state.contentPixelRatio=Math.min(this._pixelRatio,this.view.qualitySettings.maximumPixelRatio)}_cameraChangedHandler(e,t){e&&t&&e.almostEquals(t)||(this._cameraChangeTime=performance.now(),this._updateViewState())}};e([v({type:t,dependsOn:["view.state.camera","ready"]})],K.prototype,"camera",null),e([v({type:t,dependsOn:["view.state.contentCamera","ready"]})],K.prototype,"contentCamera",null),e([v({type:f})],K.prototype,"center",null),e([v({type:_})],K.prototype,"extent",null),e([v({readOnly:!0})],K.prototype,"frustum",null),e([v({readOnly:!0})],K.prototype,"hasInitialView",null),e([v({readOnly:!0,type:Boolean})],K.prototype,"ready",void 0),e([v({type:Number})],K.prototype,"scale",null),e([v()],K.prototype,"padding",null),e([v({readOnly:!0})],K.prototype,"screenCenter",null),e([v({constructOnly:!0})],K.prototype,"view",void 0),e([v({type:i})],K.prototype,"viewpoint",null),e([v({type:Number})],K.prototype,"zoom",null),e([v({readOnly:!0})],K.prototype,"_pixelRatio",null),e([v({readOnly:!0})],K.prototype,"_rasterPixelRatio",null),e([v({readOnly:!0})],K.prototype,"_usePhysicalPixelRendering",null),e([v({readOnly:!0})],K.prototype,"_usePhysicalPixelRenderingAny",null),e([v()],K.prototype,"_windowDevicePixelRatio",void 0),e([v()],K.prototype,"_devicePixelRatioOverride",void 0),K=e([u("esri.views.3d.state.ViewStateManager")],K);const Q=["camera","viewpoint","extent","scale","center","zoom"],X=[{propertyName:"camera",overrides:["viewpoint"]},{propertyName:"viewpoint",overrides:["extent"]},{propertyName:"extent",overrides:["center","scale"]},{propertyName:"center",overrides:[]},{propertyName:"scale",overrides:["zoom"]},{propertyName:"zoom",overrides:[]},{propertyName:"padding",overrides:[]}],Y={heading:0,tilt:0},Z=new t,$=new F,ee=C(),te="pending-initial-view",ie="content-camera-reset",re=300,ae=100;export{ae as INTERACTING_TIMEOUT,K as ViewStateManager};