@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 4.65 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{_ as t}from"../../../../chunks/tslib.es6.js";import{clamp as i}from"../../../../core/mathUtils.js";import{Milliseconds as e}from"../../../../core/time.js";import"../../../../core/Logger.js";import"../../../../core/has.js";import"../../../../core/RandomLCG.js";import"../../../../core/Error.js";import{subclass as r}from"../../../../core/accessorSupport/decorators/subclass.js";import{c as s,n as o,h as a,f as n,l as m,d as h,g as c,s as p}from"../../../../chunks/vec32.js";import{create as _}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{create as l}from"../../../../geometry/support/ray.js";import{c as y}from"../../../../chunks/sphere.js";import{applyAll as f}from"../../camera/constraintUtils.js";import{ConstraintOptions as g}from"../../camera/constraintUtils/ConstraintOptions.js";import{ConstraintTypes as w}from"../../camera/constraintUtils/ConstraintTypes.js";import{InteractionType as C}from"../../camera/constraintUtils/InteractionType.js";import{applySurfaceCollisionConstraint as d}from"../../camera/constraintUtils/surfaceCollision.js";import{PointToPointAnimationController as j}from"./PointToPointAnimationController.js";import{contentIntersectorOptions as u,navigationMode as D,zoomMaxDistanceModifier as v,zoomMinDistanceModifier as b,zoomDistanceModifier as R,NavigationMode as M,panToPosition as L}from"../utils/navigationUtils.js";import{fromScreenAtEye as O}from"../../support/geometryUtils/ray.js";import{intersectScreen as z}from"../../support/geometryUtils/sphere.js";import U from"../../webgl/RenderCamera.js";import{newIntersector as V}from"../../webgl-engine/lib/Intersector.js";import{outExpo as S}from"../../../animation/easing.js";const H=.6,x=4,A=60;let F=class extends j{constructor(){super(...arguments),this._zoomLocation=_(),this._tmpCamera=new U,this._tmpViewDir=_(),this._tmpRayDir=l(),this._targetOnSphere=_(),this._tmpCenter=_(),this._beginCamera=new U,this._constraintOptions=new g(w.ALL_EXCEPT_COLLISION,C.ZOOM,null,this._beginCamera),this._sphere=y()}initialize(){this._intersector=V(this.view.state.viewingMode)}step(t,i){if(!this.running)return;const e=this.view.state;this.animation.finished?this._beginCamera.copyFrom(e.camera):this.animation.cameraAt(1,this._beginCamera);let r=!1,o=!1;this._intersectionHelper.intersectScreen(i,this._zoomLocation,0===this.view.map.ground.opacity?u:{})&&(r=t>0,o=!0),this._tmpCamera.copyFrom(e.camera),r?this._intersectionHelper.intersectRay(this._tmpCamera.ray,this._intersector,this._tmpCenter)&&(this._tmpCamera.center=this._tmpCenter):this._intersectionHelper.intersectRay(this._tmpCamera.ray,this._intersector,this._zoomLocation)?this._tmpCamera.center=this._zoomLocation:s(this._zoomLocation,this._tmpCamera.center),this._updateCamera(this._tmpCamera,t,i,o),this.begin(this._tmpCamera)}animationSettings(){return{duration:e(600),easing:S}}_updateCamera(t,e,r,s){const _=D(t,r,this.view.renderCoordsHelper,this.view.viewingMode),l=Math.abs(this.view.camera.position.z),y=this._zoomLocation;o(T,t.eye),a(T,T,-1),O(t,r,this._tmpRayDir),o(this._tmpRayDir.direction,this._tmpRayDir.direction);const g=i(Math.min(R,1/Math.abs(n(T,this._tmpRayDir.direction)))*l,b,v);if(_===M.Horizontal){let i=H**e;this._sphere[3]=m(y),h(this._tmpViewDir,t.center,t.eye);const s=Math.min(m(this._tmpViewDir),g);let o=s*i;if(i<=1&&o<x&&(o=x,i=o/s),Math.abs(s-o)<1e-6)return;const n=m(t.center);if(this._sphere[3]!==n){const e=this._sphere[3]+i*(n-this._sphere[3]);t.center=a(I,t.center,e/n)}a(this._tmpViewDir,this._tmpViewDir,-i),t.eye=c(I,t.center,this._tmpViewDir),f(this.view,t,this._constraintOptions),p(y,t.center)>1e-12&&z(this._sphere,t,r,this._targetOnSphere)&&L(this._sphere,t,y,this._targetOnSphere,this.view.camera.heading,this.view.camera.tilt,!0)}else{let i=H**Math.abs(e);const o=e>0?1:-1;h(this._tmpViewDir,y,t.eye);const n=m(this._tmpViewDir),p=this.view._stage.renderView.getMinimalDepthForArea(null,r[0],r[1],this.view.state.camera,A);let _=null!=p?p:g;_=s&&e>0?Math.min(_,n):_,a(this._tmpRayDir.direction,this._tmpRayDir.direction,_),c(y,this._tmpRayDir.origin,this._tmpRayDir.direction);let l=_*i;const f=Math.max(x,1.01*t.nearFar[0]);if(e>0&&l<f&&(l=f,i=l/_),Math.abs(_-l)<1e-6)return;a(this._tmpRayDir.direction,this._tmpRayDir.direction,o*(1-i)),t.eye=c(I,t.eye,this._tmpRayDir.direction),t.center=c(I,t.center,this._tmpRayDir.direction)}d(this.view,t)}};F=t([r("esri.views.3d.state.controllers.ZoomStepControllerGlobal")],F);const I=_(),T=_();export{F as ZoomStepControllerGlobal};