@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
118 lines • 10.7 kB
JavaScript
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);
}
isTouching(hitTest) {
if (!this.pointerEvent)
return false;
if (!hitTest)
return true;
return hitTest(this.current);
}
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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