import { BaseInput } from './base-input'; export class Mouse extends BaseInput { constructor(element) { super(element); this.mousePosition = new Position(); this.mouseDelta = new Delta(); this.mouseWheel = new Delta(); this.mouseButtons = new MouseButtons(); } capture() { this.handleMouseDown = this.handleMouseDown.bind(this); this.handleMouseMove = this.handleMouseMove.bind(this); this.handleMouseUp = this.handleMouseUp.bind(this); this.handlePointerChange = this.handlePointerChange.bind(this); this.active = true; this.element.addEventListener('mousedown', this.handleMouseDown); this.element.addEventListener('mousemove', this.handleMouseMove); this.element.addEventListener('mouseup', this.handleMouseUp); document.addEventListener('pointerlockchange', this.handlePointerChange); } release() { this.active = false; this.element.removeEventListener('mousedown', this.handleMouseDown); this.element.removeEventListener('mousemove', this.handleMouseMove); this.element.removeEventListener('mouseup', this.handleMouseUp); } getState() { const { mouseButtons, mouseDelta, mousePosition, mouseWheel } = this; const state = { mouseButtons: { keysDown: new Map(this.mouseButtons.keysDown), keysJustPressed: new Map(this.mouseButtons.keysJustPressed), keysJustReleased: new Map(this.mouseButtons.keysJustReleased) }, mouseDelta, mousePosition, mouseWheel }; this.mouseButtons.keysJustPressed.clear(); this.mouseButtons.keysJustReleased.clear(); this.mouseDelta.x = 0; this.mouseDelta.y = 0; return state; } handleMouseDown(event) { if (this.active) event.preventDefault(); this.mouseButtons.keysDown.set(event.button, true); this.mouseButtons.keysJustPressed.set(event.button, true); this.mouseButtons.keysJustReleased.set(event.button, false); } handleMouseMove(event) { if (this.active) event.preventDefault(); this.mousePosition.x = event.clientX; this.mousePosition.y = event.clientY; this.mouseDelta.x = event.movementX; this.mouseDelta.y = event.movementY; } handleMouseUp(event) { if (this.active) event.preventDefault(); this.mouseButtons.keysJustReleased.set(event.button, true); this.mouseButtons.keysDown.set(event.button, false); this.mouseButtons.keysJustPressed.set(event.button, false); } handlePointerChange() { if (document.pointerLockElement !== this.element) { this.element.addEventListener('click', () => { this.element.requestPointerLock(); }, { once: true }); } } } export class Position { } export class MouseButtons { constructor() { this.keysDown = new Map(); this.keysJustPressed = new Map(); this.keysJustReleased = new Map(); } } export class Delta { }