UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

58 lines (57 loc) 1.2 kB
import { InputSource } from "../input.js"; const BUTTON_CODES = { A: 0, B: 1, X: 2, Y: 3, LB: 4, RB: 5, LT: 6, RT: 7, SELECT: 8, START: 9, LEFT_STICK: 10, RIGHT_STICK: 11 }; const BUTTON_COUNT = Object.keys(BUTTON_CODES).length; class GamepadSource extends InputSource { static buttonCode = BUTTON_CODES; _buttonPrev = Array(BUTTON_COUNT).fill(0); constructor() { super({ buttons: Array(BUTTON_COUNT).fill(0), leftStick: [0, 0], rightStick: [0, 0] }); } read() { const gamepads = navigator.getGamepads(); for (let i = 0; i < gamepads.length; i++) { const gp = gamepads[i]; if (!gp) { continue; } if (gp.mapping !== "standard") { continue; } if (gp.axes.length < 4) { continue; } if (gp.buttons.length < BUTTON_COUNT) { continue; } const { buttons, axes } = gp; for (let j = 0; j < this._buttonPrev.length; j++) { const state = +buttons[j].pressed; this.deltas.buttons[j] = state - this._buttonPrev[j]; this._buttonPrev[j] = state; } this.deltas.leftStick.append([axes[0], axes[1]]); this.deltas.rightStick.append([axes[2], axes[3]]); } return super.read(); } } export { GamepadSource };