UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

111 lines 10.3 kB
import { TgdEvent } from "./../event/index.js"; const MOUSE_BUTTON_RIGHT = 2; export class TgdInputPointerImpl { constructor(canvas) { this.canvas = canvas; this.eventTap = new TgdEvent(); this.eventMoveStart = new TgdEvent(); this.eventMove = new TgdEvent(); this.eventMoveEnd = new TgdEvent(); this.eventZoom = new TgdEvent(); /** * This is a tap only of the pointer touched for less that * `tapDelay` milliseconds. */ this.tapDelay = 300; this.controlKeys = { altKey: false, ctrlKey: false, metaKey: false, shiftKey: false, }; this.start = { x: 0, y: 0, t: 0, fingersCount: 1, }; this.current = { x: 0, y: 0, t: 0, fingersCount: 1, }; this.previous = { x: 0, y: 0, t: 0, fingersCount: 1, }; /** * If not null, the pointer is touching. */ this.pointerEvent = null; this.handleContextMenu = (event) => { event.preventDefault(); }; this.handleCanvasWheel = (event) => { let delta = event.deltaX + event.deltaY + event.deltaZ; delta = delta > 0 ? 1 : -1; this.eventZoom.dispatch(Object.assign({ current: this.getPoint(event), direction: delta, preventDefault: () => event.preventDefault() }, this.controlKeys)); }; this.handlePointerDown = (event) => { if (!event.isPrimary) return; this.canvas.setPointerCapture(event.pointerId); event.preventDefault(); event.stopPropagation(); this.pointerEvent = event; const point = this.getPoint(event); this.start = this.current = this.previous = point; this.eventMoveStart.dispatch(Object.assign({ start: point, current: point, previous: point }, this.controlKeys)); }; this.handlePointerMove = (event) => { if (!event.isPrimary || !this.pointerEvent || !this.canvas) return; this.previous = this.current; this.current = this.getPoint(event); this.eventMove.dispatch(Object.assign({ start: this.start, current: this.current, previous: this.previous }, this.controlKeys)); }; this.handlePointerUp = (event) => { if (!event.isPrimary || !this.pointerEvent) return; event.preventDefault(); this.current = this.getPoint(event); this.eventMoveEnd.dispatch(Object.assign({ start: this.start, current: this.current, previous: this.previous }, this.controlKeys)); this.pointerEvent = null; // Tap event. if (event.timeStamp - this.start.t < this.tapDelay) { this.eventTap.dispatch(Object.assign(Object.assign({}, this.start), this.controlKeys)); } }; canvas.addEventListener("pointerdown", this.handlePointerDown, true); canvas.addEventListener("wheel", this.handleCanvasWheel); canvas.addEventListener("contextmenu", this.handleContextMenu); canvas.addEventListener("pointermove", this.handlePointerMove); canvas.addEventListener("pointerup", this.handlePointerUp); } detach() { const { canvas } = this; if (!canvas) return; canvas.removeEventListener("pointerdown", this.handlePointerDown); canvas.removeEventListener("wheel", this.handleCanvasWheel); canvas.removeEventListener("contextmenu", this.handleContextMenu); canvas.removeEventListener("pointermove", this.handlePointerMove); canvas.removeEventListener("pointerup", this.handlePointerUp); } getPoint(event) { this.controlKeys = { altKey: event.altKey || event.buttons === MOUSE_BUTTON_RIGHT, ctrlKey: event.ctrlKey, metaKey: event.metaKey, shiftKey: event.shiftKey, }; const { left, top, width, height } = this.canvas.getBoundingClientRect(); const x = 2 * ((event.clientX - left) / width - 0.5); const y = -2 * ((event.clientY - top) / height - 0.5); return { x, y, t: event.timeStamp, fingersCount: 1 }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnB1dC9wb2ludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFTckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUE7QUFFNUIsTUFBTSxPQUFPLG1CQUFtQjtJQXlDNUIsWUFBNkIsTUFBeUI7UUFBekIsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUF4QzdDLGFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBcUMsQ0FBQTtRQUM1RCxtQkFBYyxHQUFHLElBQUksUUFBUSxFQUFzQyxDQUFBO1FBQ25FLGNBQVMsR0FBRyxJQUFJLFFBQVEsRUFBc0MsQ0FBQTtRQUM5RCxpQkFBWSxHQUFHLElBQUksUUFBUSxFQUFzQyxDQUFBO1FBQ2pFLGNBQVMsR0FBRyxJQUFJLFFBQVEsRUFBc0MsQ0FBQTtRQUN2RTs7O1dBR0c7UUFDSSxhQUFRLEdBQUcsR0FBRyxDQUFBO1FBRWIsZ0JBQVcsR0FBRztZQUNsQixNQUFNLEVBQUUsS0FBSztZQUNiLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsS0FBSztTQUNsQixDQUFBO1FBQ08sVUFBSyxHQUErQjtZQUN4QyxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixZQUFZLEVBQUUsQ0FBQztTQUNsQixDQUFBO1FBQ08sWUFBTyxHQUErQjtZQUMxQyxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixZQUFZLEVBQUUsQ0FBQztTQUNsQixDQUFBO1FBQ08sYUFBUSxHQUErQjtZQUMzQyxDQUFDLEVBQUUsQ0FBQztZQUNKLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixZQUFZLEVBQUUsQ0FB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