@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 4.79 kB
JavaScript
import{neverReached as e}from"../../../../core/compilerUtils.js";import{clamp as t,acosClamped as r,asinClamped as n,deg2rad as i}from"../../../../core/mathUtils.js";import{isSome as s}from"../../../../core/maybe.js";import{d as a}from"../../../../chunks/mat4.js";import{c as o}from"../../../../chunks/mat4f64.js";import{b as c,m as u,g as m,a as l,i as d,e as f,n as p,l as y,p as h}from"../../../../chunks/vec3.js";import{c as M}from"../../../../chunks/vec3f64.js";import{getReferenceEllipsoid as C}from"../../../../geometry/ellipsoidUtils.js";import{b as T,e as I,t as O}from"../../../../chunks/sphere.js";import{defaultConstraintOptions as A,hasConstraintType as D,adjustRangeForInteraction as S}from"./common.js";import{ConstraintTypes as R}from"./ConstraintTypes.js";import{InteractionType as j}from"./InteractionType.js";import{TiltMode as w}from"./TiltMode.js";import{viewAngle as x}from"../../state/utils/viewUtils.js";function U(t,r,n=A,i=!0){W.eyeCenterDistance=0,W.requiresTwoSteps=!1;const s=P(t,r,n,void 0,W);if(0===s)return!1;switch(a(z,-s,r.viewRight),n.tiltMode){case w.LOOK_AROUND:u(_,r.viewForward,z),m(_,_,W.eyeCenterDistance),r.center=l(G,r.eye,_);break;case w.TUMBLE:c(_,r.center,r.eye),u(_,_,z),r.eye=c(G,r.center,_);break;default:e(n.tiltMode)}return r.up=u(G,r.up,z),!W.requiresTwoSteps||!i||U(t,r,n,!1)}function P(e,t,r=A,n=A,i){if(!e.state.constraints.tilt)return 0;const s=t.distance,a=e.state.constraints.tilt(s,Q);return B(e,r,a),n.interactionType===j.TUMBLE&&D(n.selection,R.ALTITUDE)&&K(e,n.interactionStartCamera,a),r.tiltMode===w.LOOK_AROUND||n.tiltMode===w.LOOK_AROUND?b(e,t,a,i):L(e,t,a)}function L(e,r,n){const i=x(e.renderCoordsHelper,r.center,r.eye),s=i-t(i,n.min,n.max);return H(s)?s:0}function b(e,t,r,n){switch(n&&(n.requiresTwoSteps=!1),e.viewingMode){case"global":return v(e,t,r,n);case"local":return q(e,t,r,n)}}function q(e,r,n,i){const s=x(e.renderCoordsHelper,r.center,r.eye),a=t(s,n.min,n.max),o=s-a;if(!H(o))return 0;if(i){const t=e.pointsOfInterest.centerOnSurfaceFrequent.estimatedSurfaceAltitude,n=e.renderCoordsHelper.getAltitude(r.eye)-t,s=Math.cos(a);Math.abs(s)>1e-4?i.eyeCenterDistance=n/s:i.eyeCenterDistance=r.distance}return o}function v(e,r,n,i){const s=k(e,r,V),a=t(s.tiltAtCenter,n.min,n.max);if(!H(s.tiltAtCenter-a))return 0;let o,c;return s.centerIsOnSurface?(o=g(s),c=F(s,o)):(o=s.constraints.clampTilt(s.eyeCenterDistance,s.tiltAtCenter),i&&o<Math.PI/2&&(i.requiresTwoSteps=!0,o=Math.PI/2-1e-5),c=N(s,o)),i&&(i.eyeCenterDistance=E(s,o)),c}function k(e,t,n){const i=e.pointsOfInterest.centerOnSurfaceFrequent.estimatedSurfaceAltitude,a=i+C(e.spatialReference).radius,o=e.renderCoordsHelper.intersectManifold(t.ray,i,G);return n.eyeCenterDistance=t.distance,n.centerIsOnSurface=!1,s(o)?(n.eyeCenterDistance=d(t.eye,o),n.tiltAtCenter=x(e.renderCoordsHelper,o,t.eye),n.centerIsOnSurface=!0):e.state.isLocal?n.tiltAtCenter=x(e.renderCoordsHelper,t.center,t.eye):(T(I(O,a),t.ray,G),n.eyeCenterDistance=d(t.eye,G),n.tiltAtCenter=r(-f(t.viewForward,p(G,G)))),n.radius=a,n.eyeRadius=y(t.eye),n.constraints=e.state.constraints,n}function H(e){return Math.abs(e)>1e-9}function g(e){const{constraints:t,eyeCenterDistance:r,tiltAtCenter:n}=e;let i=n,s=t.clampTilt(r,n);const a=E(e,s);if(t.clampTilt(a,n)===s)return s;let o=0;for(;o<10&&H(s-i);){const r=(i+s)/2,n=E(e,r);H(t.clampTilt(n,r)-r)?i=r:s=r,o++}return s}function E(e,r){if(!e.centerIsOnSurface)return e.eyeCenterDistance;const i=Math.PI-t(r,0,Math.PI),s=n(e.radius/e.eyeRadius*Math.sin(i)),a=Math.PI-i-s,o=Math.sin(a)/Math.sin(i);if(e.eyeRadius<e.radius&&o>1){const t=Math.PI-s,r=Math.PI-i-t;return Math.sin(r)/Math.sin(i)*e.eyeRadius}return o*e.eyeRadius}function F(e,t){const r=n(e.radius/e.eyeRadius*Math.sin(e.tiltAtCenter)),i=n(e.radius/e.eyeRadius*Math.sin(t));return e.eyeRadius>e.radius?r-i:i-r}function N(e,t){return e.tiltAtCenter-Math.PI/2-(t-Math.PI/2)}function B(e,t,r){if(t.interactionType===j.NONE)return;const{interactionStartCamera:n,interactionFactor:i}=t;if(!n)return;const{min:s,max:a}=r,o=P(e,n,A,t),c=0===o?0:x(e.renderCoordsHelper,n.center,n.eye);r.min=s,r.max=a,t.interactionType===j.TUMBLE?(D(t.selection,R.ALTITUDE)&&K(e,n,r),S(o,c,!0,i,J,r)):S(o,c,!1,i,J,r)}function K(e,t,n){const i=e.state.constraints;if(e.state.isLocal||!i.altitude||!t)return;const s=h(t.center),a=Math.sqrt(s),o=t.distance,c=C(e.spatialReference).radius,u=i.altitude.min+c,m=i.altitude.max+c,l=(u*u-o*o-s)/(-2*a*o),d=(m*m-o*o-s)/(-2*a*o);n.min=Math.max(n.min,Math.min(Math.PI-r(d),n.max)),n.max=Math.min(n.max,Math.PI-r(l))}const _=M(),z=o(),G=M(),J=i(5),Q={min:0,max:0},V={constraints:null,radius:0,eyeRadius:0,centerIsOnSurface:!0,eyeCenterDistance:0,tiltAtCenter:0},W={eyeCenterDistance:0,requiresTwoSteps:!1};export{U as applyTiltConstraint,P as getTiltConstraintError};