@daneren2005/shared-memory-physics 1.0.0 → 1.2.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,8 +1,8 @@
1
1
  import e from "flatbush";
2
- import { addAtomicFloat32 as t } from "@daneren2005/shared-memory-objects";
3
- import { ComponentSystem as n } from "@daneren2005/shared-memory-ecs";
2
+ import { addAtomicFloat32 as t, loadFloat32 as n, storeFloat32 as r } from "@daneren2005/shared-memory-objects";
3
+ import { ComponentSystem as i } from "@daneren2005/shared-memory-ecs";
4
4
  //#region src/components/transform-component.ts
5
- var r = 0, i = 1, a = 2, o = 3, s = 4, c = 5, l = {
5
+ var a = 0, o = 1, s = 2, c = 3, l = 4, u = 5, d = {
6
6
  type: Float32Array,
7
7
  size: 5,
8
8
  loadProperties: [
@@ -63,7 +63,7 @@ var r = 0, i = 1, a = 2, o = 3, s = 4, c = 5, l = {
63
63
  y: e.y
64
64
  };
65
65
  }
66
- }, u = 0, d = 1, f = 2, p = {
66
+ }, f = 0, p = 1, m = 2, h = {
67
67
  type: Float32Array,
68
68
  size: 2,
69
69
  loadProperties: ["velocityX", "velocityY"],
@@ -91,30 +91,36 @@ var r = 0, i = 1, a = 2, o = 3, s = 4, c = 5, l = {
91
91
  velocityY: e.velocityY
92
92
  };
93
93
  }
94
- }, m = 1, h = 2, g = 3, _ = [
94
+ }, g = 1, _ = 2, v = 3, y = [
95
95
  1,
96
96
  2,
97
97
  3
98
- ], v = 1, y = 4294967295;
99
- function b(e, t, n, r) {
98
+ ], b = 1, x = 4294967295;
99
+ function ee(e, t, n, r) {
100
100
  return (t & n) !== 0 && (r & e) !== 0;
101
101
  }
102
- var x = 0, S = 1, C = 2, w = 3, T = {
102
+ var te = 0, ne = 1, re = 2, ie = 3, ae = 4;
103
+ function oe(e) {
104
+ return e[3] !== 0;
105
+ }
106
+ var S = {
103
107
  type: Uint32Array,
104
- size: 3,
108
+ size: 4,
105
109
  loadProperties: [
106
110
  "width",
107
111
  "height",
108
112
  "radius",
109
113
  "shape",
110
114
  "collideCategory",
111
- "collideMask"
115
+ "collideMask",
116
+ "sensor"
112
117
  ],
113
118
  load(e, t, n) {
114
119
  let r = t.create([
115
- E(n),
120
+ se(n),
116
121
  n.collideCategory ?? 1,
117
- n.collideMask ?? 4294967295
122
+ n.collideMask ?? 4294967295,
123
+ +!!n.sensor
118
124
  ]), i = t.getBlock(r);
119
125
  return {
120
126
  index: r,
@@ -135,106 +141,183 @@ var x = 0, S = 1, C = 2, w = 3, T = {
135
141
  },
136
142
  set collideMask(e) {
137
143
  i[2] = e;
144
+ },
145
+ get sensor() {
146
+ return i[3] !== 0;
147
+ },
148
+ set sensor(e) {
149
+ i[3] = +!!e;
138
150
  }
139
151
  };
140
152
  }
141
153
  };
142
- function E(e) {
154
+ function se(e) {
143
155
  let t = e.shape;
144
156
  if (t === void 0) return e.radius === void 0 ? 1 : 2;
145
- if (!_.includes(t)) throw Error(`Unknown body shape: ${t}`);
157
+ if (!y.includes(t)) throw Error(`Unknown body shape: ${t}`);
146
158
  return t;
147
159
  }
148
160
  //#endregion
161
+ //#region src/components/bounciness-component.ts
162
+ var ce = 0, le = 1, C = {
163
+ type: Float32Array,
164
+ size: 1,
165
+ loadProperties: ["bounciness"],
166
+ load(e, t, n) {
167
+ let r = t.create([n.bounciness ?? 0]), i = t.getBlock(r);
168
+ return {
169
+ index: r,
170
+ get bounciness() {
171
+ return i[0];
172
+ },
173
+ set bounciness(e) {
174
+ i[0] = e;
175
+ }
176
+ };
177
+ }
178
+ }, ue = 0, de = 1, fe = 2, pe = 3, me = 4, he = 5, ge = 6, _e = 7, ve = 8, w = {
179
+ type: Float32Array,
180
+ size: 8,
181
+ loadProperties: ["interpolate"],
182
+ load(e, t, n) {
183
+ let r = n.x ?? 0, i = n.y ?? 0, a = t.create([
184
+ r,
185
+ i,
186
+ r,
187
+ i,
188
+ 0,
189
+ 0,
190
+ 0,
191
+ 0
192
+ ]), o = t.getBlock(a);
193
+ return {
194
+ index: a,
195
+ get x() {
196
+ return o[0];
197
+ },
198
+ set x(e) {
199
+ o[0] = e;
200
+ },
201
+ get y() {
202
+ return o[1];
203
+ },
204
+ set y(e) {
205
+ o[1] = e;
206
+ },
207
+ get prevX() {
208
+ return o[2];
209
+ },
210
+ set prevX(e) {
211
+ o[2] = e;
212
+ },
213
+ get prevY() {
214
+ return o[3];
215
+ },
216
+ set prevY(e) {
217
+ o[3] = e;
218
+ }
219
+ };
220
+ }
221
+ };
222
+ function ye(e) {
223
+ let { transform: t, interpolation: n } = e.components;
224
+ !t || !n || (n.prevX = n.x = t.x, n.prevY = n.y = t.y);
225
+ }
226
+ //#endregion
149
227
  //#region src/components/registry.ts
150
- var D = {
151
- transform: l,
152
- velocity: p,
153
- body: T
228
+ var be = {
229
+ transform: d,
230
+ velocity: h,
231
+ body: S,
232
+ bounciness: C,
233
+ interpolation: w
154
234
  };
155
235
  //#endregion
156
236
  //#region src/math/shapes.ts
157
- function O(e, t) {
237
+ function T(e, t) {
158
238
  return Math.max(0, (e - t) / 2);
159
239
  }
160
- function k(e, t, n) {
240
+ function E(e, t, n) {
161
241
  return e === 2 ? t / 2 : e === 3 ? n / 2 : 0;
162
242
  }
163
- function A(e, t, n) {
243
+ function D(e, t, n) {
164
244
  return e === 2 ? t <= 0 : e === 3 ? n <= 0 : t <= 0 || n <= 0;
165
245
  }
166
- function j(e, t, n, r) {
167
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * O(t, n) + n / 2 : F(t, n, r);
246
+ function O(e, t, n, r) {
247
+ return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(r)) * T(t, n) + n / 2 : M(t, n, r);
168
248
  }
169
- function M(e, t, n, r) {
170
- return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * O(t, n) + n / 2 : I(t, n, r);
249
+ function k(e, t, n, r) {
250
+ return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(r)) * T(t, n) + n / 2 : N(t, n, r);
171
251
  }
172
- function N(e, t, n, r, i, a, o, s, c, l, u, d) {
173
- if (A(e, r, i) || A(o, l, u)) return !1;
252
+ function A(e, t, n, r, i, a, o, s, c, l, u, d) {
253
+ if (D(e, r, i) || D(o, l, u)) return !1;
174
254
  let f = e !== 1, p = o !== 1;
175
- if (!f && !p) return L(t, n, r, i, a, s, c, l, u, d);
176
- if (f && !p) return N(o, s, c, l, u, d, e, t, n, r, i, a);
177
- let m = P(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = k(o, l, u);
178
- if (!f) return B(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
179
- let v = P(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = k(e, r, i) + _;
180
- return z(t - y, n - b, t + y, n + b, s - h, c - g, s + h, c + g) < x * x;
255
+ if (!f && !p) return P(t, n, r, i, a, s, c, l, u, d);
256
+ if (f && !p) return A(o, s, c, l, u, d, e, t, n, r, i, a);
257
+ let m = j(o, l, u), h = Math.cos(d) * m, g = Math.sin(d) * m, _ = E(o, l, u);
258
+ if (!f) return L(s - h, c - g, s + h, c + g, t, n, r, i, a) < _ * _;
259
+ let v = j(e, r, i), y = Math.cos(a) * v, b = Math.sin(a) * v, x = E(e, r, i) + _;
260
+ return I(t - y, n - b, t + y, n + b, s - h, c - g, s + h, c + g) < x * x;
181
261
  }
182
- function P(e, t, n) {
183
- return e === 3 ? O(t, n) : 0;
262
+ function j(e, t, n) {
263
+ return e === 3 ? T(t, n) : 0;
184
264
  }
185
- function F(e, t, n) {
265
+ function M(e, t, n) {
186
266
  return (Math.abs(Math.cos(n)) * e + Math.abs(Math.sin(n)) * t) / 2;
187
267
  }
188
- function I(e, t, n) {
268
+ function N(e, t, n) {
189
269
  return (Math.abs(Math.sin(n)) * e + Math.abs(Math.cos(n)) * t) / 2;
190
270
  }
191
- function L(e, t, n, r, i, a, o, s, c, l) {
271
+ function P(e, t, n, r, i, a, o, s, c, l) {
192
272
  if (n <= 0 || r <= 0 || s <= 0 || c <= 0) return !1;
193
273
  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;
194
- return !R(u, d, v, y, m, h, u, d, g, _, f, p) && !R(-d, u, v, y, m, h, u, d, g, _, f, p) && !R(f, p, v, y, m, h, u, d, g, _, f, p) && !R(-p, f, v, y, m, h, u, d, g, _, f, p);
274
+ return !F(u, d, v, y, m, h, u, d, g, _, f, p) && !F(-d, u, v, y, m, h, u, d, g, _, f, p) && !F(f, p, v, y, m, h, u, d, g, _, f, p) && !F(-p, f, v, y, m, h, u, d, g, _, f, p);
195
275
  }
196
- function R(e, t, n, r, i, a, o, s, c, l, u, d) {
276
+ function F(e, t, n, r, i, a, o, s, c, l, u, d) {
197
277
  let f = i * Math.abs(o * e + s * t) + a * Math.abs(-s * e + o * t), p = c * Math.abs(u * e + d * t) + l * Math.abs(-d * e + u * t);
198
278
  return Math.abs(n * e + r * t) >= f + p;
199
279
  }
200
- function z(e, t, n, r, i, a, o, s) {
280
+ function I(e, t, n, r, i, a, o, s) {
201
281
  let c = n - e, l = r - t, u = o - i, d = s - a, f = e - i, p = t - a, m = c * c + l * l, h = u * u + d * d, g = u * f + d * p, _ = 0, v = 0;
202
282
  if (m <= 0 && h <= 0) return f * f + p * p;
203
- if (m <= 0) v = W(g / h);
283
+ if (m <= 0) v = B(g / h);
204
284
  else {
205
285
  let e = c * f + l * p;
206
- if (h <= 0) _ = W(-e / m);
286
+ if (h <= 0) _ = B(-e / m);
207
287
  else {
208
288
  let t = c * u + l * d, n = m * h - t * t;
209
- n !== 0 && (_ = W((t * g - e * h) / n)), v = (t * _ + g) / h, v < 0 ? (v = 0, _ = W(-e / m)) : v > 1 && (v = 1, _ = W((t - e) / m));
289
+ n !== 0 && (_ = B((t * g - e * h) / n)), v = (t * _ + g) / h, v < 0 ? (v = 0, _ = B(-e / m)) : v > 1 && (v = 1, _ = B((t - e) / m));
210
290
  }
211
291
  }
212
292
  let y = e + c * _ - (i + u * v), b = t + l * _ - (a + d * v);
213
293
  return y * y + b * b;
214
294
  }
215
- function B(e, t, n, r, i, a, o, s, c) {
295
+ function L(e, t, n, r, i, a, o, s, c) {
216
296
  let l = Math.cos(c), u = Math.sin(c), d = o / 2, f = s / 2, p = e - i, m = t - a, h = n - i, g = r - a, _ = p * l + m * u, v = -p * u + m * l, y = h * l + g * u, b = -h * u + g * l;
217
- return H(_, v, y, b, d, f) ? Math.min(U(_, v, d, f), U(y, b, d, f), V(-d, -f, _, v, y, b), V(d, -f, _, v, y, b), V(d, f, _, v, y, b), V(-d, f, _, v, y, b)) : 0;
297
+ return xe(_, v, y, b, d, f) ? Math.min(z(_, v, d, f), z(y, b, d, f), R(-d, -f, _, v, y, b), R(d, -f, _, v, y, b), R(d, f, _, v, y, b), R(-d, f, _, v, y, b)) : 0;
218
298
  }
219
- function V(e, t, n, r, i, a) {
220
- let o = i - n, s = a - r, c = o * o + s * s, l = c > 0 ? W(((e - n) * o + (t - r) * s) / c) : 0, u = e - (n + o * l), d = t - (r + s * l);
299
+ function R(e, t, n, r, i, a) {
300
+ let o = i - n, s = a - r, c = o * o + s * s, l = c > 0 ? B(((e - n) * o + (t - r) * s) / c) : 0, u = e - (n + o * l), d = t - (r + s * l);
221
301
  return u * u + d * d;
222
302
  }
223
- function H(e, t, n, r, i, a) {
303
+ function xe(e, t, n, r, i, a) {
224
304
  if (Math.max(e, n) < -i || Math.min(e, n) > i || Math.max(t, r) < -a || Math.min(t, r) > a) return !0;
225
305
  let o = -(r - t), s = n - e;
226
306
  return Math.abs(o * e + s * t) > i * Math.abs(o) + a * Math.abs(s);
227
307
  }
228
- function U(e, t, n, r) {
308
+ function z(e, t, n, r) {
229
309
  let i = Math.abs(e) - n, a = Math.abs(t) - r, o = i > 0 ? i : 0, s = a > 0 ? a : 0;
230
310
  return o * o + s * s;
231
311
  }
232
- function W(e) {
312
+ function B(e) {
233
313
  return e < 0 ? 0 : e > 1 ? 1 : e;
234
314
  }
235
315
  //#endregion
236
316
  //#region src/systems/collision.ts
237
- var G = 1e-4, ee = 24, K = "collidable", q = [], J = class {
317
+ var V = 1e-4, Se = 24, H = "collidable", U = [], W = {
318
+ fraction: 1,
319
+ blocking: U
320
+ }, G = class {
238
321
  buckets = [];
239
322
  constructor(t, n) {
240
323
  let r = /* @__PURE__ */ new Map();
@@ -244,8 +327,8 @@ var G = 1e-4, ee = 24, K = "collidable", q = [], J = class {
244
327
  let o = a[1];
245
328
  if (o === 0) continue;
246
329
  let s = a[0], c = i[2], l = i[3];
247
- if (A(s, c, l)) continue;
248
- let u = i[4], d = j(s, c, l, u), f = M(s, c, l, u), 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);
330
+ if (D(s, c, l)) continue;
331
+ let u = i[4], d = O(s, c, l, u), f = k(s, c, l, u), 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);
249
332
  v || (v = {
250
333
  entries: [],
251
334
  bounds: []
@@ -265,41 +348,87 @@ var G = 1e-4, ee = 24, K = "collidable", q = [], J = class {
265
348
  }
266
349
  }
267
350
  forEachOverlapping(e, t) {
268
- let n = Y(e);
351
+ let n = K(e);
269
352
  if (!n) return;
270
353
  let { x: r, y: i, halfWidth: a, halfHeight: o } = n;
271
354
  this.forEachCandidate(n, r - a, i - o, r + a, i + o, (e) => {
272
- X(n, r, i, e) && t(e);
355
+ q(n, r, i, e) && t(e);
273
356
  });
274
357
  }
275
358
  sweep(e, t, n) {
276
- let r = Math.sqrt(t * t + n * n), i = Y(e);
359
+ let r = Math.sqrt(t * t + n * n), i = K(e);
277
360
  if (!i || r === 0) return {
278
361
  fraction: 1,
279
- blocking: q
362
+ blocking: U
280
363
  };
281
- let { x: a, y: o, halfWidth: s, halfHeight: c } = i, l = a + t, u = o + n, d = [];
282
- if (this.forEachCandidate(i, l - s, u - c, l + s, u + c, (e) => {
283
- X(i, l, u, e) && (X(i, a, o, e) || d.push(e));
284
- }), d.length === 0) return {
364
+ let a = this.gatherCandidates(i, t, n);
365
+ return a.length === 0 ? {
285
366
  fraction: 1,
286
- blocking: q
367
+ blocking: U
368
+ } : this.refine(i, a, t, n, r);
369
+ }
370
+ resolveMove(e, t, n, r) {
371
+ let i = Math.sqrt(t * t + n * n), a = K(e);
372
+ if (!a || i === 0) return {
373
+ moveX: t,
374
+ moveY: n,
375
+ blocking: U
376
+ };
377
+ let o = this.gatherCandidates(a, t, n);
378
+ if (o.length === 0) return {
379
+ moveX: t,
380
+ moveY: n,
381
+ blocking: U
382
+ };
383
+ if (r && t !== 0 && n !== 0) {
384
+ let e = this.gatherCandidates(a, t, 0), r = this.gatherCandidates(a, 0, n);
385
+ if (e.length === 0 && r.length === 0) return Math.abs(t) >= Math.abs(n) ? {
386
+ moveX: t,
387
+ moveY: 0,
388
+ blocking: U
389
+ } : {
390
+ moveX: 0,
391
+ moveY: n,
392
+ blocking: U
393
+ };
394
+ let i = e.length === 0 ? W : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? W : this.refine(a, r, 0, n, Math.abs(n));
395
+ return {
396
+ moveX: t * i.fraction,
397
+ moveY: n * o.fraction,
398
+ blocking: Ce(i.blocking, o.blocking)
399
+ };
400
+ }
401
+ let s = this.refine(a, o, t, n, i);
402
+ return {
403
+ moveX: t * s.fraction,
404
+ moveY: n * s.fraction,
405
+ blocking: s.blocking
287
406
  };
288
- let f = 0, p = 1, m = G / r;
289
- for (let e = 0; e < ee && p - f > m; e++) {
290
- let e = (f + p) / 2;
291
- this.blockedAt(i, d, t, n, e) ? p = e : f = e;
407
+ }
408
+ gatherCandidates(e, t, n) {
409
+ let { x: r, y: i, halfWidth: a, halfHeight: o } = e;
410
+ if (e.sensor) return [];
411
+ let s = r + t, c = i + n, l = [];
412
+ return this.forEachCandidate(e, s - a, c - o, s + a, c + o, (t) => {
413
+ q(e, s, c, t) && t.components.body[3] === 0 && (q(e, r, i, t) || l.push(t));
414
+ }), l;
415
+ }
416
+ refine(e, t, n, r, i) {
417
+ let { x: a, y: o } = e, s = 0, c = 1, l = V / i;
418
+ for (let i = 0; i < Se && c - s > l; i++) {
419
+ let i = (s + c) / 2;
420
+ this.blockedAt(e, t, n, r, i) ? c = i : s = i;
292
421
  }
293
- let h = [], g = a + t * p, _ = o + n * p;
294
- for (let e of d) X(i, g, _, e) && h.push(e);
422
+ let u = [], d = a + n * c, f = o + r * c;
423
+ for (let n of t) q(e, d, f, n) && u.push(n);
295
424
  return {
296
- fraction: f * r > G ? f : 0,
297
- blocking: h
425
+ fraction: s * i > V ? s : 0,
426
+ blocking: u
298
427
  };
299
428
  }
300
429
  blockedAt(e, t, n, r, i) {
301
430
  let a = e.x + n * i, o = e.y + r * i;
302
- for (let n of t) if (X(e, a, o, n)) return !0;
431
+ for (let n of t) if (q(e, a, o, n)) return !0;
303
432
  return !1;
304
433
  }
305
434
  forEachCandidate(e, t, n, r, i, a) {
@@ -309,13 +438,20 @@ var G = 1e-4, ee = 24, K = "collidable", q = [], J = class {
309
438
  }
310
439
  }
311
440
  };
312
- function Y(e) {
441
+ function Ce(e, t) {
442
+ if (e.length === 0) return t;
443
+ if (t.length === 0) return e;
444
+ let n = [...e];
445
+ for (let e of t) n.some((t) => t.entityId === e.entityId) || n.push(e);
446
+ return n;
447
+ }
448
+ function K(e) {
313
449
  let t = e.components.body;
314
450
  if (!t) return;
315
451
  let n = t[2];
316
452
  if (n === 0) return;
317
453
  let r = e.components.transform, i = t[0], a = r[2], o = r[3];
318
- if (A(i, a, o)) return;
454
+ if (D(i, a, o)) return;
319
455
  let s = r[4];
320
456
  return {
321
457
  entityId: e.entityId,
@@ -325,19 +461,20 @@ function Y(e) {
325
461
  width: a,
326
462
  height: o,
327
463
  angle: s,
328
- halfWidth: j(i, a, o, s),
329
- halfHeight: M(i, a, o, s),
464
+ halfWidth: O(i, a, o, s),
465
+ halfHeight: k(i, a, o, s),
330
466
  category: t[1],
331
- mask: n
467
+ mask: n,
468
+ sensor: t[3] !== 0
332
469
  };
333
470
  }
334
- function X(e, t, n, r) {
471
+ function q(e, t, n, r) {
335
472
  let i = r.components.transform;
336
- return N(e.shape, t, n, e.width, e.height, e.angle, r.components.body[0], i[0], i[1], i[2], i[3], i[4]);
473
+ return A(e.shape, t, n, e.width, e.height, e.angle, r.components.body[0], i[0], i[1], i[2], i[3], i[4]);
337
474
  }
338
475
  //#endregion
339
476
  //#region src/systems/spatial-index.ts
340
- var te = class {
477
+ var we = class {
341
478
  entries = [];
342
479
  index;
343
480
  constructor(t) {
@@ -345,7 +482,7 @@ var te = class {
345
482
  for (let e of t) {
346
483
  let t = e.components, r = t.transform;
347
484
  if (!r) continue;
348
- 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 = j(a, o, s, c), f = M(a, o, s, c);
485
+ 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 = O(a, o, s, c), f = k(a, o, s, c);
349
486
  this.entries.push({
350
487
  entityId: e.entityId,
351
488
  components: t
@@ -377,59 +514,141 @@ var te = class {
377
514
  let o = this.entries;
378
515
  return (i ? a.neighbors(e, t, n, r, (e) => i(o[e])) : a.neighbors(e, t, n, r)).map((e) => o[e]);
379
516
  }
380
- }, Z = "position-updated";
381
- function ne(e = {}) {
517
+ }, J = {
518
+ x: 0,
519
+ y: 0
520
+ }, Y = {
521
+ x: 0,
522
+ y: 0
523
+ }, X = {
524
+ x: 0,
525
+ y: 0
526
+ };
527
+ function Z(e, t) {
528
+ let n = e.components.bounciness;
529
+ if (!n || De(e.components.body) || De(t.components.body) || !Te(e, t, J)) return;
530
+ let r = e.components.velocity, i = r[0], a = r[1], o = i * J.x + a * J.y;
531
+ if (o >= 0) return;
532
+ let s = (1 + n[0]) * o;
533
+ r[0] = i - s * J.x, r[1] = a - s * J.y;
534
+ }
535
+ function Te(e, t, n) {
536
+ let r = e.components.transform, i = t.components.transform, a = r[0] - i[0], o = r[1] - i[1], s = Ee(e.components.body), c = Ee(t.components.body);
537
+ if (s === 2 && c === 2) {
538
+ let e = Math.sqrt(a * a + o * o);
539
+ return e === 0 ? !1 : (n.x = a / e, n.y = o / e, !0);
540
+ }
541
+ return Oe(r, s, Y), Oe(i, c, X), Y.x + X.x - Math.abs(a) < Y.y + X.y - Math.abs(o) ? (n.x = a < 0 ? -1 : 1, n.y = 0) : (n.x = 0, n.y = o < 0 ? -1 : 1), !0;
542
+ }
543
+ function Ee(e) {
544
+ return e ? e[0] : 1;
545
+ }
546
+ function De(e) {
547
+ return e !== void 0 && e[3] !== 0;
548
+ }
549
+ function Oe(e, t, n) {
550
+ let r = e[2], i = e[3], a = e[4];
551
+ n.x = O(t, r, i, a), n.y = k(t, r, i, a);
552
+ }
553
+ //#endregion
554
+ //#region src/systems/physics-update.ts
555
+ var ke = "position-updated";
556
+ function Ae(e = {}) {
382
557
  let { onCollision: t, optional: n = [] } = e, r, i = Object.assign((e, n, i, a, o) => {
383
558
  let s = {
384
559
  entityId: n,
385
560
  components: i
386
- }, c = e.elapsedTime / 1e3, l = i.velocity[0] * c, u = i.velocity[1] * c, d;
387
- if (r) {
388
- let e = r.sweep(s, l, u);
389
- l *= e.fraction, u *= e.fraction, d = e.blocking;
561
+ }, c = i.interpolation, l = e.elapsedTime / 1e3, u = i.velocity[0] * l, d = i.velocity[1] * l;
562
+ if (Me(c, i.transform, e.elapsedTime), !r) {
563
+ $(n, i.transform, u, d, o, e.reportMoves), Q(c, e.tick);
564
+ return;
565
+ }
566
+ let f = i.bounciness !== void 0, p = r.resolveMove(s, u, d, !f);
567
+ if ($(n, i.transform, p.moveX, p.moveY, o, e.reportMoves), Q(c, e.tick), !(!f && !t)) {
568
+ r.forEachOverlapping(s, (n) => {
569
+ f && Z(s, n), t && t(e, s, n, a, o);
570
+ });
571
+ for (let n of p.blocking) f && Z(s, n), t && t(e, s, n, a, o);
390
572
  }
391
- if ($(n, i.transform, l, u, o), !(!t || !r) && (r.forEachOverlapping(s, (n) => {
392
- t(e, s, n, a, o);
393
- }), d)) for (let n of d) t(e, s, n, a, o);
394
573
  }, { physics: {
395
- collision: t !== void 0,
574
+ collision: !0,
396
575
  optional: n
397
576
  } });
398
- return t && (i.preRun = (e, t, n) => {
399
- r = new J(n.collidable ?? [], e.elapsedTime / 1e3);
400
- }), i;
577
+ return i.preRun = (e, t, n) => {
578
+ r = new G(n.collidable ?? [], e.elapsedTime / 1e3);
579
+ }, i;
401
580
  }
402
- var Q = (e, t, n, r, i) => {
403
- let a = e.elapsedTime / 1e3;
404
- $(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i);
581
+ var je = (e, t, n, r, i) => {
582
+ let a = e.elapsedTime / 1e3, o = n.interpolation;
583
+ Me(o, n.transform, e.elapsedTime), $(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), Q(o, e.tick);
405
584
  };
406
- function $(e, n, r, i, a) {
407
- r === 0 && i === 0 || (r !== 0 && t(n, 0, r, Infinity), i !== 0 && t(n, 1, i, Infinity), a.emitEntityEvent(e, Z, n[0], n[1]));
585
+ function Me(e, t, n) {
586
+ e && (e[2] = t[0], e[3] = t[1], e[6] = n);
587
+ }
588
+ function Q(e, t) {
589
+ e && r(e, 7, t);
590
+ }
591
+ function $(e, n, r, i, a, o) {
592
+ r === 0 && i === 0 || (r !== 0 && t(n, 0, r, Infinity), i !== 0 && t(n, 1, i, Infinity), o !== !1 && a.emitSystemEvent(ke, e));
408
593
  }
409
594
  //#endregion
410
595
  //#region src/systems/physics-system.ts
411
- var re = class extends n {
596
+ var Ne = 50, Pe = class extends i {
597
+ tick = 0;
598
+ reportMoves;
412
599
  constructor(e, t = {}) {
413
- let n = t.updateFunction ?? Q, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = i && !r.includes("body") ? ["body", ...r] : r;
600
+ let n = t.updateFunction ?? je, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = [];
601
+ i && !r.includes("body") && a.push("body"), i && !r.includes("bounciness") && a.push("bounciness"), r.includes("interpolation") || a.push("interpolation");
602
+ let o = a.length ? [...a, ...r] : r, s = i ? { [H]: {
603
+ required: ["transform", "body"],
604
+ optional: ["velocity", ...r]
605
+ } } : void 0, c = s || t.queries ? {
606
+ ...s,
607
+ ...t.queries
608
+ } : void 0;
414
609
  super(e, {
415
610
  name: t.name ?? "PhysicsSystem",
416
- deltaBetweenRuns: t.deltaBetweenRuns,
611
+ deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
417
612
  firstRun: t.firstRun,
418
613
  required: ["transform", "velocity"],
419
- optional: a,
614
+ optional: o,
615
+ filter: t.filter,
420
616
  updateFunction: n,
421
- queries: i ? { [K]: {
422
- required: ["transform", "body"],
423
- optional: ["velocity", ...r]
424
- } } : void 0,
617
+ queries: c,
425
618
  forceMainThread: t.forceMainThread ?? !t.getWorker,
426
619
  getWorker: t.getWorker ?? (() => {
427
620
  throw Error("PhysicsSystem cannot start a worker: no getWorker was supplied");
428
621
  })
622
+ }), this.reportMoves = t.reportMoves;
623
+ }
624
+ addDataToWorld(e) {
625
+ e.tick = ++this.tick, e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0;
626
+ }
627
+ }, Fe = (e, t, r) => {
628
+ let i = r.interpolation, a = r.transform, o = n(i, 7), s = i[2], c = i[3], l = i[6], u = a[0], d = a[1], f = n(i, 7);
629
+ if (o !== f) return;
630
+ if (l <= 0) {
631
+ i[4] = 1, i[5] = f, i[0] = u, i[1] = d;
632
+ return;
633
+ }
634
+ let p = i[4];
635
+ 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;
636
+ }, Ie = class extends i {
637
+ constructor(e, t = {}) {
638
+ super(e, {
639
+ name: t.name ?? "InterpolationSystem",
640
+ deltaBetweenRuns: 0,
641
+ firstRun: t.firstRun,
642
+ required: ["transform", "interpolation"],
643
+ updateFunction: Fe,
644
+ forceMainThread: t.forceMainThread ?? !t.getWorker,
645
+ getWorker: t.getWorker ?? (() => {
646
+ throw Error("InterpolationSystem cannot start a worker: no getWorker was supplied");
647
+ })
429
648
  });
430
649
  }
431
650
  };
432
651
  //#endregion
433
- export { S as BODY_CATEGORY_INDEX, C as BODY_MASK_INDEX, x as BODY_SHAPE_INDEX, w as BODY_SIZE, K as COLLIDABLE_QUERY, J as CollisionBroadphase, v as DEFAULT_COLLIDE_CATEGORY, y as DEFAULT_COLLIDE_MASK, Z as POSITION_UPDATED_EVENT, re as PhysicsSystem, g as SHAPE_CAPSULE, h as SHAPE_CIRCLE, m as SHAPE_RECTANGLE, te as SpatialIndex, s as TRANSFORM_ANGLE_INDEX, o as TRANSFORM_HEIGHT_INDEX, c as TRANSFORM_SIZE, a as TRANSFORM_WIDTH_INDEX, r as TRANSFORM_X_INDEX, i as TRANSFORM_Y_INDEX, f as VELOCITY_SIZE, u as VELOCITY_X_INDEX, d as VELOCITY_Y_INDEX, T as bodyDefinition, I as boundsHalfHeight, F as boundsHalfWidth, b as canCollide, O as capsuleHalfLength, ne as createPhysicsUpdate, L as orientedBoxesOverlap, D as physicsRegistry, Q as physicsUpdate, V as pointSegmentDistanceSquared, B as segmentBoxDistanceSquared, z as segmentSegmentDistanceSquared, M as shapeHalfHeight, j as shapeHalfWidth, A as shapeIsEmpty, k as shapeRadius, N as shapesOverlap, l as transformDefinition, p as velocityDefinition };
652
+ export { ne as BODY_CATEGORY_INDEX, re as BODY_MASK_INDEX, ie as BODY_SENSOR_INDEX, te as BODY_SHAPE_INDEX, ae as BODY_SIZE, ce as BOUNCINESS_INDEX, le as BOUNCINESS_SIZE, H as COLLIDABLE_QUERY, G as CollisionBroadphase, b as DEFAULT_COLLIDE_CATEGORY, x as DEFAULT_COLLIDE_MASK, Ne as DEFAULT_PHYSICS_STEP_MS, ge as INTERPOLATION_DURATION_INDEX, fe as INTERPOLATION_PREV_X_INDEX, pe as INTERPOLATION_PREV_Y_INDEX, me as INTERPOLATION_PROGRESS_INDEX, ve as INTERPOLATION_SIZE, he as INTERPOLATION_SYNCED_TICK_INDEX, _e as INTERPOLATION_TICK_INDEX, ue as INTERPOLATION_X_INDEX, de as INTERPOLATION_Y_INDEX, Ie as InterpolationSystem, ke as POSITION_UPDATED_EVENT, Pe as PhysicsSystem, v as SHAPE_CAPSULE, _ as SHAPE_CIRCLE, g as SHAPE_RECTANGLE, we as SpatialIndex, l as TRANSFORM_ANGLE_INDEX, c as TRANSFORM_HEIGHT_INDEX, u as TRANSFORM_SIZE, s as TRANSFORM_WIDTH_INDEX, a as TRANSFORM_X_INDEX, o as TRANSFORM_Y_INDEX, m as VELOCITY_SIZE, f as VELOCITY_X_INDEX, p as VELOCITY_Y_INDEX, S as bodyDefinition, C as bouncinessDefinition, N as boundsHalfHeight, M as boundsHalfWidth, ee as canCollide, T as capsuleHalfLength, Ae as createPhysicsUpdate, w as interpolationDefinition, Fe as interpolationUpdate, oe as isSensor, P as orientedBoxesOverlap, be as physicsRegistry, je as physicsUpdate, R as pointSegmentDistanceSquared, L as segmentBoxDistanceSquared, I as segmentSegmentDistanceSquared, k as shapeHalfHeight, O as shapeHalfWidth, D as shapeIsEmpty, E as shapeRadius, A as shapesOverlap, ye as snapEntity, d as transformDefinition, h as velocityDefinition };
434
653
 
435
654
  //# sourceMappingURL=index.js.map