UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 10.7 kB
import{_ as t}from"../../../../chunks/tslib.es6.js";import{neverReached as e}from"../../../../core/compilerUtils.js";import{clamp as i,acosClamped as a,deg2rad as r}from"../../../../core/mathUtils.js";import{isSome as s}from"../../../../core/maybe.js";import{property as o}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/accessorSupport/ensureType.js";import"../../../../core/arrayUtils.js";import{subclass as n}from"../../../../core/accessorSupport/decorators/subclass.js";import{w as c,e as m,i as l}from"../../../../chunks/mat4.js";import{c as p}from"../../../../chunks/mat4f64.js";import{b as h,m as d,a as u,g as _,c as f,o as v,l as C,s as g,n as y,f as w,e as O,i as b,r as S}from"../../../../chunks/vec3.js";import{c as x}from"../../../../chunks/vec3f64.js";import{getReferenceEllipsoid as j}from"../../../../geometry/ellipsoidUtils.js";import{wrap as M}from"../../../../geometry/support/ray.js";import{b as T,e as L,t as A}from"../../../../chunks/sphere.js";import{sv3d as z}from"../../../../geometry/support/vectorStacks.js";import{applyAll as E}from"../../camera/constraintUtils.js";import{ConstraintTypes as D}from"../../camera/constraintUtils/ConstraintTypes.js";import{InteractionType as I}from"../../camera/constraintUtils/InteractionType.js";import{TiltMode as U}from"../../camera/constraintUtils/TiltMode.js";import{TiltDefault as R}from"../Constraints.js";import{InteractiveController as k}from"./InteractiveController.js";import{panMotionToRotationMatrix as H,onSurfaceTiltToEyeTiltGlobal as N,offSurfaceTiltToEyeTiltGlobal as F}from"../utils/navigationUtils.js";import{viewAngle as P}from"../utils/viewUtils.js";import{headingTiltToDirectionUp as G}from"../../support/cameraUtils.js";import{createDirectionUp as V}from"../../support/cameraUtilsInternal.js";import{Camera as B}from"../../webgl-engine/lib/Camera.js";import{extractTransformation as K,isZeroTransformation as X,extractTransformationKeyboard as Z}from"../../../navigation/gamepadAndKeyboardUtils.js";let q=class extends k{constructor(t){super(t),this._filteredSurfaceElevation=0,this._transformation={translation:[0,0,0],heading:0,tilt:0,zoom:0},this._keysButtonState=[0,0,0,0,0,0,0,0,0,0,0,0],this._tmpCamera=new B,this._headingStart=0,this._constraintOptions={selection:D.ALL,interactionType:I.NONE,interactionStartCamera:new B,interactionFactor:0,interactionDirection:null,tiltMode:U.LOOK_AROUND}}handleEventGamepad(t){const e=K(t,this.view.navigation.gamepad,this._transformation);("end"===t.action||X(e))&&this.finishController()}activateDirection(t){this._keysButtonState[t]=1,Z(this._keysButtonState,this._transformation)}deactivateDirection(t){this._keysButtonState[t]=0;const e=Z(this._keysButtonState,this._transformation);X(e)&&this.finishController()}onControllerStart(t){this._filteredSurfaceElevation=this.view.pointsOfInterest.cameraOnSurface.location.z,this._headingStart=this.view.camera.heading,super.onControllerStart(t)}_updateFilteredSurfaceElevation(t){const e=this.view.pointsOfInterest.cameraOnSurface.location.z,i=1;this._filteredSurfaceElevation+=i*(e-this._filteredSurfaceElevation)*t}stepController(t,e){this._updateStartHeading(),this._updateFilteredSurfaceElevation(t),this.currentCamera.copyViewFrom(e),this._updateCameraCenter(),this._constraintOptions.interactionStartCamera?.copyFrom(this.currentCamera),this._calculateControlTransformation(t,this.currentCamera,it),this._applyDisabledMovementTypes(it),this._applyPan(it.pan),this._applyRotate(it.rotate),this._applyZoom(it.zoom),this._applyAscend(it.ascend),this._constraintOptions.interactionType=I.NONE,this._constraintOptions.selection=D.COLLISION,E(this.view,this.currentCamera,this._constraintOptions),super.stepController(t,e)}_updateStartHeading(){0!==this._transformation.heading&&(this._headingStart=this.view.camera.heading)}_applyRotate(t){if(!t.enabled)return;const e=this.currentCamera;h(at,e.center,e.eye),d(at,at,t.matrix),e.center=u(at,at,e.eye),e.up=d(at,e.up,t.matrix),this._constraintOptions.interactionType=I.LOOK_AROUND,this._constraintOptions.selection=D.ALL_EXCEPT_COLLISION,E(this.view,e,this._constraintOptions)}_applyPan(t,e=this.currentCamera){if(!t.enabled)return;e.eye=d(at,e.eye,t.matrix),e.center=d(at,e.center,t.matrix);this.view.state.isGlobal&&(e.up=d(at,e.up,t.matrix)),this._constraintOptions.interactionType=I.PAN,this._constraintOptions.selection=D.ALL,E(this.view,e,this._constraintOptions)}_applyZoom(t){if(!t)return;const e=this.currentCamera.viewForward;this.currentCamera.eye=u(at,this.currentCamera.eye,_(z.get(),e,t)),f(rt,e),v(rt,rt),this._constraintOptions.interactionDirection=rt,this._constraintOptions.interactionType=I.ZOOM,this._constraintOptions.selection=D.ALL_EXCEPT_COLLISION,E(this.view,this.currentCamera,this._constraintOptions),this._constraintOptions.interactionDirection=null}_applyAscend(t){if(!t)return;const e=this.view.renderCoordsHelper.worldUpAtPosition(this.currentCamera.eye,z.get());this._constraintOptions.interactionDirection=f(rt,e);if(this.view.state.isGlobal){const e=C(this.currentCamera.eye),i=(e+t)/e;this.currentCamera.eye=_(at,this.currentCamera.eye,i),this.currentCamera.center=_(at,this.currentCamera.center,i)}else{const i=_(z.get(),e,t);this.currentCamera.eye=u(at,this.currentCamera.eye,i),this.currentCamera.center=u(at,this.currentCamera.center,i)}this._updateCameraCenter(),this._constraintOptions.interactionType=I.ASCEND,this._constraintOptions.selection=D.COLLISION,E(this.view,this.currentCamera,this._constraintOptions)&&this._updateCameraCenter(),this._constraintOptions.selection=D.ALL_EXCEPT_COLLISION,E(this.view,this.currentCamera,this._constraintOptions),this._constraintOptions.interactionDirection=null}_calculateControlTransformation(t,e,i){ot(i);const a=this._computeVelocities(t);this.view.state.isLocal?this._calculateControlTransformationLocal(a,e,i):this._calculateControlTransformationGlobal(a,e,i)}_updateCameraCenter(){const t=this.view.pointsOfInterest.centerOnSurfaceFrequent.estimatedSurfaceAltitude,e=this.view.renderCoordsHelper,i=this.currentCamera.ray;this.currentCamera.center=e.intersectManifoldClosestSilhouette(i,t,at)}_calculateControlTransformationLocal(t,a,r){const{viewRight:s,viewForward:o}=a,n=this._transformation,l=this.view.navigation.gamepad,p=g(z.get(),o[0],o[1],0);y(p,p);const h=n.translation[0]*t.pan;if(0!==h){const t=_(z.get(),s,h);c(r.pan.matrix,r.pan.matrix,t),r.pan.enabled=!0}switch(l.mode){case"pan":{const e=-n.translation[1]*t.pan;if(0!==e){const t=_(z.get(),p,e);c(r.pan.matrix,r.pan.matrix,t),r.pan.enabled=!0}r.zoom=n.zoom*t.zoom;break}case"zoom":r.zoom=(-n.translation[1]+n.zoom)*t.zoom;break;default:e(l.mode)}const d=n.translation[2]*t.ascend;r.ascend=d;const u=-n.heading*t.rotate;0!==u&&(m(r.rotate.matrix,r.rotate.matrix,u,this.view.renderCoordsHelper.worldUpAtPosition(a.eye,z.get())),r.rotate.enabled=!0);const f=n.tilt*t.rotate,v=P(this.view.renderCoordsHelper,a.center,a.eye),C=i(v+f,R.min,R.max)-v;C&&(m(r.rotate.matrix,r.rotate.matrix,C,s),r.rotate.enabled=!0)}_calculateControlTransformationGlobal(t,e,i){const{eye:a,viewRight:r}=e,s=this._transformation,o=this.view.navigation.gamepad,n=w(z.get(),r,a);y(n,n),v(n,n),H(this.startCamera,e,s,t,this.view.camera.heading,this._headingStart,this.view.camera.tilt,i,o),this._tmpCamera.copyFrom(this.currentCamera),this._applyPan(it.pan,this._tmpCamera);const c=this.view.pointsOfInterest.centerOnSurfaceFrequent.estimatedSurfaceAltitude,l=s.translation[2]*t.ascend;i.ascend=l;const p=-s.heading*t.rotate;0!==p&&(m(i.rotate.matrix,i.rotate.matrix,p,this._tmpCamera.eye),i.rotate.enabled=!0);const h=s.tilt*t.rotate,d=this._clampTiltDeltaGlobalToValidRange(h,e.ray,c);0!==d&&(m(i.rotate.matrix,i.rotate.matrix,d,this._tmpCamera.viewRight),i.rotate.enabled=!0),i.zoom+=s.zoom*t.zoom}_clampTiltDeltaGlobalToValidRange(t,e,r){const s=j(this.view.spatialReference),o=N(R.min,e.origin,r,s);let n=0,c=0;const m=z.get();if(this.view.renderCoordsHelper.intersectManifold(e,r,m)){const t=P(this.view.renderCoordsHelper,m,e.origin);n=N(t,e.origin,r,s),c=N(R.max,e.origin,r,s)}else{T(L(A,r+s.radius),e,m);const t=a(-O(e.direction,y(m,m)));n=F(t,e.origin,r,s),c=F(R.max,e.origin,r,s)}return i(n+t,o,c)-n}_getPointAbsoluteSurfaceElevation(t,e,i){const{renderCoordsHelper:a}=this.view,r=a.getAltitude(t),s=e+Math.abs(r-e);return a.setAltitude(i,s,t),s}_clampedDistanceToSurface(t,e){const{renderCoordsHelper:i}=this.view,{camera:a}=this.view.state,{direction:r}=G(this.view,e,0,Q,st),s=i.intersectManifoldClosestSilhouette(M(e,r),t,z.get()),o=b(e,s),n=i.intersectManifoldClosestSilhouette(M(e,S(z.get(),e,a.center)),t,z.get()),c=b(e,n);return Math.min(o,c)}_computeHeadingRotateRadius(t){const{renderCoordsHelper:e,state:i}=this.view,{camera:r,isGlobal:s}=i,o=e.intersectManifoldClosestSilhouette(r.ray,this._filteredSurfaceElevation,z.get());if(s){const e=h(z.get(),t,o),i=C(e);_(e,e,1/i);const r=y(z.get(),t),s=a(O(r,e));return i*Math.sin(Math.min(W,s))}{const i=f(z.get(),t);return e.setAltitude(i,this._filteredSurfaceElevation),b(o,i)}}_minimumAscendVelocity(){return this.view.state.constraints.collision.enabled?0:$}_computeVelocities(t){const e=this._filteredSurfaceElevation,a=e+j(this.view.spatialReference).radius,{camera:r,isGlobal:s}=this.view.state,o=z.get(),n=this._getPointAbsoluteSurfaceElevation(r.eye,e,o),c=this._clampedDistanceToSurface(e,o),m=r.width/2,l=Y*r.width,p=Y*r.width,h=c*Math.tan(.5*r.fovX)/m,d=h/a,u=h/this._computeHeadingRotateRadius(o),_=n-e;return{pan:(s?d:h)*l*t,ascend:Math.max(this._minimumAscendVelocity()*t,2**(l*t/m)*_-_),zoom:2**(l*t/m)*c-c,rotate:i(u*p,tt,et)*t}}_applyDisabledMovementTypes(t){!s(this.disableMovements)||void 0!==this.disableMovements.mode&&this.view.state.viewingMode!==this.disableMovements.mode||(t.zoom=this.disableMovements.zoom?0:t.zoom,t.ascend=this.disableMovements.ascend?0:t.ascend,t.pan.enabled=!this.disableMovements.pan,this.disableMovements.pan&&l(t.pan.matrix),t.rotate.enabled=!this.disableMovements.rotate,this.disableMovements.rotate&&l(t.rotate.matrix))}static activatesFor(t,e){const i=K(e,t.navigation.gamepad,J);return!("end"===e.action||X(i))}};t([o({constructOnly:!0})],q.prototype,"gamepadDevice",void 0),t([o({constructOnly:!0})],q.prototype,"disableMovements",void 0),q=t([n("esri.views.3d.state.controllers.GamepadKeyboardController")],q);const J={translation:[0,0,0],heading:0,tilt:0,zoom:0},Q=80,W=r(Q),Y=.75,$=5,tt=r(30),et=r(80),it={zoom:0,ascend:0,pan:{enabled:!1,matrix:p()},rotate:{enabled:!1,matrix:p()}},at=x(),rt=x(),st=V();function ot(t){t.zoom=0,t.ascend=0,t.pan.enabled=!1,l(t.pan.matrix),t.rotate.enabled=!1,l(t.rotate.matrix)}export{q as GamepadKeyboardController};