@daneren2005/shared-memory-physics 1.5.0 → 1.6.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/dist/index.js CHANGED
@@ -1,10 +1,68 @@
1
- import { BaseWorld as e, Component as t, ComponentSystem as n, DEAD_INDEX as r } from "@daneren2005/shared-memory-ecs";
1
+ import { BaseWorld as e, Component as t, DEAD_INDEX as n, EntityWorkerSystem as r } from "@daneren2005/shared-memory-ecs";
2
2
  import { loadFloat32 as i, storeFloat32 as a } from "@daneren2005/shared-memory-objects/utils/float32-atomics";
3
3
  import o from "@daneren2005/shared-memory-objects/spatial/shared-spatial-map";
4
4
  import s from "flatbush";
5
5
  import { addAtomicFloat32 as c } from "@daneren2005/shared-memory-objects/utils/atomic-math";
6
+ //#region src/components/polygon-component.ts
7
+ var l = 16, u = 0, d = 1, f = 33, p = class extends t {
8
+ get vertexCount() {
9
+ return this.block[0];
10
+ }
11
+ }, m = {
12
+ type: Float32Array,
13
+ size: 33,
14
+ loadProperties: ["vertices"],
15
+ toBlock(e) {
16
+ let t = h(e.vertices);
17
+ return [t.vertices.length / 2, ...t.vertices];
18
+ },
19
+ attach(e, t, n) {
20
+ return new p(t.getBlock(n), n);
21
+ }
22
+ };
23
+ function h(e) {
24
+ if (!e || e.length < 3 || e.length > 16) throw Error("A polygon needs between 3 and 16 vertices");
25
+ let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity;
26
+ for (let [a, o] of e) {
27
+ if (!Number.isFinite(a) || !Number.isFinite(o)) throw Error("Polygon vertices must be finite numbers");
28
+ t = Math.min(t, a), n = Math.min(n, o), r = Math.max(r, a), i = Math.max(i, o);
29
+ }
30
+ let a = r - t, o = i - n;
31
+ if (a <= 0 || o <= 0) throw Error("A polygon must have nonzero width and height");
32
+ let s = 0;
33
+ for (let t = 0; t < e.length; t++) {
34
+ let n = e[(t + e.length - 1) % e.length], r = e[t], i = e[(t + 1) % e.length], a = (r[0] - n[0]) * (i[1] - r[1]) - (r[1] - n[1]) * (i[0] - r[0]);
35
+ if (a === 0) throw Error("A polygon cannot contain duplicate or collinear adjacent vertices");
36
+ let o = Math.sign(a);
37
+ if (s === 0) s = o;
38
+ else if (o !== s) throw Error("Polygon vertices must describe a convex polygon in boundary order");
39
+ }
40
+ for (let t = 0; t < e.length; t++) {
41
+ let n = e[t], r = e[(t + 1) % e.length];
42
+ for (let i = t + 1; i < e.length; i++) {
43
+ if (i === t || i === t + 1 || t === 0 && i === e.length - 1) continue;
44
+ let a = e[i], o = e[(i + 1) % e.length];
45
+ if (g(n, r, a, o)) throw Error("Polygon edges cannot cross or share non-adjacent vertices");
46
+ }
47
+ }
48
+ let c = (t + r) / 2, l = (n + i) / 2, u = [], d = s > 0 ? e : e.toReversed();
49
+ for (let [e, t] of d) u.push((e - c) / a, (t - l) / o);
50
+ return {
51
+ width: a,
52
+ height: o,
53
+ vertices: u
54
+ };
55
+ }
56
+ function g(e, t, n, r) {
57
+ let i = _(e, t, n), a = _(e, t, r), o = _(n, r, e), s = _(n, r, t);
58
+ return i * a <= 0 && o * s <= 0;
59
+ }
60
+ function _(e, t, n) {
61
+ return (t[0] - e[0]) * (n[1] - e[1]) - (t[1] - e[1]) * (n[0] - e[0]);
62
+ }
63
+ //#endregion
6
64
  //#region src/components/transform-component.ts
7
- var l = 0, u = 1, d = 2, f = 3, p = 4, m = 5, h = class extends t {
65
+ var v = 0, y = 1, b = 2, x = 3, S = 4, C = 5, w = class extends t {
8
66
  get x() {
9
67
  return this.block[0];
10
68
  }
@@ -35,30 +93,36 @@ var l = 0, u = 1, d = 2, f = 3, p = 4, m = 5, h = class extends t {
35
93
  set angle(e) {
36
94
  this.block[4] = e;
37
95
  }
38
- }, g = {
96
+ }, T = {
39
97
  type: Float32Array,
40
98
  size: 5,
41
99
  loadProperties: [
42
100
  "width",
43
101
  "height",
44
- "radius"
102
+ "radius",
103
+ "vertices"
45
104
  ],
46
105
  toBlock(e) {
47
- let t = e.radius, n = e.width, r = e.height;
106
+ let t = e.radius, n = e.vertices, r = e.width, i = e.height;
107
+ if (n !== void 0) {
108
+ if (t !== void 0 || r !== void 0 || i !== void 0) throw Error("A transform takes polygon vertices, a radius, or a width and height");
109
+ let e = h(n);
110
+ r = e.width, i = e.height;
111
+ }
48
112
  if (t !== void 0) {
49
- if (n !== void 0 || r !== void 0) throw Error("A transform takes either a radius or a width and height, not both");
50
- n = r = t * 2;
113
+ if (r !== void 0 || i !== void 0) throw Error("A transform takes either a radius or a width and height, not both");
114
+ r = i = t * 2;
51
115
  }
52
116
  return [
53
117
  e.x,
54
118
  e.y,
55
- n,
56
119
  r,
120
+ i,
57
121
  e.angle ?? 0
58
122
  ];
59
123
  },
60
124
  attach(e, t, n) {
61
- return new h(t.getBlock(n), n);
125
+ return new w(t.getBlock(n), n);
62
126
  },
63
127
  save(e) {
64
128
  return {
@@ -67,7 +131,7 @@ var l = 0, u = 1, d = 2, f = 3, p = 4, m = 5, h = class extends t {
67
131
  angle: e.angle
68
132
  };
69
133
  }
70
- }, _ = 0, v = 1, y = 2, b = class extends t {
134
+ }, E = 0, D = 1, O = 2, k = 3, A = class extends t {
71
135
  get velocityX() {
72
136
  return this.block[0];
73
137
  }
@@ -80,52 +144,129 @@ var l = 0, u = 1, d = 2, f = 3, p = 4, m = 5, h = class extends t {
80
144
  set velocityY(e) {
81
145
  this.block[1] = e;
82
146
  }
83
- }, x = {
147
+ get damping() {
148
+ return this.block[2];
149
+ }
150
+ set damping(e) {
151
+ M(e), this.block[2] = e;
152
+ }
153
+ }, j = {
84
154
  type: Float32Array,
85
- size: 2,
86
- loadProperties: ["velocityX", "velocityY"],
155
+ size: 3,
156
+ loadProperties: [
157
+ "velocityX",
158
+ "velocityY",
159
+ "damping"
160
+ ],
87
161
  toBlock(e) {
88
- return [e.velocityX ?? 0, e.velocityY ?? 0];
162
+ let t = e.damping ?? 0;
163
+ return M(t), [
164
+ e.velocityX ?? 0,
165
+ e.velocityY ?? 0,
166
+ t
167
+ ];
89
168
  },
90
169
  attach(e, t, n) {
91
- return new b(t.getBlock(n), n);
170
+ return new A(t.getBlock(n), n);
92
171
  },
93
172
  save(e) {
94
173
  return {
95
174
  velocityX: e.velocityX,
96
- velocityY: e.velocityY
175
+ velocityY: e.velocityY,
176
+ damping: e.damping
97
177
  };
98
178
  }
99
- }, S = 1, C = 2, w = 3, T = [
179
+ };
180
+ function M(e) {
181
+ if (!Number.isFinite(e) || e < 0) throw Error("Damping must be a finite number of at least zero");
182
+ }
183
+ //#endregion
184
+ //#region src/components/dynamics-component.ts
185
+ var N = 0, ee = 1, P = 2, F = 3, I = class extends t {
186
+ get accelerationX() {
187
+ return this.block[0];
188
+ }
189
+ set accelerationX(e) {
190
+ re(e, "Acceleration"), this.block[0] = e;
191
+ }
192
+ get accelerationY() {
193
+ return this.block[1];
194
+ }
195
+ set accelerationY(e) {
196
+ re(e, "Acceleration"), this.block[1] = e;
197
+ }
198
+ get mass() {
199
+ return 1 / this.block[2];
200
+ }
201
+ set mass(e) {
202
+ ne(e), this.block[2] = 1 / e;
203
+ }
204
+ }, te = {
205
+ type: Float32Array,
206
+ size: 3,
207
+ loadProperties: [
208
+ "accelerationX",
209
+ "accelerationY",
210
+ "mass"
211
+ ],
212
+ toBlock(e) {
213
+ let t = e.accelerationX ?? 0, n = e.accelerationY ?? 0, r = e.mass ?? 1;
214
+ return re(t, "Acceleration"), re(n, "Acceleration"), ne(r), [
215
+ t,
216
+ n,
217
+ 1 / r
218
+ ];
219
+ },
220
+ attach(e, t, n) {
221
+ return new I(t.getBlock(n), n);
222
+ },
223
+ save(e) {
224
+ return {
225
+ accelerationX: e.accelerationX,
226
+ accelerationY: e.accelerationY,
227
+ mass: e.mass
228
+ };
229
+ }
230
+ };
231
+ function ne(e) {
232
+ if (!Number.isFinite(e) || e <= 0) throw Error("Mass must be a finite number greater than zero");
233
+ }
234
+ function re(e, t) {
235
+ if (!Number.isFinite(e)) throw Error(`${t} must be a finite number`);
236
+ }
237
+ //#endregion
238
+ //#region src/components/body-component.ts
239
+ var ie = 1, ae = 2, oe = 3, se = 4, ce = [
100
240
  1,
101
241
  2,
102
- 3
103
- ], E = 1, D = 4294967295;
104
- function O(e, t, n, r) {
242
+ 3,
243
+ 4
244
+ ], le = 1, ue = 4294967295;
245
+ function de(e, t, n, r) {
105
246
  return (t & n) !== 0 && (r & e) !== 0;
106
247
  }
107
- var ee = 0, te = 1, ne = 2, re = 3, ie = 3, ae = 4, oe = 8, se = 16;
108
- function k(e) {
109
- return e[0] & 3;
110
- }
111
- function A(e) {
112
- return (e[0] & 4) != 0;
248
+ var fe = 0, pe = 1, me = 2, he = 3, ge = 7, _e = 8, ve = 16, ye = 32;
249
+ function L(e) {
250
+ return e[0] & 7;
113
251
  }
114
- function ce(e) {
252
+ function R(e) {
115
253
  return (e[0] & 8) != 0;
116
254
  }
117
- function j(e) {
255
+ function be(e) {
118
256
  return (e[0] & 16) != 0;
119
257
  }
120
- function le(e) {
121
- e[0] |= 16;
258
+ function xe(e) {
259
+ return (e[0] & 32) != 0;
122
260
  }
123
- var ue = class extends t {
261
+ function Se(e) {
262
+ e[0] |= 32;
263
+ }
264
+ var Ce = class extends t {
124
265
  get shape() {
125
- return this.block[0] & 3;
266
+ return this.block[0] & 7;
126
267
  }
127
268
  set shape(e) {
128
- this.block[0] = this.block[0] & -4 | e & 3;
269
+ this.block[0] = this.block[0] & -8 | e & 7;
129
270
  }
130
271
  get collideCategory() {
131
272
  return this.block[1];
@@ -140,24 +281,25 @@ var ue = class extends t {
140
281
  this.block[2] = e;
141
282
  }
142
283
  get sensor() {
143
- return (this.block[0] & 4) != 0;
284
+ return (this.block[0] & 8) != 0;
144
285
  }
145
286
  set sensor(e) {
146
- this.block[0] = e ? this.block[0] | 4 : this.block[0] & -5;
287
+ this.block[0] = e ? this.block[0] | 8 : this.block[0] & -9;
147
288
  }
148
289
  get continuousCollisionDetection() {
149
- return (this.block[0] & 8) != 0;
290
+ return (this.block[0] & 16) != 0;
150
291
  }
151
292
  set continuousCollisionDetection(e) {
152
- this.block[0] = e ? this.block[0] | 8 : this.block[0] & -9;
293
+ this.block[0] = e ? this.block[0] | 16 : this.block[0] & -17;
153
294
  }
154
- }, de = {
295
+ }, we = {
155
296
  type: Uint32Array,
156
297
  size: 3,
157
298
  loadProperties: [
158
299
  "width",
159
300
  "height",
160
301
  "radius",
302
+ "vertices",
161
303
  "shape",
162
304
  "collideCategory",
163
305
  "collideMask",
@@ -166,35 +308,36 @@ var ue = class extends t {
166
308
  ],
167
309
  toBlock(e) {
168
310
  return [
169
- fe(e),
311
+ Te(e),
170
312
  e.collideCategory ?? 1,
171
313
  e.collideMask ?? 4294967295
172
314
  ];
173
315
  },
174
316
  attach(e, t, n) {
175
- return new ue(t.getBlock(n), n);
317
+ return new Ce(t.getBlock(n), n);
176
318
  }
177
319
  };
178
- function fe(e) {
179
- let t = pe(e);
180
- return e.sensor && (t |= 4), e.continuousCollisionDetection && (t |= 8), t;
320
+ function Te(e) {
321
+ let t = Ee(e);
322
+ return e.sensor && (t |= 8), e.continuousCollisionDetection && (t |= 16), t;
181
323
  }
182
- function pe(e) {
324
+ function Ee(e) {
183
325
  let t = e.shape;
184
- if (t === void 0) return e.radius === void 0 ? 1 : 2;
185
- if (!T.includes(t)) throw Error(`Unknown body shape: ${t}`);
326
+ if (t === void 0) return e.vertices === void 0 ? e.radius === void 0 ? 1 : 2 : 4;
327
+ if (!ce.includes(t)) throw Error(`Unknown body shape: ${t}`);
328
+ if (t === 4 && e.vertices === void 0) throw Error("A polygon body requires vertices");
186
329
  return t;
187
330
  }
188
331
  //#endregion
189
332
  //#region src/components/bounciness-component.ts
190
- var me = 0, he = 1, ge = class extends t {
333
+ var De = 0, Oe = 1, ke = class extends t {
191
334
  get bounciness() {
192
335
  return this.block[0];
193
336
  }
194
337
  set bounciness(e) {
195
338
  this.block[0] = e;
196
339
  }
197
- }, _e = {
340
+ }, Ae = {
198
341
  type: Float32Array,
199
342
  size: 1,
200
343
  loadProperties: ["bounciness"],
@@ -202,9 +345,9 @@ var me = 0, he = 1, ge = class extends t {
202
345
  return [e.bounciness ?? 0];
203
346
  },
204
347
  attach(e, t, n) {
205
- return new ge(t.getBlock(n), n);
348
+ return new ke(t.getBlock(n), n);
206
349
  }
207
- }, ve = 0, ye = 1, be = 2, xe = 3, Se = 4, Ce = 5, we = 6, Te = 7, Ee = 8, De = class extends t {
350
+ }, je = 0, Me = 1, Ne = 2, Pe = 3, Fe = 4, Ie = 5, Le = 6, Re = 7, ze = 8, Be = class extends t {
208
351
  get x() {
209
352
  return this.block[0];
210
353
  }
@@ -253,7 +396,7 @@ var me = 0, he = 1, ge = class extends t {
253
396
  set tick(e) {
254
397
  a(this.block, 7, e);
255
398
  }
256
- }, Oe = {
399
+ }, Ve = {
257
400
  type: Float32Array,
258
401
  size: 8,
259
402
  loadProperties: ["interpolate"],
@@ -271,14 +414,14 @@ var me = 0, he = 1, ge = class extends t {
271
414
  ];
272
415
  },
273
416
  attach(e, t, n) {
274
- return new De(t.getBlock(n), n);
417
+ return new Be(t.getBlock(n), n);
275
418
  }
276
419
  };
277
- function ke(e) {
420
+ function He(e) {
278
421
  let { transform: t, interpolation: n } = e.components;
279
422
  !t || !n || (n.prevX = n.x = t.x, n.prevY = n.y = t.y);
280
423
  }
281
- function Ae(e, t) {
424
+ function Ue(e, t) {
282
425
  let { transform: n, velocity: r, interpolation: i } = e.components;
283
426
  if (!n || !r || !i) return;
284
427
  let a = 1 - (t.stepFraction < 0 ? 0 : t.stepFraction > 1 ? 1 : t.stepFraction), o = t.stepMs / 1e3, s = n.x, c = n.y, l = r.velocityX * o * a, u = r.velocityY * o * a;
@@ -286,142 +429,144 @@ function Ae(e, t) {
286
429
  }
287
430
  //#endregion
288
431
  //#region src/components/registry.ts
289
- var je = {
290
- transform: g,
291
- velocity: x,
292
- body: de,
293
- bounciness: _e,
294
- interpolation: Oe
295
- }, M = {
432
+ var We = {
433
+ transform: T,
434
+ velocity: j,
435
+ body: we,
436
+ polygon: m,
437
+ bounciness: Ae,
438
+ dynamics: te,
439
+ interpolation: Ve
440
+ }, z = {
296
441
  x: 0,
297
442
  y: 0
298
- }, N = {
443
+ }, B = {
299
444
  x: 0,
300
445
  y: 0
301
446
  };
302
- function P(e, t) {
447
+ function V(e, t) {
303
448
  return Math.max(0, (e - t) / 2);
304
449
  }
305
- function F(e, t, n) {
450
+ function H(e, t, n) {
306
451
  return e === 2 ? t / 2 : e === 3 ? n / 2 : 0;
307
452
  }
308
- function I(e, t, n) {
453
+ function U(e, t, n) {
309
454
  return e === 2 ? t <= 0 : e === 3 ? n <= 0 : t <= 0 || n <= 0;
310
455
  }
311
- function L(e, t, n, r) {
312
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * P(t, n) + n / 2 : ze(t, n, r);
456
+ function W(e, t, n, r) {
457
+ return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * V(t, n) + n / 2 : $e(t, n, r);
313
458
  }
314
- function R(e, t, n, r) {
315
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * P(t, n) + n / 2 : Be(t, n, r);
459
+ function G(e, t, n, r) {
460
+ return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * V(t, n) + n / 2 : et(t, n, r);
316
461
  }
317
- function z(e, t, n, r, i, a, o, s, c, l, u, d) {
318
- if (I(e, r, i) || I(o, l, u)) return !1;
462
+ function Ge(e, t, n, r, i, a, o, s, c, l, u, d) {
463
+ if (U(e, r, i) || U(o, l, u)) return !1;
319
464
  let f = e !== 1, p = o !== 1;
320
- if (!f && !p) return Ve(t, n, r, i, a, s, c, l, u, d);
321
- if (f && !p) return z(o, s, c, l, u, d, e, t, n, r, i, a);
322
- let m = B(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = F(o, l, u);
323
- if (!f) return Ue(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
324
- let v = B(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = F(e, r, i) + _;
325
- return He(t - y, n - b, t + y, n + b, s - h, c - g, s + h, c + g) < x * x;
465
+ if (!f && !p) return tt(t, n, r, i, a, s, c, l, u, d);
466
+ if (f && !p) return Ge(o, s, c, l, u, d, e, t, n, r, i, a);
467
+ let m = K(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = H(o, l, u);
468
+ if (!f) return rt(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
469
+ let v = K(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = H(e, r, i) + _;
470
+ return nt(t - y, n - b, t + y, n + b, s - h, c - g, s + h, c + g) < x * x;
326
471
  }
327
- function B(e, t, n) {
328
- return e === 3 ? P(t, n) : 0;
472
+ function K(e, t, n) {
473
+ return e === 3 ? V(t, n) : 0;
329
474
  }
330
- function Me(e, t, n, r, i, a, o, s, c, l, u, d, f) {
475
+ function Ke(e, t, n, r, i, a, o, s, c, l, u, d, f) {
331
476
  let p = e !== 1, m = o !== 1;
332
- return !p && !m ? Ne(t, n, r, i, a, s, c, l, u, d, f) : p && m ? Pe(e, t, n, r, i, a, o, s, c, l, u, d, f) : p ? Fe(s, c, l, u, d, e, t, n, r, i, a, f) : Fe(t, n, r, i, a, o, s, c, l, u, d, f) ? (f.x = -f.x, f.y = -f.y, !0) : !1;
477
+ return !p && !m ? qe(t, n, r, i, a, s, c, l, u, d, f) : p && m ? Je(e, t, n, r, i, a, o, s, c, l, u, d, f) : p ? Ye(s, c, l, u, d, e, t, n, r, i, a, f) : Ye(t, n, r, i, a, o, s, c, l, u, d, f) ? (f.x = -f.x, f.y = -f.y, !0) : !1;
333
478
  }
334
- function Ne(e, t, n, r, i, a, o, s, c, l, u) {
335
- let d = Math.cos(i), f = Math.sin(i), p = Math.cos(l), m = Math.sin(l), h = n / 2, g = r / 2, _ = s / 2, v = c / 2, y = e - a, b = t - o, x = V(d, f, y, b, h, g, d, f, _, v, p, m);
479
+ function qe(e, t, n, r, i, a, o, s, c, l, u) {
480
+ let d = Math.cos(i), f = Math.sin(i), p = Math.cos(l), m = Math.sin(l), h = n / 2, g = r / 2, _ = s / 2, v = c / 2, y = e - a, b = t - o, x = q(d, f, y, b, h, g, d, f, _, v, p, m);
336
481
  u.x = d, u.y = f;
337
- let S = V(-f, d, y, b, h, g, d, f, _, v, p, m);
338
- return S < x && (x = S, u.x = -f, u.y = d), S = V(p, m, y, b, h, g, d, f, _, v, p, m), S < x && (x = S, u.x = p, u.y = m), S = V(-m, p, y, b, h, g, d, f, _, v, p, m), S < x && (u.x = -m, u.y = p), Le(y, b, u), !0;
482
+ let S = q(-f, d, y, b, h, g, d, f, _, v, p, m);
483
+ return S < x && (x = S, u.x = -f, u.y = d), S = q(p, m, y, b, h, g, d, f, _, v, p, m), S < x && (x = S, u.x = p, u.y = m), S = q(-m, p, y, b, h, g, d, f, _, v, p, m), S < x && (u.x = -m, u.y = p), Ze(y, b, u), !0;
339
484
  }
340
- function Pe(e, t, n, r, i, a, o, s, c, l, u, d, f) {
341
- let p = B(e, r, i), m = Math.cos(a) * p, h = Math.sin(a) * p, g = B(o, l, u), _ = Math.cos(d) * g, v = Math.sin(d) * g, y = Math.sqrt(He(t - m, n - h, t + m, n + h, s - _, c - v, s + _, c + v, M));
342
- return y > 0 ? (f.x = M.x / y, f.y = M.y / y, !0) : Re(t - s, n - c, f);
485
+ function Je(e, t, n, r, i, a, o, s, c, l, u, d, f) {
486
+ let p = K(e, r, i), m = Math.cos(a) * p, h = Math.sin(a) * p, g = K(o, l, u), _ = Math.cos(d) * g, v = Math.sin(d) * g, y = Math.sqrt(nt(t - m, n - h, t + m, n + h, s - _, c - v, s + _, c + v, z));
487
+ return y > 0 ? (f.x = z.x / y, f.y = z.y / y, !0) : Qe(t - s, n - c, f);
343
488
  }
344
- function Fe(e, t, n, r, i, a, o, s, c, l, u, d) {
345
- let f = B(a, c, l), p = Math.cos(u) * f, m = Math.sin(u) * f, h = Math.sqrt(Ue(o - p, s - m, o + p, s + m, e, t, n, r, i, M));
346
- if (h > 0) return d.x = M.x / h, d.y = M.y / h, !0;
347
- let g = Math.cos(i), _ = Math.sin(i), v = o - e, y = s - t, b = v * g + y * _, x = -v * _ + y * g, S = p * g + m * _, C = -p * _ + m * g, w = F(a, c, l), T = n / 2, E = r / 2, D = Ie(1, 0, b, x, S, C, w, T, E);
489
+ function Ye(e, t, n, r, i, a, o, s, c, l, u, d) {
490
+ let f = K(a, c, l), p = Math.cos(u) * f, m = Math.sin(u) * f, h = Math.sqrt(rt(o - p, s - m, o + p, s + m, e, t, n, r, i, z));
491
+ if (h > 0) return d.x = z.x / h, d.y = z.y / h, !0;
492
+ let g = Math.cos(i), _ = Math.sin(i), v = o - e, y = s - t, b = v * g + y * _, x = -v * _ + y * g, S = p * g + m * _, C = -p * _ + m * g, w = H(a, c, l), T = n / 2, E = r / 2, D = Xe(1, 0, b, x, S, C, w, T, E);
348
493
  d.x = 1, d.y = 0;
349
- let O = Ie(0, 1, b, x, S, C, w, T, E);
350
- O < D && (D = O, d.x = 0, d.y = 1), Re(-C, S, N) && (O = Ie(N.x, N.y, b, x, S, C, w, T, E), O < D && (d.x = N.x, d.y = N.y)), Le(b, x, d);
351
- let ee = d.x, te = d.y;
352
- return d.x = ee * g - te * _, d.y = ee * _ + te * g, !0;
494
+ let O = Xe(0, 1, b, x, S, C, w, T, E);
495
+ O < D && (D = O, d.x = 0, d.y = 1), Qe(-C, S, B) && (O = Xe(B.x, B.y, b, x, S, C, w, T, E), O < D && (d.x = B.x, d.y = B.y)), Ze(b, x, d);
496
+ let k = d.x, A = d.y;
497
+ return d.x = k * g - A * _, d.y = k * _ + A * g, !0;
353
498
  }
354
- function Ie(e, t, n, r, i, a, o, s, c) {
499
+ function Xe(e, t, n, r, i, a, o, s, c) {
355
500
  return s * Math.abs(e) + c * Math.abs(t) + (Math.abs(i * e + a * t) + o) - Math.abs(n * e + r * t);
356
501
  }
357
- function Le(e, t, n) {
502
+ function Ze(e, t, n) {
358
503
  e * n.x + t * n.y < 0 && (n.x = -n.x, n.y = -n.y);
359
504
  }
360
- function Re(e, t, n) {
505
+ function Qe(e, t, n) {
361
506
  let r = Math.sqrt(e * e + t * t);
362
507
  return r === 0 ? !1 : (n.x = e / r, n.y = t / r, !0);
363
508
  }
364
- function ze(e, t, n) {
509
+ function $e(e, t, n) {
365
510
  return (Math.abs(Math.cos(n)) * e + Math.abs(Math.sin(n)) * t) / 2;
366
511
  }
367
- function Be(e, t, n) {
512
+ function et(e, t, n) {
368
513
  return (Math.abs(Math.sin(n)) * e + Math.abs(Math.cos(n)) * t) / 2;
369
514
  }
370
- function Ve(e, t, n, r, i, a, o, s, c, l) {
515
+ function tt(e, t, n, r, i, a, o, s, c, l) {
371
516
  if (n <= 0 || r <= 0 || s <= 0 || c <= 0) return !1;
372
517
  let u = Math.cos(i), d = Math.sin(i), f = Math.cos(l), p = Math.sin(l), m = n / 2, h = r / 2, g = s / 2, _ = c / 2, v = a - e, y = o - t;
373
- return V(u, d, v, y, m, h, u, d, g, _, f, p) > 0 && V(-d, u, v, y, m, h, u, d, g, _, f, p) > 0 && V(f, p, v, y, m, h, u, d, g, _, f, p) > 0 && V(-p, f, v, y, m, h, u, d, g, _, f, p) > 0;
518
+ return q(u, d, v, y, m, h, u, d, g, _, f, p) > 0 && q(-d, u, v, y, m, h, u, d, g, _, f, p) > 0 && q(f, p, v, y, m, h, u, d, g, _, f, p) > 0 && q(-p, f, v, y, m, h, u, d, g, _, f, p) > 0;
374
519
  }
375
- function V(e, t, n, r, i, a, o, s, c, l, u, d) {
520
+ function q(e, t, n, r, i, a, o, s, c, l, u, d) {
376
521
  return i * Math.abs(o * e + s * t) + a * Math.abs(-s * e + o * t) + (c * Math.abs(u * e + d * t) + l * Math.abs(-d * e + u * t)) - Math.abs(n * e + r * t);
377
522
  }
378
- function He(e, t, n, r, i, a, o, s, c) {
523
+ function nt(e, t, n, r, i, a, o, s, c) {
379
524
  let l = n - e, u = r - t, d = o - i, f = s - a, p = e - i, m = t - a, h = l * l + u * u, g = d * d + f * f, _ = d * p + f * m, v = 0, y = 0;
380
525
  if (h <= 0 && g <= 0) return c && (c.x = p, c.y = m), p * p + m * m;
381
- if (h <= 0) y = G(_ / g);
526
+ if (h <= 0) y = Y(_ / g);
382
527
  else {
383
528
  let e = l * p + u * m;
384
- if (g <= 0) v = G(-e / h);
529
+ if (g <= 0) v = Y(-e / h);
385
530
  else {
386
531
  let t = l * d + u * f, n = h * g - t * t;
387
- n !== 0 && (v = G((t * _ - e * g) / n)), y = (t * v + _) / g, y < 0 ? (y = 0, v = G(-e / h)) : y > 1 && (y = 1, v = G((t - e) / h));
532
+ n !== 0 && (v = Y((t * _ - e * g) / n)), y = (t * v + _) / g, y < 0 ? (y = 0, v = Y(-e / h)) : y > 1 && (y = 1, v = Y((t - e) / h));
388
533
  }
389
534
  }
390
535
  let b = e + l * v - (i + d * y), x = t + u * v - (a + f * y);
391
536
  return c && (c.x = b, c.y = x), b * b + x * x;
392
537
  }
393
- function Ue(e, t, n, r, i, a, o, s, c, l) {
538
+ function rt(e, t, n, r, i, a, o, s, c, l) {
394
539
  let u = Math.cos(c), d = Math.sin(c), f = o / 2, p = s / 2, m = e - i, h = t - a, g = n - i, _ = r - a, v = m * u + h * d, y = -m * d + h * u, b = g * u + _ * d, x = -g * d + _ * u;
395
- if (!We(v, y, b, x, f, p)) return l && (l.x = 0, l.y = 0), 0;
396
- if (!l) return Math.min(W(v, y, f, p), W(b, x, f, p), U(-f, -p, v, y, b, x), U(f, -p, v, y, b, x), U(f, p, v, y, b, x), U(-f, p, v, y, b, x));
397
- let S = W(v, y, f, p, l);
398
- S = H(S, W(b, x, f, p, N), N, l, !1), S = H(S, U(-f, -p, v, y, b, x, N), N, l, !0), S = H(S, U(f, -p, v, y, b, x, N), N, l, !0), S = H(S, U(f, p, v, y, b, x, N), N, l, !0), S = H(S, U(-f, p, v, y, b, x, N), N, l, !0);
540
+ if (!at(v, y, b, x, f, p)) return l && (l.x = 0, l.y = 0), 0;
541
+ if (!l) return Math.min(ot(v, y, f, p), ot(b, x, f, p), J(-f, -p, v, y, b, x), J(f, -p, v, y, b, x), J(f, p, v, y, b, x), J(-f, p, v, y, b, x));
542
+ let S = ot(v, y, f, p, l);
543
+ S = it(S, ot(b, x, f, p, B), B, l, !1), S = it(S, J(-f, -p, v, y, b, x, B), B, l, !0), S = it(S, J(f, -p, v, y, b, x, B), B, l, !0), S = it(S, J(f, p, v, y, b, x, B), B, l, !0), S = it(S, J(-f, p, v, y, b, x, B), B, l, !0);
399
544
  let C = l.x, w = l.y;
400
545
  return l.x = C * u - w * d, l.y = C * d + w * u, S;
401
546
  }
402
- function H(e, t, n, r, i) {
547
+ function it(e, t, n, r, i) {
403
548
  return t >= e ? e : (r.x = i ? -n.x : n.x, r.y = i ? -n.y : n.y, t);
404
549
  }
405
- function U(e, t, n, r, i, a, o) {
406
- let s = i - n, c = a - r, l = s * s + c * c, u = l > 0 ? G(((e - n) * s + (t - r) * c) / l) : 0, d = e - (n + s * u), f = t - (r + c * u);
550
+ function J(e, t, n, r, i, a, o) {
551
+ let s = i - n, c = a - r, l = s * s + c * c, u = l > 0 ? Y(((e - n) * s + (t - r) * c) / l) : 0, d = e - (n + s * u), f = t - (r + c * u);
407
552
  return o && (o.x = d, o.y = f), d * d + f * f;
408
553
  }
409
- function We(e, t, n, r, i, a) {
554
+ function at(e, t, n, r, i, a) {
410
555
  if (Math.max(e, n) < -i || Math.min(e, n) > i || Math.max(t, r) < -a || Math.min(t, r) > a) return !0;
411
556
  let o = -(r - t), s = n - e;
412
557
  return Math.abs(o * e + s * t) > i * Math.abs(o) + a * Math.abs(s);
413
558
  }
414
- function W(e, t, n, r, i) {
559
+ function ot(e, t, n, r, i) {
415
560
  let a = Math.abs(e) - n, o = Math.abs(t) - r, s = a > 0 ? a : 0, c = o > 0 ? o : 0;
416
561
  return i && (i.x = e < 0 ? -s : s, i.y = t < 0 ? -c : c), s * s + c * c;
417
562
  }
418
- function G(e) {
563
+ function Y(e) {
419
564
  return e < 0 ? 0 : e > 1 ? 1 : e;
420
565
  }
421
566
  //#endregion
422
567
  //#region src/systems/spatial-bounds.ts
423
- function K(e) {
424
- let t = e.transform, n = e.body ? k(e.body) : 1, r = t[2], i = t[3], a = t[4], o = L(n, r, i, a), s = R(n, r, i, a), c = t[0], l = t[1];
568
+ function X(e) {
569
+ let t = e.transform, n = e.body ? L(e.body) : 1, r = t[2], i = t[3], a = t[4], o = W(n, r, i, a), s = G(n, r, i, a), c = t[0], l = t[1];
425
570
  return {
426
571
  minX: c - o,
427
572
  minY: l - s,
@@ -429,23 +574,23 @@ function K(e) {
429
574
  maxY: l + s
430
575
  };
431
576
  }
432
- function Ge(e, t, n, r, i) {
577
+ function st(e, t, n, r, i) {
433
578
  return e.minX <= r && e.maxX >= t && e.minY <= i && e.maxY >= n;
434
579
  }
435
- function Ke(e, t) {
580
+ function ct(e, t) {
436
581
  return t > e ? t - e : Math.max(1, Math.abs(e)) * 2 ** -52;
437
582
  }
438
583
  //#endregion
439
584
  //#region src/world.ts
440
- function qe(e, t) {
585
+ function lt(e, t) {
441
586
  t.spatialMapMemory = e.spatialMap.getSharedMemory();
442
587
  }
443
- function Je(e) {
588
+ function ut(e) {
444
589
  if (e.spatialMap) return e.spatialMap;
445
590
  if (!e.heap || !e.spatialMapMemory) throw Error("Spatial system world is missing its shared MemoryHeap or spatial map");
446
591
  return e.spatialMap = new o(e.heap, e.spatialMapMemory), e.spatialMap;
447
592
  }
448
- var Ye = class extends e {
593
+ var dt = class extends e {
449
594
  spatialMap;
450
595
  spatialIds = /* @__PURE__ */ new Set();
451
596
  constructor(e, t = {}) {
@@ -468,7 +613,7 @@ var Ye = class extends e {
468
613
  this.spatialIds.delete(t.eid), this.spatialMap.remove(t.eid);
469
614
  return;
470
615
  }
471
- let i = K({
616
+ let i = X({
472
617
  transform: r,
473
618
  body: n.body?.block
474
619
  });
@@ -476,12 +621,12 @@ var Ye = class extends e {
476
621
  }
477
622
  searchSpatial(e, t, n, r, i) {
478
623
  if (n < e || r < t) return [];
479
- let a = [], o = Number.isFinite(e) && Number.isFinite(t) && Number.isFinite(n) && Number.isFinite(r) ? this.spatialMap.search(e, t, Ke(e, n), Ke(t, r)) : this.spatialIds;
624
+ let a = [], o = Number.isFinite(e) && Number.isFinite(t) && Number.isFinite(n) && Number.isFinite(r) ? this.spatialMap.search(e, t, ct(e, n), ct(t, r)) : this.spatialIds;
480
625
  for (let s of o) {
481
626
  let o = this.getEntityByEid(s);
482
627
  if (!o || i && !i(o)) continue;
483
628
  let c = o.components, l = c.transform?.block;
484
- l && Ge(K({
629
+ l && st(X({
485
630
  transform: l,
486
631
  body: c.body?.block
487
632
  }), e, t, n, r) && a.push(o);
@@ -503,64 +648,255 @@ var Ye = class extends e {
503
648
  return t ? [t] : [];
504
649
  });
505
650
  }
506
- }, q = 1e-4, Xe = 24, Ze = "collidable", J = [], Qe = 2 ** 26, $e = {
651
+ }, ft = {
652
+ min: 0,
653
+ max: 0
654
+ }, pt = {
655
+ min: 0,
656
+ max: 0
657
+ }, Z = {
658
+ overlap: !0,
659
+ depth: Infinity,
660
+ x: 0,
661
+ y: 0
662
+ };
663
+ function mt(e, t, n, r, i, a, o, s, c, l, u, d, f, p) {
664
+ return gt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, !1);
665
+ }
666
+ function ht(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) {
667
+ return Z.depth = Infinity, !gt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, !0) || Z.depth === Infinity ? !1 : (m.x = Z.x, m.y = Z.y, !0);
668
+ }
669
+ function gt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) {
670
+ return !(e === 4 && (!t || !_t(t, n, r, i, a, o, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m)) || s === 4 && (!c || !_t(c, l, u, d, f, p, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m)) || e === 1 && !vt(o, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) || s === 1 && !vt(p, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) || Tt(e) && c && !yt(e, n, r, i, a, o, c, l, u, d, f, p, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) || Tt(s) && t && !yt(s, l, u, d, f, p, t, n, r, i, a, o, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m));
671
+ }
672
+ function _t(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v, y, b) {
673
+ let x = e[0], S = Math.cos(a), C = Math.sin(a);
674
+ for (let a = 0; a < x; a++) {
675
+ let w = (a + 1) % x, T = St(e, a, t, r, i, S, C), E = Ct(e, a, n, r, i, S, C), D = St(e, w, t, r, i, S, C);
676
+ if (!bt(E - Ct(e, w, n, r, i, S, C), D - T, o, s, c, l, u, d, f, p, m, h, g, _, v, y, b)) return !1;
677
+ }
678
+ return !0;
679
+ }
680
+ function vt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h) {
681
+ let g = Math.cos(e), _ = Math.sin(e);
682
+ return bt(g, _, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h) && bt(-_, g, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h);
683
+ }
684
+ function yt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v, y, b, x, S, C, w, T, E) {
685
+ let D = e === 3 ? V(r, i) : 0, O = Math.cos(a) * D, k = Math.sin(a) * D, A = t - O, j = n - k, M = t + O, N = n + k, ee = o[0], P = Math.cos(d), F = Math.sin(d);
686
+ for (let e = 0; e < ee; e++) {
687
+ let t = St(o, e, s, l, u, P, F), n = Ct(o, e, c, l, u, P, F), r = wt(A, j, M, N, t, n), i = A + (M - A) * r, a = j + (N - j) * r;
688
+ if (!bt(t - i, n - a, f, p, m, h, g, _, v, y, b, x, S, C, w, T, E)) return !1;
689
+ }
690
+ return !0;
691
+ }
692
+ function bt(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g) {
693
+ let _ = Math.hypot(e, t);
694
+ if (_ === 0) return !0;
695
+ e /= _, t /= _, xt(n, r, i, a, o, s, c, e, t, ft), xt(l, u, d, f, p, m, h, e, t, pt);
696
+ let v = ft.max - pt.min, y = pt.max - ft.min;
697
+ if (!g && (v <= 0 || y <= 0)) return !1;
698
+ if (g) {
699
+ let n, r;
700
+ v <= 0 ? (n = -v, r = -1) : y <= 0 ? (n = -y, r = 1) : v < y ? (n = v, r = -1) : (n = y, r = 1), n < Z.depth && (Z.depth = n, Z.x = e * r, Z.y = t * r);
701
+ }
702
+ return !0;
703
+ }
704
+ function xt(e, t, n, r, i, a, o, s, c, l) {
705
+ let u = n * s + r * c;
706
+ if (e === 2) {
707
+ let e = i / 2;
708
+ l.min = u - e, l.max = u + e;
709
+ return;
710
+ }
711
+ if (e === 3) {
712
+ let e = V(i, a), t = Math.abs(s * Math.cos(o) + c * Math.sin(o)) * e + a / 2;
713
+ l.min = u - t, l.max = u + t;
714
+ return;
715
+ }
716
+ if (e === 1) {
717
+ let e = Math.cos(o), t = Math.sin(o), n = Math.abs(s * e + c * t) * i / 2 + Math.abs(s * -t + c * e) * a / 2;
718
+ l.min = u - n, l.max = u + n;
719
+ return;
720
+ }
721
+ if (!t) {
722
+ l.min = Infinity, l.max = -Infinity;
723
+ return;
724
+ }
725
+ let d = t[0], f = Math.cos(o), p = Math.sin(o);
726
+ l.min = Infinity, l.max = -Infinity;
727
+ for (let e = 0; e < d; e++) {
728
+ let o = St(t, e, n, i, a, f, p), u = Ct(t, e, r, i, a, f, p), d = o * s + u * c;
729
+ l.min = Math.min(l.min, d), l.max = Math.max(l.max, d);
730
+ }
731
+ }
732
+ function St(e, t, n, r, i, a, o) {
733
+ let s = 1 + t * 2;
734
+ return n + e[s] * r * a - e[s + 1] * i * o;
735
+ }
736
+ function Ct(e, t, n, r, i, a, o) {
737
+ let s = 1 + t * 2;
738
+ return n + e[s] * r * o + e[s + 1] * i * a;
739
+ }
740
+ function wt(e, t, n, r, i, a) {
741
+ let o = n - e, s = r - t, c = o * o + s * s;
742
+ return c === 0 ? 0 : Math.min(1, Math.max(0, ((i - e) * o + (a - t) * s) / c));
743
+ }
744
+ function Tt(e) {
745
+ return e === 2 || e === 3;
746
+ }
747
+ function Et(e, t, n, r, i, a) {
748
+ if (Pt(n, r, "Force"), Pt(i, a, "Impulse"), n === 0 && r === 0 && i === 0 && a === 0) return;
749
+ let o = e.get(t) ?? Nt(), s = {
750
+ ...o,
751
+ forceX: o.forceX + n,
752
+ forceY: o.forceY + r,
753
+ impulseX: o.impulseX + i,
754
+ impulseY: o.impulseY + a
755
+ };
756
+ Pt(s.forceX, s.forceY, "Accumulated force"), Pt(s.impulseX, s.impulseY, "Accumulated impulse"), e.set(t, s);
757
+ }
758
+ function Dt(e, t, n) {
759
+ Ft(n), !(n.velocityX === void 0 && n.velocityY === void 0) && e.set(t, {
760
+ ...e.get(t) ?? Nt(),
761
+ ...n
762
+ });
763
+ }
764
+ function Ot(e, t) {
765
+ if (e.size === 0) return t;
766
+ let n = /* @__PURE__ */ new Map();
767
+ for (let [t, r] of e) n.set(t, { ...r });
768
+ return Mt(t, (e, t) => {
769
+ let r = n.get(e) ?? Nt();
770
+ n.set(e, {
771
+ forceX: r.forceX + t.forceX,
772
+ forceY: r.forceY + t.forceY,
773
+ impulseX: r.impulseX + t.impulseX,
774
+ impulseY: r.impulseY + t.impulseY,
775
+ velocityX: t.velocityX ?? r.velocityX,
776
+ velocityY: t.velocityY ?? r.velocityY
777
+ });
778
+ }), Array.from(n, ([e, t]) => ({
779
+ entityId: e,
780
+ ...t
781
+ })).sort((e, t) => e.entityId - t.entityId);
782
+ }
783
+ function kt(e, t, n, r) {
784
+ let i = e.dynamicsCommands, a = i instanceof Float64Array ? i : void 0, o = At(i && !(i instanceof Float64Array) ? i : void 0, t), s = a ? jt(a, t) : -1, c = n[2];
785
+ if (!r && !o && s < 0 && c === 0) return;
786
+ let l = e.elapsedTime / 1e3, u = r?.[2] ?? 1, d = s < 0 ? o?.forceX ?? 0 : a[s + 1], f = s < 0 ? o?.forceY ?? 0 : a[s + 2], p = s < 0 ? o?.impulseX ?? 0 : a[s + 3], m = s < 0 ? o?.impulseY ?? 0 : a[s + 4], h = s < 0 ? 0 : a[s + 5], g = s < 0 ? o?.velocityX : h & 1 ? a[s + 6] : void 0, _ = s < 0 ? o?.velocityY : h & 2 ? a[s + 7] : void 0, v = c > 0 ? 1 / (1 + c * l) : 1, y = (n[0] + (r?.[0] ?? 0) * l + d * u * l + p * u) * v, b = (n[1] + (r?.[1] ?? 0) * l + f * u * l + m * u) * v;
787
+ n[0] = g ?? y, n[1] = _ ?? b;
788
+ }
789
+ function At(e, t) {
790
+ if (!e) return;
791
+ let n = 0, r = e.length - 1;
792
+ for (; n <= r;) {
793
+ let i = n + r >>> 1, a = e[i];
794
+ if (a.entityId === t) return a;
795
+ a.entityId < t ? n = i + 1 : r = i - 1;
796
+ }
797
+ }
798
+ function jt(e, t) {
799
+ let n = 0, r = e.length / 8 - 1;
800
+ for (; n <= r;) {
801
+ let i = n + r >>> 1, a = i * 8, o = e[a + 0];
802
+ if (o === t) return a;
803
+ o < t ? n = i + 1 : r = i - 1;
804
+ }
805
+ return -1;
806
+ }
807
+ function Mt(e, t) {
808
+ if (e) {
809
+ if (!(e instanceof Float64Array)) {
810
+ for (let { entityId: n, ...r } of e) t(n, r);
811
+ return;
812
+ }
813
+ for (let n = 0; n < e.length; n += 8) {
814
+ let r = e[n + 5];
815
+ t(e[n + 0], {
816
+ forceX: e[n + 1],
817
+ forceY: e[n + 2],
818
+ impulseX: e[n + 3],
819
+ impulseY: e[n + 4],
820
+ velocityX: r & 1 ? e[n + 6] : void 0,
821
+ velocityY: r & 2 ? e[n + 7] : void 0
822
+ });
823
+ }
824
+ }
825
+ }
826
+ function Nt() {
827
+ return {
828
+ forceX: 0,
829
+ forceY: 0,
830
+ impulseX: 0,
831
+ impulseY: 0
832
+ };
833
+ }
834
+ function Pt(e, t, n) {
835
+ if (!Number.isFinite(e) || !Number.isFinite(t)) throw Error(`${n} must contain finite numbers`);
836
+ }
837
+ function Ft(e) {
838
+ if (e.velocityX !== void 0 && !Number.isFinite(e.velocityX) || e.velocityY !== void 0 && !Number.isFinite(e.velocityY)) throw Error("Velocity assignment must contain finite numbers");
839
+ }
840
+ //#endregion
841
+ //#region src/systems/collision.ts
842
+ var It = 1e-4, Lt = 24, Rt = "collidable", Q = [], zt = 2 ** 26, Bt = {
507
843
  fraction: 1,
508
- blocking: J
509
- }, et = class {
844
+ blocking: Q
845
+ }, Vt = class {
510
846
  buckets = [];
511
847
  hasBounciness = !1;
512
848
  resolved = /* @__PURE__ */ new Set();
513
- constructor(e, t) {
514
- let n = /* @__PURE__ */ new Map();
515
- for (let r of e) {
516
- let e = r.components, i = e.transform, a = e.body;
517
- if (!i || !a) continue;
518
- let o = a[1];
519
- if (o === 0) continue;
520
- let s = k(a), c = i[2], l = i[3];
521
- if (I(s, c, l)) continue;
522
- let u = i[4], d = L(s, c, l, u), f = R(s, c, l, u);
849
+ constructor(e, t, n) {
850
+ let r = /* @__PURE__ */ new Map(), i = n instanceof Float64Array ? n : void 0, a = n && !(n instanceof Float64Array) ? n : void 0;
851
+ for (let n of e) {
852
+ let e = n.components, o = e.transform, s = e.body;
853
+ if (!o || !s) continue;
854
+ let c = s[1];
855
+ if (c === 0) continue;
856
+ let l = L(s), u = o[2], d = o[3];
857
+ if (U(l, u, d)) continue;
858
+ let f = o[4], p = W(l, u, d, f), m = G(l, u, d, f);
523
859
  e.bounciness && (this.hasBounciness = !0);
524
- let p = e.velocity, m = p ? Math.abs(p[0]) * t : 0, h = p ? Math.abs(p[1]) * t : 0, g = i[0], _ = i[1], v = n.get(o);
525
- v || (v = {
860
+ let h = e.velocity, g = e.dynamics, _ = At(a, n.entityId), v = i ? jt(i, n.entityId) : -1, y = g?.[2] ?? 1, b = v < 0 ? _?.forceX ?? 0 : i[v + 1], x = v < 0 ? _?.forceY ?? 0 : i[v + 2], S = v < 0 ? _?.impulseX ?? 0 : i[v + 3], C = v < 0 ? _?.impulseY ?? 0 : i[v + 4], w = v < 0 ? 0 : i[v + 5], T = v < 0 ? _?.velocityX : w & 1 ? i[v + 6] : void 0, E = v < 0 ? _?.velocityY : w & 2 ? i[v + 7] : void 0, D = h?.[0] ?? 0, O = h?.[1] ?? 0, k = D + (g?.[0] ?? 0) * t + b * y * t + S * y, A = O + (g?.[1] ?? 0) * t + x * y * t + C * y, j = T ?? k, M = E ?? A, N = Math.max(Math.abs(D), Math.abs(j)) * t, ee = Math.max(Math.abs(O), Math.abs(M)) * t, P = o[0], F = o[1], I = r.get(c);
861
+ I || (I = {
526
862
  entries: [],
527
863
  bounds: []
528
- }, n.set(o, v)), v.entries.push({
529
- entityId: r.entityId,
864
+ }, r.set(c, I)), I.entries.push({
865
+ entityId: n.entityId,
530
866
  components: e
531
- }), v.bounds.push(g - d - m, _ - f - h, g + d + m, _ + f + h);
867
+ }), I.bounds.push(P - p - N, F - m - ee, P + p + N, F + m + ee);
532
868
  }
533
- for (let [e, { entries: t, bounds: r }] of n) {
534
- let n = new s(t.length);
535
- for (let e = 0; e < t.length; e++) n.add(r[e * 4], r[e * 4 + 1], r[e * 4 + 2], r[e * 4 + 3]);
536
- n.finish(), this.buckets.push({
869
+ for (let [e, { entries: t, bounds: n }] of r) {
870
+ let r = new s(t.length);
871
+ for (let e = 0; e < t.length; e++) r.add(n[e * 4], n[e * 4 + 1], n[e * 4 + 2], n[e * 4 + 3]);
872
+ r.finish(), this.buckets.push({
537
873
  category: e,
538
874
  entries: t,
539
- index: n
875
+ index: r
540
876
  });
541
877
  }
542
878
  }
543
879
  claimContact(e, t) {
544
- let n = e < t ? e * Qe + t : t * Qe + e;
880
+ let n = e < t ? e * zt + t : t * zt + e;
545
881
  return this.resolved.has(n) ? !1 : (this.resolved.add(n), !0);
546
882
  }
547
883
  forEachOverlapping(e, t, n = 0, r = 0) {
548
- let i = Y(e);
884
+ let i = Wt(e);
549
885
  if (!i) return;
550
886
  let { x: a, y: o, halfWidth: s, halfHeight: c } = i;
551
887
  if (i.ccd && (n !== 0 || r !== 0)) {
552
888
  let e = a - n, l = o - r, u = Math.min(e, a) - s, d = Math.min(l, o) - c, f = Math.max(e, a) + s, p = Math.max(l, o) + c;
553
889
  this.forEachCandidate(i, u, d, f, p, (a) => {
554
- nt(i, e, l, n, r, a) && t(a);
890
+ Gt(i, e, l, n, r, a) && t(a);
555
891
  });
556
892
  return;
557
893
  }
558
894
  this.forEachCandidate(i, a - s, o - c, a + s, o + c, (e) => {
559
- X(i, a, o, e) && t(e);
895
+ $(i, a, o, e) && t(e);
560
896
  });
561
897
  }
562
898
  contactPoint(e, t, n, r) {
563
- let i = e.components.transform, a = i[0], o = i[1], s = Math.sqrt(n * n + r * r), c = Y(e);
899
+ let i = e.components.transform, a = i[0], o = i[1], s = Math.sqrt(n * n + r * r), c = Wt(e);
564
900
  if (!c || s === 0) return {
565
901
  x: a,
566
902
  y: o
@@ -572,25 +908,34 @@ var Ye = class extends e {
572
908
  y: c.y + r * l
573
909
  };
574
910
  }
911
+ contactNormal(e, t, n, r, i) {
912
+ let a = Wt(e);
913
+ if (!a) return !1;
914
+ let o = n === 0 && r === 0 ? {
915
+ x: a.x,
916
+ y: a.y
917
+ } : this.contactPoint(e, t, n, r);
918
+ return Ht(a, o.x, o.y, t, i);
919
+ }
575
920
  sweep(e, t, n) {
576
- let r = Math.sqrt(t * t + n * n), i = Y(e);
921
+ let r = Math.sqrt(t * t + n * n), i = Wt(e);
577
922
  if (!i || r === 0) return {
578
923
  fraction: 1,
579
- blocking: J
924
+ blocking: Q
580
925
  };
581
926
  if (i.ccd) return this.sweepContinuous(i, t, n, r);
582
927
  let a = this.gatherCandidates(i, t, n);
583
928
  return a.length === 0 ? {
584
929
  fraction: 1,
585
- blocking: J
930
+ blocking: Q
586
931
  } : this.refine(i, a, t, n, r);
587
932
  }
588
933
  resolveMove(e, t, n, r) {
589
- let i = Math.sqrt(t * t + n * n), a = Y(e);
934
+ let i = Math.sqrt(t * t + n * n), a = Wt(e);
590
935
  if (!a || i === 0) return {
591
936
  moveX: t,
592
937
  moveY: n,
593
- blocking: J
938
+ blocking: Q
594
939
  };
595
940
  if (a.ccd) {
596
941
  let e = this.sweepContinuous(a, t, n, i);
@@ -604,20 +949,20 @@ var Ye = class extends e {
604
949
  if (o.length === 0) return {
605
950
  moveX: t,
606
951
  moveY: n,
607
- blocking: J
952
+ blocking: Q
608
953
  };
609
954
  if (r && t !== 0 && n !== 0) {
610
955
  let e = this.gatherCandidates(a, t, 0), r = this.gatherCandidates(a, 0, n);
611
956
  if (e.length === 0 && r.length === 0) return Math.abs(t) >= Math.abs(n) ? {
612
957
  moveX: t,
613
958
  moveY: 0,
614
- blocking: J
959
+ blocking: Q
615
960
  } : {
616
961
  moveX: 0,
617
962
  moveY: n,
618
- blocking: J
963
+ blocking: Q
619
964
  };
620
- let i = e.length === 0 ? $e : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? $e : this.refine(a, r, 0, n, Math.abs(n)), s = t * i.fraction, c = n * o.fraction;
965
+ let i = e.length === 0 ? Bt : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? Bt : this.refine(a, r, 0, n, Math.abs(n)), s = t * i.fraction, c = n * o.fraction;
621
966
  if (s !== 0 && c !== 0) {
622
967
  let e = this.gatherCandidates(a, s, c);
623
968
  if (e.length > 0) {
@@ -632,7 +977,7 @@ var Ye = class extends e {
632
977
  return {
633
978
  moveX: s,
634
979
  moveY: c,
635
- blocking: tt(i.blocking, o.blocking)
980
+ blocking: Ut(i.blocking, o.blocking)
636
981
  };
637
982
  }
638
983
  let s = this.refine(a, o, t, n, i);
@@ -647,19 +992,19 @@ var Ye = class extends e {
647
992
  if (e.sensor) return [];
648
993
  let s = r + t, c = i + n, l = [];
649
994
  return this.forEachCandidate(e, s - a, c - o, s + a, c + o, (t) => {
650
- X(e, s, c, t) && (A(t.components.body) || X(e, r, i, t) || l.push(t));
995
+ $(e, s, c, t) && (R(t.components.body) || $(e, r, i, t) || l.push(t));
651
996
  }), l;
652
997
  }
653
998
  refine(e, t, n, r, i) {
654
- let { x: a, y: o } = e, s = 0, c = 1, l = q / i;
655
- for (let i = 0; i < Xe && c - s > l; i++) {
999
+ let { x: a, y: o } = e, s = 0, c = 1, l = It / i;
1000
+ for (let i = 0; i < Lt && c - s > l; i++) {
656
1001
  let i = (s + c) / 2;
657
1002
  this.blockedAt(e, t, n, r, i) ? c = i : s = i;
658
1003
  }
659
1004
  let u = [], d = a + n * c, f = o + r * c;
660
- for (let n of t) X(e, d, f, n) && u.push(n);
1005
+ for (let n of t) $(e, d, f, n) && u.push(n);
661
1006
  return {
662
- fraction: s * i > q ? s : 0,
1007
+ fraction: s * i > It ? s : 0,
663
1008
  blocking: u
664
1009
  };
665
1010
  }
@@ -667,22 +1012,22 @@ var Ye = class extends e {
667
1012
  if (e.sensor) return [];
668
1013
  let { x: r, y: i, halfWidth: a, halfHeight: o } = e, s = r + t, c = i + n, l = [];
669
1014
  return this.forEachCandidate(e, Math.min(r, s) - a, Math.min(i, c) - o, Math.max(r, s) + a, Math.max(i, c) + o, (a) => {
670
- A(a.components.body) || X(e, r, i, a) || nt(e, r, i, t, n, a) && l.push(a);
1015
+ R(a.components.body) || $(e, r, i, a) || Gt(e, r, i, t, n, a) && l.push(a);
671
1016
  }), l;
672
1017
  }
673
1018
  sweepContinuous(e, t, n, r) {
674
1019
  let i = this.gatherContinuousCandidates(e, t, n);
675
1020
  if (i.length === 0) return {
676
1021
  fraction: 1,
677
- blocking: J
1022
+ blocking: Q
678
1023
  };
679
- let a = 1, o = [], s = q / r;
1024
+ let a = 1, o = [], s = It / r;
680
1025
  for (let c of i) {
681
1026
  let i = this.entryFraction(e, c, t, n, r);
682
1027
  i < a - s ? (a = i, o = [c]) : i <= a + s && o.push(c);
683
1028
  }
684
1029
  return {
685
- fraction: a * r > q ? a : 0,
1030
+ fraction: a * r > It ? a : 0,
686
1031
  blocking: o
687
1032
  };
688
1033
  }
@@ -690,82 +1035,90 @@ var Ye = class extends e {
690
1035
  let a;
691
1036
  if (this.blockedAtOne(e, t, n, r, 1)) a = 1;
692
1037
  else {
693
- let o = t.components.transform, s = o[0] - e.x, c = o[1] - e.y, l = rt((s * n + c * r) / (i * i));
1038
+ let o = t.components.transform, s = o[0] - e.x, c = o[1] - e.y, l = Kt((s * n + c * r) / (i * i));
694
1039
  if (!this.blockedAtOne(e, t, n, r, l)) return l;
695
1040
  a = l;
696
1041
  }
697
- let o = 0, s = q / i;
698
- for (let i = 0; i < Xe && a - o > s; i++) {
1042
+ let o = 0, s = It / i;
1043
+ for (let i = 0; i < Lt && a - o > s; i++) {
699
1044
  let i = (o + a) / 2;
700
1045
  this.blockedAtOne(e, t, n, r, i) ? a = i : o = i;
701
1046
  }
702
1047
  return o;
703
1048
  }
704
1049
  blockedAtOne(e, t, n, r, i) {
705
- return X(e, Math.fround(e.x + n * i), Math.fround(e.y + r * i), t);
1050
+ return $(e, Math.fround(e.x + n * i), Math.fround(e.y + r * i), t);
706
1051
  }
707
1052
  blockedAt(e, t, n, r, i) {
708
1053
  let a = Math.fround(e.x + n * i), o = Math.fround(e.y + r * i);
709
- for (let n of t) if (X(e, a, o, n)) return !0;
1054
+ for (let n of t) if ($(e, a, o, n)) return !0;
710
1055
  return !1;
711
1056
  }
712
- forEachCandidate(e, t, n, i, a, o) {
713
- for (let s of this.buckets) if ((e.mask & s.category) !== 0) for (let c of s.index.search(t, n, i, a)) {
1057
+ forEachCandidate(e, t, r, i, a, o) {
1058
+ for (let s of this.buckets) if ((e.mask & s.category) !== 0) for (let c of s.index.search(t, r, i, a)) {
714
1059
  let t = s.entries[c];
715
- t.entityId !== e.entityId && (t.components.body[2] & e.category) !== 0 && t.components.entity?.[r] !== 1 && (j(t.components.body) || o(t));
1060
+ t.entityId !== e.entityId && (t.components.body[2] & e.category) !== 0 && t.components.entity?.[n] !== 1 && (xe(t.components.body) || o(t));
716
1061
  }
717
1062
  }
718
1063
  };
719
- function tt(e, t) {
1064
+ function Ht(e, t, n, r, i) {
1065
+ let a = r.components.transform, o = L(r.components.body), s = a[0], c = a[1], l = a[2], u = a[3], d = a[4];
1066
+ return e.shape === 4 || o === 4 ? ht(e.shape, e.polygon, t, n, e.width, e.height, e.angle, o, r.components.polygon, s, c, l, u, d, i) : Ke(e.shape, t, n, e.width, e.height, e.angle, o, s, c, l, u, d, i);
1067
+ }
1068
+ function Ut(e, t) {
720
1069
  if (e.length === 0) return t;
721
1070
  if (t.length === 0) return e;
722
1071
  let n = [...e];
723
1072
  for (let e of t) n.some((t) => t.entityId === e.entityId) || n.push(e);
724
1073
  return n;
725
1074
  }
726
- function Y(e) {
1075
+ function Wt(e) {
727
1076
  let t = e.components.body;
728
1077
  if (!t) return;
729
1078
  let n = t[2];
730
1079
  if (n === 0) return;
731
- let r = e.components.transform, i = k(t), a = r[2], o = r[3];
732
- if (I(i, a, o)) return;
733
- let s = r[4];
734
- return {
1080
+ let r = e.components.transform, i = L(t), a = r[2], o = r[3];
1081
+ if (U(i, a, o)) return;
1082
+ let s = r[4], c = e.components.polygon;
1083
+ if (!(i === 4 && !c)) return {
735
1084
  entityId: e.entityId,
736
1085
  shape: i,
1086
+ polygon: c,
737
1087
  x: r[0],
738
1088
  y: r[1],
739
1089
  width: a,
740
1090
  height: o,
741
1091
  angle: s,
742
- halfWidth: L(i, a, o, s),
743
- halfHeight: R(i, a, o, s),
1092
+ halfWidth: W(i, a, o, s),
1093
+ halfHeight: G(i, a, o, s),
744
1094
  category: t[1],
745
1095
  mask: n,
746
- sensor: A(t),
747
- ccd: ce(t)
1096
+ sensor: R(t),
1097
+ ccd: be(t)
748
1098
  };
749
1099
  }
750
- function nt(e, t, n, r, i, a) {
751
- let o = t + r, s = n + i, c = a.components.transform, l = k(a.components.body), u = c[0], d = c[1], f = c[2], p = c[3], m = c[4];
752
- if (e.shape === 1) {
753
- let a = Math.cos(e.angle), c = Math.sin(e.angle), h = r * a + i * c, g = -r * c + i * a;
754
- return z(1, (t + o) / 2, (n + s) / 2, e.width + Math.abs(h), e.height + Math.abs(g), e.angle, l, u, d, f, p, m);
755
- }
756
- let h = F(e.shape, e.width, e.height), g = Math.sqrt(r * r + i * i), _ = g > 0 ? Math.atan2(i, r) : e.angle;
757
- return z(3, (t + o) / 2, (n + s) / 2, g + h * 2, h * 2, _, l, u, d, f, p, m) ? !0 : z(e.shape, o, s, e.width, e.height, e.angle, l, u, d, f, p, m);
1100
+ function Gt(e, t, n, r, i, a) {
1101
+ let o = t + r, s = n + i, c = a.components.transform, l = L(a.components.body), u = c[0], d = c[1], f = c[2], p = c[3], m = c[4];
1102
+ if (e.shape === 1 || e.shape === 4) {
1103
+ let c = Math.cos(e.angle), h = Math.sin(e.angle), g = r * c + i * h, _ = -r * h + i * c;
1104
+ return qt(1, void 0, (t + o) / 2, (n + s) / 2, e.width + Math.abs(g), e.height + Math.abs(_), e.angle, l, a.components.polygon, u, d, f, p, m);
1105
+ }
1106
+ let h = H(e.shape, e.width, e.height), g = Math.sqrt(r * r + i * i), _ = g > 0 ? Math.atan2(i, r) : e.angle;
1107
+ return qt(3, void 0, (t + o) / 2, (n + s) / 2, g + h * 2, h * 2, _, l, a.components.polygon, u, d, f, p, m) ? !0 : qt(e.shape, e.polygon, o, s, e.width, e.height, e.angle, l, a.components.polygon, u, d, f, p, m);
758
1108
  }
759
- function rt(e) {
1109
+ function Kt(e) {
760
1110
  return e < 0 ? 0 : e > 1 ? 1 : e;
761
1111
  }
762
- function X(e, t, n, r) {
1112
+ function $(e, t, n, r) {
763
1113
  let i = r.components.transform;
764
- return z(e.shape, t, n, e.width, e.height, e.angle, k(r.components.body), i[0], i[1], i[2], i[3], i[4]);
1114
+ return qt(e.shape, e.polygon, t, n, e.width, e.height, e.angle, L(r.components.body), r.components.polygon, i[0], i[1], i[2], i[3], i[4]);
1115
+ }
1116
+ function qt(e, t, n, r, i, a, o, s, c, l, u, d, f, p) {
1117
+ return e !== 4 && s !== 4 ? Ge(e, n, r, i, a, o, s, l, u, d, f, p) : mt(e, t, n, r, i, a, o, s, c, l, u, d, f, p);
765
1118
  }
766
1119
  //#endregion
767
1120
  //#region src/systems/spatial-index.ts
768
- var it = class {
1121
+ var Jt = class {
769
1122
  entries = [];
770
1123
  index;
771
1124
  constructor(e) {
@@ -773,7 +1126,7 @@ var it = class {
773
1126
  for (let n of e) {
774
1127
  let e = n.components, r = e.transform;
775
1128
  if (!r) continue;
776
- let i = e.body, a = i ? k(i) : 1, o = r[2], s = r[3], c = r[4], l = r[0], u = r[1], d = L(a, o, s, c), f = R(a, o, s, c);
1129
+ let i = e.body, a = i ? L(i) : 1, o = r[2], s = r[3], c = r[4], l = r[0], u = r[1], d = W(a, o, s, c), f = G(a, o, s, c);
777
1130
  this.entries.push({
778
1131
  entityId: n.entityId,
779
1132
  components: e
@@ -805,14 +1158,14 @@ var it = class {
805
1158
  let o = this.entries;
806
1159
  return (i ? a.neighbors(e, t, n, r, (e) => i(o[e])) : a.neighbors(e, t, n, r)).map((e) => o[e]);
807
1160
  }
808
- }, Z = {
1161
+ }, Yt = {
809
1162
  x: 0,
810
1163
  y: 0
811
1164
  };
812
- function at(e, t) {
813
- !st(e) && !st(t) || ct(e, t) && lt(e, t, Z) && (ot(e, Z.x, Z.y), ot(t, -Z.x, -Z.y));
1165
+ function Xt(e, t, n = !1) {
1166
+ !$t(e, n) && !$t(t, n) || en(e, t) && tn(e, t, Yt) && (Qt(e, Yt.x, Yt.y, n), Qt(t, -Yt.x, -Yt.y, n));
814
1167
  }
815
- function ot(e, t, n) {
1168
+ function Zt(e, t, n) {
816
1169
  let r = e.components.bounciness, i = e.components.velocity;
817
1170
  if (!r || !i) return;
818
1171
  let a = i[0], o = i[1], s = a * t + o * n;
@@ -820,98 +1173,132 @@ function ot(e, t, n) {
820
1173
  let c = (1 + r[0]) * s;
821
1174
  i[0] = a - c * t, i[1] = o - c * n;
822
1175
  }
823
- function st(e) {
824
- return e.components.bounciness !== void 0 && e.components.velocity !== void 0;
1176
+ function Qt(e, t, n, r) {
1177
+ if (e.components.bounciness) {
1178
+ Zt(e, t, n);
1179
+ return;
1180
+ }
1181
+ let i = e.components.velocity;
1182
+ if (!r || !i) return;
1183
+ let a = i[0], o = i[1], s = a * t + o * n;
1184
+ s < 0 && (i[0] = a - s * t, i[1] = o - s * n);
825
1185
  }
826
- function ct(e, t) {
827
- return !dt(e.components.body) && !dt(t.components.body);
1186
+ function $t(e, t) {
1187
+ return e.components.velocity !== void 0 && (t || e.components.bounciness !== void 0);
828
1188
  }
829
- function lt(e, t, n) {
830
- let r = e.components.transform, i = t.components.transform;
831
- return Me(ut(e.components.body), r[0], r[1], r[2], r[3], r[4], ut(t.components.body), i[0], i[1], i[2], i[3], i[4], n);
1189
+ function en(e, t) {
1190
+ return !rn(e.components.body) && !rn(t.components.body);
832
1191
  }
833
- function ut(e) {
834
- return e ? k(e) : 1;
1192
+ function tn(e, t, n) {
1193
+ let r = e.components.transform, i = t.components.transform, a = nn(e.components.body), o = nn(t.components.body);
1194
+ return a === 4 || o === 4 ? ht(a, e.components.polygon, r[0], r[1], r[2], r[3], r[4], o, t.components.polygon, i[0], i[1], i[2], i[3], i[4], n) : Ke(a, r[0], r[1], r[2], r[3], r[4], o, i[0], i[1], i[2], i[3], i[4], n);
1195
+ }
1196
+ function nn(e) {
1197
+ return e ? L(e) : 1;
835
1198
  }
836
- function dt(e) {
837
- return e !== void 0 && A(e);
1199
+ function rn(e) {
1200
+ return e !== void 0 && R(e);
838
1201
  }
839
1202
  //#endregion
840
1203
  //#region src/systems/physics-update.ts
841
- function Q(e, t, n) {
1204
+ function an(e, t, n) {
842
1205
  if (!e.spatialMap && (!e.heap || !e.spatialMapMemory)) return;
843
- let r = Je(e), i = K(n);
1206
+ let r = ut(e), i = X(n);
844
1207
  r.update(t, i.minX, i.minY, i.maxX - i.minX, i.maxY - i.minY);
845
1208
  }
846
- var ft = "position-updated";
847
- function pt(e = {}) {
848
- let { onCollision: t, optional: n = [], group: i } = e, a, o, s = Object.assign((e, n, s, c, l) => {
849
- if (s.entity?.[r] === 1) return;
850
- if (s.body !== void 0 && j(s.body)) {
851
- l.entityDied(n);
1209
+ var on = "position-updated", sn = {
1210
+ x: 0,
1211
+ y: 0
1212
+ };
1213
+ function cn(e = {}) {
1214
+ let { onCollision: t, optional: r = [], group: i, stopVelocityOnContact: a = !1 } = e, o, s, c = /* @__PURE__ */ new Map(), l = Object.assign((e, r, c, l, u) => {
1215
+ if (c.entity?.[n] === 1) return;
1216
+ if (c.body !== void 0 && xe(c.body)) {
1217
+ u.entityDied(r);
852
1218
  return;
853
1219
  }
854
- let u = i ? $(s, i) : 0;
855
- if (i && e.skipGroup === u) return;
856
- let d = {
857
- entityId: n,
858
- components: s
859
- }, f = s.interpolation, p = e.elapsedTime / 1e3, m = s.velocity[0] * p, h = s.velocity[1] * p;
860
- vt(f, s.transform, e.elapsedTime);
861
- let g = i ? o?.get(u) : a;
862
- if (!g) {
863
- bt(n, s.transform, m, h, l, e.reportMoves), Q(e, n, s), yt(f, e.tick);
1220
+ let d = i ? un(c, i) : 0;
1221
+ if (i && e.skipGroup === d) return;
1222
+ let f = {
1223
+ entityId: r,
1224
+ components: c
1225
+ }, p = c.interpolation, m = e.elapsedTime / 1e3;
1226
+ kt(e, r, c.velocity, c.dynamics);
1227
+ let h = c.velocity[0] * m, g = c.velocity[1] * m;
1228
+ hn(p, c.transform, e.elapsedTime);
1229
+ let _ = i ? s?.get(d) : o;
1230
+ if (!_) {
1231
+ _n(r, c.transform, h, g, u, e.reportMoves), an(e, r, c), gn(p, e.tick);
864
1232
  return;
865
1233
  }
866
- let _ = s.bounciness !== void 0, v = g.resolveMove(d, m, h, !_);
867
- if (bt(n, s.transform, v.moveX, v.moveY, l, e.reportMoves), Q(e, n, s), yt(f, e.tick), !(!g.hasBounciness && !t)) {
868
- g.forEachOverlapping(d, (r) => {
869
- g.claimContact(n, r.entityId) && mt(e, d, r, c, l, t);
870
- }, v.moveX, v.moveY);
871
- for (let r of v.blocking) g.claimContact(n, r.entityId) && mt(e, d, r, c, l, t);
1234
+ let v = c.bounciness !== void 0, y = _.resolveMove(f, h, g, !v);
1235
+ if (_n(r, c.transform, y.moveX, y.moveY, u, e.reportMoves), an(e, r, c), gn(p, e.tick), !(!_.hasBounciness && !a && !t)) {
1236
+ _.forEachOverlapping(f, (n) => {
1237
+ _.claimContact(r, n.entityId) && dn(e, _, f, n, l, u, y.moveX, y.moveY, a, t);
1238
+ }, y.moveX, y.moveY);
1239
+ for (let n of y.blocking) _.claimContact(r, n.entityId) && dn(e, _, f, n, l, u, y.moveX, y.moveY, a, t);
872
1240
  }
873
1241
  }, { physics: {
874
1242
  collision: !0,
875
- optional: n,
1243
+ dynamics: !0,
1244
+ optional: r,
876
1245
  group: i
877
1246
  } });
878
- return s.preRun = (e, t, n) => {
879
- e.dieAtImpact = (t, n) => {
880
- gt(e, i ? o?.get($(t.components, i)) : a, t, n);
1247
+ return l.preRun = (e, t, n) => {
1248
+ ln(e, c), e.dieAtImpact = (t, n) => {
1249
+ pn(e, i ? s?.get(un(t.components, i)) : o, t, n);
881
1250
  };
882
- let r = e.elapsedTime / 1e3, s = n.collidable ?? [];
1251
+ let r = e.elapsedTime / 1e3, a = n.collidable ?? [];
883
1252
  if (!i) {
884
- a = new et(s, r);
1253
+ o = new Vt(a, r, e.dynamicsCommands);
885
1254
  return;
886
1255
  }
887
- let c = /* @__PURE__ */ new Map();
888
- for (let t of s) {
889
- let n = $(t.components, i);
1256
+ let l = /* @__PURE__ */ new Map();
1257
+ for (let t of a) {
1258
+ let n = un(t.components, i);
890
1259
  if (e.skipGroup === n) continue;
891
- let r = c.get(n);
892
- r || (r = [], c.set(n, r)), r.push(t);
1260
+ let r = l.get(n);
1261
+ r || (r = [], l.set(n, r)), r.push(t);
893
1262
  }
894
- o = /* @__PURE__ */ new Map();
895
- for (let [e, t] of c) o.set(e, new et(t, r));
896
- }, s;
1263
+ s = /* @__PURE__ */ new Map();
1264
+ for (let [t, n] of l) s.set(t, new Vt(n, r, e.dynamicsCommands));
1265
+ }, l;
1266
+ }
1267
+ function ln(e, t) {
1268
+ let n = e, r = e.commandQueueId ?? 0, i = t.get(r);
1269
+ i && (e.dynamicsCommands = Ot(i, e.dynamicsCommands), t.delete(r));
1270
+ let a = () => {
1271
+ let e = t.get(r);
1272
+ return e || (e = /* @__PURE__ */ new Map(), t.set(r, e)), e;
1273
+ };
1274
+ n.queueForce = (e, t, n) => {
1275
+ Et(a(), e, t, n, 0, 0);
1276
+ }, n.queueImpulse = (e, t, n) => {
1277
+ Et(a(), e, 0, 0, t, n);
1278
+ }, n.queueVelocity = (e, t) => {
1279
+ Dt(a(), e, t);
1280
+ };
897
1281
  }
898
- function $(e, t) {
1282
+ function un(e, t) {
899
1283
  let n = e[t.component];
900
1284
  return n ? n[t.index] : 0;
901
1285
  }
902
- function mt(e, t, n, r, i, a) {
903
- if (at(t, n), !a) return;
904
- let o = K(t.components), s = K(n.components);
905
- a(e, t, n, r, i), ht(e, t.entityId, t.components, o), ht(e, n.entityId, n.components, s);
1286
+ function dn(e, t, n, r, i, a, o, s, c, l) {
1287
+ if (Xt(n, r, c), !l) return;
1288
+ let u = X(n.components), d = X(r.components);
1289
+ sn.x = 0, sn.y = 0, t.contactNormal(n, r, o, s, sn), l(e, n, r, i, a, {
1290
+ normalX: sn.x,
1291
+ normalY: sn.y
1292
+ }), fn(e, n.entityId, n.components, u), fn(e, r.entityId, r.components, d);
906
1293
  }
907
- function ht(e, t, n, r) {
908
- let i = K(n);
909
- (i.minX !== r.minX || i.minY !== r.minY || i.maxX !== r.maxX || i.maxY !== r.maxY) && Q(e, t, n);
1294
+ function fn(e, t, n, r) {
1295
+ let i = X(n);
1296
+ (i.minX !== r.minX || i.minY !== r.minY || i.maxX !== r.maxX || i.maxY !== r.maxY) && an(e, t, n);
910
1297
  }
911
- function gt(e, t, n, r) {
1298
+ function pn(e, t, n, r) {
912
1299
  let i = n.components.body;
913
- if (!i || j(i)) return;
914
- le(i);
1300
+ if (!i || xe(i)) return;
1301
+ Se(i);
915
1302
  let a = n.components.transform, o = n.components.velocity, s = r.components.transform, c = r.components.body;
916
1303
  if (!t || !a || !o || !s || !c) return;
917
1304
  let l = e.elapsedTime / 1e3, u = o[0] * l, d = o[1] * l;
@@ -928,52 +1315,54 @@ function gt(e, t, n, r) {
928
1315
  } }, u, d);
929
1316
  a[0] = f.x, a[1] = f.y;
930
1317
  }
931
- function _t(e, t, n, r, i) {
1318
+ function mn(e, t, n, r, i) {
932
1319
  let a = e.elapsedTime / 1e3, o = n.interpolation;
933
- vt(o, n.transform, e.elapsedTime), bt(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), Q(e, t, n), yt(o, e.tick);
1320
+ kt(e, t, n.velocity, n.dynamics), hn(o, n.transform, e.elapsedTime), _n(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), an(e, t, n), gn(o, e.tick);
934
1321
  }
935
- function vt(e, t, n) {
1322
+ function hn(e, t, n) {
936
1323
  e && (e[2] = t[0], e[3] = t[1], e[6] = n);
937
1324
  }
938
- function yt(e, t) {
1325
+ function gn(e, t) {
939
1326
  e && a(e, 7, t);
940
1327
  }
941
- function bt(e, t, n, r, i, a) {
942
- n === 0 && r === 0 || (n !== 0 && c(t, 0, n, Infinity), r !== 0 && c(t, 1, r, Infinity), a !== !1 && i.emitSystemEvent(ft, e));
1328
+ function _n(e, t, n, r, i, a) {
1329
+ n === 0 && r === 0 || (n !== 0 && c(t, 0, n, Infinity), r !== 0 && c(t, 1, r, Infinity), a !== !1 && i.emitSystemEvent(on, e));
943
1330
  }
944
1331
  //#endregion
945
1332
  //#region src/systems/physics-system.ts
946
- var xt = 50, St = class extends n {
1333
+ var vn = 50, yn = 1, bn = class extends r {
947
1334
  spatialWorld;
1335
+ pendingDynamicsCommands = /* @__PURE__ */ new Map();
1336
+ commandQueueId = yn++;
948
1337
  tick = 0;
949
1338
  reportMoves;
950
1339
  skipGroup;
951
1340
  constructor(e, t = {}) {
952
- let n = t.updateFunction ?? _t, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = n.physics?.group, o = [];
953
- i && !r.includes("body") && o.push("body"), i && !r.includes("bounciness") && o.push("bounciness"), r.includes("interpolation") || o.push("interpolation"), i && o.push("entity"), a && !r.includes(a.component) && o.push(a.component);
954
- let s = o.length ? [...o, ...r] : r, c = r.includes("bounciness") ? [...r] : ["bounciness", ...r];
955
- a && !c.includes(a.component) && c.push(a.component);
956
- let l = i ? { [Ze]: {
1341
+ let n = t.updateFunction ?? mn, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = n === mn || n.physics?.dynamics === !0, o = n.physics?.group, s = [];
1342
+ i && !r.includes("body") && s.push("body"), i && !r.includes("bounciness") && s.push("bounciness"), i && !r.includes("polygon") && s.push("polygon"), r.includes("interpolation") || s.push("interpolation"), a && !r.includes("dynamics") && s.push("dynamics"), i && s.push("entity"), o && !r.includes(o.component) && s.push(o.component);
1343
+ let c = s.length ? [...s, ...r] : r, l = r.includes("bounciness") ? [...r] : ["bounciness", ...r];
1344
+ l.includes("polygon") || l.push("polygon"), a && !l.includes("dynamics") && l.push("dynamics"), o && !l.includes(o.component) && l.push(o.component);
1345
+ let u = i ? { [Rt]: {
957
1346
  required: ["transform", "body"],
958
1347
  optional: [
959
1348
  "velocity",
960
1349
  "entity",
961
- ...c
1350
+ ...l
962
1351
  ],
963
1352
  filter: t.scope
964
- } } : void 0, u = l || t.queries ? {
965
- ...l,
1353
+ } } : void 0, d = u || t.queries ? {
1354
+ ...u,
966
1355
  ...t.queries
967
- } : void 0, d = Ct(t.scope, t.filter);
1356
+ } : void 0, f = xn(t.scope, t.filter);
968
1357
  super(e, {
969
1358
  name: t.name ?? "PhysicsSystem",
970
1359
  deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
971
1360
  firstRun: t.firstRun,
972
1361
  required: ["transform", "velocity"],
973
- optional: s,
974
- filter: d,
1362
+ optional: c,
1363
+ filter: f,
975
1364
  updateFunction: n,
976
- queries: u,
1365
+ queries: d,
977
1366
  forceMainThread: t.forceMainThread ?? !t.getWorker,
978
1367
  getWorker: t.getWorker ?? (() => {
979
1368
  throw Error("PhysicsSystem cannot start a worker: no getWorker was supplied");
@@ -982,22 +1371,49 @@ var xt = 50, St = class extends n {
982
1371
  }
983
1372
  startInterpolation(e) {
984
1373
  let t = this.deltaBetweenRuns;
985
- t <= 0 || Ae(e, {
1374
+ t <= 0 || Ue(e, {
986
1375
  stepMs: t,
987
1376
  stepFraction: this.currentDelta / t,
988
1377
  tick: this.tick
989
1378
  });
990
1379
  }
1380
+ queueForce(e, t, n) {
1381
+ this.queueDynamics(e, t, n, 0, 0);
1382
+ }
1383
+ queueImpulse(e, t, n) {
1384
+ this.queueDynamics(e, 0, 0, t, n);
1385
+ }
1386
+ queueVelocity(e, t) {
1387
+ let n = typeof e == "number" ? e : e.eid;
1388
+ Dt(this.pendingDynamicsCommands, n, t);
1389
+ }
991
1390
  addDataToWorld(e) {
992
- e.tick = ++this.tick, qe(this.spatialWorld, e), e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0, e.skipGroup = this.skipGroup;
1391
+ e.tick = ++this.tick, lt(this.spatialWorld, e), e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0, e.skipGroup = this.skipGroup, e.commandQueueId = this.commandQueueId, e.dynamicsCommands = this.snapshotDynamicsCommands();
1392
+ }
1393
+ queueDynamics(e, t, n, r, i) {
1394
+ let a = typeof e == "number" ? e : e.eid;
1395
+ Et(this.pendingDynamicsCommands, a, t, n, r, i);
1396
+ }
1397
+ snapshotDynamicsCommands() {
1398
+ if (this.pendingDynamicsCommands.size === 0) return;
1399
+ let e = this.pendingDynamicsCommands;
1400
+ this.pendingDynamicsCommands = /* @__PURE__ */ new Map();
1401
+ let t = Array.from(e.keys()).sort((e, t) => e - t), n = new Float64Array(t.length * 8);
1402
+ for (let r = 0; r < t.length; r++) {
1403
+ let i = t[r], a = e.get(i), o = r * 8;
1404
+ n[o + 0] = i, n[o + 1] = a.forceX, n[o + 2] = a.forceY, n[o + 3] = a.impulseX, n[o + 4] = a.impulseY;
1405
+ let s = (a.velocityX === void 0 ? 0 : 1) | (a.velocityY === void 0 ? 0 : 2);
1406
+ n[o + 5] = s, n[o + 6] = a.velocityX ?? 0, n[o + 7] = a.velocityY ?? 0;
1407
+ }
1408
+ return n;
993
1409
  }
994
1410
  };
995
- function Ct(e, t) {
1411
+ function xn(e, t) {
996
1412
  return e ? t ? (n) => e(n) && t(n) : e : t;
997
1413
  }
998
1414
  //#endregion
999
1415
  //#region src/systems/interpolation-update.ts
1000
- var wt = (e, t, n) => {
1416
+ var Sn = (e, t, n) => {
1001
1417
  let r = n.interpolation, a = n.transform, o = i(r, 7), s = r[2], c = r[3], l = r[6], u = a[0], d = a[1], f = i(r, 7);
1002
1418
  if (o !== f) return;
1003
1419
  if (l <= 0) {
@@ -1006,14 +1422,14 @@ var wt = (e, t, n) => {
1006
1422
  }
1007
1423
  let p = r[4];
1008
1424
  f !== r[5] && (p = 0, r[5] = f), p += e.elapsedTime / l, p > 1 && (p = 1), r[4] = p, r[0] = s + (u - s) * p, r[1] = c + (d - c) * p;
1009
- }, Tt = class extends n {
1425
+ }, Cn = class extends r {
1010
1426
  constructor(e, t = {}) {
1011
1427
  super(e, {
1012
1428
  name: t.name ?? "InterpolationSystem",
1013
1429
  deltaBetweenRuns: 0,
1014
1430
  firstRun: t.firstRun,
1015
1431
  required: ["transform", "interpolation"],
1016
- updateFunction: wt,
1432
+ updateFunction: Sn,
1017
1433
  forceMainThread: t.forceMainThread ?? !t.getWorker,
1018
1434
  getWorker: t.getWorker ?? (() => {
1019
1435
  throw Error("InterpolationSystem cannot start a worker: no getWorker was supplied");
@@ -1022,6 +1438,6 @@ var wt = (e, t, n) => {
1022
1438
  }
1023
1439
  };
1024
1440
  //#endregion
1025
- export { te as BODY_CATEGORY_INDEX, oe as BODY_CCD_FLAG, se as BODY_DYING_FLAG, ee as BODY_FLAGS_INDEX, ne as BODY_MASK_INDEX, ae as BODY_SENSOR_FLAG, ie as BODY_SHAPE_MASK, re as BODY_SIZE, me as BOUNCINESS_INDEX, he as BOUNCINESS_SIZE, Ze as COLLIDABLE_QUERY, et as CollisionBroadphase, E as DEFAULT_COLLIDE_CATEGORY, D as DEFAULT_COLLIDE_MASK, xt as DEFAULT_PHYSICS_STEP_MS, we as INTERPOLATION_DURATION_INDEX, be as INTERPOLATION_PREV_X_INDEX, xe as INTERPOLATION_PREV_Y_INDEX, Se as INTERPOLATION_PROGRESS_INDEX, Ee as INTERPOLATION_SIZE, Ce as INTERPOLATION_SYNCED_TICK_INDEX, Te as INTERPOLATION_TICK_INDEX, ve as INTERPOLATION_X_INDEX, ye as INTERPOLATION_Y_INDEX, Tt as InterpolationSystem, ft as POSITION_UPDATED_EVENT, Ye as PhysicalWorld, St as PhysicsSystem, w as SHAPE_CAPSULE, C as SHAPE_CIRCLE, S as SHAPE_RECTANGLE, it as SpatialIndex, p as TRANSFORM_ANGLE_INDEX, f as TRANSFORM_HEIGHT_INDEX, m as TRANSFORM_SIZE, d as TRANSFORM_WIDTH_INDEX, l as TRANSFORM_X_INDEX, u as TRANSFORM_Y_INDEX, y as VELOCITY_SIZE, _ as VELOCITY_X_INDEX, v as VELOCITY_Y_INDEX, qe as addPhysicalWorldData, de as bodyDefinition, k as bodyShape, _e as bouncinessDefinition, Be as boundsHalfHeight, ze as boundsHalfWidth, O as canCollide, P as capsuleHalfLength, Me as contactNormal, pt as createPhysicsUpdate, Je as getSpatialMap, Oe as interpolationDefinition, wt as interpolationUpdate, ce as isContinuous, j as isDying, A as isSensor, le as markDying, Ve as orientedBoxesOverlap, je as physicsRegistry, _t as physicsUpdate, U as pointSegmentDistanceSquared, Ue as segmentBoxDistanceSquared, He as segmentSegmentDistanceSquared, R as shapeHalfHeight, L as shapeHalfWidth, I as shapeIsEmpty, F as shapeRadius, z as shapesOverlap, ke as snapEntity, Ae as startSpawnInterpolation, g as transformDefinition, Q as updateSpatialMap, x as velocityDefinition };
1441
+ export { pe as BODY_CATEGORY_INDEX, ve as BODY_CCD_FLAG, ye as BODY_DYING_FLAG, fe as BODY_FLAGS_INDEX, me as BODY_MASK_INDEX, _e as BODY_SENSOR_FLAG, ge as BODY_SHAPE_MASK, he as BODY_SIZE, De as BOUNCINESS_INDEX, Oe as BOUNCINESS_SIZE, Rt as COLLIDABLE_QUERY, Vt as CollisionBroadphase, le as DEFAULT_COLLIDE_CATEGORY, ue as DEFAULT_COLLIDE_MASK, vn as DEFAULT_PHYSICS_STEP_MS, N as DYNAMICS_ACCELERATION_X_INDEX, ee as DYNAMICS_ACCELERATION_Y_INDEX, P as DYNAMICS_INVERSE_MASS_INDEX, F as DYNAMICS_SIZE, Le as INTERPOLATION_DURATION_INDEX, Ne as INTERPOLATION_PREV_X_INDEX, Pe as INTERPOLATION_PREV_Y_INDEX, Fe as INTERPOLATION_PROGRESS_INDEX, ze as INTERPOLATION_SIZE, Ie as INTERPOLATION_SYNCED_TICK_INDEX, Re as INTERPOLATION_TICK_INDEX, je as INTERPOLATION_X_INDEX, Me as INTERPOLATION_Y_INDEX, Cn as InterpolationSystem, l as MAX_POLYGON_VERTICES, f as POLYGON_SIZE, u as POLYGON_VERTEX_COUNT_INDEX, d as POLYGON_VERTICES_INDEX, on as POSITION_UPDATED_EVENT, dt as PhysicalWorld, bn as PhysicsSystem, oe as SHAPE_CAPSULE, ae as SHAPE_CIRCLE, se as SHAPE_POLYGON, ie as SHAPE_RECTANGLE, Jt as SpatialIndex, S as TRANSFORM_ANGLE_INDEX, x as TRANSFORM_HEIGHT_INDEX, C as TRANSFORM_SIZE, b as TRANSFORM_WIDTH_INDEX, v as TRANSFORM_X_INDEX, y as TRANSFORM_Y_INDEX, O as VELOCITY_DAMPING_INDEX, k as VELOCITY_SIZE, E as VELOCITY_X_INDEX, D as VELOCITY_Y_INDEX, lt as addPhysicalWorldData, we as bodyDefinition, L as bodyShape, Ae as bouncinessDefinition, et as boundsHalfHeight, $e as boundsHalfWidth, de as canCollide, V as capsuleHalfLength, Ke as contactNormal, cn as createPhysicsUpdate, te as dynamicsDefinition, ut as getSpatialMap, kt as integrateDynamics, Ve as interpolationDefinition, Sn as interpolationUpdate, be as isContinuous, xe as isDying, R as isSensor, Se as markDying, tt as orientedBoxesOverlap, We as physicsRegistry, mn as physicsUpdate, J as pointSegmentDistanceSquared, ht as polygonContactNormal, m as polygonDefinition, mt as polygonShapesOverlap, h as preparePolygon, rt as segmentBoxDistanceSquared, nt as segmentSegmentDistanceSquared, G as shapeHalfHeight, W as shapeHalfWidth, U as shapeIsEmpty, H as shapeRadius, Ge as shapesOverlap, He as snapEntity, Ue as startSpawnInterpolation, T as transformDefinition, an as updateSpatialMap, j as velocityDefinition };
1026
1442
 
1027
1443
  //# sourceMappingURL=index.js.map