@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 5.35 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 t}from"../../../chunks/tslib.es6.js";import i from"../../../core/Accessor.js";import{deg2rad as a,rad2deg as e}from"../../../core/mathUtils.js";import{watch as s,sync as r,initial as n}from"../../../core/reactiveUtils.js";import{property as o}from"../../../core/accessorSupport/decorators/property.js";import"../../../core/has.js";import"../../../core/Logger.js";import"../../../core/RandomLCG.js";import{subclass as c}from"../../../core/accessorSupport/decorators/subclass.js";import{ViewingMode as l}from"../../ViewingMode.js";import{applyAll as u}from"../camera/constraintUtils.js";import{surfaceElevationBelowRenderLocation as p}from"../camera/intersectionUtils.js";import{ConstraintOptions as h}from"../camera/constraintUtils/ConstraintOptions.js";import{ConstraintTypes as d}from"../camera/constraintUtils/ConstraintTypes.js";import{InteractionType as m}from"../camera/constraintUtils/InteractionType.js";import{createNearFarHeuristic as v}from"./NearFarHeuristic.js";import{SurfaceCollisionConstraint as w}from"./SurfaceCollisionConstraint.js";let _=class extends i{constructor(t){super(t),this.nearFarHeuristic=v(t.view.state.viewingMode,t.view.basemapTerrain,t.view.renderCoordsHelper.spatialReference)}initialize(){this.addHandles([s((()=>[this.view.constraints?.clipDistance?.near,this.view.constraints?.clipDistance?.far]),(()=>this._clipDistanceNearFarChanged())),s((()=>this.view.constraints?.clipDistance?.mode),(()=>this._updateNearFar())),this.view.state.events.on("before-camera-change",(({camera:t,sceneDepthRange:i})=>this._updateCameraNearFar(t,i))),s((()=>this.view.stage.renderer.sceneDepthRange.value),(()=>this._updateNearFar()),r),s((()=>this.view.renderDataExtent),(()=>this._updateNearFar()),r),s((()=>[this.view.constraints?.altitude?.min,this.view.constraints?.altitude?.max]),(()=>this._updateAltitude()),r),s((()=>this.view.constraints?.tilt?.max),(()=>this._updateTiltMax()),r),s((()=>this.view.constraints?.tilt?.mode),(()=>this._updateTilt()),r),s((()=>this.view.state?.camera),(()=>this._updateTiltAutoMax()),r),s((()=>[this.view.map?.ground?.navigationConstraint?.type,this.view.state?.constraints?.collision?.enabled]),(()=>this._updateCollision()),r)]),this.view.state.isLocal&&this.addHandles(s((()=>this.view.renderDataExtent),(t=>this._updateLocalSurfaceDistance(t)),n)),this._updateNearFar(),this.view.state.viewingMode!==l.Local&&this._updateAltitude(),this._updateTilt(),this._updateCollision(),this._set("surfaceCollisionConstraint",new w({view:this.view}))}destroy(){this.surfaceCollisionConstraint&&(this.surfaceCollisionConstraint.destroy(),this._set("surfaceCollisionConstraint",null))}_clipDistanceNearFarChanged(){const t=this.view.constraints?.clipDistance;t&&"auto"!==t.mode&&this.view.state.updateCamera((i=>C(i,t)))}_updateNearFar(){this.view.state.updateCamera((t=>this._updateCameraNearFar(t)))}_updateCameraNearFar(t,i){const a=this.view.constraints&&this.view.constraints.clipDistance;"manual"===(a?a.mode:"auto")?C(t,a):this._updateCameraNearFarAuto(t,a,i)}_updateCameraNearFarAuto(t,i,a){const e=p(this.view,t.eye),s=this.nearFarHeuristic.compute(t,this.view.renderDataExtent,a??this.view.stage.renderer.sceneDepthRange.value,e);t.near=s.near,t.far=s.far,i&&i.autoUpdate(t.near,t.far)}_updateCollision(){const t=this.view.map?.ground?.navigationConstraint?.type,i=!t||"stay-above"===t,a=this.view.state.constraints.collision;if(i!==a.enabled){a.enabled=i,i&&this._reapplyConstraints(d.COLLISION);const t=this.view.constraints&&this.view.constraints.tilt;t&&"auto"!==t.mode||this._updateTiltAuto()}}_updateAltitude(){const t=this.view.constraints&&this.view.constraints.altitude;t&&this.view.state.viewingMode!==l.Local?this.view.state.constraints.altitude={min:t.min,max:t.max}:this.view.state.constraints.altitude=null,this._reapplyConstraints()}_updateTiltMax(){const t=this.view.constraints&&this.view.constraints.tilt;t&&"auto"!==t.mode&&(this._updateTiltManual(t),this._reapplyConstraints())}_updateTilt(){const t=this.view.constraints&&this.view.constraints.tilt;"manual"===(t?t.mode:"auto")?this._updateTiltManual(t):this._updateTiltAuto(),this._reapplyConstraints()}_updateTiltManual(t){const i=this.view.state.constraints;i.tilt=i.createConstantMaxTilt(a(t.max))}_updateTiltAuto(){const t=this.view.state.constraints;t.tilt=t.createDefaultTilt(),this._updateTiltAutoMax()}_updateTiltAutoMax(){const t=this.view.constraints&&this.view.constraints.tilt;if(!t||"auto"!==t.mode)return;const i=this.view.state.constraints;if(i.tilt){const a=i.tilt(this.view.state.camera.distance).max;t.autoUpdate(e(a))}}_updateLocalSurfaceDistance(t){if(null==t)return;let i=Math.max(t.width,t.height);if(i<=0)return;null!=t.zmax&&null!=t.zmin&&(i=Math.max(i,t.zmax-t.zmin));const a=this.view.state,e=3*i/Math.atan(a.camera.fov/2);e!==a.constraints.distance&&(a.constraints.distance=e)}_reapplyConstraints(t=d.ALL){this.view.state.updateCamera((i=>u(this.view,i,new h(t,m.NONE,null))))}};function C(t,i){i&&(t.near=i.near,t.far=i.far)}t([o({constructOnly:!0})],_.prototype,"view",void 0),t([o({readOnly:!0})],_.prototype,"surfaceCollisionConstraint",void 0),_=t([c("esri.views.3d.state.ConstraintsManager")],_);export{_ as ConstraintsManager};