@codexo/exojs 0.6.5 → 0.6.7
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/CHANGELOG.md +88 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/input/GestureRecognizer.d.ts +28 -0
- package/dist/esm/input/GestureRecognizer.js +132 -0
- package/dist/esm/input/GestureRecognizer.js.map +1 -0
- package/dist/esm/input/InputManager.d.ts +19 -0
- package/dist/esm/input/InputManager.js +122 -12
- package/dist/esm/input/InputManager.js.map +1 -1
- package/dist/esm/input/Pointer.d.ts +89 -1
- package/dist/esm/input/Pointer.js +163 -3
- package/dist/esm/input/Pointer.js.map +1 -1
- package/dist/esm/input/index.d.ts +1 -1
- package/dist/esm/input/types.d.ts +80 -0
- package/dist/esm/input/types.js +84 -1
- package/dist/esm/input/types.js.map +1 -1
- package/dist/exo.esm.js +494 -15
- package/dist/exo.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/exo.esm.js
CHANGED
|
@@ -10851,6 +10851,89 @@ var ChannelOffset;
|
|
|
10851
10851
|
ChannelOffset[ChannelOffset["Pointers"] = 256] = "Pointers";
|
|
10852
10852
|
ChannelOffset[ChannelOffset["Gamepads"] = 512] = "Gamepads";
|
|
10853
10853
|
})(ChannelOffset || (ChannelOffset = {}));
|
|
10854
|
+
/** Maximum number of simultaneous tracked pointers (mouse / touch / pen). */
|
|
10855
|
+
const maxPointers = 16;
|
|
10856
|
+
/** Number of channel slots reserved per pointer. 16 pointers × 16 slots = 256 (fills the Pointers category exactly). */
|
|
10857
|
+
const pointerSlotSize = 16;
|
|
10858
|
+
/**
|
|
10859
|
+
* Channel offsets for unified pointer (mouse / touch / pen) state.
|
|
10860
|
+
*
|
|
10861
|
+
* The un-prefixed aliases (Active, X, Y, …) are identical to Slot0Active, Slot0X, Slot0Y, …
|
|
10862
|
+
* and address the primary pointer (slot 0). Use Slot{N}Active / Slot{N}X / Slot{N}Y for
|
|
10863
|
+
* multi-pointer (e.g. pinch) access. Other per-slot channels beyond Active/X/Y are reachable
|
|
10864
|
+
* via arithmetic: `Pointer.X + slotIndex * pointerSlotSize + channelOffset` (Pointer.X = PointerChannel.X).
|
|
10865
|
+
*
|
|
10866
|
+
* @internal — accessed publicly via the `Pointer` class namespace (see Pointer.ts).
|
|
10867
|
+
*/
|
|
10868
|
+
var PointerChannel;
|
|
10869
|
+
(function (PointerChannel) {
|
|
10870
|
+
// --- Convenience aliases for the primary pointer (slot 0) ---
|
|
10871
|
+
PointerChannel[PointerChannel["Active"] = 256] = "Active";
|
|
10872
|
+
PointerChannel[PointerChannel["X"] = 257] = "X";
|
|
10873
|
+
PointerChannel[PointerChannel["Y"] = 258] = "Y";
|
|
10874
|
+
PointerChannel[PointerChannel["Pressure"] = 259] = "Pressure";
|
|
10875
|
+
PointerChannel[PointerChannel["Width"] = 260] = "Width";
|
|
10876
|
+
PointerChannel[PointerChannel["Height"] = 261] = "Height";
|
|
10877
|
+
PointerChannel[PointerChannel["Twist"] = 262] = "Twist";
|
|
10878
|
+
PointerChannel[PointerChannel["TiltX"] = 263] = "TiltX";
|
|
10879
|
+
PointerChannel[PointerChannel["TiltY"] = 264] = "TiltY";
|
|
10880
|
+
PointerChannel[PointerChannel["Left"] = 265] = "Left";
|
|
10881
|
+
PointerChannel[PointerChannel["Right"] = 266] = "Right";
|
|
10882
|
+
PointerChannel[PointerChannel["Middle"] = 267] = "Middle";
|
|
10883
|
+
PointerChannel[PointerChannel["IsMouse"] = 268] = "IsMouse";
|
|
10884
|
+
PointerChannel[PointerChannel["IsTouch"] = 269] = "IsTouch";
|
|
10885
|
+
PointerChannel[PointerChannel["IsPen"] = 270] = "IsPen";
|
|
10886
|
+
PointerChannel[PointerChannel["IsPrimary"] = 271] = "IsPrimary";
|
|
10887
|
+
// --- Per-slot Active/X/Y for multi-pointer access ---
|
|
10888
|
+
PointerChannel[PointerChannel["Slot0Active"] = 256] = "Slot0Active";
|
|
10889
|
+
PointerChannel[PointerChannel["Slot0X"] = 257] = "Slot0X";
|
|
10890
|
+
PointerChannel[PointerChannel["Slot0Y"] = 258] = "Slot0Y";
|
|
10891
|
+
PointerChannel[PointerChannel["Slot1Active"] = 272] = "Slot1Active";
|
|
10892
|
+
PointerChannel[PointerChannel["Slot1X"] = 273] = "Slot1X";
|
|
10893
|
+
PointerChannel[PointerChannel["Slot1Y"] = 274] = "Slot1Y";
|
|
10894
|
+
PointerChannel[PointerChannel["Slot2Active"] = 288] = "Slot2Active";
|
|
10895
|
+
PointerChannel[PointerChannel["Slot2X"] = 289] = "Slot2X";
|
|
10896
|
+
PointerChannel[PointerChannel["Slot2Y"] = 290] = "Slot2Y";
|
|
10897
|
+
PointerChannel[PointerChannel["Slot3Active"] = 304] = "Slot3Active";
|
|
10898
|
+
PointerChannel[PointerChannel["Slot3X"] = 305] = "Slot3X";
|
|
10899
|
+
PointerChannel[PointerChannel["Slot3Y"] = 306] = "Slot3Y";
|
|
10900
|
+
PointerChannel[PointerChannel["Slot4Active"] = 320] = "Slot4Active";
|
|
10901
|
+
PointerChannel[PointerChannel["Slot4X"] = 321] = "Slot4X";
|
|
10902
|
+
PointerChannel[PointerChannel["Slot4Y"] = 322] = "Slot4Y";
|
|
10903
|
+
PointerChannel[PointerChannel["Slot5Active"] = 336] = "Slot5Active";
|
|
10904
|
+
PointerChannel[PointerChannel["Slot5X"] = 337] = "Slot5X";
|
|
10905
|
+
PointerChannel[PointerChannel["Slot5Y"] = 338] = "Slot5Y";
|
|
10906
|
+
PointerChannel[PointerChannel["Slot6Active"] = 352] = "Slot6Active";
|
|
10907
|
+
PointerChannel[PointerChannel["Slot6X"] = 353] = "Slot6X";
|
|
10908
|
+
PointerChannel[PointerChannel["Slot6Y"] = 354] = "Slot6Y";
|
|
10909
|
+
PointerChannel[PointerChannel["Slot7Active"] = 368] = "Slot7Active";
|
|
10910
|
+
PointerChannel[PointerChannel["Slot7X"] = 369] = "Slot7X";
|
|
10911
|
+
PointerChannel[PointerChannel["Slot7Y"] = 370] = "Slot7Y";
|
|
10912
|
+
PointerChannel[PointerChannel["Slot8Active"] = 384] = "Slot8Active";
|
|
10913
|
+
PointerChannel[PointerChannel["Slot8X"] = 385] = "Slot8X";
|
|
10914
|
+
PointerChannel[PointerChannel["Slot8Y"] = 386] = "Slot8Y";
|
|
10915
|
+
PointerChannel[PointerChannel["Slot9Active"] = 400] = "Slot9Active";
|
|
10916
|
+
PointerChannel[PointerChannel["Slot9X"] = 401] = "Slot9X";
|
|
10917
|
+
PointerChannel[PointerChannel["Slot9Y"] = 402] = "Slot9Y";
|
|
10918
|
+
PointerChannel[PointerChannel["Slot10Active"] = 416] = "Slot10Active";
|
|
10919
|
+
PointerChannel[PointerChannel["Slot10X"] = 417] = "Slot10X";
|
|
10920
|
+
PointerChannel[PointerChannel["Slot10Y"] = 418] = "Slot10Y";
|
|
10921
|
+
PointerChannel[PointerChannel["Slot11Active"] = 432] = "Slot11Active";
|
|
10922
|
+
PointerChannel[PointerChannel["Slot11X"] = 433] = "Slot11X";
|
|
10923
|
+
PointerChannel[PointerChannel["Slot11Y"] = 434] = "Slot11Y";
|
|
10924
|
+
PointerChannel[PointerChannel["Slot12Active"] = 448] = "Slot12Active";
|
|
10925
|
+
PointerChannel[PointerChannel["Slot12X"] = 449] = "Slot12X";
|
|
10926
|
+
PointerChannel[PointerChannel["Slot12Y"] = 450] = "Slot12Y";
|
|
10927
|
+
PointerChannel[PointerChannel["Slot13Active"] = 464] = "Slot13Active";
|
|
10928
|
+
PointerChannel[PointerChannel["Slot13X"] = 465] = "Slot13X";
|
|
10929
|
+
PointerChannel[PointerChannel["Slot13Y"] = 466] = "Slot13Y";
|
|
10930
|
+
PointerChannel[PointerChannel["Slot14Active"] = 480] = "Slot14Active";
|
|
10931
|
+
PointerChannel[PointerChannel["Slot14X"] = 481] = "Slot14X";
|
|
10932
|
+
PointerChannel[PointerChannel["Slot14Y"] = 482] = "Slot14Y";
|
|
10933
|
+
PointerChannel[PointerChannel["Slot15Active"] = 496] = "Slot15Active";
|
|
10934
|
+
PointerChannel[PointerChannel["Slot15X"] = 497] = "Slot15X";
|
|
10935
|
+
PointerChannel[PointerChannel["Slot15Y"] = 498] = "Slot15Y";
|
|
10936
|
+
})(PointerChannel || (PointerChannel = {}));
|
|
10854
10937
|
var Keyboard;
|
|
10855
10938
|
(function (Keyboard) {
|
|
10856
10939
|
Keyboard[Keyboard["Backspace"] = 8] = "Backspace";
|
|
@@ -11132,14 +11215,21 @@ class Pointer {
|
|
|
11132
11215
|
tilt;
|
|
11133
11216
|
stateFlags = new Flags();
|
|
11134
11217
|
_canvas;
|
|
11218
|
+
_channels;
|
|
11219
|
+
_slotIndex;
|
|
11220
|
+
_channelBase;
|
|
11135
11221
|
_buttons;
|
|
11136
11222
|
_pressure;
|
|
11137
11223
|
_rotation;
|
|
11224
|
+
_isPrimary;
|
|
11138
11225
|
_currentState = PointerState.Unknown;
|
|
11139
|
-
constructor(event, canvas) {
|
|
11140
|
-
const { pointerId, pointerType, clientX, clientY, width, height, tiltX, tiltY, buttons, pressure, twist } = event;
|
|
11226
|
+
constructor(event, canvas, channels, slotIndex) {
|
|
11227
|
+
const { pointerId, pointerType, clientX, clientY, width, height, tiltX, tiltY, buttons, pressure, twist, isPrimary } = event;
|
|
11141
11228
|
const { left, top } = canvas.getBoundingClientRect();
|
|
11142
11229
|
this._canvas = canvas;
|
|
11230
|
+
this._channels = channels;
|
|
11231
|
+
this._slotIndex = slotIndex;
|
|
11232
|
+
this._channelBase = ChannelOffset.Pointers + slotIndex * pointerSlotSize;
|
|
11143
11233
|
this.id = pointerId;
|
|
11144
11234
|
this.type = pointerType;
|
|
11145
11235
|
this.position = new Vector(clientX - left, clientY - top);
|
|
@@ -11148,7 +11238,9 @@ class Pointer {
|
|
|
11148
11238
|
this._buttons = buttons;
|
|
11149
11239
|
this._pressure = pressure;
|
|
11150
11240
|
this._rotation = twist;
|
|
11241
|
+
this._isPrimary = isPrimary;
|
|
11151
11242
|
this.stateFlags.push(PointerStateFlag.Over);
|
|
11243
|
+
this._writeChannels(true);
|
|
11152
11244
|
}
|
|
11153
11245
|
get x() {
|
|
11154
11246
|
return this.position.x;
|
|
@@ -11171,48 +11263,71 @@ class Pointer {
|
|
|
11171
11263
|
get rotation() {
|
|
11172
11264
|
return this._rotation;
|
|
11173
11265
|
}
|
|
11266
|
+
get twist() {
|
|
11267
|
+
return this._rotation;
|
|
11268
|
+
}
|
|
11269
|
+
get tiltX() {
|
|
11270
|
+
return this.tilt.x;
|
|
11271
|
+
}
|
|
11272
|
+
get tiltY() {
|
|
11273
|
+
return this.tilt.y;
|
|
11274
|
+
}
|
|
11275
|
+
get isPrimary() {
|
|
11276
|
+
return this._isPrimary;
|
|
11277
|
+
}
|
|
11278
|
+
get slotIndex() {
|
|
11279
|
+
return this._slotIndex;
|
|
11280
|
+
}
|
|
11174
11281
|
get currentState() {
|
|
11175
11282
|
return this._currentState;
|
|
11176
11283
|
}
|
|
11177
11284
|
handleEnter(event) {
|
|
11178
11285
|
this.handleEvent(event);
|
|
11179
11286
|
this._currentState = PointerState.InsideCanvas;
|
|
11287
|
+
this._writeChannels(true);
|
|
11180
11288
|
}
|
|
11181
11289
|
handleLeave(event) {
|
|
11182
11290
|
this.handleEvent(event);
|
|
11183
11291
|
this.stateFlags.push(PointerStateFlag.Leave);
|
|
11184
11292
|
this._currentState = PointerState.OutsideCanvas;
|
|
11293
|
+
this._writeChannels(false);
|
|
11185
11294
|
}
|
|
11186
11295
|
handlePress(event) {
|
|
11187
11296
|
this.handleEvent(event);
|
|
11188
11297
|
this.startPos.copy(this.position);
|
|
11189
11298
|
this.stateFlags.push(PointerStateFlag.Down);
|
|
11190
11299
|
this._currentState = PointerState.Pressed;
|
|
11300
|
+
this._writeChannels(true);
|
|
11191
11301
|
}
|
|
11192
11302
|
handleMove(event) {
|
|
11193
11303
|
this.handleEvent(event);
|
|
11194
11304
|
this.stateFlags.push(PointerStateFlag.Move);
|
|
11195
11305
|
this._currentState = PointerState.Moving;
|
|
11306
|
+
this._writeChannels(true);
|
|
11196
11307
|
}
|
|
11197
11308
|
handleRelease(event) {
|
|
11198
11309
|
this.handleEvent(event);
|
|
11199
11310
|
this.stateFlags.push(PointerStateFlag.Up);
|
|
11200
11311
|
this._currentState = PointerState.Released;
|
|
11312
|
+
this._writeChannels(true);
|
|
11201
11313
|
}
|
|
11202
11314
|
handleCancel(event) {
|
|
11203
11315
|
this.handleEvent(event);
|
|
11204
11316
|
this.stateFlags.push(PointerStateFlag.Cancel);
|
|
11205
11317
|
this._currentState = PointerState.Cancelled;
|
|
11318
|
+
this._writeChannels(false);
|
|
11206
11319
|
}
|
|
11207
11320
|
destroy() {
|
|
11321
|
+
this._clearChannels();
|
|
11208
11322
|
this.position.destroy();
|
|
11209
11323
|
this.startPos.destroy();
|
|
11210
11324
|
this.size.destroy();
|
|
11211
11325
|
this.tilt.destroy();
|
|
11212
11326
|
this._canvas = null;
|
|
11327
|
+
this._channels = null;
|
|
11213
11328
|
}
|
|
11214
11329
|
handleEvent(event) {
|
|
11215
|
-
const { clientX, clientY, width, height, tiltX, tiltY, buttons, pressure, twist } = event;
|
|
11330
|
+
const { clientX, clientY, width, height, tiltX, tiltY, buttons, pressure, twist, isPrimary } = event;
|
|
11216
11331
|
const { left, top } = this._canvas.getBoundingClientRect();
|
|
11217
11332
|
this.position.set(clientX - left, clientY - top);
|
|
11218
11333
|
this.size.set(width, height);
|
|
@@ -11220,8 +11335,263 @@ class Pointer {
|
|
|
11220
11335
|
this._buttons = buttons;
|
|
11221
11336
|
this._pressure = pressure;
|
|
11222
11337
|
this._rotation = twist;
|
|
11338
|
+
this._isPrimary = isPrimary;
|
|
11223
11339
|
return this;
|
|
11224
11340
|
}
|
|
11341
|
+
/** Write the full 16-channel per-pointer state into the shared channel buffer. */
|
|
11342
|
+
_writeChannels(active) {
|
|
11343
|
+
const ch = this._channels;
|
|
11344
|
+
const canvas = this._canvas;
|
|
11345
|
+
if (!ch || !canvas) {
|
|
11346
|
+
return;
|
|
11347
|
+
}
|
|
11348
|
+
const base = this._channelBase;
|
|
11349
|
+
const w = canvas.width || 1;
|
|
11350
|
+
const h = canvas.height || 1;
|
|
11351
|
+
if (!active) {
|
|
11352
|
+
// Zero the entire slot for a clean release.
|
|
11353
|
+
for (let i = 0; i < pointerSlotSize; i++) {
|
|
11354
|
+
ch[base + i] = 0;
|
|
11355
|
+
}
|
|
11356
|
+
return;
|
|
11357
|
+
}
|
|
11358
|
+
const x = Math.min(1, Math.max(0, this.position.x / w));
|
|
11359
|
+
const y = Math.min(1, Math.max(0, this.position.y / h));
|
|
11360
|
+
ch[base + 0] = 1; // active
|
|
11361
|
+
ch[base + 1] = x; // x (normalized)
|
|
11362
|
+
ch[base + 2] = y; // y (normalized)
|
|
11363
|
+
ch[base + 3] = this._pressure; // pressure
|
|
11364
|
+
ch[base + 4] = Math.min(1, this.size.width / w); // width (normalized)
|
|
11365
|
+
ch[base + 5] = Math.min(1, this.size.height / h); // height (normalized)
|
|
11366
|
+
ch[base + 6] = this._rotation / 359; // twist (0..359 → 0..1)
|
|
11367
|
+
ch[base + 7] = (this.tilt.x + 90) / 180; // tiltX (-90..90 → 0..1)
|
|
11368
|
+
ch[base + 8] = (this.tilt.y + 90) / 180; // tiltY (-90..90 → 0..1)
|
|
11369
|
+
ch[base + 9] = (this._buttons & 1) ? 1 : 0; // button.left
|
|
11370
|
+
ch[base + 10] = (this._buttons & 2) ? 1 : 0; // button.right
|
|
11371
|
+
ch[base + 11] = (this._buttons & 4) ? 1 : 0; // button.middle
|
|
11372
|
+
ch[base + 12] = this.type === 'mouse' ? 1 : 0; // isMouse
|
|
11373
|
+
ch[base + 13] = this.type === 'touch' ? 1 : 0; // isTouch
|
|
11374
|
+
ch[base + 14] = this.type === 'pen' ? 1 : 0; // isPen
|
|
11375
|
+
ch[base + 15] = this._isPrimary ? 1 : 0; // isPrimary
|
|
11376
|
+
}
|
|
11377
|
+
/** Zero the slot when this pointer is fully released/destroyed. */
|
|
11378
|
+
_clearChannels() {
|
|
11379
|
+
const ch = this._channels;
|
|
11380
|
+
if (!ch) {
|
|
11381
|
+
return;
|
|
11382
|
+
}
|
|
11383
|
+
const base = this._channelBase;
|
|
11384
|
+
for (let i = 0; i < pointerSlotSize; i++) {
|
|
11385
|
+
ch[base + i] = 0;
|
|
11386
|
+
}
|
|
11387
|
+
}
|
|
11388
|
+
}
|
|
11389
|
+
/**
|
|
11390
|
+
* Namespace merged onto the `Pointer` class to expose channel-offset constants.
|
|
11391
|
+
* All members mirror `PointerChannel` so callers can write `Pointer.Active`, `Pointer.X`, etc.
|
|
11392
|
+
*
|
|
11393
|
+
* The un-prefixed members (Active, X, Y, …) address slot 0 (the primary pointer).
|
|
11394
|
+
* For multi-touch access use `Pointer.Slot{N}Active / Slot{N}X / Slot{N}Y`, or compute:
|
|
11395
|
+
* `Pointer.X + slotIndex * pointerSlotSize + channelOffset`.
|
|
11396
|
+
*/
|
|
11397
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
11398
|
+
(function (Pointer) {
|
|
11399
|
+
/* eslint-disable @typescript-eslint/naming-convention */
|
|
11400
|
+
// --- Primary-pointer convenience aliases (slot 0) ---
|
|
11401
|
+
Pointer.Active = PointerChannel.Active;
|
|
11402
|
+
Pointer.X = PointerChannel.X;
|
|
11403
|
+
Pointer.Y = PointerChannel.Y;
|
|
11404
|
+
Pointer.Pressure = PointerChannel.Pressure;
|
|
11405
|
+
Pointer.Width = PointerChannel.Width;
|
|
11406
|
+
Pointer.Height = PointerChannel.Height;
|
|
11407
|
+
Pointer.Twist = PointerChannel.Twist;
|
|
11408
|
+
Pointer.TiltX = PointerChannel.TiltX;
|
|
11409
|
+
Pointer.TiltY = PointerChannel.TiltY;
|
|
11410
|
+
Pointer.Left = PointerChannel.Left;
|
|
11411
|
+
Pointer.Right = PointerChannel.Right;
|
|
11412
|
+
Pointer.Middle = PointerChannel.Middle;
|
|
11413
|
+
Pointer.IsMouse = PointerChannel.IsMouse;
|
|
11414
|
+
Pointer.IsTouch = PointerChannel.IsTouch;
|
|
11415
|
+
Pointer.IsPen = PointerChannel.IsPen;
|
|
11416
|
+
Pointer.IsPrimary = PointerChannel.IsPrimary;
|
|
11417
|
+
// --- Per-slot Active/X/Y for multi-pointer access ---
|
|
11418
|
+
Pointer.Slot0Active = PointerChannel.Slot0Active;
|
|
11419
|
+
Pointer.Slot0X = PointerChannel.Slot0X;
|
|
11420
|
+
Pointer.Slot0Y = PointerChannel.Slot0Y;
|
|
11421
|
+
Pointer.Slot1Active = PointerChannel.Slot1Active;
|
|
11422
|
+
Pointer.Slot1X = PointerChannel.Slot1X;
|
|
11423
|
+
Pointer.Slot1Y = PointerChannel.Slot1Y;
|
|
11424
|
+
Pointer.Slot2Active = PointerChannel.Slot2Active;
|
|
11425
|
+
Pointer.Slot2X = PointerChannel.Slot2X;
|
|
11426
|
+
Pointer.Slot2Y = PointerChannel.Slot2Y;
|
|
11427
|
+
Pointer.Slot3Active = PointerChannel.Slot3Active;
|
|
11428
|
+
Pointer.Slot3X = PointerChannel.Slot3X;
|
|
11429
|
+
Pointer.Slot3Y = PointerChannel.Slot3Y;
|
|
11430
|
+
Pointer.Slot4Active = PointerChannel.Slot4Active;
|
|
11431
|
+
Pointer.Slot4X = PointerChannel.Slot4X;
|
|
11432
|
+
Pointer.Slot4Y = PointerChannel.Slot4Y;
|
|
11433
|
+
Pointer.Slot5Active = PointerChannel.Slot5Active;
|
|
11434
|
+
Pointer.Slot5X = PointerChannel.Slot5X;
|
|
11435
|
+
Pointer.Slot5Y = PointerChannel.Slot5Y;
|
|
11436
|
+
Pointer.Slot6Active = PointerChannel.Slot6Active;
|
|
11437
|
+
Pointer.Slot6X = PointerChannel.Slot6X;
|
|
11438
|
+
Pointer.Slot6Y = PointerChannel.Slot6Y;
|
|
11439
|
+
Pointer.Slot7Active = PointerChannel.Slot7Active;
|
|
11440
|
+
Pointer.Slot7X = PointerChannel.Slot7X;
|
|
11441
|
+
Pointer.Slot7Y = PointerChannel.Slot7Y;
|
|
11442
|
+
Pointer.Slot8Active = PointerChannel.Slot8Active;
|
|
11443
|
+
Pointer.Slot8X = PointerChannel.Slot8X;
|
|
11444
|
+
Pointer.Slot8Y = PointerChannel.Slot8Y;
|
|
11445
|
+
Pointer.Slot9Active = PointerChannel.Slot9Active;
|
|
11446
|
+
Pointer.Slot9X = PointerChannel.Slot9X;
|
|
11447
|
+
Pointer.Slot9Y = PointerChannel.Slot9Y;
|
|
11448
|
+
Pointer.Slot10Active = PointerChannel.Slot10Active;
|
|
11449
|
+
Pointer.Slot10X = PointerChannel.Slot10X;
|
|
11450
|
+
Pointer.Slot10Y = PointerChannel.Slot10Y;
|
|
11451
|
+
Pointer.Slot11Active = PointerChannel.Slot11Active;
|
|
11452
|
+
Pointer.Slot11X = PointerChannel.Slot11X;
|
|
11453
|
+
Pointer.Slot11Y = PointerChannel.Slot11Y;
|
|
11454
|
+
Pointer.Slot12Active = PointerChannel.Slot12Active;
|
|
11455
|
+
Pointer.Slot12X = PointerChannel.Slot12X;
|
|
11456
|
+
Pointer.Slot12Y = PointerChannel.Slot12Y;
|
|
11457
|
+
Pointer.Slot13Active = PointerChannel.Slot13Active;
|
|
11458
|
+
Pointer.Slot13X = PointerChannel.Slot13X;
|
|
11459
|
+
Pointer.Slot13Y = PointerChannel.Slot13Y;
|
|
11460
|
+
Pointer.Slot14Active = PointerChannel.Slot14Active;
|
|
11461
|
+
Pointer.Slot14X = PointerChannel.Slot14X;
|
|
11462
|
+
Pointer.Slot14Y = PointerChannel.Slot14Y;
|
|
11463
|
+
Pointer.Slot15Active = PointerChannel.Slot15Active;
|
|
11464
|
+
Pointer.Slot15X = PointerChannel.Slot15X;
|
|
11465
|
+
Pointer.Slot15Y = PointerChannel.Slot15Y;
|
|
11466
|
+
/* eslint-enable @typescript-eslint/naming-convention */
|
|
11467
|
+
})(Pointer || (Pointer = {}));
|
|
11468
|
+
|
|
11469
|
+
/** Long-press threshold in milliseconds. */
|
|
11470
|
+
const longPressMs = 500;
|
|
11471
|
+
/**
|
|
11472
|
+
* Internal gesture recognizer — NOT exported publicly.
|
|
11473
|
+
* Receives pointer lifecycle events from InputManager and fires gesture signals.
|
|
11474
|
+
*/
|
|
11475
|
+
class GestureRecognizer {
|
|
11476
|
+
onPinch;
|
|
11477
|
+
onRotate;
|
|
11478
|
+
onLongPress;
|
|
11479
|
+
distanceThreshold;
|
|
11480
|
+
// Active touch pointers (only touch type; index in order of arrival).
|
|
11481
|
+
touchPointers = new Map();
|
|
11482
|
+
// Long-press state per pointer.
|
|
11483
|
+
longPressEntries = new Map();
|
|
11484
|
+
// Previous two-touch distance and angle for incremental deltas.
|
|
11485
|
+
prevDistance = -1;
|
|
11486
|
+
prevAngle = 0;
|
|
11487
|
+
// Reusable Vector for center dispatches (avoids heap churn).
|
|
11488
|
+
centerVec = new Vector();
|
|
11489
|
+
constructor(distanceThreshold, onPinch, onRotate, onLongPress) {
|
|
11490
|
+
this.distanceThreshold = distanceThreshold;
|
|
11491
|
+
this.onPinch = onPinch;
|
|
11492
|
+
this.onRotate = onRotate;
|
|
11493
|
+
this.onLongPress = onLongPress;
|
|
11494
|
+
}
|
|
11495
|
+
onPointerDown(pointer) {
|
|
11496
|
+
if (pointer.type === 'touch') {
|
|
11497
|
+
this.touchPointers.set(pointer.id, pointer);
|
|
11498
|
+
this._resetTwoTouchBaseline();
|
|
11499
|
+
}
|
|
11500
|
+
// Start long-press timer for every pointer type.
|
|
11501
|
+
const timerId = setTimeout(() => {
|
|
11502
|
+
this.longPressEntries.delete(pointer.id);
|
|
11503
|
+
this.onLongPress.dispatch(pointer);
|
|
11504
|
+
}, longPressMs);
|
|
11505
|
+
this.longPressEntries.set(pointer.id, {
|
|
11506
|
+
pointerId: pointer.id,
|
|
11507
|
+
pointer,
|
|
11508
|
+
timerId,
|
|
11509
|
+
startX: pointer.x,
|
|
11510
|
+
startY: pointer.y,
|
|
11511
|
+
});
|
|
11512
|
+
}
|
|
11513
|
+
onPointerMove(pointer, distanceThreshold) {
|
|
11514
|
+
// Cancel long-press if moved beyond threshold.
|
|
11515
|
+
const entry = this.longPressEntries.get(pointer.id);
|
|
11516
|
+
if (entry) {
|
|
11517
|
+
const dx = pointer.x - entry.startX;
|
|
11518
|
+
const dy = pointer.y - entry.startY;
|
|
11519
|
+
if (Math.sqrt(dx * dx + dy * dy) > distanceThreshold) {
|
|
11520
|
+
clearTimeout(entry.timerId);
|
|
11521
|
+
this.longPressEntries.delete(pointer.id);
|
|
11522
|
+
}
|
|
11523
|
+
}
|
|
11524
|
+
if (pointer.type !== 'touch') {
|
|
11525
|
+
return;
|
|
11526
|
+
}
|
|
11527
|
+
// Update the stored pointer reference's position via the live object.
|
|
11528
|
+
// (We store the actual Pointer object so position is already updated by the caller.)
|
|
11529
|
+
if (this.touchPointers.size < 2) {
|
|
11530
|
+
return;
|
|
11531
|
+
}
|
|
11532
|
+
this._processTwoTouchGestures();
|
|
11533
|
+
}
|
|
11534
|
+
onPointerUp(pointer) {
|
|
11535
|
+
this._cancelLongPress(pointer.id);
|
|
11536
|
+
}
|
|
11537
|
+
onPointerLeave(pointer) {
|
|
11538
|
+
this._cancelLongPress(pointer.id);
|
|
11539
|
+
if (pointer.type === 'touch') {
|
|
11540
|
+
this.touchPointers.delete(pointer.id);
|
|
11541
|
+
this._resetTwoTouchBaseline();
|
|
11542
|
+
}
|
|
11543
|
+
}
|
|
11544
|
+
onPointerCancel(pointer) {
|
|
11545
|
+
this._cancelLongPress(pointer.id);
|
|
11546
|
+
if (pointer.type === 'touch') {
|
|
11547
|
+
this.touchPointers.delete(pointer.id);
|
|
11548
|
+
this._resetTwoTouchBaseline();
|
|
11549
|
+
}
|
|
11550
|
+
}
|
|
11551
|
+
destroy() {
|
|
11552
|
+
for (const entry of this.longPressEntries.values()) {
|
|
11553
|
+
clearTimeout(entry.timerId);
|
|
11554
|
+
}
|
|
11555
|
+
this.longPressEntries.clear();
|
|
11556
|
+
this.touchPointers.clear();
|
|
11557
|
+
this.centerVec.destroy();
|
|
11558
|
+
}
|
|
11559
|
+
_cancelLongPress(pointerId) {
|
|
11560
|
+
const entry = this.longPressEntries.get(pointerId);
|
|
11561
|
+
if (entry) {
|
|
11562
|
+
clearTimeout(entry.timerId);
|
|
11563
|
+
this.longPressEntries.delete(pointerId);
|
|
11564
|
+
}
|
|
11565
|
+
}
|
|
11566
|
+
_resetTwoTouchBaseline() {
|
|
11567
|
+
this.prevDistance = -1;
|
|
11568
|
+
this.prevAngle = 0;
|
|
11569
|
+
}
|
|
11570
|
+
_processTwoTouchGestures() {
|
|
11571
|
+
const iter = this.touchPointers.values();
|
|
11572
|
+
const pA = iter.next().value;
|
|
11573
|
+
const pB = iter.next().value;
|
|
11574
|
+
const dx = pB.x - pA.x;
|
|
11575
|
+
const dy = pB.y - pA.y;
|
|
11576
|
+
const currentDistance = Math.sqrt(dx * dx + dy * dy);
|
|
11577
|
+
const currentAngle = Math.atan2(dy, dx);
|
|
11578
|
+
const centerX = (pA.x + pB.x) / 2;
|
|
11579
|
+
const centerY = (pA.y + pB.y) / 2;
|
|
11580
|
+
this.centerVec.set(centerX, centerY);
|
|
11581
|
+
if (this.prevDistance > 0) {
|
|
11582
|
+
const scale = currentDistance / this.prevDistance;
|
|
11583
|
+
// Only fire if there's a meaningful distance change.
|
|
11584
|
+
if (Math.abs(scale - 1) > 0.0001) {
|
|
11585
|
+
this.onPinch.dispatch(scale, this.centerVec);
|
|
11586
|
+
}
|
|
11587
|
+
const angleDelta = currentAngle - this.prevAngle;
|
|
11588
|
+
if (Math.abs(angleDelta) > 0.0001) {
|
|
11589
|
+
this.onRotate.dispatch(angleDelta, this.centerVec);
|
|
11590
|
+
}
|
|
11591
|
+
}
|
|
11592
|
+
this.prevDistance = currentDistance;
|
|
11593
|
+
this.prevAngle = currentAngle;
|
|
11594
|
+
}
|
|
11225
11595
|
}
|
|
11226
11596
|
|
|
11227
11597
|
var GamepadChannel;
|
|
@@ -11602,6 +11972,10 @@ class InputManager {
|
|
|
11602
11972
|
channelsPressed = [];
|
|
11603
11973
|
channelsReleased = [];
|
|
11604
11974
|
gamepadDefinitions;
|
|
11975
|
+
// Slot allocation for unified pointer tracking (mouse / touch / pen).
|
|
11976
|
+
pointerSlots = new Map(); // pointerId → slotIndex
|
|
11977
|
+
freeSlots = Array.from({ length: maxPointers }, (_, i) => i);
|
|
11978
|
+
gestureRecognizer;
|
|
11605
11979
|
canvasFocusedValue;
|
|
11606
11980
|
pointerDistanceThreshold;
|
|
11607
11981
|
keyDownHandler = this.handleKeyDown.bind(this);
|
|
@@ -11630,12 +12004,23 @@ class InputManager {
|
|
|
11630
12004
|
onGamepadConnected = new Signal();
|
|
11631
12005
|
onGamepadDisconnected = new Signal();
|
|
11632
12006
|
onGamepadUpdated = new Signal();
|
|
12007
|
+
/** Fires on every two-touch-pointer move where the distance between them changed. `scale` > 1 = spreading, < 1 = pinching. */
|
|
12008
|
+
onPinch = new Signal();
|
|
12009
|
+
/** Fires on every two-touch-pointer move where the angle between them changed. `angleDelta` is in radians. */
|
|
12010
|
+
onRotate = new Signal();
|
|
12011
|
+
/** Fires when a pointer has been held without significant movement for ≥ 500 ms. */
|
|
12012
|
+
onLongPress = new Signal();
|
|
11633
12013
|
constructor(app) {
|
|
11634
12014
|
const { gamepadDefinitions = [], pointerDistanceThreshold } = app.options;
|
|
11635
12015
|
this.canvas = app.canvas;
|
|
11636
12016
|
this.canvasFocusedValue = document.activeElement === this.canvas;
|
|
11637
12017
|
this.pointerDistanceThreshold = pointerDistanceThreshold;
|
|
11638
12018
|
this.gamepadDefinitions = [...gamepadDefinitions, ...builtInGamepadDefinitions];
|
|
12019
|
+
// Disable the browser's default pan/zoom/double-tap-zoom on touch devices so
|
|
12020
|
+
// pointer events reach the canvas without being swallowed by the browser's
|
|
12021
|
+
// native touch gestures.
|
|
12022
|
+
this.canvas.style.touchAction = 'none';
|
|
12023
|
+
this.gestureRecognizer = new GestureRecognizer(pointerDistanceThreshold, this.onPinch, this.onRotate, this.onLongPress);
|
|
11639
12024
|
this.addEventListeners();
|
|
11640
12025
|
}
|
|
11641
12026
|
get pointersInCanvas() {
|
|
@@ -11688,6 +12073,7 @@ class InputManager {
|
|
|
11688
12073
|
}
|
|
11689
12074
|
destroy() {
|
|
11690
12075
|
this.removeEventListeners();
|
|
12076
|
+
this.gestureRecognizer.destroy();
|
|
11691
12077
|
for (const pointer of Object.values(this.pointers)) {
|
|
11692
12078
|
pointer.destroy();
|
|
11693
12079
|
}
|
|
@@ -11699,6 +12085,8 @@ class InputManager {
|
|
|
11699
12085
|
this.gamepadsValue.length = 0;
|
|
11700
12086
|
this.channelsPressed.length = 0;
|
|
11701
12087
|
this.channelsReleased.length = 0;
|
|
12088
|
+
this.pointerSlots.clear();
|
|
12089
|
+
this.freeSlots.length = 0;
|
|
11702
12090
|
this.wheelOffset.destroy();
|
|
11703
12091
|
this.flags.destroy();
|
|
11704
12092
|
this.onPointerEnter.destroy();
|
|
@@ -11715,62 +12103,153 @@ class InputManager {
|
|
|
11715
12103
|
this.onGamepadConnected.destroy();
|
|
11716
12104
|
this.onGamepadDisconnected.destroy();
|
|
11717
12105
|
this.onGamepadUpdated.destroy();
|
|
12106
|
+
this.onPinch.destroy();
|
|
12107
|
+
this.onRotate.destroy();
|
|
12108
|
+
this.onLongPress.destroy();
|
|
12109
|
+
}
|
|
12110
|
+
_assignSlot(pointerId) {
|
|
12111
|
+
if (this.pointerSlots.has(pointerId)) {
|
|
12112
|
+
return this.pointerSlots.get(pointerId);
|
|
12113
|
+
}
|
|
12114
|
+
if (this.freeSlots.length === 0) {
|
|
12115
|
+
return null; // All 16 slots occupied — silently drop.
|
|
12116
|
+
}
|
|
12117
|
+
const slot = this.freeSlots.shift();
|
|
12118
|
+
this.pointerSlots.set(pointerId, slot);
|
|
12119
|
+
return slot;
|
|
12120
|
+
}
|
|
12121
|
+
_releaseSlot(pointerId) {
|
|
12122
|
+
const slot = this.pointerSlots.get(pointerId);
|
|
12123
|
+
if (slot !== undefined) {
|
|
12124
|
+
this.pointerSlots.delete(pointerId);
|
|
12125
|
+
// Push to the front so slot 0 is recovered first, keeping allocation predictable.
|
|
12126
|
+
this.freeSlots.unshift(slot);
|
|
12127
|
+
}
|
|
11718
12128
|
}
|
|
11719
12129
|
handleKeyDown(event) {
|
|
12130
|
+
// Game-engine convention: keys only register while the canvas
|
|
12131
|
+
// owns focus. Otherwise typing into adjacent <input> fields would
|
|
12132
|
+
// also drive game state, which is never what users want.
|
|
12133
|
+
if (!this.canvasFocusedValue) {
|
|
12134
|
+
return;
|
|
12135
|
+
}
|
|
11720
12136
|
const channel = ChannelOffset.Keyboard + event.keyCode;
|
|
11721
12137
|
this.channels[channel] = 1;
|
|
11722
12138
|
this.channelsPressed.push(channel);
|
|
11723
12139
|
this.flags.push(InputManagerFlag.KeyDown);
|
|
12140
|
+
// Consume the event: stop default browser actions (page scroll on
|
|
12141
|
+
// arrow/space, find-as-you-type on /, etc.) and stop propagation
|
|
12142
|
+
// so other listeners on the page don't double-handle.
|
|
12143
|
+
stopEvent(event);
|
|
11724
12144
|
}
|
|
11725
12145
|
handleKeyUp(event) {
|
|
12146
|
+
if (!this.canvasFocusedValue) {
|
|
12147
|
+
return;
|
|
12148
|
+
}
|
|
11726
12149
|
const channel = ChannelOffset.Keyboard + event.keyCode;
|
|
11727
12150
|
this.channels[channel] = 0;
|
|
11728
12151
|
this.channelsReleased.push(channel);
|
|
11729
12152
|
this.flags.push(InputManagerFlag.KeyUp);
|
|
12153
|
+
stopEvent(event);
|
|
11730
12154
|
}
|
|
11731
12155
|
handlePointerOver(event) {
|
|
11732
|
-
|
|
12156
|
+
const slot = this._assignSlot(event.pointerId);
|
|
12157
|
+
if (slot === null) {
|
|
12158
|
+
return; // 17th+ simultaneous pointer — silently drop.
|
|
12159
|
+
}
|
|
12160
|
+
this.pointers[event.pointerId] = new Pointer(event, this.canvas, this.channels, slot);
|
|
11733
12161
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11734
12162
|
}
|
|
11735
12163
|
handlePointerLeave(event) {
|
|
11736
|
-
this.pointers[event.pointerId]
|
|
12164
|
+
const pointer = this.pointers[event.pointerId];
|
|
12165
|
+
if (!pointer) {
|
|
12166
|
+
return;
|
|
12167
|
+
}
|
|
12168
|
+
pointer.handleLeave(event);
|
|
12169
|
+
this.gestureRecognizer.onPointerLeave(pointer);
|
|
12170
|
+
this._releaseSlot(event.pointerId);
|
|
11737
12171
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11738
12172
|
}
|
|
11739
12173
|
handlePointerDown(event) {
|
|
11740
12174
|
this.canvas.focus();
|
|
11741
12175
|
this.canvasFocusedValue = true;
|
|
11742
|
-
this.pointers[event.pointerId]
|
|
12176
|
+
const pointer = this.pointers[event.pointerId];
|
|
12177
|
+
if (!pointer) {
|
|
12178
|
+
return;
|
|
12179
|
+
}
|
|
12180
|
+
pointer.handlePress(event);
|
|
12181
|
+
this.gestureRecognizer.onPointerDown(pointer);
|
|
11743
12182
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11744
|
-
|
|
12183
|
+
// preventDefault stops native drag / text-selection;
|
|
12184
|
+
// stopImmediatePropagation prevents bubbling to host-page click
|
|
12185
|
+
// handlers so an embedded canvas doesn't accidentally trigger UI
|
|
12186
|
+
// outside its bounds.
|
|
12187
|
+
stopEvent(event);
|
|
11745
12188
|
}
|
|
11746
12189
|
handlePointerMove(event) {
|
|
11747
|
-
this.pointers[event.pointerId]
|
|
12190
|
+
const pointer = this.pointers[event.pointerId];
|
|
12191
|
+
if (!pointer) {
|
|
12192
|
+
return;
|
|
12193
|
+
}
|
|
12194
|
+
pointer.handleMove(event);
|
|
12195
|
+
this.gestureRecognizer.onPointerMove(pointer, this.pointerDistanceThreshold);
|
|
11748
12196
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11749
12197
|
}
|
|
11750
12198
|
handlePointerUp(event) {
|
|
11751
|
-
this.pointers[event.pointerId]
|
|
12199
|
+
const pointer = this.pointers[event.pointerId];
|
|
12200
|
+
if (!pointer) {
|
|
12201
|
+
return;
|
|
12202
|
+
}
|
|
12203
|
+
pointer.handleRelease(event);
|
|
12204
|
+
this.gestureRecognizer.onPointerUp(pointer);
|
|
11752
12205
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11753
|
-
event
|
|
12206
|
+
stopEvent(event);
|
|
11754
12207
|
}
|
|
11755
12208
|
handlePointerCancel(event) {
|
|
11756
|
-
this.pointers[event.pointerId]
|
|
12209
|
+
const pointer = this.pointers[event.pointerId];
|
|
12210
|
+
if (!pointer) {
|
|
12211
|
+
return;
|
|
12212
|
+
}
|
|
12213
|
+
pointer.handleCancel(event);
|
|
12214
|
+
this.gestureRecognizer.onPointerCancel(pointer);
|
|
12215
|
+
this._releaseSlot(event.pointerId);
|
|
11757
12216
|
this.flags.push(InputManagerFlag.PointerUpdate);
|
|
11758
12217
|
}
|
|
11759
12218
|
handleMouseWheel(event) {
|
|
12219
|
+
if (!this.canvasFocusedValue) {
|
|
12220
|
+
return;
|
|
12221
|
+
}
|
|
11760
12222
|
this.wheelOffset.set(event.deltaX, event.deltaY);
|
|
11761
12223
|
this.flags.push(InputManagerFlag.MouseWheel);
|
|
11762
|
-
|
|
11763
|
-
event.preventDefault();
|
|
11764
|
-
}
|
|
12224
|
+
stopEvent(event);
|
|
11765
12225
|
}
|
|
11766
12226
|
handleCanvasFocus() {
|
|
11767
12227
|
this.canvasFocusedValue = true;
|
|
11768
12228
|
}
|
|
11769
12229
|
handleCanvasBlur() {
|
|
11770
12230
|
this.canvasFocusedValue = false;
|
|
12231
|
+
this.releaseAllKeyboardChannels();
|
|
11771
12232
|
}
|
|
11772
12233
|
handleWindowBlur() {
|
|
11773
12234
|
this.canvasFocusedValue = false;
|
|
12235
|
+
this.releaseAllKeyboardChannels();
|
|
12236
|
+
}
|
|
12237
|
+
/**
|
|
12238
|
+
* Force every currently-held keyboard channel back to zero and emit
|
|
12239
|
+
* onKeyUp for each. Called on canvas/window blur so keys held when
|
|
12240
|
+
* focus leaves don't stay stuck "down" forever — without this, a user
|
|
12241
|
+
* who alt-tabs while pressing W would have W register as held until
|
|
12242
|
+
* they manually release while focus is back.
|
|
12243
|
+
*/
|
|
12244
|
+
releaseAllKeyboardChannels() {
|
|
12245
|
+
for (let offset = 0; offset < ChannelSize.Category; offset++) {
|
|
12246
|
+
const channel = ChannelOffset.Keyboard + offset;
|
|
12247
|
+
if (this.channels[channel] !== 0) {
|
|
12248
|
+
this.channels[channel] = 0;
|
|
12249
|
+
this.channelsReleased.push(channel);
|
|
12250
|
+
this.flags.push(InputManagerFlag.KeyUp);
|
|
12251
|
+
}
|
|
12252
|
+
}
|
|
11774
12253
|
}
|
|
11775
12254
|
addEventListeners() {
|
|
11776
12255
|
const activeWindow = window;
|
|
@@ -18509,5 +18988,5 @@ const createRapierPhysicsWorld = async (options = {}) => {
|
|
|
18509
18988
|
return await RapierPhysicsWorld.create(options);
|
|
18510
18989
|
};
|
|
18511
18990
|
|
|
18512
|
-
export { AbstractAssetFactory, AbstractMedia, AbstractWebGl2BatchedRenderer, AbstractWebGl2Renderer, AbstractWebGpuRenderer, AnimatedSprite, Application, ApplicationStatus, ArcadeStickGamepadMapping, AudioAnalyser, BinaryFactory, BlendModes, BlurFilter, Bounds, BufferTypes, BufferUsage, BundleLoadError, CacheFirstStrategy, CallbackRenderPass, Capabilities, ChannelOffset, ChannelSize, Circle, Clock, CollisionType, Color, ColorAffector, ColorFilter, Container, Drawable, Ellipse, FactoryRegistry, Filter, Flags, FontFactory, ForceAffector, GameCubeGamepadMapping, Gamepad, GamepadChannel, GamepadControl, GamepadMapping, GamepadMappingFamily, GamepadPromptLayouts, GenericDualAnalogGamepadMapping, Graphics, ImageFactory, IndexedDbDatabase, IndexedDbStore, Input, InputManager, Interval, JoyConLeftGamepadMapping, JoyConRightGamepadMapping, Json, JsonFactory, Keyboard, Line, Loader, Matrix, Mesh, Music, MusicFactory, NetworkOnlyStrategy, ObservableSize, ObservableVector, Particle, ParticleOptions, ParticleSystem, PlayStationGamepadMapping, Pointer, PointerState, PointerStateFlag, PolarVector, Polygon, Quadtree, Random, RapierPhysicsBinding, RapierPhysicsWorld, Rectangle, RenderBackendType, RenderNode, RenderTarget, RenderTargetPass, RenderTexture, RendererRegistry, RenderingPrimitives, Sampler, ScaleAffector, ScaleModes, Scene, SceneManager, SceneNode, Segment, Shader, ShaderAttribute, ShaderPrimitives, ShaderUniform, Signal, Size, Sound, SoundFactory, Sprite, SpriteFlags, Spritesheet, SteamControllerGamepadMapping, SvgAsset, SvgFactory, SwitchProGamepadMapping, Text, TextAsset, TextFactory, TextStyle, Texture, TextureFactory, Time, Timer, TorqueAffector, UniversalEmitter, Vector, Video, VideoFactory, View, ViewFlags, VoronoiRegion, VttAsset, VttFactory, WasmFactory, WebGl2Backend, WebGl2MeshRenderer, WebGl2ParticleRenderer, WebGl2RenderBuffer, WebGl2ShaderBlock, WebGl2SpriteRenderer, WebGl2VertexArrayObject, WebGpuBackend, WebGpuMeshRenderer, WebGpuParticleRenderer, WebGpuSpriteRenderer, WrapModes, XboxGamepadMapping, bezierCurveTo, buildCircle, buildEllipse, buildLine, buildPath, buildPolygon, buildRectangle, buildStar, builtInGamepadDefinitions, canvasSourceToDataUrl, clamp, createRapierPhysicsWorld, createRenderStats, createWebGl2ShaderProgram, decodeAudioData, defineAssetManifest, degreesPerRadian, degreesToRadians, determineMimeType, emptyArrayBuffer, getAudioContext, getCanvasSourceSize, getCollisionCircleCircle, getCollisionCircleRectangle, getCollisionPolygonCircle, getCollisionRectangleRectangle, getCollisionSat, getDistance, getOfflineAudioContext, getPreciseTime, getTextureSourceSize, getVoronoiRegion$1 as getVoronoiRegion, getWebGpuBlendState, hours, inRange, intersectionCircleCircle, intersectionCircleEllipse, intersectionCirclePoly, intersectionEllipseEllipse, intersectionEllipsePoly, intersectionLineCircle, intersectionLineEllipse, intersectionLineLine, intersectionLinePoly, intersectionLineRect, intersectionPointCircle, intersectionPointEllipse, intersectionPointLine, intersectionPointPoint, intersectionPointPoly, intersectionPointRect, intersectionPolyPoly, intersectionRectCircle, intersectionRectEllipse, intersectionRectPoly, intersectionRectRect, intersectionSat, isAudioContextReady, isPowerOfTwo, lerp, matchesIds, milliseconds, minutes, noop$1 as noop, normalizeIds, onAudioContextReady, parseGamepadDescriptor, quadraticCurveTo, radiansPerDegree, radiansToDegrees, rand, removeArrayItems, resetRenderStats, resolveDefinition, resolveGamepadDefinition, seconds, sign$1 as sign, stopEvent, supportsCodec, supportsEventOptions, supportsIndexedDb, supportsPointerEvents, supportsTouchEvents, supportsWebAudio, tau, trimRotation, webGl2PrimitiveArrayConstructors, webGl2PrimitiveByteSizeMapping, webGl2PrimitiveTypeNames };
|
|
18991
|
+
export { AbstractAssetFactory, AbstractMedia, AbstractWebGl2BatchedRenderer, AbstractWebGl2Renderer, AbstractWebGpuRenderer, AnimatedSprite, Application, ApplicationStatus, ArcadeStickGamepadMapping, AudioAnalyser, BinaryFactory, BlendModes, BlurFilter, Bounds, BufferTypes, BufferUsage, BundleLoadError, CacheFirstStrategy, CallbackRenderPass, Capabilities, ChannelOffset, ChannelSize, Circle, Clock, CollisionType, Color, ColorAffector, ColorFilter, Container, Drawable, Ellipse, FactoryRegistry, Filter, Flags, FontFactory, ForceAffector, GameCubeGamepadMapping, Gamepad, GamepadChannel, GamepadControl, GamepadMapping, GamepadMappingFamily, GamepadPromptLayouts, GenericDualAnalogGamepadMapping, Graphics, ImageFactory, IndexedDbDatabase, IndexedDbStore, Input, InputManager, Interval, JoyConLeftGamepadMapping, JoyConRightGamepadMapping, Json, JsonFactory, Keyboard, Line, Loader, Matrix, Mesh, Music, MusicFactory, NetworkOnlyStrategy, ObservableSize, ObservableVector, Particle, ParticleOptions, ParticleSystem, PlayStationGamepadMapping, Pointer, PointerState, PointerStateFlag, PolarVector, Polygon, Quadtree, Random, RapierPhysicsBinding, RapierPhysicsWorld, Rectangle, RenderBackendType, RenderNode, RenderTarget, RenderTargetPass, RenderTexture, RendererRegistry, RenderingPrimitives, Sampler, ScaleAffector, ScaleModes, Scene, SceneManager, SceneNode, Segment, Shader, ShaderAttribute, ShaderPrimitives, ShaderUniform, Signal, Size, Sound, SoundFactory, Sprite, SpriteFlags, Spritesheet, SteamControllerGamepadMapping, SvgAsset, SvgFactory, SwitchProGamepadMapping, Text, TextAsset, TextFactory, TextStyle, Texture, TextureFactory, Time, Timer, TorqueAffector, UniversalEmitter, Vector, Video, VideoFactory, View, ViewFlags, VoronoiRegion, VttAsset, VttFactory, WasmFactory, WebGl2Backend, WebGl2MeshRenderer, WebGl2ParticleRenderer, WebGl2RenderBuffer, WebGl2ShaderBlock, WebGl2SpriteRenderer, WebGl2VertexArrayObject, WebGpuBackend, WebGpuMeshRenderer, WebGpuParticleRenderer, WebGpuSpriteRenderer, WrapModes, XboxGamepadMapping, bezierCurveTo, buildCircle, buildEllipse, buildLine, buildPath, buildPolygon, buildRectangle, buildStar, builtInGamepadDefinitions, canvasSourceToDataUrl, clamp, createRapierPhysicsWorld, createRenderStats, createWebGl2ShaderProgram, decodeAudioData, defineAssetManifest, degreesPerRadian, degreesToRadians, determineMimeType, emptyArrayBuffer, getAudioContext, getCanvasSourceSize, getCollisionCircleCircle, getCollisionCircleRectangle, getCollisionPolygonCircle, getCollisionRectangleRectangle, getCollisionSat, getDistance, getOfflineAudioContext, getPreciseTime, getTextureSourceSize, getVoronoiRegion$1 as getVoronoiRegion, getWebGpuBlendState, hours, inRange, intersectionCircleCircle, intersectionCircleEllipse, intersectionCirclePoly, intersectionEllipseEllipse, intersectionEllipsePoly, intersectionLineCircle, intersectionLineEllipse, intersectionLineLine, intersectionLinePoly, intersectionLineRect, intersectionPointCircle, intersectionPointEllipse, intersectionPointLine, intersectionPointPoint, intersectionPointPoly, intersectionPointRect, intersectionPolyPoly, intersectionRectCircle, intersectionRectEllipse, intersectionRectPoly, intersectionRectRect, intersectionSat, isAudioContextReady, isPowerOfTwo, lerp, matchesIds, maxPointers, milliseconds, minutes, noop$1 as noop, normalizeIds, onAudioContextReady, parseGamepadDescriptor, pointerSlotSize, quadraticCurveTo, radiansPerDegree, radiansToDegrees, rand, removeArrayItems, resetRenderStats, resolveDefinition, resolveGamepadDefinition, seconds, sign$1 as sign, stopEvent, supportsCodec, supportsEventOptions, supportsIndexedDb, supportsPointerEvents, supportsTouchEvents, supportsWebAudio, tau, trimRotation, webGl2PrimitiveArrayConstructors, webGl2PrimitiveByteSizeMapping, webGl2PrimitiveTypeNames };
|
|
18513
18992
|
//# sourceMappingURL=exo.esm.js.map
|