@daneren2005/shared-memory-physics 1.2.2 → 1.4.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,40 @@
1
- import e from "flatbush";
2
- import { ComponentSystem as t, DEAD_INDEX as n } from "@daneren2005/shared-memory-ecs";
3
- import { addAtomicFloat32 as r } from "@daneren2005/shared-memory-objects/utils/atomic-math";
4
- import { loadFloat32 as i, storeFloat32 as a } from "@daneren2005/shared-memory-objects/utils/float32-atomics";
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";
5
5
  //#region src/components/transform-component.ts
6
- var o = 0, s = 1, c = 2, l = 3, u = 4, d = 5, f = {
6
+ var s = 0, c = 1, l = 2, u = 3, d = 4, f = 5, p = class extends e {
7
+ get x() {
8
+ return this.block[0];
9
+ }
10
+ set x(e) {
11
+ this.block[0] = e;
12
+ }
13
+ get y() {
14
+ return this.block[1];
15
+ }
16
+ set y(e) {
17
+ this.block[1] = e;
18
+ }
19
+ get width() {
20
+ return this.block[2];
21
+ }
22
+ set width(e) {
23
+ this.block[2] = e;
24
+ }
25
+ get height() {
26
+ return this.block[3];
27
+ }
28
+ set height(e) {
29
+ this.block[3] = e;
30
+ }
31
+ get angle() {
32
+ return this.block[4];
33
+ }
34
+ set angle(e) {
35
+ this.block[4] = e;
36
+ }
37
+ }, m = {
7
38
  type: Float32Array,
8
39
  size: 5,
9
40
  loadProperties: [
@@ -11,80 +42,52 @@ var o = 0, s = 1, c = 2, l = 3, u = 4, d = 5, f = {
11
42
  "height",
12
43
  "radius"
13
44
  ],
14
- load(e, t, n) {
15
- let r = n.radius, i = n.width, a = n.height;
16
- if (r !== void 0) {
17
- if (i !== void 0 || a !== void 0) throw Error("A transform takes either a radius or a width and height, not both");
18
- i = a = r * 2;
45
+ toBlock(e) {
46
+ let t = e.radius, n = e.width, r = e.height;
47
+ 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;
19
50
  }
20
- let o = t.create([
21
- n.x,
22
- n.y,
23
- i,
24
- a,
25
- n.angle ?? 0
26
- ]), s = t.getBlock(o);
27
- return {
28
- index: o,
29
- get x() {
30
- return s[0];
31
- },
32
- set x(e) {
33
- s[0] = e;
34
- },
35
- get y() {
36
- return s[1];
37
- },
38
- set y(e) {
39
- s[1] = e;
40
- },
41
- get width() {
42
- return s[2];
43
- },
44
- set width(e) {
45
- s[2] = e;
46
- },
47
- get height() {
48
- return s[3];
49
- },
50
- set height(e) {
51
- s[3] = e;
52
- },
53
- get angle() {
54
- return s[4];
55
- },
56
- set angle(e) {
57
- s[4] = e;
58
- }
59
- };
51
+ return [
52
+ e.x,
53
+ e.y,
54
+ n,
55
+ r,
56
+ e.angle ?? 0
57
+ ];
58
+ },
59
+ attach(e, t, n) {
60
+ return new p(t.getBlock(n), n);
60
61
  },
61
62
  save(e) {
62
63
  return {
63
64
  x: e.x,
64
- y: e.y
65
+ y: e.y,
66
+ angle: e.angle
65
67
  };
66
68
  }
67
- }, p = 0, m = 1, h = 2, g = {
69
+ }, h = 0, g = 1, _ = 2, v = class extends e {
70
+ get velocityX() {
71
+ return this.block[0];
72
+ }
73
+ set velocityX(e) {
74
+ this.block[0] = e;
75
+ }
76
+ get velocityY() {
77
+ return this.block[1];
78
+ }
79
+ set velocityY(e) {
80
+ this.block[1] = e;
81
+ }
82
+ }, y = {
68
83
  type: Float32Array,
69
84
  size: 2,
70
85
  loadProperties: ["velocityX", "velocityY"],
71
- load(e, t, n) {
72
- let r = t.create([n.velocityX ?? 0, n.velocityY ?? 0]), i = t.getBlock(r);
73
- return {
74
- index: r,
75
- get velocityX() {
76
- return i[0];
77
- },
78
- set velocityX(e) {
79
- i[0] = e;
80
- },
81
- get velocityY() {
82
- return i[1];
83
- },
84
- set velocityY(e) {
85
- i[1] = e;
86
- }
87
- };
86
+ toBlock(e) {
87
+ return [e.velocityX ?? 0, e.velocityY ?? 0];
88
+ },
89
+ attach(e, t, n) {
90
+ return new v(t.getBlock(n), n);
88
91
  },
89
92
  save(e) {
90
93
  return {
@@ -92,21 +95,58 @@ var o = 0, s = 1, c = 2, l = 3, u = 4, d = 5, f = {
92
95
  velocityY: e.velocityY
93
96
  };
94
97
  }
95
- }, _ = 1, v = 2, y = 3, b = [
98
+ }, b = 1, x = 2, S = 3, C = [
96
99
  1,
97
100
  2,
98
101
  3
99
- ], x = 1, S = 4294967295;
100
- function C(e, t, n, r) {
102
+ ], w = 1, T = 4294967295;
103
+ function E(e, t, n, r) {
101
104
  return (t & n) !== 0 && (r & e) !== 0;
102
105
  }
103
- var w = 0, T = 1, E = 2, D = 3, O = 4;
104
- function k(e) {
105
- return e[3] !== 0;
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;
109
+ }
110
+ function M(e) {
111
+ return (e[0] & 4) != 0;
106
112
  }
107
- var A = {
113
+ function re(e) {
114
+ return (e[0] & 8) != 0;
115
+ }
116
+ var ie = class extends e {
117
+ get shape() {
118
+ return this.block[0] & 3;
119
+ }
120
+ set shape(e) {
121
+ this.block[0] = this.block[0] & -4 | e & 3;
122
+ }
123
+ get collideCategory() {
124
+ return this.block[1];
125
+ }
126
+ set collideCategory(e) {
127
+ this.block[1] = e;
128
+ }
129
+ get collideMask() {
130
+ return this.block[2];
131
+ }
132
+ set collideMask(e) {
133
+ this.block[2] = e;
134
+ }
135
+ get sensor() {
136
+ return (this.block[0] & 4) != 0;
137
+ }
138
+ set sensor(e) {
139
+ this.block[0] = e ? this.block[0] | 4 : this.block[0] & -5;
140
+ }
141
+ get continuousCollisionDetection() {
142
+ return (this.block[0] & 8) != 0;
143
+ }
144
+ set continuousCollisionDetection(e) {
145
+ this.block[0] = e ? this.block[0] | 8 : this.block[0] & -9;
146
+ }
147
+ }, ae = {
108
148
  type: Uint32Array,
109
- size: 4,
149
+ size: 3,
110
150
  loadProperties: [
111
151
  "width",
112
152
  "height",
@@ -114,342 +154,382 @@ var A = {
114
154
  "shape",
115
155
  "collideCategory",
116
156
  "collideMask",
117
- "sensor"
157
+ "sensor",
158
+ "continuousCollisionDetection"
118
159
  ],
119
- load(e, t, n) {
120
- let r = t.create([
121
- ee(n),
122
- n.collideCategory ?? 1,
123
- n.collideMask ?? 4294967295,
124
- +!!n.sensor
125
- ]), i = t.getBlock(r);
126
- return {
127
- index: r,
128
- get shape() {
129
- return i[0];
130
- },
131
- set shape(e) {
132
- i[0] = e;
133
- },
134
- get collideCategory() {
135
- return i[1];
136
- },
137
- set collideCategory(e) {
138
- i[1] = e;
139
- },
140
- get collideMask() {
141
- return i[2];
142
- },
143
- set collideMask(e) {
144
- i[2] = e;
145
- },
146
- get sensor() {
147
- return i[3] !== 0;
148
- },
149
- set sensor(e) {
150
- i[3] = +!!e;
151
- }
152
- };
160
+ toBlock(e) {
161
+ return [
162
+ oe(e),
163
+ e.collideCategory ?? 1,
164
+ e.collideMask ?? 4294967295
165
+ ];
166
+ },
167
+ attach(e, t, n) {
168
+ return new ie(t.getBlock(n), n);
153
169
  }
154
170
  };
155
- function ee(e) {
171
+ function oe(e) {
172
+ let t = se(e);
173
+ return e.sensor && (t |= 4), e.continuousCollisionDetection && (t |= 8), t;
174
+ }
175
+ function se(e) {
156
176
  let t = e.shape;
157
177
  if (t === void 0) return e.radius === void 0 ? 1 : 2;
158
- if (!b.includes(t)) throw Error(`Unknown body shape: ${t}`);
178
+ if (!C.includes(t)) throw Error(`Unknown body shape: ${t}`);
159
179
  return t;
160
180
  }
161
181
  //#endregion
162
182
  //#region src/components/bounciness-component.ts
163
- var te = 0, ne = 1, re = {
183
+ var ce = 0, le = 1, ue = class extends e {
184
+ get bounciness() {
185
+ return this.block[0];
186
+ }
187
+ set bounciness(e) {
188
+ this.block[0] = e;
189
+ }
190
+ }, de = {
164
191
  type: Float32Array,
165
192
  size: 1,
166
193
  loadProperties: ["bounciness"],
167
- load(e, t, n) {
168
- let r = t.create([n.bounciness ?? 0]), i = t.getBlock(r);
169
- return {
170
- index: r,
171
- get bounciness() {
172
- return i[0];
173
- },
174
- set bounciness(e) {
175
- i[0] = e;
176
- }
177
- };
194
+ toBlock(e) {
195
+ return [e.bounciness ?? 0];
196
+ },
197
+ attach(e, t, n) {
198
+ return new ue(t.getBlock(n), n);
199
+ }
200
+ }, fe = 0, pe = 1, me = 2, he = 3, ge = 4, _e = 5, ve = 6, ye = 7, be = 8, xe = class extends e {
201
+ get x() {
202
+ return this.block[0];
203
+ }
204
+ set x(e) {
205
+ this.block[0] = e;
206
+ }
207
+ get y() {
208
+ return this.block[1];
209
+ }
210
+ set y(e) {
211
+ this.block[1] = e;
212
+ }
213
+ get prevX() {
214
+ return this.block[2];
215
+ }
216
+ set prevX(e) {
217
+ this.block[2] = e;
218
+ }
219
+ get prevY() {
220
+ return this.block[3];
178
221
  }
179
- }, ie = 0, ae = 1, oe = 2, se = 3, ce = 4, le = 5, ue = 6, de = 7, fe = 8, pe = {
222
+ set prevY(e) {
223
+ this.block[3] = e;
224
+ }
225
+ get progress() {
226
+ return this.block[4];
227
+ }
228
+ set progress(e) {
229
+ this.block[4] = e;
230
+ }
231
+ get syncedTick() {
232
+ return this.block[5];
233
+ }
234
+ set syncedTick(e) {
235
+ this.block[5] = e;
236
+ }
237
+ get duration() {
238
+ return this.block[6];
239
+ }
240
+ set duration(e) {
241
+ this.block[6] = e;
242
+ }
243
+ get tick() {
244
+ return r(this.block, 7);
245
+ }
246
+ set tick(e) {
247
+ i(this.block, 7, e);
248
+ }
249
+ }, Se = {
180
250
  type: Float32Array,
181
251
  size: 8,
182
252
  loadProperties: ["interpolate"],
183
- load(e, t, n) {
184
- let r = n.x ?? 0, i = n.y ?? 0, a = t.create([
185
- r,
186
- i,
187
- r,
188
- i,
253
+ toBlock(e) {
254
+ let t = e.x ?? 0, n = e.y ?? 0;
255
+ return [
256
+ t,
257
+ n,
258
+ t,
259
+ n,
189
260
  0,
190
261
  0,
191
262
  0,
192
263
  0
193
- ]), o = t.getBlock(a);
194
- return {
195
- index: a,
196
- get x() {
197
- return o[0];
198
- },
199
- set x(e) {
200
- o[0] = e;
201
- },
202
- get y() {
203
- return o[1];
204
- },
205
- set y(e) {
206
- o[1] = e;
207
- },
208
- get prevX() {
209
- return o[2];
210
- },
211
- set prevX(e) {
212
- o[2] = e;
213
- },
214
- get prevY() {
215
- return o[3];
216
- },
217
- set prevY(e) {
218
- o[3] = e;
219
- }
220
- };
264
+ ];
265
+ },
266
+ attach(e, t, n) {
267
+ return new xe(t.getBlock(n), n);
221
268
  }
222
269
  };
223
- function me(e) {
270
+ function Ce(e) {
224
271
  let { transform: t, interpolation: n } = e.components;
225
272
  !t || !n || (n.prevX = n.x = t.x, n.prevY = n.y = t.y);
226
273
  }
274
+ function we(e, t) {
275
+ let { transform: n, velocity: r, interpolation: i } = e.components;
276
+ if (!n || !r || !i) return;
277
+ 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;
278
+ i.prevX = s, i.prevY = c, n.x = s + l, n.y = c + u, i.x = s, i.y = c, i.duration = t.stepMs * a, i.progress = 0, i.syncedTick = t.tick, i.tick = t.tick;
279
+ }
227
280
  //#endregion
228
281
  //#region src/components/registry.ts
229
- var he = {
230
- transform: f,
231
- velocity: g,
232
- body: A,
233
- bounciness: re,
234
- interpolation: pe
235
- }, j = {
282
+ var Te = {
283
+ transform: m,
284
+ velocity: y,
285
+ body: ae,
286
+ bounciness: de,
287
+ interpolation: Se
288
+ }, N = {
236
289
  x: 0,
237
290
  y: 0
238
- }, M = {
291
+ }, P = {
239
292
  x: 0,
240
293
  y: 0
241
294
  };
242
- function N(e, t) {
295
+ function F(e, t) {
243
296
  return Math.max(0, (e - t) / 2);
244
297
  }
245
- function P(e, t, n) {
298
+ function I(e, t, n) {
246
299
  return e === 2 ? t / 2 : e === 3 ? n / 2 : 0;
247
300
  }
248
- function F(e, t, n) {
301
+ function L(e, t, n) {
249
302
  return e === 2 ? t <= 0 : e === 3 ? n <= 0 : t <= 0 || n <= 0;
250
303
  }
251
- function I(e, t, n, r) {
252
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * N(t, n) + n / 2 : Se(t, n, r);
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);
253
306
  }
254
- function L(e, t, n, r) {
255
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * N(t, n) + n / 2 : Ce(t, n, r);
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);
256
309
  }
257
- function R(e, t, n, r, i, a, o, s, c, l, u, d) {
258
- if (F(e, r, i) || F(o, l, u)) return !1;
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;
259
312
  let f = e !== 1, p = o !== 1;
260
- if (!f && !p) return we(t, n, r, i, a, s, c, l, u, d);
261
- if (f && !p) return R(o, s, c, l, u, d, e, t, n, r, i, a);
262
- let m = z(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = P(o, l, u);
263
- if (!f) return U(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
264
- let v = z(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = P(e, r, i) + _;
265
- return H(t - y, n - b, t + y, n + b, s - h, c - g, s + h, c + g) < x * x;
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;
266
319
  }
267
- function z(e, t, n) {
268
- return e === 3 ? N(t, n) : 0;
320
+ function V(e, t, n) {
321
+ return e === 3 ? F(t, n) : 0;
269
322
  }
270
- function ge(e, t, n, r, i, a, o, s, c, l, u, d, f) {
323
+ function Ee(e, t, n, r, i, a, o, s, c, l, u, d, f) {
271
324
  let p = e !== 1, m = o !== 1;
272
- return !p && !m ? _e(t, n, r, i, a, s, c, l, u, d, f) : p && m ? ve(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;
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;
273
326
  }
274
- function _e(e, t, n, r, i, a, o, s, c, l, u) {
275
- 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);
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);
276
329
  u.x = d, u.y = f;
277
- let S = V(-f, d, y, b, h, g, d, f, _, v, p, m);
278
- 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), be(y, b, u), !0;
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;
279
332
  }
280
- function ve(e, t, n, r, i, a, o, s, c, l, u, d, f) {
281
- let p = z(e, r, i), m = Math.cos(a) * p, h = Math.sin(a) * p, g = z(o, l, u), _ = Math.cos(d) * g, v = Math.sin(d) * g, y = Math.sqrt(H(t - m, n - h, t + m, n + h, s - _, c - v, s + _, c + v, j));
282
- return y > 0 ? (f.x = j.x / y, f.y = j.y / y, !0) : xe(t - s, n - c, f);
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);
283
336
  }
284
- function ye(e, t, n, r, i, a, o, s, c, l, u, d) {
285
- let f = z(a, c, l), p = Math.cos(u) * f, m = Math.sin(u) * f, h = Math.sqrt(U(o - p, s - m, o + p, s + m, e, t, n, r, i, j));
286
- if (h > 0) return d.x = j.x / h, d.y = j.y / h, !0;
287
- 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 = P(a, c, l), T = n / 2, E = r / 2, D = B(1, 0, b, x, S, C, w, T, E);
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);
288
341
  d.x = 1, d.y = 0;
289
- let O = B(0, 1, b, x, S, C, w, T, E);
290
- O < D && (D = O, d.x = 0, d.y = 1), xe(-C, S, M) && (O = B(M.x, M.y, b, x, S, C, w, T, E), O < D && (d.x = M.x, d.y = M.y)), be(b, x, d);
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);
291
344
  let k = d.x, A = d.y;
292
345
  return d.x = k * g - A * _, d.y = k * _ + A * g, !0;
293
346
  }
294
- function B(e, t, n, r, i, a, o, s, c) {
347
+ function H(e, t, n, r, i, a, o, s, c) {
295
348
  return s * Math.abs(e) + c * Math.abs(t) + (Math.abs(i * e + a * t) + o) - Math.abs(n * e + r * t);
296
349
  }
297
- function be(e, t, n) {
350
+ function Ae(e, t, n) {
298
351
  e * n.x + t * n.y < 0 && (n.x = -n.x, n.y = -n.y);
299
352
  }
300
- function xe(e, t, n) {
353
+ function je(e, t, n) {
301
354
  let r = Math.sqrt(e * e + t * t);
302
355
  return r === 0 ? !1 : (n.x = e / r, n.y = t / r, !0);
303
356
  }
304
- function Se(e, t, n) {
357
+ function Me(e, t, n) {
305
358
  return (Math.abs(Math.cos(n)) * e + Math.abs(Math.sin(n)) * t) / 2;
306
359
  }
307
- function Ce(e, t, n) {
360
+ function Ne(e, t, n) {
308
361
  return (Math.abs(Math.sin(n)) * e + Math.abs(Math.cos(n)) * t) / 2;
309
362
  }
310
- function we(e, t, n, r, i, a, o, s, c, l) {
363
+ function Pe(e, t, n, r, i, a, o, s, c, l) {
311
364
  if (n <= 0 || r <= 0 || s <= 0 || c <= 0) return !1;
312
365
  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;
313
- 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;
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;
314
367
  }
315
- function V(e, t, n, r, i, a, o, s, c, l, u, d) {
368
+ function U(e, t, n, r, i, a, o, s, c, l, u, d) {
316
369
  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);
317
370
  }
318
- function H(e, t, n, r, i, a, o, s, c) {
371
+ function W(e, t, n, r, i, a, o, s, c) {
319
372
  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;
320
373
  if (h <= 0 && g <= 0) return c && (c.x = p, c.y = m), p * p + m * m;
321
- if (h <= 0) y = q(_ / g);
374
+ if (h <= 0) y = J(_ / g);
322
375
  else {
323
376
  let e = l * p + u * m;
324
- if (g <= 0) v = q(-e / h);
377
+ if (g <= 0) v = J(-e / h);
325
378
  else {
326
379
  let t = l * d + u * f, n = h * g - t * t;
327
- n !== 0 && (v = q((t * _ - e * g) / n)), y = (t * v + _) / g, y < 0 ? (y = 0, v = q(-e / h)) : y > 1 && (y = 1, v = q((t - e) / h));
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));
328
381
  }
329
382
  }
330
383
  let b = e + l * v - (i + d * y), x = t + u * v - (a + f * y);
331
384
  return c && (c.x = b, c.y = x), b * b + x * x;
332
385
  }
333
- function U(e, t, n, r, i, a, o, s, c, l) {
386
+ function Fe(e, t, n, r, i, a, o, s, c, l) {
334
387
  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;
335
- if (!Te(v, y, b, x, f, p)) return l && (l.x = 0, l.y = 0), 0;
336
- if (!l) return Math.min(K(v, y, f, p), K(b, x, f, p), G(-f, -p, v, y, b, x), G(f, -p, v, y, b, x), G(f, p, v, y, b, x), G(-f, p, v, y, b, x));
337
- let S = K(v, y, f, p, l);
338
- S = W(S, K(b, x, f, p, M), M, l, !1), S = W(S, G(-f, -p, v, y, b, x, M), M, l, !0), S = W(S, G(f, -p, v, y, b, x, M), M, l, !0), S = W(S, G(f, p, v, y, b, x, M), M, l, !0), S = W(S, G(-f, p, v, y, b, x, M), M, l, !0);
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);
339
392
  let C = l.x, w = l.y;
340
393
  return l.x = C * u - w * d, l.y = C * d + w * u, S;
341
394
  }
342
- function W(e, t, n, r, i) {
395
+ function G(e, t, n, r, i) {
343
396
  return t >= e ? e : (r.x = i ? -n.x : n.x, r.y = i ? -n.y : n.y, t);
344
397
  }
345
- function G(e, t, n, r, i, a, o) {
346
- let s = i - n, c = a - r, l = s * s + c * c, u = l > 0 ? q(((e - n) * s + (t - r) * c) / l) : 0, d = e - (n + s * u), f = t - (r + c * u);
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);
347
400
  return o && (o.x = d, o.y = f), d * d + f * f;
348
401
  }
349
- function Te(e, t, n, r, i, a) {
402
+ function Ie(e, t, n, r, i, a) {
350
403
  if (Math.max(e, n) < -i || Math.min(e, n) > i || Math.max(t, r) < -a || Math.min(t, r) > a) return !0;
351
404
  let o = -(r - t), s = n - e;
352
405
  return Math.abs(o * e + s * t) > i * Math.abs(o) + a * Math.abs(s);
353
406
  }
354
- function K(e, t, n, r, i) {
407
+ function q(e, t, n, r, i) {
355
408
  let a = Math.abs(e) - n, o = Math.abs(t) - r, s = a > 0 ? a : 0, c = o > 0 ? o : 0;
356
409
  return i && (i.x = e < 0 ? -s : s, i.y = t < 0 ? -c : c), s * s + c * c;
357
410
  }
358
- function q(e) {
411
+ function J(e) {
359
412
  return e < 0 ? 0 : e > 1 ? 1 : e;
360
413
  }
361
414
  //#endregion
362
415
  //#region src/systems/collision.ts
363
- var Ee = 1e-4, De = 24, Oe = "collidable", J = [], ke = 2 ** 26, Ae = {
416
+ var Y = 1e-4, Le = 24, Re = "collidable", X = [], ze = 2 ** 26, Be = {
364
417
  fraction: 1,
365
- blocking: J
366
- }, je = class {
418
+ blocking: X
419
+ }, Ve = class {
367
420
  buckets = [];
368
421
  hasBounciness = !1;
369
422
  resolved = /* @__PURE__ */ new Set();
370
- constructor(t, n) {
371
- let r = /* @__PURE__ */ new Map();
372
- for (let e of t) {
373
- let t = e.components, i = t.transform, a = t.body;
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;
374
427
  if (!i || !a) continue;
375
428
  let o = a[1];
376
429
  if (o === 0) continue;
377
- let s = a[0], c = i[2], l = i[3];
378
- if (F(s, c, l)) continue;
379
- let u = i[4], d = I(s, c, l, u), f = L(s, c, l, u);
380
- t.bounciness && (this.hasBounciness = !0);
381
- let p = t.velocity, m = p ? Math.abs(p[0]) * n : 0, h = p ? Math.abs(p[1]) * n : 0, g = i[0], _ = i[1], v = r.get(o);
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);
433
+ 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);
382
435
  v || (v = {
383
436
  entries: [],
384
437
  bounds: []
385
- }, r.set(o, v)), v.entries.push({
386
- entityId: e.entityId,
387
- components: t
438
+ }, n.set(o, v)), v.entries.push({
439
+ entityId: r.entityId,
440
+ components: e
388
441
  }), v.bounds.push(g - d - m, _ - f - h, g + d + m, _ + f + h);
389
442
  }
390
- for (let [t, { entries: n, bounds: i }] of r) {
391
- let r = new e(n.length);
392
- for (let e = 0; e < n.length; e++) r.add(i[e * 4], i[e * 4 + 1], i[e * 4 + 2], i[e * 4 + 3]);
393
- r.finish(), this.buckets.push({
394
- category: t,
395
- entries: n,
396
- index: r
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({
447
+ category: e,
448
+ entries: t,
449
+ index: n
397
450
  });
398
451
  }
399
452
  }
400
453
  claimContact(e, t) {
401
- let n = e < t ? e * ke + t : t * ke + e;
454
+ let n = e < t ? e * ze + t : t * ze + e;
402
455
  return this.resolved.has(n) ? !1 : (this.resolved.add(n), !0);
403
456
  }
404
- forEachOverlapping(e, t) {
405
- let n = Y(e);
406
- if (!n) return;
407
- let { x: r, y: i, halfWidth: a, halfHeight: o } = n;
408
- this.forEachCandidate(n, r - a, i - o, r + a, i + o, (e) => {
409
- X(n, r, i, e) && t(e);
457
+ forEachOverlapping(e, t, n = 0, r = 0) {
458
+ let i = Ue(e);
459
+ if (!i) return;
460
+ let { x: a, y: o, halfWidth: s, halfHeight: c } = i;
461
+ if (i.ccd && (n !== 0 || r !== 0)) {
462
+ 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
+ this.forEachCandidate(i, u, d, f, p, (a) => {
464
+ We(i, e, l, n, r, a) && t(a);
465
+ });
466
+ return;
467
+ }
468
+ this.forEachCandidate(i, a - s, o - c, a + s, o + c, (e) => {
469
+ Z(i, a, o, e) && t(e);
410
470
  });
411
471
  }
412
472
  sweep(e, t, n) {
413
- let r = Math.sqrt(t * t + n * n), i = Y(e);
473
+ let r = Math.sqrt(t * t + n * n), i = Ue(e);
414
474
  if (!i || r === 0) return {
415
475
  fraction: 1,
416
- blocking: J
476
+ blocking: X
417
477
  };
478
+ if (i.ccd) return this.sweepContinuous(i, t, n, r);
418
479
  let a = this.gatherCandidates(i, t, n);
419
480
  return a.length === 0 ? {
420
481
  fraction: 1,
421
- blocking: J
482
+ blocking: X
422
483
  } : this.refine(i, a, t, n, r);
423
484
  }
424
485
  resolveMove(e, t, n, r) {
425
- let i = Math.sqrt(t * t + n * n), a = Y(e);
486
+ let i = Math.sqrt(t * t + n * n), a = Ue(e);
426
487
  if (!a || i === 0) return {
427
488
  moveX: t,
428
489
  moveY: n,
429
- blocking: J
490
+ blocking: X
430
491
  };
492
+ if (a.ccd) {
493
+ let e = this.sweepContinuous(a, t, n, i);
494
+ return {
495
+ moveX: t * e.fraction,
496
+ moveY: n * e.fraction,
497
+ blocking: e.blocking
498
+ };
499
+ }
431
500
  let o = this.gatherCandidates(a, t, n);
432
501
  if (o.length === 0) return {
433
502
  moveX: t,
434
503
  moveY: n,
435
- blocking: J
504
+ blocking: X
436
505
  };
437
506
  if (r && t !== 0 && n !== 0) {
438
507
  let e = this.gatherCandidates(a, t, 0), r = this.gatherCandidates(a, 0, n);
439
508
  if (e.length === 0 && r.length === 0) return Math.abs(t) >= Math.abs(n) ? {
440
509
  moveX: t,
441
510
  moveY: 0,
442
- blocking: J
511
+ blocking: X
443
512
  } : {
444
513
  moveX: 0,
445
514
  moveY: n,
446
- blocking: J
515
+ blocking: X
447
516
  };
448
- let i = e.length === 0 ? Ae : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? Ae : this.refine(a, r, 0, n, Math.abs(n));
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;
518
+ if (s !== 0 && c !== 0) {
519
+ let e = this.gatherCandidates(a, s, c);
520
+ if (e.length > 0) {
521
+ let t = this.refine(a, e, s, c, Math.sqrt(s * s + c * c));
522
+ return {
523
+ moveX: s * t.fraction,
524
+ moveY: c * t.fraction,
525
+ blocking: t.blocking
526
+ };
527
+ }
528
+ }
449
529
  return {
450
- moveX: t * i.fraction,
451
- moveY: n * o.fraction,
452
- blocking: Me(i.blocking, o.blocking)
530
+ moveX: s,
531
+ moveY: c,
532
+ blocking: He(i.blocking, o.blocking)
453
533
  };
454
534
  }
455
535
  let s = this.refine(a, o, t, n, i);
@@ -464,25 +544,66 @@ var Ee = 1e-4, De = 24, Oe = "collidable", J = [], ke = 2 ** 26, Ae = {
464
544
  if (e.sensor) return [];
465
545
  let s = r + t, c = i + n, l = [];
466
546
  return this.forEachCandidate(e, s - a, c - o, s + a, c + o, (t) => {
467
- X(e, s, c, t) && t.components.body[3] === 0 && (X(e, r, i, t) || l.push(t));
547
+ Z(e, s, c, t) && (M(t.components.body) || Z(e, r, i, t) || l.push(t));
468
548
  }), l;
469
549
  }
470
550
  refine(e, t, n, r, i) {
471
- let { x: a, y: o } = e, s = 0, c = 1, l = Ee / i;
472
- for (let i = 0; i < De && c - s > l; 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++) {
473
553
  let i = (s + c) / 2;
474
554
  this.blockedAt(e, t, n, r, i) ? c = i : s = i;
475
555
  }
476
556
  let u = [], d = a + n * c, f = o + r * c;
477
- for (let n of t) X(e, d, f, n) && u.push(n);
557
+ for (let n of t) Z(e, d, f, n) && u.push(n);
478
558
  return {
479
- fraction: s * i > Ee ? s : 0,
559
+ fraction: s * i > Y ? s : 0,
480
560
  blocking: u
481
561
  };
482
562
  }
563
+ gatherContinuousCandidates(e, t, n) {
564
+ if (e.sensor) return [];
565
+ let { x: r, y: i, halfWidth: a, halfHeight: o } = e, s = r + t, c = i + n, l = [];
566
+ 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);
568
+ }), l;
569
+ }
570
+ sweepContinuous(e, t, n, r) {
571
+ let i = this.gatherContinuousCandidates(e, t, n);
572
+ if (i.length === 0) return {
573
+ fraction: 1,
574
+ blocking: X
575
+ };
576
+ let a = 1, o = [], s = Y / r;
577
+ for (let c of i) {
578
+ let i = this.entryFraction(e, c, t, n, r);
579
+ i < a - s ? (a = i, o = [c]) : i <= a + s && o.push(c);
580
+ }
581
+ return {
582
+ fraction: a * r > Y ? a : 0,
583
+ blocking: o
584
+ };
585
+ }
586
+ entryFraction(e, t, n, r, i) {
587
+ let a;
588
+ if (this.blockedAtOne(e, t, n, r, 1)) a = 1;
589
+ 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));
591
+ if (!this.blockedAtOne(e, t, n, r, l)) return l;
592
+ a = l;
593
+ }
594
+ let o = 0, s = Y / i;
595
+ for (let i = 0; i < Le && a - o > s; i++) {
596
+ let i = (o + a) / 2;
597
+ this.blockedAtOne(e, t, n, r, i) ? a = i : o = i;
598
+ }
599
+ return o;
600
+ }
601
+ blockedAtOne(e, t, n, r, i) {
602
+ return Z(e, Math.fround(e.x + n * i), Math.fround(e.y + r * i), t);
603
+ }
483
604
  blockedAt(e, t, n, r, i) {
484
- let a = e.x + n * i, o = e.y + r * i;
485
- for (let n of t) if (X(e, a, o, n)) return !0;
605
+ 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;
486
607
  return !1;
487
608
  }
488
609
  forEachCandidate(e, t, r, i, a, o) {
@@ -492,20 +613,20 @@ var Ee = 1e-4, De = 24, Oe = "collidable", J = [], ke = 2 ** 26, Ae = {
492
613
  }
493
614
  }
494
615
  };
495
- function Me(e, t) {
616
+ function He(e, t) {
496
617
  if (e.length === 0) return t;
497
618
  if (t.length === 0) return e;
498
619
  let n = [...e];
499
620
  for (let e of t) n.some((t) => t.entityId === e.entityId) || n.push(e);
500
621
  return n;
501
622
  }
502
- function Y(e) {
623
+ function Ue(e) {
503
624
  let t = e.components.body;
504
625
  if (!t) return;
505
626
  let n = t[2];
506
627
  if (n === 0) return;
507
- let r = e.components.transform, i = t[0], a = r[2], o = r[3];
508
- if (F(i, a, o)) return;
628
+ let r = e.components.transform, i = j(t), a = r[2], o = r[3];
629
+ if (L(i, a, o)) return;
509
630
  let s = r[4];
510
631
  return {
511
632
  entityId: e.entityId,
@@ -515,37 +636,50 @@ function Y(e) {
515
636
  width: a,
516
637
  height: o,
517
638
  angle: s,
518
- halfWidth: I(i, a, o, s),
519
- halfHeight: L(i, a, o, s),
639
+ halfWidth: R(i, a, o, s),
640
+ halfHeight: z(i, a, o, s),
520
641
  category: t[1],
521
642
  mask: n,
522
- sensor: t[3] !== 0
643
+ sensor: M(t),
644
+ ccd: re(t)
523
645
  };
524
646
  }
525
- function X(e, t, n, r) {
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);
655
+ }
656
+ function Ge(e) {
657
+ return e < 0 ? 0 : e > 1 ? 1 : e;
658
+ }
659
+ function Z(e, t, n, r) {
526
660
  let i = r.components.transform;
527
- return R(e.shape, t, n, e.width, e.height, e.angle, r.components.body[0], i[0], i[1], i[2], i[3], i[4]);
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]);
528
662
  }
529
663
  //#endregion
530
664
  //#region src/systems/spatial-index.ts
531
- var Ne = class {
665
+ var Ke = class {
532
666
  entries = [];
533
667
  index;
534
- constructor(t) {
535
- let n = [];
536
- for (let e of t) {
537
- let t = e.components, r = t.transform;
668
+ constructor(e) {
669
+ let t = [];
670
+ for (let n of e) {
671
+ let e = n.components, r = e.transform;
538
672
  if (!r) continue;
539
- let i = t.body, a = i ? i[0] : 1, o = r[2], s = r[3], c = r[4], l = r[0], u = r[1], d = I(a, o, s, c), f = L(a, o, s, c);
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);
540
674
  this.entries.push({
541
- entityId: e.entityId,
542
- components: t
543
- }), n.push(l - d, u - f, l + d, u + f);
675
+ entityId: n.entityId,
676
+ components: e
677
+ }), t.push(l - d, u - f, l + d, u + f);
544
678
  }
545
679
  if (this.entries.length === 0) return;
546
- let r = new e(this.entries.length);
547
- for (let e = 0; e < this.entries.length; e++) r.add(n[e * 4], n[e * 4 + 1], n[e * 4 + 2], n[e * 4 + 3]);
548
- r.finish(), this.index = r;
680
+ let n = new a(this.entries.length);
681
+ 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
+ n.finish(), this.index = n;
549
683
  }
550
684
  get size() {
551
685
  return this.entries.length;
@@ -568,14 +702,14 @@ var Ne = class {
568
702
  let o = this.entries;
569
703
  return (i ? a.neighbors(e, t, n, r, (e) => i(o[e])) : a.neighbors(e, t, n, r)).map((e) => o[e]);
570
704
  }
571
- }, Z = {
705
+ }, Q = {
572
706
  x: 0,
573
707
  y: 0
574
708
  };
575
- function Pe(e, t) {
576
- !Ie(e) && !Ie(t) || Le(e, t) && Re(e, t, Z) && (Fe(e, Z.x, Z.y), Fe(t, -Z.x, -Z.y));
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));
577
711
  }
578
- function Fe(e, t, n) {
712
+ function Je(e, t, n) {
579
713
  let r = e.components.bounciness, i = e.components.velocity;
580
714
  if (!r || !i) return;
581
715
  let a = i[0], o = i[1], s = a * t + o * n;
@@ -583,123 +717,161 @@ function Fe(e, t, n) {
583
717
  let c = (1 + r[0]) * s;
584
718
  i[0] = a - c * t, i[1] = o - c * n;
585
719
  }
586
- function Ie(e) {
720
+ function Ye(e) {
587
721
  return e.components.bounciness !== void 0 && e.components.velocity !== void 0;
588
722
  }
589
- function Le(e, t) {
590
- return !Be(e.components.body) && !Be(t.components.body);
723
+ function Xe(e, t) {
724
+ return !$e(e.components.body) && !$e(t.components.body);
591
725
  }
592
- function Re(e, t, n) {
726
+ function Ze(e, t, n) {
593
727
  let r = e.components.transform, i = t.components.transform;
594
- return ge(ze(e.components.body), r[0], r[1], r[2], r[3], r[4], ze(t.components.body), i[0], i[1], i[2], i[3], i[4], n);
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);
595
729
  }
596
- function ze(e) {
597
- return e ? e[0] : 1;
730
+ function Qe(e) {
731
+ return e ? j(e) : 1;
598
732
  }
599
- function Be(e) {
600
- return e !== void 0 && e[3] !== 0;
733
+ function $e(e) {
734
+ return e !== void 0 && M(e);
601
735
  }
602
736
  //#endregion
603
737
  //#region src/systems/physics-update.ts
604
- var Ve = "position-updated";
605
- function He(e = {}) {
606
- let { onCollision: t, optional: r = [] } = e, i, a = Object.assign((e, r, a, o, s) => {
607
- if (a.entity?.[n] === 1) return;
608
- let c = {
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 = {
609
745
  entityId: r,
610
- components: a
611
- }, l = a.interpolation, u = e.elapsedTime / 1e3, d = a.velocity[0] * u, f = a.velocity[1] * u;
612
- Ge(l, a.transform, e.elapsedTime);
613
- let p = i;
614
- if (!p) {
615
- $(r, a.transform, d, f, s, e.reportMoves), Q(l, e.tick);
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);
616
752
  return;
617
753
  }
618
- let m = a.bounciness !== void 0, h = p.resolveMove(c, d, f, !m);
619
- if ($(r, a.transform, h.moveX, h.moveY, s, e.reportMoves), Q(l, e.tick), !(!p.hasBounciness && !t)) {
620
- p.forEachOverlapping(c, (n) => {
621
- p.claimContact(r, n.entityId) && Ue(e, c, n, o, s, t);
622
- });
623
- for (let n of h.blocking) p.claimContact(r, n.entityId) && Ue(e, c, n, o, s, t);
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);
624
760
  }
625
761
  }, { physics: {
626
762
  collision: !0,
627
- optional: r
763
+ optional: r,
764
+ group: i
628
765
  } });
629
- return a.preRun = (e, t, n) => {
630
- i = new je(n.collidable ?? [], e.elapsedTime / 1e3);
631
- }, a;
766
+ return s.preRun = (e, t, n) => {
767
+ let r = e.elapsedTime / 1e3, s = n.collidable ?? [];
768
+ if (!i) {
769
+ a = new Ve(s, r);
770
+ return;
771
+ }
772
+ let c = /* @__PURE__ */ new Map();
773
+ for (let t of s) {
774
+ let n = nt(t.components, i);
775
+ if (e.skipGroup === n) continue;
776
+ let r = c.get(n);
777
+ r || (r = [], c.set(n, r)), r.push(t);
778
+ }
779
+ o = /* @__PURE__ */ new Map();
780
+ for (let [e, t] of c) o.set(e, new Ve(t, r));
781
+ }, s;
632
782
  }
633
- function Ue(e, t, n, r, i, a) {
634
- Pe(t, n), a && a(e, t, n, r, i);
783
+ function nt(e, t) {
784
+ let n = e[t.component];
785
+ return n ? n[t.index] : 0;
635
786
  }
636
- function We(e, t, n, r, i) {
787
+ function rt(e, t, n, r, i, a) {
788
+ qe(t, n), a && a(e, t, n, r, i);
789
+ }
790
+ function it(e, t, n, r, i) {
637
791
  let a = e.elapsedTime / 1e3, o = n.interpolation;
638
- Ge(o, n.transform, e.elapsedTime), $(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), Q(o, e.tick);
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);
639
793
  }
640
- function Ge(e, t, n) {
794
+ function at(e, t, n) {
641
795
  e && (e[2] = t[0], e[3] = t[1], e[6] = n);
642
796
  }
643
- function Q(e, t) {
644
- e && a(e, 7, t);
797
+ function ot(e, t) {
798
+ e && i(e, 7, t);
645
799
  }
646
- function $(e, t, n, i, a, o) {
647
- n === 0 && i === 0 || (n !== 0 && r(t, 0, n, Infinity), i !== 0 && r(t, 1, i, Infinity), o !== !1 && a.emitSystemEvent(Ve, e));
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));
648
802
  }
649
803
  //#endregion
650
804
  //#region src/systems/physics-system.ts
651
- var Ke = 50, qe = class extends t {
805
+ var st = 50, ct = class extends t {
652
806
  tick = 0;
653
807
  reportMoves;
808
+ skipGroup;
654
809
  constructor(e, t = {}) {
655
- let n = t.updateFunction ?? We, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = [];
656
- i && !r.includes("body") && a.push("body"), i && !r.includes("bounciness") && a.push("bounciness"), r.includes("interpolation") || a.push("interpolation"), i && a.push("entity");
657
- let o = a.length ? [...a, ...r] : r, s = r.includes("bounciness") ? r : ["bounciness", ...r], c = i ? { [Oe]: {
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]: {
658
815
  required: ["transform", "body"],
659
816
  optional: [
660
817
  "velocity",
661
818
  "entity",
662
- ...s
663
- ]
664
- } } : void 0, l = c || t.queries ? {
665
- ...c,
819
+ ...c
820
+ ],
821
+ filter: t.scope
822
+ } } : void 0, u = l || t.queries ? {
823
+ ...l,
666
824
  ...t.queries
667
- } : void 0;
825
+ } : void 0, d = lt(t.scope, t.filter);
668
826
  super(e, {
669
827
  name: t.name ?? "PhysicsSystem",
670
828
  deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
671
829
  firstRun: t.firstRun,
672
830
  required: ["transform", "velocity"],
673
- optional: o,
674
- filter: t.filter,
831
+ optional: s,
832
+ filter: d,
675
833
  updateFunction: n,
676
- queries: l,
834
+ queries: u,
677
835
  forceMainThread: t.forceMainThread ?? !t.getWorker,
678
836
  getWorker: t.getWorker ?? (() => {
679
837
  throw Error("PhysicsSystem cannot start a worker: no getWorker was supplied");
680
838
  })
681
- }), this.reportMoves = t.reportMoves;
839
+ }), this.reportMoves = t.reportMoves, this.skipGroup = t.skipGroup;
840
+ }
841
+ startInterpolation(e) {
842
+ let t = this.deltaBetweenRuns;
843
+ t <= 0 || we(e, {
844
+ stepMs: t,
845
+ stepFraction: this.currentDelta / t,
846
+ tick: this.tick
847
+ });
682
848
  }
683
849
  addDataToWorld(e) {
684
- e.tick = ++this.tick, e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0;
850
+ e.tick = ++this.tick, e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0, e.skipGroup = this.skipGroup;
685
851
  }
686
- }, Je = (e, t, n) => {
687
- 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);
852
+ };
853
+ function lt(e, t) {
854
+ return e ? t ? (n) => e(n) && t(n) : e : t;
855
+ }
856
+ //#endregion
857
+ //#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);
688
860
  if (o !== f) return;
689
861
  if (l <= 0) {
690
- r[4] = 1, r[5] = f, r[0] = u, r[1] = d;
862
+ i[4] = 1, i[5] = f, i[0] = u, i[1] = d;
691
863
  return;
692
864
  }
693
- let p = r[4];
694
- 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;
695
- }, Ye = class extends t {
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 {
696
868
  constructor(e, t = {}) {
697
869
  super(e, {
698
870
  name: t.name ?? "InterpolationSystem",
699
871
  deltaBetweenRuns: 0,
700
872
  firstRun: t.firstRun,
701
873
  required: ["transform", "interpolation"],
702
- updateFunction: Je,
874
+ updateFunction: ut,
703
875
  forceMainThread: t.forceMainThread ?? !t.getWorker,
704
876
  getWorker: t.getWorker ?? (() => {
705
877
  throw Error("InterpolationSystem cannot start a worker: no getWorker was supplied");
@@ -708,6 +880,6 @@ var Ke = 50, qe = class extends t {
708
880
  }
709
881
  };
710
882
  //#endregion
711
- export { T as BODY_CATEGORY_INDEX, E as BODY_MASK_INDEX, D as BODY_SENSOR_INDEX, w as BODY_SHAPE_INDEX, O as BODY_SIZE, te as BOUNCINESS_INDEX, ne as BOUNCINESS_SIZE, Oe as COLLIDABLE_QUERY, je as CollisionBroadphase, x as DEFAULT_COLLIDE_CATEGORY, S as DEFAULT_COLLIDE_MASK, Ke as DEFAULT_PHYSICS_STEP_MS, ue as INTERPOLATION_DURATION_INDEX, oe as INTERPOLATION_PREV_X_INDEX, se as INTERPOLATION_PREV_Y_INDEX, ce as INTERPOLATION_PROGRESS_INDEX, fe as INTERPOLATION_SIZE, le as INTERPOLATION_SYNCED_TICK_INDEX, de as INTERPOLATION_TICK_INDEX, ie as INTERPOLATION_X_INDEX, ae as INTERPOLATION_Y_INDEX, Ye as InterpolationSystem, Ve as POSITION_UPDATED_EVENT, qe as PhysicsSystem, y as SHAPE_CAPSULE, v as SHAPE_CIRCLE, _ as SHAPE_RECTANGLE, Ne as SpatialIndex, u as TRANSFORM_ANGLE_INDEX, l as TRANSFORM_HEIGHT_INDEX, d as TRANSFORM_SIZE, c as TRANSFORM_WIDTH_INDEX, o as TRANSFORM_X_INDEX, s as TRANSFORM_Y_INDEX, h as VELOCITY_SIZE, p as VELOCITY_X_INDEX, m as VELOCITY_Y_INDEX, A as bodyDefinition, re as bouncinessDefinition, Ce as boundsHalfHeight, Se as boundsHalfWidth, C as canCollide, N as capsuleHalfLength, ge as contactNormal, He as createPhysicsUpdate, pe as interpolationDefinition, Je as interpolationUpdate, k as isSensor, we as orientedBoxesOverlap, he as physicsRegistry, We as physicsUpdate, G as pointSegmentDistanceSquared, U as segmentBoxDistanceSquared, H as segmentSegmentDistanceSquared, L as shapeHalfHeight, I as shapeHalfWidth, F as shapeIsEmpty, P as shapeRadius, R as shapesOverlap, me as snapEntity, f as transformDefinition, g as velocityDefinition };
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 };
712
884
 
713
885
  //# sourceMappingURL=index.js.map