@daneren2005/shared-memory-physics 1.4.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,9 +1,68 @@
1
- import { Component as e, ComponentSystem as t, DEAD_INDEX as n } from "@daneren2005/shared-memory-ecs";
2
- import { loadFloat32 as r, storeFloat32 as i } from "@daneren2005/shared-memory-objects/utils/float32-atomics";
3
- import a from "flatbush";
4
- import { addAtomicFloat32 as o } from "@daneren2005/shared-memory-objects/utils/atomic-math";
1
+ import { BaseWorld as e, Component as t, DEAD_INDEX as n, EntityWorkerSystem as r } from "@daneren2005/shared-memory-ecs";
2
+ import { loadFloat32 as i, storeFloat32 as a } from "@daneren2005/shared-memory-objects/utils/float32-atomics";
3
+ import o from "@daneren2005/shared-memory-objects/spatial/shared-spatial-map";
4
+ import s from "flatbush";
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
5
64
  //#region src/components/transform-component.ts
6
- var s = 0, c = 1, l = 2, u = 3, d = 4, f = 5, p = class extends e {
65
+ var v = 0, y = 1, b = 2, x = 3, S = 4, C = 5, w = class extends t {
7
66
  get x() {
8
67
  return this.block[0];
9
68
  }
@@ -34,30 +93,36 @@ var s = 0, c = 1, l = 2, u = 3, d = 4, f = 5, p = class extends e {
34
93
  set angle(e) {
35
94
  this.block[4] = e;
36
95
  }
37
- }, m = {
96
+ }, T = {
38
97
  type: Float32Array,
39
98
  size: 5,
40
99
  loadProperties: [
41
100
  "width",
42
101
  "height",
43
- "radius"
102
+ "radius",
103
+ "vertices"
44
104
  ],
45
105
  toBlock(e) {
46
- 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
+ }
47
112
  if (t !== void 0) {
48
- if (n !== void 0 || r !== void 0) throw Error("A transform takes either a radius or a width and height, not both");
49
- 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;
50
115
  }
51
116
  return [
52
117
  e.x,
53
118
  e.y,
54
- n,
55
119
  r,
120
+ i,
56
121
  e.angle ?? 0
57
122
  ];
58
123
  },
59
124
  attach(e, t, n) {
60
- return new p(t.getBlock(n), n);
125
+ return new w(t.getBlock(n), n);
61
126
  },
62
127
  save(e) {
63
128
  return {
@@ -66,7 +131,7 @@ var s = 0, c = 1, l = 2, u = 3, d = 4, f = 5, p = class extends e {
66
131
  angle: e.angle
67
132
  };
68
133
  }
69
- }, h = 0, g = 1, _ = 2, v = class extends e {
134
+ }, E = 0, D = 1, O = 2, k = 3, A = class extends t {
70
135
  get velocityX() {
71
136
  return this.block[0];
72
137
  }
@@ -79,46 +144,129 @@ var s = 0, c = 1, l = 2, u = 3, d = 4, f = 5, p = class extends e {
79
144
  set velocityY(e) {
80
145
  this.block[1] = e;
81
146
  }
82
- }, y = {
147
+ get damping() {
148
+ return this.block[2];
149
+ }
150
+ set damping(e) {
151
+ M(e), this.block[2] = e;
152
+ }
153
+ }, j = {
83
154
  type: Float32Array,
84
- size: 2,
85
- loadProperties: ["velocityX", "velocityY"],
155
+ size: 3,
156
+ loadProperties: [
157
+ "velocityX",
158
+ "velocityY",
159
+ "damping"
160
+ ],
86
161
  toBlock(e) {
87
- 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
+ ];
88
168
  },
89
169
  attach(e, t, n) {
90
- return new v(t.getBlock(n), n);
170
+ return new A(t.getBlock(n), n);
91
171
  },
92
172
  save(e) {
93
173
  return {
94
174
  velocityX: e.velocityX,
95
- velocityY: e.velocityY
175
+ velocityY: e.velocityY,
176
+ damping: e.damping
177
+ };
178
+ }
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
96
228
  };
97
229
  }
98
- }, b = 1, x = 2, S = 3, C = [
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 = [
99
240
  1,
100
241
  2,
101
- 3
102
- ], w = 1, T = 4294967295;
103
- function E(e, t, n, r) {
242
+ 3,
243
+ 4
244
+ ], le = 1, ue = 4294967295;
245
+ function de(e, t, n, r) {
104
246
  return (t & n) !== 0 && (r & e) !== 0;
105
247
  }
106
- var D = 0, O = 1, k = 2, A = 3, ee = 3, te = 4, ne = 8;
107
- function j(e) {
108
- return e[0] & 3;
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;
109
251
  }
110
- function M(e) {
111
- return (e[0] & 4) != 0;
112
- }
113
- function re(e) {
252
+ function R(e) {
114
253
  return (e[0] & 8) != 0;
115
254
  }
116
- var ie = class extends e {
255
+ function be(e) {
256
+ return (e[0] & 16) != 0;
257
+ }
258
+ function xe(e) {
259
+ return (e[0] & 32) != 0;
260
+ }
261
+ function Se(e) {
262
+ e[0] |= 32;
263
+ }
264
+ var Ce = class extends t {
117
265
  get shape() {
118
- return this.block[0] & 3;
266
+ return this.block[0] & 7;
119
267
  }
120
268
  set shape(e) {
121
- this.block[0] = this.block[0] & -4 | e & 3;
269
+ this.block[0] = this.block[0] & -8 | e & 7;
122
270
  }
123
271
  get collideCategory() {
124
272
  return this.block[1];
@@ -133,24 +281,25 @@ var ie = class extends e {
133
281
  this.block[2] = e;
134
282
  }
135
283
  get sensor() {
136
- return (this.block[0] & 4) != 0;
284
+ return (this.block[0] & 8) != 0;
137
285
  }
138
286
  set sensor(e) {
139
- 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;
140
288
  }
141
289
  get continuousCollisionDetection() {
142
- return (this.block[0] & 8) != 0;
290
+ return (this.block[0] & 16) != 0;
143
291
  }
144
292
  set continuousCollisionDetection(e) {
145
- 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;
146
294
  }
147
- }, ae = {
295
+ }, we = {
148
296
  type: Uint32Array,
149
297
  size: 3,
150
298
  loadProperties: [
151
299
  "width",
152
300
  "height",
153
301
  "radius",
302
+ "vertices",
154
303
  "shape",
155
304
  "collideCategory",
156
305
  "collideMask",
@@ -159,35 +308,36 @@ var ie = class extends e {
159
308
  ],
160
309
  toBlock(e) {
161
310
  return [
162
- oe(e),
311
+ Te(e),
163
312
  e.collideCategory ?? 1,
164
313
  e.collideMask ?? 4294967295
165
314
  ];
166
315
  },
167
316
  attach(e, t, n) {
168
- return new ie(t.getBlock(n), n);
317
+ return new Ce(t.getBlock(n), n);
169
318
  }
170
319
  };
171
- function oe(e) {
172
- let t = se(e);
173
- 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;
174
323
  }
175
- function se(e) {
324
+ function Ee(e) {
176
325
  let t = e.shape;
177
- if (t === void 0) return e.radius === void 0 ? 1 : 2;
178
- if (!C.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");
179
329
  return t;
180
330
  }
181
331
  //#endregion
182
332
  //#region src/components/bounciness-component.ts
183
- var ce = 0, le = 1, ue = class extends e {
333
+ var De = 0, Oe = 1, ke = class extends t {
184
334
  get bounciness() {
185
335
  return this.block[0];
186
336
  }
187
337
  set bounciness(e) {
188
338
  this.block[0] = e;
189
339
  }
190
- }, de = {
340
+ }, Ae = {
191
341
  type: Float32Array,
192
342
  size: 1,
193
343
  loadProperties: ["bounciness"],
@@ -195,9 +345,9 @@ var ce = 0, le = 1, ue = class extends e {
195
345
  return [e.bounciness ?? 0];
196
346
  },
197
347
  attach(e, t, n) {
198
- return new ue(t.getBlock(n), n);
348
+ return new ke(t.getBlock(n), n);
199
349
  }
200
- }, fe = 0, pe = 1, me = 2, he = 3, ge = 4, _e = 5, ve = 6, ye = 7, be = 8, xe = class extends e {
350
+ }, je = 0, Me = 1, Ne = 2, Pe = 3, Fe = 4, Ie = 5, Le = 6, Re = 7, ze = 8, Be = class extends t {
201
351
  get x() {
202
352
  return this.block[0];
203
353
  }
@@ -241,12 +391,12 @@ var ce = 0, le = 1, ue = class extends e {
241
391
  this.block[6] = e;
242
392
  }
243
393
  get tick() {
244
- return r(this.block, 7);
394
+ return i(this.block, 7);
245
395
  }
246
396
  set tick(e) {
247
- i(this.block, 7, e);
397
+ a(this.block, 7, e);
248
398
  }
249
- }, Se = {
399
+ }, Ve = {
250
400
  type: Float32Array,
251
401
  size: 8,
252
402
  loadProperties: ["interpolate"],
@@ -264,14 +414,14 @@ var ce = 0, le = 1, ue = class extends e {
264
414
  ];
265
415
  },
266
416
  attach(e, t, n) {
267
- return new xe(t.getBlock(n), n);
417
+ return new Be(t.getBlock(n), n);
268
418
  }
269
419
  };
270
- function Ce(e) {
420
+ function He(e) {
271
421
  let { transform: t, interpolation: n } = e.components;
272
422
  !t || !n || (n.prevX = n.x = t.x, n.prevY = n.y = t.y);
273
423
  }
274
- function we(e, t) {
424
+ function Ue(e, t) {
275
425
  let { transform: n, velocity: r, interpolation: i } = e.components;
276
426
  if (!n || !r || !i) return;
277
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;
@@ -279,215 +429,513 @@ function we(e, t) {
279
429
  }
280
430
  //#endregion
281
431
  //#region src/components/registry.ts
282
- var Te = {
283
- transform: m,
284
- velocity: y,
285
- body: ae,
286
- bounciness: de,
287
- interpolation: Se
288
- }, N = {
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 = {
289
441
  x: 0,
290
442
  y: 0
291
- }, P = {
443
+ }, B = {
292
444
  x: 0,
293
445
  y: 0
294
446
  };
295
- function F(e, t) {
447
+ function V(e, t) {
296
448
  return Math.max(0, (e - t) / 2);
297
449
  }
298
- function I(e, t, n) {
450
+ function H(e, t, n) {
299
451
  return e === 2 ? t / 2 : e === 3 ? n / 2 : 0;
300
452
  }
301
- function L(e, t, n) {
453
+ function U(e, t, n) {
302
454
  return e === 2 ? t <= 0 : e === 3 ? n <= 0 : t <= 0 || n <= 0;
303
455
  }
304
- function R(e, t, n, r) {
305
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * F(t, n) + n / 2 : Me(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);
306
458
  }
307
- function z(e, t, n, r) {
308
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * F(t, n) + n / 2 : Ne(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);
309
461
  }
310
- function B(e, t, n, r, i, a, o, s, c, l, u, d) {
311
- if (L(e, r, i) || L(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;
312
464
  let f = e !== 1, p = o !== 1;
313
- if (!f && !p) return Pe(t, n, r, i, a, s, c, l, u, d);
314
- if (f && !p) return B(o, s, c, l, u, d, e, t, n, r, i, a);
315
- let m = V(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = I(o, l, u);
316
- if (!f) return Fe(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
317
- let v = V(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = I(e, r, i) + _;
318
- return W(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;
319
471
  }
320
- function V(e, t, n) {
321
- return e === 3 ? F(t, n) : 0;
472
+ function K(e, t, n) {
473
+ return e === 3 ? V(t, n) : 0;
322
474
  }
323
- function Ee(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) {
324
476
  let p = e !== 1, m = o !== 1;
325
- return !p && !m ? De(t, n, r, i, a, s, c, l, u, d, f) : p && m ? Oe(e, t, n, r, i, a, o, s, c, l, u, d, f) : p ? ke(s, c, l, u, d, e, t, n, r, i, a, f) : ke(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;
326
478
  }
327
- function De(e, t, n, r, i, a, o, s, c, l, u) {
328
- 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 = U(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);
329
481
  u.x = d, u.y = f;
330
- let S = U(-f, d, y, b, h, g, d, f, _, v, p, m);
331
- return S < x && (x = S, u.x = -f, u.y = d), S = U(p, m, y, b, h, g, d, f, _, v, p, m), S < x && (x = S, u.x = p, u.y = m), S = U(-m, p, y, b, h, g, d, f, _, v, p, m), S < x && (u.x = -m, u.y = p), Ae(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;
332
484
  }
333
- function Oe(e, t, n, r, i, a, o, s, c, l, u, d, f) {
334
- let p = V(e, r, i), m = Math.cos(a) * p, h = Math.sin(a) * p, g = V(o, l, u), _ = Math.cos(d) * g, v = Math.sin(d) * g, y = Math.sqrt(W(t - m, n - h, t + m, n + h, s - _, c - v, s + _, c + v, N));
335
- return y > 0 ? (f.x = N.x / y, f.y = N.y / y, !0) : je(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);
336
488
  }
337
- function ke(e, t, n, r, i, a, o, s, c, l, u, d) {
338
- let f = V(a, c, l), p = Math.cos(u) * f, m = Math.sin(u) * f, h = Math.sqrt(Fe(o - p, s - m, o + p, s + m, e, t, n, r, i, N));
339
- if (h > 0) return d.x = N.x / h, d.y = N.y / h, !0;
340
- 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 = I(a, c, l), T = n / 2, E = r / 2, D = H(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);
341
493
  d.x = 1, d.y = 0;
342
- let O = H(0, 1, b, x, S, C, w, T, E);
343
- O < D && (D = O, d.x = 0, d.y = 1), je(-C, S, P) && (O = H(P.x, P.y, b, x, S, C, w, T, E), O < D && (d.x = P.x, d.y = P.y)), Ae(b, x, d);
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);
344
496
  let k = d.x, A = d.y;
345
497
  return d.x = k * g - A * _, d.y = k * _ + A * g, !0;
346
498
  }
347
- function H(e, t, n, r, i, a, o, s, c) {
499
+ function Xe(e, t, n, r, i, a, o, s, c) {
348
500
  return s * Math.abs(e) + c * Math.abs(t) + (Math.abs(i * e + a * t) + o) - Math.abs(n * e + r * t);
349
501
  }
350
- function Ae(e, t, n) {
502
+ function Ze(e, t, n) {
351
503
  e * n.x + t * n.y < 0 && (n.x = -n.x, n.y = -n.y);
352
504
  }
353
- function je(e, t, n) {
505
+ function Qe(e, t, n) {
354
506
  let r = Math.sqrt(e * e + t * t);
355
507
  return r === 0 ? !1 : (n.x = e / r, n.y = t / r, !0);
356
508
  }
357
- function Me(e, t, n) {
509
+ function $e(e, t, n) {
358
510
  return (Math.abs(Math.cos(n)) * e + Math.abs(Math.sin(n)) * t) / 2;
359
511
  }
360
- function Ne(e, t, n) {
512
+ function et(e, t, n) {
361
513
  return (Math.abs(Math.sin(n)) * e + Math.abs(Math.cos(n)) * t) / 2;
362
514
  }
363
- function Pe(e, t, n, r, i, a, o, s, c, l) {
515
+ function tt(e, t, n, r, i, a, o, s, c, l) {
364
516
  if (n <= 0 || r <= 0 || s <= 0 || c <= 0) return !1;
365
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;
366
- return U(u, d, v, y, m, h, u, d, g, _, f, p) > 0 && U(-d, u, v, y, m, h, u, d, g, _, f, p) > 0 && U(f, p, v, y, m, h, u, d, g, _, f, p) > 0 && U(-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;
367
519
  }
368
- function U(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) {
369
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);
370
522
  }
371
- function W(e, t, n, r, i, a, o, s, c) {
523
+ function nt(e, t, n, r, i, a, o, s, c) {
372
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;
373
525
  if (h <= 0 && g <= 0) return c && (c.x = p, c.y = m), p * p + m * m;
374
- if (h <= 0) y = J(_ / g);
526
+ if (h <= 0) y = Y(_ / g);
375
527
  else {
376
528
  let e = l * p + u * m;
377
- if (g <= 0) v = J(-e / h);
529
+ if (g <= 0) v = Y(-e / h);
378
530
  else {
379
531
  let t = l * d + u * f, n = h * g - t * t;
380
- n !== 0 && (v = J((t * _ - e * g) / n)), y = (t * v + _) / g, y < 0 ? (y = 0, v = J(-e / h)) : y > 1 && (y = 1, v = J((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));
381
533
  }
382
534
  }
383
535
  let b = e + l * v - (i + d * y), x = t + u * v - (a + f * y);
384
536
  return c && (c.x = b, c.y = x), b * b + x * x;
385
537
  }
386
- function Fe(e, t, n, r, i, a, o, s, c, l) {
538
+ function rt(e, t, n, r, i, a, o, s, c, l) {
387
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;
388
- if (!Ie(v, y, b, x, f, p)) return l && (l.x = 0, l.y = 0), 0;
389
- if (!l) return Math.min(q(v, y, f, p), q(b, x, f, p), K(-f, -p, v, y, b, x), K(f, -p, v, y, b, x), K(f, p, v, y, b, x), K(-f, p, v, y, b, x));
390
- let S = q(v, y, f, p, l);
391
- S = G(S, q(b, x, f, p, P), P, l, !1), S = G(S, K(-f, -p, v, y, b, x, P), P, l, !0), S = G(S, K(f, -p, v, y, b, x, P), P, l, !0), S = G(S, K(f, p, v, y, b, x, P), P, l, !0), S = G(S, K(-f, p, v, y, b, x, P), P, 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);
392
544
  let C = l.x, w = l.y;
393
545
  return l.x = C * u - w * d, l.y = C * d + w * u, S;
394
546
  }
395
- function G(e, t, n, r, i) {
547
+ function it(e, t, n, r, i) {
396
548
  return t >= e ? e : (r.x = i ? -n.x : n.x, r.y = i ? -n.y : n.y, t);
397
549
  }
398
- function K(e, t, n, r, i, a, o) {
399
- let s = i - n, c = a - r, l = s * s + c * c, u = l > 0 ? J(((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);
400
552
  return o && (o.x = d, o.y = f), d * d + f * f;
401
553
  }
402
- function Ie(e, t, n, r, i, a) {
554
+ function at(e, t, n, r, i, a) {
403
555
  if (Math.max(e, n) < -i || Math.min(e, n) > i || Math.max(t, r) < -a || Math.min(t, r) > a) return !0;
404
556
  let o = -(r - t), s = n - e;
405
557
  return Math.abs(o * e + s * t) > i * Math.abs(o) + a * Math.abs(s);
406
558
  }
407
- function q(e, t, n, r, i) {
559
+ function ot(e, t, n, r, i) {
408
560
  let a = Math.abs(e) - n, o = Math.abs(t) - r, s = a > 0 ? a : 0, c = o > 0 ? o : 0;
409
561
  return i && (i.x = e < 0 ? -s : s, i.y = t < 0 ? -c : c), s * s + c * c;
410
562
  }
411
- function J(e) {
563
+ function Y(e) {
412
564
  return e < 0 ? 0 : e > 1 ? 1 : e;
413
565
  }
414
566
  //#endregion
567
+ //#region src/systems/spatial-bounds.ts
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];
570
+ return {
571
+ minX: c - o,
572
+ minY: l - s,
573
+ maxX: c + o,
574
+ maxY: l + s
575
+ };
576
+ }
577
+ function st(e, t, n, r, i) {
578
+ return e.minX <= r && e.maxX >= t && e.minY <= i && e.maxY >= n;
579
+ }
580
+ function ct(e, t) {
581
+ return t > e ? t - e : Math.max(1, Math.abs(e)) * 2 ** -52;
582
+ }
583
+ //#endregion
584
+ //#region src/world.ts
585
+ function lt(e, t) {
586
+ t.spatialMapMemory = e.spatialMap.getSharedMemory();
587
+ }
588
+ function ut(e) {
589
+ if (e.spatialMap) return e.spatialMap;
590
+ if (!e.heap || !e.spatialMapMemory) throw Error("Spatial system world is missing its shared MemoryHeap or spatial map");
591
+ return e.spatialMap = new o(e.heap, e.spatialMapMemory), e.spatialMap;
592
+ }
593
+ var dt = class extends e {
594
+ spatialMap;
595
+ spatialIds = /* @__PURE__ */ new Set();
596
+ constructor(e, t = {}) {
597
+ let { spatial: n, ...r } = t;
598
+ super(e, r), this.spatialMap = new o(this.heap, n), this.on("entity-added", (e) => {
599
+ this.updateSpatialEntity(e), e.on("component-added", (t) => {
600
+ (t === "transform" || t === "body") && this.updateSpatialEntity(e);
601
+ }), e.on("component-removed", (t) => {
602
+ (t === "transform" || t === "body") && this.updateSpatialEntity(e);
603
+ });
604
+ }), this.on("entity-removed", (e) => {
605
+ this.spatialIds.delete(e.eid), this.spatialMap.remove(e.eid);
606
+ });
607
+ }
608
+ updateSpatialEntity(e) {
609
+ let t = typeof e == "number" ? this.getEntityByEid(e) : e;
610
+ if (!t) return;
611
+ let n = t.components, r = n.transform?.block;
612
+ if (!r) {
613
+ this.spatialIds.delete(t.eid), this.spatialMap.remove(t.eid);
614
+ return;
615
+ }
616
+ let i = X({
617
+ transform: r,
618
+ body: n.body?.block
619
+ });
620
+ this.spatialIds.add(t.eid), this.spatialMap.update(t.eid, i.minX, i.minY, i.maxX - i.minX, i.maxY - i.minY);
621
+ }
622
+ searchSpatial(e, t, n, r, i) {
623
+ if (n < e || r < t) return [];
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;
625
+ for (let s of o) {
626
+ let o = this.getEntityByEid(s);
627
+ if (!o || i && !i(o)) continue;
628
+ let c = o.components, l = c.transform?.block;
629
+ l && st(X({
630
+ transform: l,
631
+ body: c.body?.block
632
+ }), e, t, n, r) && a.push(o);
633
+ }
634
+ return a;
635
+ }
636
+ searchSpatialAround(e, t, n, r, i) {
637
+ return this.searchSpatial(e - n, t - r, e + n, t + r, i);
638
+ }
639
+ findNearestSpatial(e, t, n = Infinity, r) {
640
+ return this.findNearbySpatial(e, t, 1, n, r)[0];
641
+ }
642
+ findNearbySpatial(e, t, n, r = Infinity, i) {
643
+ return this.spatialMap.neighbors(e, t, n, r, (e) => {
644
+ let t = this.getEntityByEid(e);
645
+ return !!t && (!i || i(t));
646
+ }).flatMap((e) => {
647
+ let t = this.getEntityByEid(e);
648
+ return t ? [t] : [];
649
+ });
650
+ }
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
415
841
  //#region src/systems/collision.ts
416
- var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
842
+ var It = 1e-4, Lt = 24, Rt = "collidable", Q = [], zt = 2 ** 26, Bt = {
417
843
  fraction: 1,
418
- blocking: X
419
- }, Ve = class {
844
+ blocking: Q
845
+ }, Vt = class {
420
846
  buckets = [];
421
847
  hasBounciness = !1;
422
848
  resolved = /* @__PURE__ */ new Set();
423
- constructor(e, t) {
424
- let n = /* @__PURE__ */ new Map();
425
- for (let r of e) {
426
- let e = r.components, i = e.transform, a = e.body;
427
- if (!i || !a) continue;
428
- let o = a[1];
429
- if (o === 0) continue;
430
- let s = j(a), c = i[2], l = i[3];
431
- if (L(s, c, l)) continue;
432
- let u = i[4], d = R(s, c, l, u), f = z(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);
433
859
  e.bounciness && (this.hasBounciness = !0);
434
- 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);
435
- 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 = {
436
862
  entries: [],
437
863
  bounds: []
438
- }, n.set(o, v)), v.entries.push({
439
- entityId: r.entityId,
864
+ }, r.set(c, I)), I.entries.push({
865
+ entityId: n.entityId,
440
866
  components: e
441
- }), 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);
442
868
  }
443
- for (let [e, { entries: t, bounds: r }] of n) {
444
- let n = new a(t.length);
445
- 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]);
446
- 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({
447
873
  category: e,
448
874
  entries: t,
449
- index: n
875
+ index: r
450
876
  });
451
877
  }
452
878
  }
453
879
  claimContact(e, t) {
454
- let n = e < t ? e * ze + t : t * ze + e;
880
+ let n = e < t ? e * zt + t : t * zt + e;
455
881
  return this.resolved.has(n) ? !1 : (this.resolved.add(n), !0);
456
882
  }
457
883
  forEachOverlapping(e, t, n = 0, r = 0) {
458
- let i = Ue(e);
884
+ let i = Wt(e);
459
885
  if (!i) return;
460
886
  let { x: a, y: o, halfWidth: s, halfHeight: c } = i;
461
887
  if (i.ccd && (n !== 0 || r !== 0)) {
462
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;
463
889
  this.forEachCandidate(i, u, d, f, p, (a) => {
464
- We(i, e, l, n, r, a) && t(a);
890
+ Gt(i, e, l, n, r, a) && t(a);
465
891
  });
466
892
  return;
467
893
  }
468
894
  this.forEachCandidate(i, a - s, o - c, a + s, o + c, (e) => {
469
- Z(i, a, o, e) && t(e);
895
+ $(i, a, o, e) && t(e);
470
896
  });
471
897
  }
898
+ contactPoint(e, t, n, r) {
899
+ let i = e.components.transform, a = i[0], o = i[1], s = Math.sqrt(n * n + r * r), c = Wt(e);
900
+ if (!c || s === 0) return {
901
+ x: a,
902
+ y: o
903
+ };
904
+ c.x = a - n, c.y = o - r;
905
+ let l = this.entryFraction(c, t, n, r, s);
906
+ return {
907
+ x: c.x + n * l,
908
+ y: c.y + r * l
909
+ };
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
+ }
472
920
  sweep(e, t, n) {
473
- let r = Math.sqrt(t * t + n * n), i = Ue(e);
921
+ let r = Math.sqrt(t * t + n * n), i = Wt(e);
474
922
  if (!i || r === 0) return {
475
923
  fraction: 1,
476
- blocking: X
924
+ blocking: Q
477
925
  };
478
926
  if (i.ccd) return this.sweepContinuous(i, t, n, r);
479
927
  let a = this.gatherCandidates(i, t, n);
480
928
  return a.length === 0 ? {
481
929
  fraction: 1,
482
- blocking: X
930
+ blocking: Q
483
931
  } : this.refine(i, a, t, n, r);
484
932
  }
485
933
  resolveMove(e, t, n, r) {
486
- let i = Math.sqrt(t * t + n * n), a = Ue(e);
934
+ let i = Math.sqrt(t * t + n * n), a = Wt(e);
487
935
  if (!a || i === 0) return {
488
936
  moveX: t,
489
937
  moveY: n,
490
- blocking: X
938
+ blocking: Q
491
939
  };
492
940
  if (a.ccd) {
493
941
  let e = this.sweepContinuous(a, t, n, i);
@@ -501,20 +949,20 @@ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
501
949
  if (o.length === 0) return {
502
950
  moveX: t,
503
951
  moveY: n,
504
- blocking: X
952
+ blocking: Q
505
953
  };
506
954
  if (r && t !== 0 && n !== 0) {
507
955
  let e = this.gatherCandidates(a, t, 0), r = this.gatherCandidates(a, 0, n);
508
956
  if (e.length === 0 && r.length === 0) return Math.abs(t) >= Math.abs(n) ? {
509
957
  moveX: t,
510
958
  moveY: 0,
511
- blocking: X
959
+ blocking: Q
512
960
  } : {
513
961
  moveX: 0,
514
962
  moveY: n,
515
- blocking: X
963
+ blocking: Q
516
964
  };
517
- let i = e.length === 0 ? Be : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? Be : 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;
518
966
  if (s !== 0 && c !== 0) {
519
967
  let e = this.gatherCandidates(a, s, c);
520
968
  if (e.length > 0) {
@@ -529,7 +977,7 @@ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
529
977
  return {
530
978
  moveX: s,
531
979
  moveY: c,
532
- blocking: He(i.blocking, o.blocking)
980
+ blocking: Ut(i.blocking, o.blocking)
533
981
  };
534
982
  }
535
983
  let s = this.refine(a, o, t, n, i);
@@ -544,19 +992,19 @@ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
544
992
  if (e.sensor) return [];
545
993
  let s = r + t, c = i + n, l = [];
546
994
  return this.forEachCandidate(e, s - a, c - o, s + a, c + o, (t) => {
547
- Z(e, s, c, t) && (M(t.components.body) || Z(e, r, i, t) || l.push(t));
995
+ $(e, s, c, t) && (R(t.components.body) || $(e, r, i, t) || l.push(t));
548
996
  }), l;
549
997
  }
550
998
  refine(e, t, n, r, i) {
551
- let { x: a, y: o } = e, s = 0, c = 1, l = Y / i;
552
- for (let i = 0; i < Le && 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++) {
553
1001
  let i = (s + c) / 2;
554
1002
  this.blockedAt(e, t, n, r, i) ? c = i : s = i;
555
1003
  }
556
1004
  let u = [], d = a + n * c, f = o + r * c;
557
- for (let n of t) Z(e, d, f, n) && u.push(n);
1005
+ for (let n of t) $(e, d, f, n) && u.push(n);
558
1006
  return {
559
- fraction: s * i > Y ? s : 0,
1007
+ fraction: s * i > It ? s : 0,
560
1008
  blocking: u
561
1009
  };
562
1010
  }
@@ -564,22 +1012,22 @@ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
564
1012
  if (e.sensor) return [];
565
1013
  let { x: r, y: i, halfWidth: a, halfHeight: o } = e, s = r + t, c = i + n, l = [];
566
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) => {
567
- M(a.components.body) || Z(e, r, i, a) || We(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);
568
1016
  }), l;
569
1017
  }
570
1018
  sweepContinuous(e, t, n, r) {
571
1019
  let i = this.gatherContinuousCandidates(e, t, n);
572
1020
  if (i.length === 0) return {
573
1021
  fraction: 1,
574
- blocking: X
1022
+ blocking: Q
575
1023
  };
576
- let a = 1, o = [], s = Y / r;
1024
+ let a = 1, o = [], s = It / r;
577
1025
  for (let c of i) {
578
1026
  let i = this.entryFraction(e, c, t, n, r);
579
1027
  i < a - s ? (a = i, o = [c]) : i <= a + s && o.push(c);
580
1028
  }
581
1029
  return {
582
- fraction: a * r > Y ? a : 0,
1030
+ fraction: a * r > It ? a : 0,
583
1031
  blocking: o
584
1032
  };
585
1033
  }
@@ -587,82 +1035,90 @@ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
587
1035
  let a;
588
1036
  if (this.blockedAtOne(e, t, n, r, 1)) a = 1;
589
1037
  else {
590
- let o = t.components.transform, s = o[0] - e.x, c = o[1] - e.y, l = Ge((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));
591
1039
  if (!this.blockedAtOne(e, t, n, r, l)) return l;
592
1040
  a = l;
593
1041
  }
594
- let o = 0, s = Y / i;
595
- for (let i = 0; i < Le && a - o > s; i++) {
1042
+ let o = 0, s = It / i;
1043
+ for (let i = 0; i < Lt && a - o > s; i++) {
596
1044
  let i = (o + a) / 2;
597
1045
  this.blockedAtOne(e, t, n, r, i) ? a = i : o = i;
598
1046
  }
599
1047
  return o;
600
1048
  }
601
1049
  blockedAtOne(e, t, n, r, i) {
602
- return Z(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);
603
1051
  }
604
1052
  blockedAt(e, t, n, r, i) {
605
1053
  let a = Math.fround(e.x + n * i), o = Math.fround(e.y + r * i);
606
- for (let n of t) if (Z(e, a, o, n)) return !0;
1054
+ for (let n of t) if ($(e, a, o, n)) return !0;
607
1055
  return !1;
608
1056
  }
609
1057
  forEachCandidate(e, t, r, i, a, o) {
610
1058
  for (let s of this.buckets) if ((e.mask & s.category) !== 0) for (let c of s.index.search(t, r, i, a)) {
611
1059
  let t = s.entries[c];
612
- t.entityId !== e.entityId && (t.components.body[2] & e.category) !== 0 && t.components.entity?.[n] !== 1 && 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));
613
1061
  }
614
1062
  }
615
1063
  };
616
- function He(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) {
617
1069
  if (e.length === 0) return t;
618
1070
  if (t.length === 0) return e;
619
1071
  let n = [...e];
620
1072
  for (let e of t) n.some((t) => t.entityId === e.entityId) || n.push(e);
621
1073
  return n;
622
1074
  }
623
- function Ue(e) {
1075
+ function Wt(e) {
624
1076
  let t = e.components.body;
625
1077
  if (!t) return;
626
1078
  let n = t[2];
627
1079
  if (n === 0) return;
628
- let r = e.components.transform, i = j(t), a = r[2], o = r[3];
629
- if (L(i, a, o)) return;
630
- let s = r[4];
631
- 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 {
632
1084
  entityId: e.entityId,
633
1085
  shape: i,
1086
+ polygon: c,
634
1087
  x: r[0],
635
1088
  y: r[1],
636
1089
  width: a,
637
1090
  height: o,
638
1091
  angle: s,
639
- halfWidth: R(i, a, o, s),
640
- halfHeight: z(i, a, o, s),
1092
+ halfWidth: W(i, a, o, s),
1093
+ halfHeight: G(i, a, o, s),
641
1094
  category: t[1],
642
1095
  mask: n,
643
- sensor: M(t),
644
- ccd: re(t)
1096
+ sensor: R(t),
1097
+ ccd: be(t)
645
1098
  };
646
1099
  }
647
- function We(e, t, n, r, i, a) {
648
- let o = t + r, s = n + i, c = a.components.transform, l = j(a.components.body), u = c[0], d = c[1], f = c[2], p = c[3], m = c[4];
649
- if (e.shape === 1) {
650
- let a = Math.cos(e.angle), c = Math.sin(e.angle), h = r * a + i * c, g = -r * c + i * a;
651
- return B(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);
652
- }
653
- let h = I(e.shape, e.width, e.height), g = Math.sqrt(r * r + i * i), _ = g > 0 ? Math.atan2(i, r) : e.angle;
654
- return B(3, (t + o) / 2, (n + s) / 2, g + h * 2, h * 2, _, l, u, d, f, p, m) ? !0 : B(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);
655
1108
  }
656
- function Ge(e) {
1109
+ function Kt(e) {
657
1110
  return e < 0 ? 0 : e > 1 ? 1 : e;
658
1111
  }
659
- function Z(e, t, n, r) {
1112
+ function $(e, t, n, r) {
660
1113
  let i = r.components.transform;
661
- return B(e.shape, t, n, e.width, e.height, e.angle, j(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);
662
1118
  }
663
1119
  //#endregion
664
1120
  //#region src/systems/spatial-index.ts
665
- var Ke = class {
1121
+ var Jt = class {
666
1122
  entries = [];
667
1123
  index;
668
1124
  constructor(e) {
@@ -670,14 +1126,14 @@ var Ke = class {
670
1126
  for (let n of e) {
671
1127
  let e = n.components, r = e.transform;
672
1128
  if (!r) continue;
673
- let i = e.body, a = i ? j(i) : 1, o = r[2], s = r[3], c = r[4], l = r[0], u = r[1], d = R(a, o, s, c), f = z(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);
674
1130
  this.entries.push({
675
1131
  entityId: n.entityId,
676
1132
  components: e
677
1133
  }), t.push(l - d, u - f, l + d, u + f);
678
1134
  }
679
1135
  if (this.entries.length === 0) return;
680
- let n = new a(this.entries.length);
1136
+ let n = new s(this.entries.length);
681
1137
  for (let e = 0; e < this.entries.length; e++) n.add(t[e * 4], t[e * 4 + 1], t[e * 4 + 2], t[e * 4 + 3]);
682
1138
  n.finish(), this.index = n;
683
1139
  }
@@ -702,14 +1158,14 @@ var Ke = class {
702
1158
  let o = this.entries;
703
1159
  return (i ? a.neighbors(e, t, n, r, (e) => i(o[e])) : a.neighbors(e, t, n, r)).map((e) => o[e]);
704
1160
  }
705
- }, Q = {
1161
+ }, Yt = {
706
1162
  x: 0,
707
1163
  y: 0
708
1164
  };
709
- function qe(e, t) {
710
- !Ye(e) && !Ye(t) || Xe(e, t) && Ze(e, t, Q) && (Je(e, Q.x, Q.y), Je(t, -Q.x, -Q.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));
711
1167
  }
712
- function Je(e, t, n) {
1168
+ function Zt(e, t, n) {
713
1169
  let r = e.components.bounciness, i = e.components.velocity;
714
1170
  if (!r || !i) return;
715
1171
  let a = i[0], o = i[1], s = a * t + o * n;
@@ -717,161 +1173,263 @@ function Je(e, t, n) {
717
1173
  let c = (1 + r[0]) * s;
718
1174
  i[0] = a - c * t, i[1] = o - c * n;
719
1175
  }
720
- function Ye(e) {
721
- 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);
1185
+ }
1186
+ function $t(e, t) {
1187
+ return e.components.velocity !== void 0 && (t || e.components.bounciness !== void 0);
722
1188
  }
723
- function Xe(e, t) {
724
- return !$e(e.components.body) && !$e(t.components.body);
1189
+ function en(e, t) {
1190
+ return !rn(e.components.body) && !rn(t.components.body);
725
1191
  }
726
- function Ze(e, t, n) {
727
- let r = e.components.transform, i = t.components.transform;
728
- return Ee(Qe(e.components.body), r[0], r[1], r[2], r[3], r[4], Qe(t.components.body), i[0], i[1], i[2], i[3], i[4], n);
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);
729
1195
  }
730
- function Qe(e) {
731
- return e ? j(e) : 1;
1196
+ function nn(e) {
1197
+ return e ? L(e) : 1;
732
1198
  }
733
- function $e(e) {
734
- return e !== void 0 && M(e);
1199
+ function rn(e) {
1200
+ return e !== void 0 && R(e);
735
1201
  }
736
1202
  //#endregion
737
1203
  //#region src/systems/physics-update.ts
738
- var et = "position-updated";
739
- function tt(e = {}) {
740
- let { onCollision: t, optional: r = [], group: i } = e, a, o, s = Object.assign((e, r, s, c, l) => {
741
- if (s.entity?.[n] === 1) return;
742
- let u = i ? nt(s, i) : 0;
743
- if (i && e.skipGroup === u) return;
744
- let d = {
1204
+ function an(e, t, n) {
1205
+ if (!e.spatialMap && (!e.heap || !e.spatialMapMemory)) return;
1206
+ let r = ut(e), i = X(n);
1207
+ r.update(t, i.minX, i.minY, i.maxX - i.minX, i.maxY - i.minY);
1208
+ }
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);
1218
+ return;
1219
+ }
1220
+ let d = i ? un(c, i) : 0;
1221
+ if (i && e.skipGroup === d) return;
1222
+ let f = {
745
1223
  entityId: r,
746
- components: s
747
- }, f = s.interpolation, p = e.elapsedTime / 1e3, m = s.velocity[0] * p, h = s.velocity[1] * p;
748
- at(f, s.transform, e.elapsedTime);
749
- let g = i ? o?.get(u) : a;
750
- if (!g) {
751
- $(r, s.transform, m, h, l, e.reportMoves), ot(f, e.tick);
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);
752
1232
  return;
753
1233
  }
754
- let _ = s.bounciness !== void 0, v = g.resolveMove(d, m, h, !_);
755
- if ($(r, s.transform, v.moveX, v.moveY, l, e.reportMoves), ot(f, e.tick), !(!g.hasBounciness && !t)) {
756
- g.forEachOverlapping(d, (n) => {
757
- g.claimContact(r, n.entityId) && rt(e, d, n, c, l, t);
758
- }, v.moveX, v.moveY);
759
- for (let n of v.blocking) g.claimContact(r, n.entityId) && rt(e, d, n, 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);
760
1240
  }
761
1241
  }, { physics: {
762
1242
  collision: !0,
1243
+ dynamics: !0,
763
1244
  optional: r,
764
1245
  group: i
765
1246
  } });
766
- return s.preRun = (e, t, n) => {
767
- let r = e.elapsedTime / 1e3, s = n.collidable ?? [];
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);
1250
+ };
1251
+ let r = e.elapsedTime / 1e3, a = n.collidable ?? [];
768
1252
  if (!i) {
769
- a = new Ve(s, r);
1253
+ o = new Vt(a, r, e.dynamicsCommands);
770
1254
  return;
771
1255
  }
772
- let c = /* @__PURE__ */ new Map();
773
- for (let t of s) {
774
- let n = nt(t.components, i);
1256
+ let l = /* @__PURE__ */ new Map();
1257
+ for (let t of a) {
1258
+ let n = un(t.components, i);
775
1259
  if (e.skipGroup === n) continue;
776
- let r = c.get(n);
777
- 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);
778
1262
  }
779
- o = /* @__PURE__ */ new Map();
780
- for (let [e, t] of c) o.set(e, new Ve(t, r));
781
- }, 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
+ };
782
1281
  }
783
- function nt(e, t) {
1282
+ function un(e, t) {
784
1283
  let n = e[t.component];
785
1284
  return n ? n[t.index] : 0;
786
1285
  }
787
- function rt(e, t, n, r, i, a) {
788
- qe(t, n), a && a(e, t, n, r, i);
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);
789
1293
  }
790
- function it(e, t, n, r, i) {
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);
1297
+ }
1298
+ function pn(e, t, n, r) {
1299
+ let i = n.components.body;
1300
+ if (!i || xe(i)) return;
1301
+ Se(i);
1302
+ let a = n.components.transform, o = n.components.velocity, s = r.components.transform, c = r.components.body;
1303
+ if (!t || !a || !o || !s || !c) return;
1304
+ let l = e.elapsedTime / 1e3, u = o[0] * l, d = o[1] * l;
1305
+ if (u === 0 && d === 0) return;
1306
+ let f = t.contactPoint({
1307
+ entityId: n.entityId,
1308
+ components: {
1309
+ transform: a,
1310
+ body: i
1311
+ }
1312
+ }, { components: {
1313
+ transform: s,
1314
+ body: c
1315
+ } }, u, d);
1316
+ a[0] = f.x, a[1] = f.y;
1317
+ }
1318
+ function mn(e, t, n, r, i) {
791
1319
  let a = e.elapsedTime / 1e3, o = n.interpolation;
792
- at(o, n.transform, e.elapsedTime), $(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), ot(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);
793
1321
  }
794
- function at(e, t, n) {
1322
+ function hn(e, t, n) {
795
1323
  e && (e[2] = t[0], e[3] = t[1], e[6] = n);
796
1324
  }
797
- function ot(e, t) {
798
- e && i(e, 7, t);
1325
+ function gn(e, t) {
1326
+ e && a(e, 7, t);
799
1327
  }
800
- function $(e, t, n, r, i, a) {
801
- n === 0 && r === 0 || (n !== 0 && o(t, 0, n, Infinity), r !== 0 && o(t, 1, r, Infinity), a !== !1 && i.emitSystemEvent(et, 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));
802
1330
  }
803
1331
  //#endregion
804
1332
  //#region src/systems/physics-system.ts
805
- var st = 50, ct = class extends t {
1333
+ var vn = 50, yn = 1, bn = class extends r {
1334
+ spatialWorld;
1335
+ pendingDynamicsCommands = /* @__PURE__ */ new Map();
1336
+ commandQueueId = yn++;
806
1337
  tick = 0;
807
1338
  reportMoves;
808
1339
  skipGroup;
809
1340
  constructor(e, t = {}) {
810
- let n = t.updateFunction ?? it, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = n.physics?.group, o = [];
811
- 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);
812
- let s = o.length ? [...o, ...r] : r, c = r.includes("bounciness") ? [...r] : ["bounciness", ...r];
813
- a && !c.includes(a.component) && c.push(a.component);
814
- let l = i ? { [Re]: {
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]: {
815
1346
  required: ["transform", "body"],
816
1347
  optional: [
817
1348
  "velocity",
818
1349
  "entity",
819
- ...c
1350
+ ...l
820
1351
  ],
821
1352
  filter: t.scope
822
- } } : void 0, u = l || t.queries ? {
823
- ...l,
1353
+ } } : void 0, d = u || t.queries ? {
1354
+ ...u,
824
1355
  ...t.queries
825
- } : void 0, d = lt(t.scope, t.filter);
1356
+ } : void 0, f = xn(t.scope, t.filter);
826
1357
  super(e, {
827
1358
  name: t.name ?? "PhysicsSystem",
828
1359
  deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
829
1360
  firstRun: t.firstRun,
830
1361
  required: ["transform", "velocity"],
831
- optional: s,
832
- filter: d,
1362
+ optional: c,
1363
+ filter: f,
833
1364
  updateFunction: n,
834
- queries: u,
1365
+ queries: d,
835
1366
  forceMainThread: t.forceMainThread ?? !t.getWorker,
836
1367
  getWorker: t.getWorker ?? (() => {
837
1368
  throw Error("PhysicsSystem cannot start a worker: no getWorker was supplied");
838
1369
  })
839
- }), this.reportMoves = t.reportMoves, this.skipGroup = t.skipGroup;
1370
+ }), this.spatialWorld = e, this.reportMoves = t.reportMoves, this.skipGroup = t.skipGroup;
840
1371
  }
841
1372
  startInterpolation(e) {
842
1373
  let t = this.deltaBetweenRuns;
843
- t <= 0 || we(e, {
1374
+ t <= 0 || Ue(e, {
844
1375
  stepMs: t,
845
1376
  stepFraction: this.currentDelta / t,
846
1377
  tick: this.tick
847
1378
  });
848
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
+ }
849
1390
  addDataToWorld(e) {
850
- e.tick = ++this.tick, 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;
851
1409
  }
852
1410
  };
853
- function lt(e, t) {
1411
+ function xn(e, t) {
854
1412
  return e ? t ? (n) => e(n) && t(n) : e : t;
855
1413
  }
856
1414
  //#endregion
857
1415
  //#region src/systems/interpolation-update.ts
858
- var ut = (e, t, n) => {
859
- let i = n.interpolation, a = n.transform, o = r(i, 7), s = i[2], c = i[3], l = i[6], u = a[0], d = a[1], f = r(i, 7);
1416
+ var Sn = (e, t, n) => {
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);
860
1418
  if (o !== f) return;
861
1419
  if (l <= 0) {
862
- i[4] = 1, i[5] = f, i[0] = u, i[1] = d;
1420
+ r[4] = 1, r[5] = f, r[0] = u, r[1] = d;
863
1421
  return;
864
1422
  }
865
- let p = i[4];
866
- f !== i[5] && (p = 0, i[5] = f), p += e.elapsedTime / l, p > 1 && (p = 1), i[4] = p, i[0] = s + (u - s) * p, i[1] = c + (d - c) * p;
867
- }, dt = class extends t {
1423
+ let p = r[4];
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;
1425
+ }, Cn = class extends r {
868
1426
  constructor(e, t = {}) {
869
1427
  super(e, {
870
1428
  name: t.name ?? "InterpolationSystem",
871
1429
  deltaBetweenRuns: 0,
872
1430
  firstRun: t.firstRun,
873
1431
  required: ["transform", "interpolation"],
874
- updateFunction: ut,
1432
+ updateFunction: Sn,
875
1433
  forceMainThread: t.forceMainThread ?? !t.getWorker,
876
1434
  getWorker: t.getWorker ?? (() => {
877
1435
  throw Error("InterpolationSystem cannot start a worker: no getWorker was supplied");
@@ -880,6 +1438,6 @@ var ut = (e, t, n) => {
880
1438
  }
881
1439
  };
882
1440
  //#endregion
883
- export { O as BODY_CATEGORY_INDEX, ne as BODY_CCD_FLAG, D as BODY_FLAGS_INDEX, k as BODY_MASK_INDEX, te as BODY_SENSOR_FLAG, ee as BODY_SHAPE_MASK, A as BODY_SIZE, ce as BOUNCINESS_INDEX, le as BOUNCINESS_SIZE, Re as COLLIDABLE_QUERY, Ve as CollisionBroadphase, w as DEFAULT_COLLIDE_CATEGORY, T as DEFAULT_COLLIDE_MASK, st as DEFAULT_PHYSICS_STEP_MS, ve as INTERPOLATION_DURATION_INDEX, me as INTERPOLATION_PREV_X_INDEX, he as INTERPOLATION_PREV_Y_INDEX, ge as INTERPOLATION_PROGRESS_INDEX, be as INTERPOLATION_SIZE, _e as INTERPOLATION_SYNCED_TICK_INDEX, ye as INTERPOLATION_TICK_INDEX, fe as INTERPOLATION_X_INDEX, pe as INTERPOLATION_Y_INDEX, dt as InterpolationSystem, et as POSITION_UPDATED_EVENT, ct as PhysicsSystem, S as SHAPE_CAPSULE, x as SHAPE_CIRCLE, b as SHAPE_RECTANGLE, Ke as SpatialIndex, d as TRANSFORM_ANGLE_INDEX, u as TRANSFORM_HEIGHT_INDEX, f as TRANSFORM_SIZE, l as TRANSFORM_WIDTH_INDEX, s as TRANSFORM_X_INDEX, c as TRANSFORM_Y_INDEX, _ as VELOCITY_SIZE, h as VELOCITY_X_INDEX, g as VELOCITY_Y_INDEX, ae as bodyDefinition, j as bodyShape, de as bouncinessDefinition, Ne as boundsHalfHeight, Me as boundsHalfWidth, E as canCollide, F as capsuleHalfLength, Ee as contactNormal, tt as createPhysicsUpdate, Se as interpolationDefinition, ut as interpolationUpdate, re as isContinuous, M as isSensor, Pe as orientedBoxesOverlap, Te as physicsRegistry, it as physicsUpdate, K as pointSegmentDistanceSquared, Fe as segmentBoxDistanceSquared, W as segmentSegmentDistanceSquared, z as shapeHalfHeight, R as shapeHalfWidth, L as shapeIsEmpty, I as shapeRadius, B as shapesOverlap, Ce as snapEntity, we as startSpawnInterpolation, m as transformDefinition, y 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 };
884
1442
 
885
1443
  //# sourceMappingURL=index.js.map