UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 2.19 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import t from"../../../../core/Handles.js";import{watch as e,initial as i}from"../../../../core/reactiveUtils.js";import{addFrameTask as a}from"../../../../core/scheduling.js";import{translateBy as s,scaleAndRotateBy as n}from"../../viewpointUtils.js";import{InputHandler as r}from"../../../input/InputHandler.js";import{resetTransformation as o,extractTransformation as h,isZeroTransformation as l}from"../../../navigation/gamepadAndKeyboardUtils.js";class m extends r{constructor(e){super(!0),this._view=e,this._frameTask=null,this._watchHandles=new t,this._currentDevice=null,this._transformation={translation:[0,0,0],heading:0,tilt:0,zoom:0},this._handle=this.registerIncoming("gamepad",(t=>this._handleGamePadEvent(t))),this._handle.pause()}onInstall(t){super.onInstall(t),this._watchHandles.add([e((()=>this._view.navigation.gamepad?.enabled),(t=>{t?(this._handle.resume(),this._frameTask||(this._frameTask=a({update:t=>this._frameUpdate(t.deltaTime)}))):(this._handle.pause(),this._frameTask&&(this._frameTask.remove(),this._frameTask=null))}),i)])}onUninstall(){this._watchHandles.removeAll(),this._frameTask&&(this._frameTask.remove(),this._frameTask=null),super.onUninstall()}_handleGamePadEvent(t){const e=this._view.navigation.gamepad.device;e&&t.data.device!==e||this._currentDevice&&this._currentDevice!==t.data.device||("end"===t.data.action?(this._currentDevice=null,o(this._transformation)):(this._currentDevice=t.data.device,h(t.data,this._view.navigation.gamepad,this._transformation)),this._frameTask?.resume())}_frameUpdate(t){const e=this._transformation;if(l(e))return void this._frameTask?.pause();const i=this._view.viewpoint.clone(),a=this._view.navigation.gamepad.velocityFactor,r=_*a*t;s(i,i,[e.translation[0]*r,-e.translation[1]*r]);const o=1+e.translation[2]*c*t,h=this._view.constraints.rotationEnabled?-e.heading*d*t:0,m=this._view.size,v=[m[0]/2,m[1]];n(i,i,o,h,v,m);const p=this._view.constraints.constrain(i,this._view.viewpoint);this._view.viewpoint=p}}const d=.06,_=.7,c=6e-4;export{m as GamepadNavigation};