@al8b/input 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/core/input-manager.d.mts +25 -0
- package/dist/core/input-manager.d.ts +25 -0
- package/dist/core/input-manager.js +724 -0
- package/dist/core/input-manager.js.map +1 -0
- package/dist/core/input-manager.mjs +701 -0
- package/dist/core/input-manager.mjs.map +1 -0
- package/dist/devices/gamepad.d.mts +24 -0
- package/dist/devices/gamepad.d.ts +24 -0
- package/dist/devices/gamepad.js +244 -0
- package/dist/devices/gamepad.js.map +1 -0
- package/dist/devices/gamepad.mjs +221 -0
- package/dist/devices/gamepad.mjs.map +1 -0
- package/dist/devices/keyboard.d.mts +16 -0
- package/dist/devices/keyboard.d.ts +16 -0
- package/dist/devices/keyboard.js +131 -0
- package/dist/devices/keyboard.js.map +1 -0
- package/dist/devices/keyboard.mjs +106 -0
- package/dist/devices/keyboard.mjs.map +1 -0
- package/dist/devices/mouse.d.mts +21 -0
- package/dist/devices/mouse.d.ts +21 -0
- package/dist/devices/mouse.js +207 -0
- package/dist/devices/mouse.js.map +1 -0
- package/dist/devices/mouse.mjs +182 -0
- package/dist/devices/mouse.mjs.map +1 -0
- package/dist/devices/touch.d.mts +22 -0
- package/dist/devices/touch.d.ts +22 -0
- package/dist/devices/touch.js +186 -0
- package/dist/devices/touch.js.map +1 -0
- package/dist/devices/touch.mjs +161 -0
- package/dist/devices/touch.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +735 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +706 -0
- package/dist/index.mjs.map +1 -0
- package/dist/shared/constants.d.mts +6 -0
- package/dist/shared/constants.d.ts +6 -0
- package/dist/shared/constants.js +40 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/constants.mjs +12 -0
- package/dist/shared/constants.mjs.map +1 -0
- package/dist/shared/utils.d.mts +9 -0
- package/dist/shared/utils.d.ts +9 -0
- package/dist/shared/utils.js +56 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/shared/utils.mjs +29 -0
- package/dist/shared/utils.mjs.map +1 -0
- package/dist/types/index.d.mts +41 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/shared/constants.ts
|
|
5
|
+
var NORMALIZED_SCALE = 200;
|
|
6
|
+
var OUT_OF_BOUNDS = -1e4;
|
|
7
|
+
|
|
8
|
+
// src/shared/utils.ts
|
|
9
|
+
var hasDocument = typeof document !== "undefined";
|
|
10
|
+
var computeRelativePosition = /* @__PURE__ */ __name((canvas, clientX, clientY) => {
|
|
11
|
+
const rect = canvas.getBoundingClientRect();
|
|
12
|
+
const min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;
|
|
13
|
+
const x = (clientX - rect.left - canvas.clientWidth / 2) / min * NORMALIZED_SCALE;
|
|
14
|
+
const y = (canvas.clientHeight / 2 - (clientY - rect.top)) / min * NORMALIZED_SCALE;
|
|
15
|
+
return {
|
|
16
|
+
x,
|
|
17
|
+
y
|
|
18
|
+
};
|
|
19
|
+
}, "computeRelativePosition");
|
|
20
|
+
|
|
21
|
+
// src/devices/mouse.ts
|
|
22
|
+
var MouseInput = class {
|
|
23
|
+
static {
|
|
24
|
+
__name(this, "MouseInput");
|
|
25
|
+
}
|
|
26
|
+
state = {
|
|
27
|
+
x: OUT_OF_BOUNDS,
|
|
28
|
+
y: OUT_OF_BOUNDS,
|
|
29
|
+
pressed: 0,
|
|
30
|
+
left: 0,
|
|
31
|
+
middle: 0,
|
|
32
|
+
right: 0,
|
|
33
|
+
press: 0,
|
|
34
|
+
release: 0,
|
|
35
|
+
wheel: 0
|
|
36
|
+
};
|
|
37
|
+
previousPressed = false;
|
|
38
|
+
wheel = 0;
|
|
39
|
+
canvas;
|
|
40
|
+
removeListeners;
|
|
41
|
+
constructor(canvas) {
|
|
42
|
+
if (canvas) {
|
|
43
|
+
this.setCanvas(canvas);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
setCanvas(canvas) {
|
|
47
|
+
this.detach();
|
|
48
|
+
this.canvas = canvas;
|
|
49
|
+
this.attach();
|
|
50
|
+
}
|
|
51
|
+
syncFromTouch(x, y, touching) {
|
|
52
|
+
this.state.x = x;
|
|
53
|
+
this.state.y = y;
|
|
54
|
+
if (touching) {
|
|
55
|
+
this.state.left = 1;
|
|
56
|
+
this.state.middle = 0;
|
|
57
|
+
this.state.right = 0;
|
|
58
|
+
this.state.pressed = 1;
|
|
59
|
+
} else {
|
|
60
|
+
this.state.left = 0;
|
|
61
|
+
this.state.middle = 0;
|
|
62
|
+
this.state.right = 0;
|
|
63
|
+
this.state.pressed = 0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
update() {
|
|
67
|
+
if (this.state.pressed && !this.previousPressed) {
|
|
68
|
+
this.previousPressed = true;
|
|
69
|
+
this.state.press = 1;
|
|
70
|
+
} else {
|
|
71
|
+
this.state.press = 0;
|
|
72
|
+
}
|
|
73
|
+
if (!this.state.pressed && this.previousPressed) {
|
|
74
|
+
this.previousPressed = false;
|
|
75
|
+
this.state.release = 1;
|
|
76
|
+
} else {
|
|
77
|
+
this.state.release = 0;
|
|
78
|
+
}
|
|
79
|
+
this.state.wheel = this.wheel;
|
|
80
|
+
this.wheel = 0;
|
|
81
|
+
}
|
|
82
|
+
attach() {
|
|
83
|
+
if (!hasDocument) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const target = document;
|
|
87
|
+
const onDown = /* @__PURE__ */ __name((event) => this.handleMouseDown(event), "onDown");
|
|
88
|
+
const onMove = /* @__PURE__ */ __name((event) => this.handleMouseMove(event), "onMove");
|
|
89
|
+
const onUp = /* @__PURE__ */ __name((event) => this.handleMouseUp(event), "onUp");
|
|
90
|
+
const onWheel = /* @__PURE__ */ __name((event) => this.handleWheel(event), "onWheel");
|
|
91
|
+
const onDomWheel = /* @__PURE__ */ __name((event) => this.handleWheel(event), "onDomWheel");
|
|
92
|
+
target.addEventListener("mousedown", onDown, {
|
|
93
|
+
passive: false
|
|
94
|
+
});
|
|
95
|
+
target.addEventListener("mousemove", onMove, {
|
|
96
|
+
passive: false
|
|
97
|
+
});
|
|
98
|
+
target.addEventListener("mouseup", onUp, {
|
|
99
|
+
passive: false
|
|
100
|
+
});
|
|
101
|
+
target.addEventListener("mousewheel", onWheel, {
|
|
102
|
+
passive: false
|
|
103
|
+
});
|
|
104
|
+
target.addEventListener("DOMMouseScroll", onDomWheel, {
|
|
105
|
+
passive: false
|
|
106
|
+
});
|
|
107
|
+
this.removeListeners = () => {
|
|
108
|
+
target.removeEventListener("mousedown", onDown);
|
|
109
|
+
target.removeEventListener("mousemove", onMove);
|
|
110
|
+
target.removeEventListener("mouseup", onUp);
|
|
111
|
+
target.removeEventListener("mousewheel", onWheel);
|
|
112
|
+
target.removeEventListener("DOMMouseScroll", onDomWheel);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
detach() {
|
|
116
|
+
this.removeListeners?.();
|
|
117
|
+
this.removeListeners = void 0;
|
|
118
|
+
this.canvas = void 0;
|
|
119
|
+
}
|
|
120
|
+
handleMouseDown(event) {
|
|
121
|
+
if (!this.canvas) return;
|
|
122
|
+
event.preventDefault();
|
|
123
|
+
const { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);
|
|
124
|
+
this.state.x = x;
|
|
125
|
+
this.state.y = y;
|
|
126
|
+
switch (event.button) {
|
|
127
|
+
case 0:
|
|
128
|
+
this.state.left = 1;
|
|
129
|
+
break;
|
|
130
|
+
case 1:
|
|
131
|
+
this.state.middle = 1;
|
|
132
|
+
break;
|
|
133
|
+
case 2:
|
|
134
|
+
this.state.right = 1;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
this.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);
|
|
138
|
+
}
|
|
139
|
+
handleMouseMove(event) {
|
|
140
|
+
if (!this.canvas) return;
|
|
141
|
+
event.preventDefault();
|
|
142
|
+
const { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);
|
|
143
|
+
this.state.x = x;
|
|
144
|
+
this.state.y = y;
|
|
145
|
+
}
|
|
146
|
+
handleMouseUp(event) {
|
|
147
|
+
if (!this.canvas) return;
|
|
148
|
+
event.preventDefault();
|
|
149
|
+
const { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);
|
|
150
|
+
this.state.x = x;
|
|
151
|
+
this.state.y = y;
|
|
152
|
+
switch (event.button) {
|
|
153
|
+
case 0:
|
|
154
|
+
this.state.left = 0;
|
|
155
|
+
break;
|
|
156
|
+
case 1:
|
|
157
|
+
this.state.middle = 0;
|
|
158
|
+
break;
|
|
159
|
+
case 2:
|
|
160
|
+
this.state.right = 0;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
this.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);
|
|
164
|
+
}
|
|
165
|
+
handleWheel(event) {
|
|
166
|
+
const wheelEvent = event;
|
|
167
|
+
if (typeof wheelEvent.deltaY === "number" && wheelEvent.deltaY !== 0) {
|
|
168
|
+
this.wheel = wheelEvent.deltaY > 0 ? -1 : 1;
|
|
169
|
+
} else if (typeof wheelEvent.wheelDelta === "number" && wheelEvent.wheelDelta !== 0) {
|
|
170
|
+
this.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;
|
|
171
|
+
} else if (typeof wheelEvent.detail === "number" && wheelEvent.detail !== 0) {
|
|
172
|
+
this.wheel = wheelEvent.detail > 0 ? -1 : 1;
|
|
173
|
+
} else {
|
|
174
|
+
this.wheel = 0;
|
|
175
|
+
}
|
|
176
|
+
event.preventDefault();
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
export {
|
|
180
|
+
MouseInput
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=mouse.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/constants.ts","../../src/shared/utils.ts","../../src/devices/mouse.ts"],"sourcesContent":["export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n"],"mappings":"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","names":["NORMALIZED_SCALE","OUT_OF_BOUNDS","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","MouseInput","state","x","OUT_OF_BOUNDS","y","pressed","left","middle","right","press","release","wheel","previousPressed","canvas","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","update","hasDocument","target","document","onDown","event","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","addEventListener","passive","removeEventListener","undefined","preventDefault","computeRelativePosition","clientX","clientY","button","Math","min","wheelEvent","deltaY","wheelDelta","detail"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TouchState } from '../types/index.mjs';
|
|
2
|
+
import { MouseInput } from './mouse.mjs';
|
|
3
|
+
|
|
4
|
+
declare class TouchInput {
|
|
5
|
+
private mouse;
|
|
6
|
+
readonly state: TouchState;
|
|
7
|
+
private touches;
|
|
8
|
+
private previousTouching;
|
|
9
|
+
private canvas?;
|
|
10
|
+
private removeListeners?;
|
|
11
|
+
constructor(mouse: MouseInput, canvas?: HTMLCanvasElement);
|
|
12
|
+
setCanvas(canvas: HTMLCanvasElement): void;
|
|
13
|
+
update(): void;
|
|
14
|
+
private syncMouseTouch;
|
|
15
|
+
private attach;
|
|
16
|
+
private detach;
|
|
17
|
+
private handleTouchStart;
|
|
18
|
+
private handleTouchMove;
|
|
19
|
+
private handleTouchEnd;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { TouchInput };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { TouchState } from '../types/index.js';
|
|
2
|
+
import { MouseInput } from './mouse.js';
|
|
3
|
+
|
|
4
|
+
declare class TouchInput {
|
|
5
|
+
private mouse;
|
|
6
|
+
readonly state: TouchState;
|
|
7
|
+
private touches;
|
|
8
|
+
private previousTouching;
|
|
9
|
+
private canvas?;
|
|
10
|
+
private removeListeners?;
|
|
11
|
+
constructor(mouse: MouseInput, canvas?: HTMLCanvasElement);
|
|
12
|
+
setCanvas(canvas: HTMLCanvasElement): void;
|
|
13
|
+
update(): void;
|
|
14
|
+
private syncMouseTouch;
|
|
15
|
+
private attach;
|
|
16
|
+
private detach;
|
|
17
|
+
private handleTouchStart;
|
|
18
|
+
private handleTouchMove;
|
|
19
|
+
private handleTouchEnd;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { TouchInput };
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/devices/touch.ts
|
|
22
|
+
var touch_exports = {};
|
|
23
|
+
__export(touch_exports, {
|
|
24
|
+
TouchInput: () => TouchInput
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(touch_exports);
|
|
27
|
+
|
|
28
|
+
// src/shared/constants.ts
|
|
29
|
+
var NORMALIZED_SCALE = 200;
|
|
30
|
+
var TOUCH_MOUSE_ID = "mouse";
|
|
31
|
+
|
|
32
|
+
// src/shared/utils.ts
|
|
33
|
+
var hasDocument = typeof document !== "undefined";
|
|
34
|
+
var computeRelativePosition = /* @__PURE__ */ __name((canvas, clientX, clientY) => {
|
|
35
|
+
const rect = canvas.getBoundingClientRect();
|
|
36
|
+
const min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;
|
|
37
|
+
const x = (clientX - rect.left - canvas.clientWidth / 2) / min * NORMALIZED_SCALE;
|
|
38
|
+
const y = (canvas.clientHeight / 2 - (clientY - rect.top)) / min * NORMALIZED_SCALE;
|
|
39
|
+
return {
|
|
40
|
+
x,
|
|
41
|
+
y
|
|
42
|
+
};
|
|
43
|
+
}, "computeRelativePosition");
|
|
44
|
+
|
|
45
|
+
// src/devices/touch.ts
|
|
46
|
+
var TouchInput = class {
|
|
47
|
+
static {
|
|
48
|
+
__name(this, "TouchInput");
|
|
49
|
+
}
|
|
50
|
+
mouse;
|
|
51
|
+
state = {
|
|
52
|
+
touching: 0,
|
|
53
|
+
x: 0,
|
|
54
|
+
y: 0,
|
|
55
|
+
press: 0,
|
|
56
|
+
release: 0,
|
|
57
|
+
touches: []
|
|
58
|
+
};
|
|
59
|
+
touches = /* @__PURE__ */ new Map();
|
|
60
|
+
previousTouching = false;
|
|
61
|
+
canvas;
|
|
62
|
+
removeListeners;
|
|
63
|
+
constructor(mouse, canvas) {
|
|
64
|
+
this.mouse = mouse;
|
|
65
|
+
if (canvas) {
|
|
66
|
+
this.setCanvas(canvas);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
setCanvas(canvas) {
|
|
70
|
+
this.detach();
|
|
71
|
+
this.canvas = canvas;
|
|
72
|
+
this.attach();
|
|
73
|
+
}
|
|
74
|
+
update() {
|
|
75
|
+
this.syncMouseTouch();
|
|
76
|
+
const list = [];
|
|
77
|
+
for (const [id, { x, y }] of this.touches.entries()) {
|
|
78
|
+
list.push({
|
|
79
|
+
id,
|
|
80
|
+
x,
|
|
81
|
+
y
|
|
82
|
+
});
|
|
83
|
+
this.state.x = x;
|
|
84
|
+
this.state.y = y;
|
|
85
|
+
}
|
|
86
|
+
this.state.touches = list;
|
|
87
|
+
this.state.touching = this.touches.size > 0 ? 1 : 0;
|
|
88
|
+
if (this.state.touching && !this.previousTouching) {
|
|
89
|
+
this.previousTouching = true;
|
|
90
|
+
this.state.press = 1;
|
|
91
|
+
} else {
|
|
92
|
+
this.state.press = 0;
|
|
93
|
+
}
|
|
94
|
+
if (!this.state.touching && this.previousTouching) {
|
|
95
|
+
this.previousTouching = false;
|
|
96
|
+
this.state.release = 1;
|
|
97
|
+
} else {
|
|
98
|
+
this.state.release = 0;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
syncMouseTouch() {
|
|
102
|
+
const mouseState = this.mouse.state;
|
|
103
|
+
if (mouseState.pressed) {
|
|
104
|
+
this.touches.set(TOUCH_MOUSE_ID, {
|
|
105
|
+
x: mouseState.x,
|
|
106
|
+
y: mouseState.y
|
|
107
|
+
});
|
|
108
|
+
} else {
|
|
109
|
+
this.touches.delete(TOUCH_MOUSE_ID);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
attach() {
|
|
113
|
+
if (!hasDocument) return;
|
|
114
|
+
const onStart = /* @__PURE__ */ __name((event) => this.handleTouchStart(event), "onStart");
|
|
115
|
+
const onMove = /* @__PURE__ */ __name((event) => this.handleTouchMove(event), "onMove");
|
|
116
|
+
const onEnd = /* @__PURE__ */ __name((event) => this.handleTouchEnd(event), "onEnd");
|
|
117
|
+
document.addEventListener("touchstart", onStart, {
|
|
118
|
+
passive: false
|
|
119
|
+
});
|
|
120
|
+
document.addEventListener("touchmove", onMove, {
|
|
121
|
+
passive: false
|
|
122
|
+
});
|
|
123
|
+
document.addEventListener("touchend", onEnd, {
|
|
124
|
+
passive: false
|
|
125
|
+
});
|
|
126
|
+
document.addEventListener("touchcancel", onEnd, {
|
|
127
|
+
passive: false
|
|
128
|
+
});
|
|
129
|
+
this.removeListeners = () => {
|
|
130
|
+
document.removeEventListener("touchstart", onStart);
|
|
131
|
+
document.removeEventListener("touchmove", onMove);
|
|
132
|
+
document.removeEventListener("touchend", onEnd);
|
|
133
|
+
document.removeEventListener("touchcancel", onEnd);
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
detach() {
|
|
137
|
+
this.removeListeners?.();
|
|
138
|
+
this.removeListeners = void 0;
|
|
139
|
+
this.canvas = void 0;
|
|
140
|
+
this.touches.clear();
|
|
141
|
+
}
|
|
142
|
+
handleTouchStart(event) {
|
|
143
|
+
if (!this.canvas) return;
|
|
144
|
+
event.preventDefault();
|
|
145
|
+
event.stopPropagation();
|
|
146
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
147
|
+
const t = event.changedTouches[i];
|
|
148
|
+
const { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);
|
|
149
|
+
this.touches.set(t.identifier, {
|
|
150
|
+
x,
|
|
151
|
+
y
|
|
152
|
+
});
|
|
153
|
+
this.mouse.syncFromTouch(x, y, true);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
handleTouchMove(event) {
|
|
157
|
+
if (!this.canvas) return;
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
event.stopPropagation();
|
|
160
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
161
|
+
const t = event.changedTouches[i];
|
|
162
|
+
if (!this.touches.has(t.identifier)) continue;
|
|
163
|
+
const { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);
|
|
164
|
+
this.touches.set(t.identifier, {
|
|
165
|
+
x,
|
|
166
|
+
y
|
|
167
|
+
});
|
|
168
|
+
this.mouse.syncFromTouch(x, y, true);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
handleTouchEnd(event) {
|
|
172
|
+
if (!this.canvas) return;
|
|
173
|
+
event.preventDefault();
|
|
174
|
+
event.stopPropagation();
|
|
175
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
176
|
+
const t = event.changedTouches[i];
|
|
177
|
+
this.touches.delete(t.identifier);
|
|
178
|
+
}
|
|
179
|
+
this.mouse.syncFromTouch(this.state.x, this.state.y, false);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
183
|
+
0 && (module.exports = {
|
|
184
|
+
TouchInput
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=touch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/devices/touch.ts","../../src/shared/constants.ts","../../src/shared/utils.ts"],"sourcesContent":["import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n"],"mappings":"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","names":["NORMALIZED_SCALE","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has"]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/shared/constants.ts
|
|
5
|
+
var NORMALIZED_SCALE = 200;
|
|
6
|
+
var TOUCH_MOUSE_ID = "mouse";
|
|
7
|
+
|
|
8
|
+
// src/shared/utils.ts
|
|
9
|
+
var hasDocument = typeof document !== "undefined";
|
|
10
|
+
var computeRelativePosition = /* @__PURE__ */ __name((canvas, clientX, clientY) => {
|
|
11
|
+
const rect = canvas.getBoundingClientRect();
|
|
12
|
+
const min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;
|
|
13
|
+
const x = (clientX - rect.left - canvas.clientWidth / 2) / min * NORMALIZED_SCALE;
|
|
14
|
+
const y = (canvas.clientHeight / 2 - (clientY - rect.top)) / min * NORMALIZED_SCALE;
|
|
15
|
+
return {
|
|
16
|
+
x,
|
|
17
|
+
y
|
|
18
|
+
};
|
|
19
|
+
}, "computeRelativePosition");
|
|
20
|
+
|
|
21
|
+
// src/devices/touch.ts
|
|
22
|
+
var TouchInput = class {
|
|
23
|
+
static {
|
|
24
|
+
__name(this, "TouchInput");
|
|
25
|
+
}
|
|
26
|
+
mouse;
|
|
27
|
+
state = {
|
|
28
|
+
touching: 0,
|
|
29
|
+
x: 0,
|
|
30
|
+
y: 0,
|
|
31
|
+
press: 0,
|
|
32
|
+
release: 0,
|
|
33
|
+
touches: []
|
|
34
|
+
};
|
|
35
|
+
touches = /* @__PURE__ */ new Map();
|
|
36
|
+
previousTouching = false;
|
|
37
|
+
canvas;
|
|
38
|
+
removeListeners;
|
|
39
|
+
constructor(mouse, canvas) {
|
|
40
|
+
this.mouse = mouse;
|
|
41
|
+
if (canvas) {
|
|
42
|
+
this.setCanvas(canvas);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
setCanvas(canvas) {
|
|
46
|
+
this.detach();
|
|
47
|
+
this.canvas = canvas;
|
|
48
|
+
this.attach();
|
|
49
|
+
}
|
|
50
|
+
update() {
|
|
51
|
+
this.syncMouseTouch();
|
|
52
|
+
const list = [];
|
|
53
|
+
for (const [id, { x, y }] of this.touches.entries()) {
|
|
54
|
+
list.push({
|
|
55
|
+
id,
|
|
56
|
+
x,
|
|
57
|
+
y
|
|
58
|
+
});
|
|
59
|
+
this.state.x = x;
|
|
60
|
+
this.state.y = y;
|
|
61
|
+
}
|
|
62
|
+
this.state.touches = list;
|
|
63
|
+
this.state.touching = this.touches.size > 0 ? 1 : 0;
|
|
64
|
+
if (this.state.touching && !this.previousTouching) {
|
|
65
|
+
this.previousTouching = true;
|
|
66
|
+
this.state.press = 1;
|
|
67
|
+
} else {
|
|
68
|
+
this.state.press = 0;
|
|
69
|
+
}
|
|
70
|
+
if (!this.state.touching && this.previousTouching) {
|
|
71
|
+
this.previousTouching = false;
|
|
72
|
+
this.state.release = 1;
|
|
73
|
+
} else {
|
|
74
|
+
this.state.release = 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
syncMouseTouch() {
|
|
78
|
+
const mouseState = this.mouse.state;
|
|
79
|
+
if (mouseState.pressed) {
|
|
80
|
+
this.touches.set(TOUCH_MOUSE_ID, {
|
|
81
|
+
x: mouseState.x,
|
|
82
|
+
y: mouseState.y
|
|
83
|
+
});
|
|
84
|
+
} else {
|
|
85
|
+
this.touches.delete(TOUCH_MOUSE_ID);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
attach() {
|
|
89
|
+
if (!hasDocument) return;
|
|
90
|
+
const onStart = /* @__PURE__ */ __name((event) => this.handleTouchStart(event), "onStart");
|
|
91
|
+
const onMove = /* @__PURE__ */ __name((event) => this.handleTouchMove(event), "onMove");
|
|
92
|
+
const onEnd = /* @__PURE__ */ __name((event) => this.handleTouchEnd(event), "onEnd");
|
|
93
|
+
document.addEventListener("touchstart", onStart, {
|
|
94
|
+
passive: false
|
|
95
|
+
});
|
|
96
|
+
document.addEventListener("touchmove", onMove, {
|
|
97
|
+
passive: false
|
|
98
|
+
});
|
|
99
|
+
document.addEventListener("touchend", onEnd, {
|
|
100
|
+
passive: false
|
|
101
|
+
});
|
|
102
|
+
document.addEventListener("touchcancel", onEnd, {
|
|
103
|
+
passive: false
|
|
104
|
+
});
|
|
105
|
+
this.removeListeners = () => {
|
|
106
|
+
document.removeEventListener("touchstart", onStart);
|
|
107
|
+
document.removeEventListener("touchmove", onMove);
|
|
108
|
+
document.removeEventListener("touchend", onEnd);
|
|
109
|
+
document.removeEventListener("touchcancel", onEnd);
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
detach() {
|
|
113
|
+
this.removeListeners?.();
|
|
114
|
+
this.removeListeners = void 0;
|
|
115
|
+
this.canvas = void 0;
|
|
116
|
+
this.touches.clear();
|
|
117
|
+
}
|
|
118
|
+
handleTouchStart(event) {
|
|
119
|
+
if (!this.canvas) return;
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
event.stopPropagation();
|
|
122
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
123
|
+
const t = event.changedTouches[i];
|
|
124
|
+
const { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);
|
|
125
|
+
this.touches.set(t.identifier, {
|
|
126
|
+
x,
|
|
127
|
+
y
|
|
128
|
+
});
|
|
129
|
+
this.mouse.syncFromTouch(x, y, true);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
handleTouchMove(event) {
|
|
133
|
+
if (!this.canvas) return;
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
event.stopPropagation();
|
|
136
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
137
|
+
const t = event.changedTouches[i];
|
|
138
|
+
if (!this.touches.has(t.identifier)) continue;
|
|
139
|
+
const { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);
|
|
140
|
+
this.touches.set(t.identifier, {
|
|
141
|
+
x,
|
|
142
|
+
y
|
|
143
|
+
});
|
|
144
|
+
this.mouse.syncFromTouch(x, y, true);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
handleTouchEnd(event) {
|
|
148
|
+
if (!this.canvas) return;
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
for (let i = 0; i < event.changedTouches.length; i++) {
|
|
152
|
+
const t = event.changedTouches[i];
|
|
153
|
+
this.touches.delete(t.identifier);
|
|
154
|
+
}
|
|
155
|
+
this.mouse.syncFromTouch(this.state.x, this.state.y, false);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
export {
|
|
159
|
+
TouchInput
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=touch.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/constants.ts","../../src/shared/utils.ts","../../src/devices/touch.ts"],"sourcesContent":["export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n"],"mappings":"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","names":["NORMALIZED_SCALE","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Input, Input as default } from './core/input-manager.mjs';
|
|
2
|
+
export { GamepadInput } from './devices/gamepad.mjs';
|
|
3
|
+
export { KeyboardInput } from './devices/keyboard.mjs';
|
|
4
|
+
export { MouseInput } from './devices/mouse.mjs';
|
|
5
|
+
export { TouchInput } from './devices/touch.mjs';
|
|
6
|
+
export { KeyboardPressRelease, KeyboardState, MouseState, PointerIdentifier, TouchPoint, TouchState } from './types/index.mjs';
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Input, Input as default } from './core/input-manager.js';
|
|
2
|
+
export { GamepadInput } from './devices/gamepad.js';
|
|
3
|
+
export { KeyboardInput } from './devices/keyboard.js';
|
|
4
|
+
export { MouseInput } from './devices/mouse.js';
|
|
5
|
+
export { TouchInput } from './devices/touch.js';
|
|
6
|
+
export { KeyboardPressRelease, KeyboardState, MouseState, PointerIdentifier, TouchPoint, TouchState } from './types/index.js';
|