@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.62 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{lerp as t}from"../../../../core/mathUtils.js";import{transpose as i}from"../../../../core/libs/gl-matrix-2/math/mat3.js";import{create as e}from"../../../../core/libs/gl-matrix-2/factories/mat3f64.js";import{l as s,j as a,m as o,c as h,d as n,q as r,h as c,e as _,f as m,g as p,n as f}from"../../../../chunks/vec32.js";import{create as l,clone as d,UNIT_Z as M,UNIT_Y as v,UNIT_X as g}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{ViewingMode as u}from"../../../ViewingMode.js";import{angle as w,slerp as y}from"../../support/mathUtils.js";class P{get pitch(){return this._pitch}get yaw(){return this._yaw}get distance(){return this._distance}get fov(){return this._fov}get size(){return this._size}constructor(t){this.viewingMode=t,this.center=l(),this._pitch=0,this._yaw=0,this._distance=0,this.direction=d(O),this._fov=55,this._size=1}pixelsPerPanAtZoom(t){return this._size/2/(this._zoomToPanScale*t)}zoomAtPixelsPerPan(t){return this._size/2/(this._zoomToPanScale*t)}pixelsPerRotate(){const t=Math.max(Math.cos(Math.abs(this._pitch)),.5);return this._size/2/t}compareTo(t,i){if(this.viewingMode===u.Global){const e=(s(this.center)+s(t.center))/2;i.pan=w(this.center,t.center)*e}else i.pan=a(this.center,t.center);let e=Math.abs(t._yaw-this._yaw);e>=Math.PI&&(e=2*Math.PI-e);const o=Math.abs(t._pitch-this._pitch);i.rotate=Math.max(e,o),i.fov=t.fov-this.fov,i.sourceZoom=this._distance,i.targetZoom=t._distance}interpolate(i,e,s){this.viewingMode===u.Global?y(i.center,e.center,s.pan,this.center):o(this.center,i.center,e.center,s.pan),this._distance=isFinite(e.distance)?t(i.distance,e.distance+s.zoomOffset,s.zoom):i.distance,this._pitch=t(i.pitch,e.pitch,s.rotate);let a=i._yaw;const h=e._yaw;Math.abs(h-a)>=Math.PI&&(a+=2*(a<h?1:-1)*Math.PI),this._yaw=t(a,h,s.rotate),this._fov=t(i.fov,e.fov,s.fov)}copyFrom(t){h(this.center,t.center),this._pitch=t.pitch,this._yaw=t.yaw,this._distance=t.distance,h(this.direction,t.direction),this._size=t.size,this._fov=t.fov,this._zoomToPanScale=Math.atan(.5*this._fov),this.viewingMode=t.viewingMode}copyFromRenderCamera(t){const i=this._lookAtOrientation(t.center,F);h(this.center,t.center),n(I,t.center,t.eye),r(I,I,i),r(k,t.up,i),this._distance=s(I),0!==this._distance&&(I[0]/=this._distance,I[1]/=this._distance,I[2]/=this._distance),this._pitch=z(I),this._yaw=x(I,k),this._size=Math.sqrt(t.width*t.width+t.height*t.height),this._fov=t.fov,this._zoomToPanScale=Math.atan(.5*this._fov)}copyToRenderCamera(t){const e=this._lookAtOrientation(this.center,F);i(e,e),this._axisAngleVec3(S,this._pitch-Math.PI/2,O,I),this._axisAngleVec3(V,this._yaw,I,I),this._axisAngleVec3(S,this._pitch-Math.PI/2,V,k),this._axisAngleVec3(V,this._yaw,k,k),c(I,I,this._distance),r(I,I,e),r(k,k,e),t.center=this.center,t.eye=n(I,this.center,I),t.up=k,t.fov=this._fov}_axisAngleVec3(t,i,e,s){const a=Math.cos(i),o=Math.sin(i);return c(A,e,a),_(b,t,e),c(b,b,o),c(j,t,(1-a)*m(t,e)),p(s,p(s,A,b),j)}_lookAtOrientation(t,i=e()){return this._upAtLookAt(t,j),_(A,this.direction,j),f(A,A),0===A[0]&&0===A[1]&&0===A[2]&&h(A,S),_(b,j,A),f(b,b),i[0]=A[0],i[1]=b[0],i[2]=j[0],i[3]=A[1],i[4]=b[1],i[5]=j[1],i[6]=A[2],i[7]=b[2],i[8]=j[2],i}_upAtLookAt(t,i){return this.viewingMode===u.Local?h(i,V):f(i,t)}}function z(t){return Math.PI-w(V,t)}function x(t,i){const e=T;return Math.abs(i[2])<.5?(h(e,i),t[2]>0&&c(e,e,-1)):h(e,t),_(b,e,V),f(b,b),w(S,b,V)}const A=l(),b=l(),j=l(),I=l(),k=l(),T=l(),V=M,O=v,S=g,F=e();export{P as Camera};