@daneren2005/shared-memory-physics 1.8.0 → 1.9.1
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/README.md +115 -2
- package/dist/components/navigation-component-constants.d.ts +11 -0
- package/dist/components/navigation-component.d.ts +31 -0
- package/dist/components/registry.d.ts +9 -0
- package/dist/index.d.ts +24 -2
- package/dist/index.js +1015 -311
- package/dist/index.js.map +1 -1
- package/dist/pathfinding/follow-path.d.ts +9 -0
- package/dist/pathfinding/grid-a-star.d.ts +29 -0
- package/dist/pathfinding/line-of-sight.d.ts +2 -0
- package/dist/pathfinding/min-heap.d.ts +14 -0
- package/dist/pathfinding/nav-grid.d.ts +42 -0
- package/dist/pathfinding/navigation-state.d.ts +20 -0
- package/dist/pathfinding/path-blockers.d.ts +29 -0
- package/dist/pathfinding/path-search.d.ts +27 -0
- package/dist/pathfinding/pathfinding-system.d.ts +27 -0
- package/dist/pathfinding/pathfinding-update.d.ts +36 -0
- package/dist/pathfinding/smooth-path.d.ts +3 -0
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -137,7 +137,7 @@ var k = class extends t {
|
|
|
137
137
|
}, n = e.angle;
|
|
138
138
|
return n !== 0 && (t.angle = n), t;
|
|
139
139
|
}
|
|
140
|
-
}, j = 0,
|
|
140
|
+
}, j = 0, ee = 1, te = 2, ne = 3, re = class extends t {
|
|
141
141
|
get velocityX() {
|
|
142
142
|
return this.block[0];
|
|
143
143
|
}
|
|
@@ -154,9 +154,9 @@ var k = class extends t {
|
|
|
154
154
|
return this.block[2];
|
|
155
155
|
}
|
|
156
156
|
set damping(e) {
|
|
157
|
-
|
|
157
|
+
N(e), this.block[2] = e;
|
|
158
158
|
}
|
|
159
|
-
},
|
|
159
|
+
}, M = {
|
|
160
160
|
type: Float32Array,
|
|
161
161
|
size: 3,
|
|
162
162
|
loadProperties: [
|
|
@@ -166,14 +166,14 @@ var k = class extends t {
|
|
|
166
166
|
],
|
|
167
167
|
toBlock(e) {
|
|
168
168
|
let t = e.damping ?? 0;
|
|
169
|
-
return
|
|
169
|
+
return N(t), [
|
|
170
170
|
e.velocityX ?? 0,
|
|
171
171
|
e.velocityY ?? 0,
|
|
172
172
|
t
|
|
173
173
|
];
|
|
174
174
|
},
|
|
175
175
|
attach(e, t, n) {
|
|
176
|
-
return new
|
|
176
|
+
return new re(t.getBlock(n), n);
|
|
177
177
|
},
|
|
178
178
|
save(e) {
|
|
179
179
|
return {
|
|
@@ -183,31 +183,31 @@ var k = class extends t {
|
|
|
183
183
|
};
|
|
184
184
|
}
|
|
185
185
|
};
|
|
186
|
-
function
|
|
186
|
+
function N(e) {
|
|
187
187
|
if (!Number.isFinite(e) || e < 0) throw Error("Damping must be a finite number of at least zero");
|
|
188
188
|
}
|
|
189
189
|
//#endregion
|
|
190
190
|
//#region src/components/dynamics-component-constants.ts
|
|
191
|
-
var
|
|
191
|
+
var ie = 0, ae = 1, oe = 2, se = 3, ce = class extends t {
|
|
192
192
|
get accelerationX() {
|
|
193
193
|
return this.block[0];
|
|
194
194
|
}
|
|
195
195
|
set accelerationX(e) {
|
|
196
|
-
|
|
196
|
+
de(e, "Acceleration"), this.block[0] = e;
|
|
197
197
|
}
|
|
198
198
|
get accelerationY() {
|
|
199
199
|
return this.block[1];
|
|
200
200
|
}
|
|
201
201
|
set accelerationY(e) {
|
|
202
|
-
|
|
202
|
+
de(e, "Acceleration"), this.block[1] = e;
|
|
203
203
|
}
|
|
204
204
|
get mass() {
|
|
205
205
|
return 1 / this.block[2];
|
|
206
206
|
}
|
|
207
207
|
set mass(e) {
|
|
208
|
-
|
|
208
|
+
ue(e), this.block[2] = 1 / e;
|
|
209
209
|
}
|
|
210
|
-
},
|
|
210
|
+
}, le = {
|
|
211
211
|
type: Float32Array,
|
|
212
212
|
size: 3,
|
|
213
213
|
loadProperties: [
|
|
@@ -217,14 +217,14 @@ var te = 0, ne = 1, re = 2, ie = 3, ae = class extends t {
|
|
|
217
217
|
],
|
|
218
218
|
toBlock(e) {
|
|
219
219
|
let t = e.accelerationX ?? 0, n = e.accelerationY ?? 0, r = e.mass ?? 1;
|
|
220
|
-
return
|
|
220
|
+
return de(t, "Acceleration"), de(n, "Acceleration"), ue(r), [
|
|
221
221
|
t,
|
|
222
222
|
n,
|
|
223
223
|
1 / r
|
|
224
224
|
];
|
|
225
225
|
},
|
|
226
226
|
attach(e, t, n) {
|
|
227
|
-
return new
|
|
227
|
+
return new ce(t.getBlock(n), n);
|
|
228
228
|
},
|
|
229
229
|
save(e) {
|
|
230
230
|
return {
|
|
@@ -234,42 +234,42 @@ var te = 0, ne = 1, re = 2, ie = 3, ae = class extends t {
|
|
|
234
234
|
};
|
|
235
235
|
}
|
|
236
236
|
};
|
|
237
|
-
function
|
|
237
|
+
function ue(e) {
|
|
238
238
|
if (!Number.isFinite(e) || e <= 0) throw Error("Mass must be a finite number greater than zero");
|
|
239
239
|
}
|
|
240
|
-
function
|
|
240
|
+
function de(e, t) {
|
|
241
241
|
if (!Number.isFinite(e)) throw Error(`${t} must be a finite number`);
|
|
242
242
|
}
|
|
243
243
|
//#endregion
|
|
244
244
|
//#region src/components/body-component-constants.ts
|
|
245
|
-
var
|
|
245
|
+
var fe = 1, pe = 2, me = 3, he = 4, ge = 1, _e = 4294967295, ve = 0, ye = 1, be = 2, xe = 3, Se = 7, Ce = 8, we = 16, Te = 32, Ee = 64, De = [
|
|
246
246
|
1,
|
|
247
247
|
2,
|
|
248
248
|
3,
|
|
249
249
|
4
|
|
250
250
|
];
|
|
251
|
-
function
|
|
251
|
+
function Oe(e, t, n, r) {
|
|
252
252
|
return (t & n) !== 0 && (r & e) !== 0;
|
|
253
253
|
}
|
|
254
|
-
function
|
|
254
|
+
function P(e) {
|
|
255
255
|
return e[0] & 7;
|
|
256
256
|
}
|
|
257
|
-
function
|
|
257
|
+
function F(e) {
|
|
258
258
|
return !!(e[0] & 8);
|
|
259
259
|
}
|
|
260
|
-
function
|
|
260
|
+
function ke(e) {
|
|
261
261
|
return !!(e[0] & 16);
|
|
262
262
|
}
|
|
263
|
-
function
|
|
263
|
+
function Ae(e) {
|
|
264
264
|
return !!(e[0] & 64);
|
|
265
265
|
}
|
|
266
|
-
function
|
|
266
|
+
function je(e) {
|
|
267
267
|
return !!(e[0] & 32);
|
|
268
268
|
}
|
|
269
|
-
function
|
|
269
|
+
function Me(e) {
|
|
270
270
|
e[0] |= 32;
|
|
271
271
|
}
|
|
272
|
-
var
|
|
272
|
+
var Ne = class extends t {
|
|
273
273
|
get shape() {
|
|
274
274
|
return this.block[0] & 7;
|
|
275
275
|
}
|
|
@@ -306,7 +306,7 @@ var Ae = class extends t {
|
|
|
306
306
|
set blocksPath(e) {
|
|
307
307
|
this.block[0] = e ? this.block[0] | 64 : this.block[0] & -65;
|
|
308
308
|
}
|
|
309
|
-
},
|
|
309
|
+
}, Pe = {
|
|
310
310
|
type: Uint32Array,
|
|
311
311
|
size: 3,
|
|
312
312
|
loadProperties: [
|
|
@@ -323,36 +323,36 @@ var Ae = class extends t {
|
|
|
323
323
|
],
|
|
324
324
|
toBlock(e) {
|
|
325
325
|
return [
|
|
326
|
-
|
|
326
|
+
Fe(e),
|
|
327
327
|
e.collideCategory ?? 1,
|
|
328
328
|
e.collideMask ?? 4294967295
|
|
329
329
|
];
|
|
330
330
|
},
|
|
331
331
|
attach(e, t, n) {
|
|
332
|
-
return new
|
|
332
|
+
return new Ne(t.getBlock(n), n);
|
|
333
333
|
}
|
|
334
334
|
};
|
|
335
|
-
function
|
|
336
|
-
let t =
|
|
335
|
+
function Fe(e) {
|
|
336
|
+
let t = Ie(e);
|
|
337
337
|
return e.sensor && (t |= 8), e.continuousCollisionDetection && (t |= 16), e.blocksPath && (t |= 64), t;
|
|
338
338
|
}
|
|
339
|
-
function
|
|
339
|
+
function Ie(e) {
|
|
340
340
|
let t = e.shape;
|
|
341
341
|
if (t === void 0) return e.vertices === void 0 ? e.radius === void 0 ? 1 : 2 : 4;
|
|
342
|
-
if (!
|
|
342
|
+
if (!De.includes(t)) throw Error(`Unknown body shape: ${t}`);
|
|
343
343
|
if (t === 4 && e.vertices === void 0) throw Error("A polygon body requires vertices");
|
|
344
344
|
return t;
|
|
345
345
|
}
|
|
346
346
|
//#endregion
|
|
347
347
|
//#region src/components/bounciness-component-constants.ts
|
|
348
|
-
var
|
|
348
|
+
var Le = 0, Re = 1, ze = class extends t {
|
|
349
349
|
get bounciness() {
|
|
350
350
|
return this.block[0];
|
|
351
351
|
}
|
|
352
352
|
set bounciness(e) {
|
|
353
353
|
this.block[0] = e;
|
|
354
354
|
}
|
|
355
|
-
},
|
|
355
|
+
}, Be = {
|
|
356
356
|
type: Float32Array,
|
|
357
357
|
size: 1,
|
|
358
358
|
loadProperties: ["bounciness"],
|
|
@@ -360,9 +360,9 @@ var Pe = 0, Fe = 1, Ie = class extends t {
|
|
|
360
360
|
return [e.bounciness ?? 0];
|
|
361
361
|
},
|
|
362
362
|
attach(e, t, n) {
|
|
363
|
-
return new
|
|
363
|
+
return new ze(t.getBlock(n), n);
|
|
364
364
|
}
|
|
365
|
-
},
|
|
365
|
+
}, Ve = 0, He = 1, Ue = 2, We = 3, Ge = 4, Ke = 5, qe = 6, Je = 7, Ye = 8, Xe = 9, Ze = 10, Qe = 11, $e = 12, et = 13, tt = 14, nt = 15, rt = 16, it = 17, at = class extends t {
|
|
366
366
|
get x() {
|
|
367
367
|
return this.block[0];
|
|
368
368
|
}
|
|
@@ -441,7 +441,7 @@ var Pe = 0, Fe = 1, Ie = class extends t {
|
|
|
441
441
|
set remainingDuration(e) {
|
|
442
442
|
this.block[7] = e;
|
|
443
443
|
}
|
|
444
|
-
},
|
|
444
|
+
}, ot = {
|
|
445
445
|
type: Float32Array,
|
|
446
446
|
size: 17,
|
|
447
447
|
loadProperties: ["interpolate"],
|
|
@@ -468,149 +468,236 @@ var Pe = 0, Fe = 1, Ie = class extends t {
|
|
|
468
468
|
];
|
|
469
469
|
},
|
|
470
470
|
attach(e, t, n) {
|
|
471
|
-
return new
|
|
471
|
+
return new at(t.getBlock(n), n);
|
|
472
|
+
}
|
|
473
|
+
}, st = 0, ct = 1, lt = 2, ut = 3, dt = 4, ft = 5, pt = 6, mt = 7, ht = 8, gt = 32, _t = 72, I = {
|
|
474
|
+
Found: 1,
|
|
475
|
+
Incomplete: 2,
|
|
476
|
+
Unreachable: 3
|
|
477
|
+
}, vt = class extends t {
|
|
478
|
+
get active() {
|
|
479
|
+
return this.block[5] !== 0;
|
|
480
|
+
}
|
|
481
|
+
get goalX() {
|
|
482
|
+
return i(this.block, 6);
|
|
483
|
+
}
|
|
484
|
+
get goalY() {
|
|
485
|
+
return i(this.block, 7);
|
|
486
|
+
}
|
|
487
|
+
get pending() {
|
|
488
|
+
return Tt(this.block);
|
|
489
|
+
}
|
|
490
|
+
get outcome() {
|
|
491
|
+
return this.block[2];
|
|
492
|
+
}
|
|
493
|
+
get waypointIndex() {
|
|
494
|
+
return this.block[3];
|
|
495
|
+
}
|
|
496
|
+
get waypoints() {
|
|
497
|
+
return Array.from({ length: this.block[4] }, (e, t) => Ot(this.block, t));
|
|
498
|
+
}
|
|
499
|
+
navigateTo(e, t) {
|
|
500
|
+
bt(this.block, e, t);
|
|
501
|
+
}
|
|
502
|
+
stop() {
|
|
503
|
+
St(this.block);
|
|
504
|
+
}
|
|
505
|
+
}, yt = {
|
|
506
|
+
type: Int32Array,
|
|
507
|
+
size: 72,
|
|
508
|
+
loadProperties: ["navigate"],
|
|
509
|
+
toBlock: () => Array.from({ length: 72 }, () => 0),
|
|
510
|
+
attach(e, t, n) {
|
|
511
|
+
return new vt(t.getBlock(n), n);
|
|
472
512
|
}
|
|
473
|
-
}
|
|
513
|
+
};
|
|
514
|
+
function bt(e, t, n) {
|
|
515
|
+
xt(e, t, n), e[5] = 1, wt(e);
|
|
516
|
+
}
|
|
517
|
+
function xt(e, t, n) {
|
|
518
|
+
a(e, 6, t), a(e, 7, n);
|
|
519
|
+
}
|
|
520
|
+
function St(e) {
|
|
521
|
+
e[5] = 0;
|
|
522
|
+
}
|
|
523
|
+
function Ct(e) {
|
|
524
|
+
return e[5] !== 0;
|
|
525
|
+
}
|
|
526
|
+
function wt(e) {
|
|
527
|
+
Atomics.add(e, 0, 1);
|
|
528
|
+
}
|
|
529
|
+
function Tt(e) {
|
|
530
|
+
return Atomics.load(e, 0) !== Atomics.load(e, 1);
|
|
531
|
+
}
|
|
532
|
+
function Et(e) {
|
|
533
|
+
return !Tt(e) && e[2] === I.Unreachable;
|
|
534
|
+
}
|
|
535
|
+
function Dt(e) {
|
|
536
|
+
return {
|
|
537
|
+
x: i(e, 6),
|
|
538
|
+
y: i(e, 7)
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
function Ot(e, t) {
|
|
542
|
+
return {
|
|
543
|
+
x: L(e, t),
|
|
544
|
+
y: kt(e, t)
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
function L(e, t) {
|
|
548
|
+
return i(e, 8 + t * 2);
|
|
549
|
+
}
|
|
550
|
+
function kt(e, t) {
|
|
551
|
+
return i(e, 8 + t * 2 + 1);
|
|
552
|
+
}
|
|
553
|
+
function At(e, t, n) {
|
|
554
|
+
let r = n.length > 32, i = r ? 32 : n.length;
|
|
555
|
+
for (let t = 0; t < i; t++) a(e, 8 + t * 2, n[t].x), a(e, 8 + t * 2 + 1, n[t].y);
|
|
556
|
+
e[4] = i, e[3] = 0, e[2] = r ? I.Incomplete : t;
|
|
557
|
+
}
|
|
558
|
+
//#endregion
|
|
559
|
+
//#region src/components/registry.ts
|
|
560
|
+
var jt = {
|
|
474
561
|
transform: A,
|
|
475
|
-
velocity:
|
|
476
|
-
body:
|
|
562
|
+
velocity: M,
|
|
563
|
+
body: Pe,
|
|
477
564
|
polygon: T,
|
|
478
|
-
bounciness:
|
|
479
|
-
dynamics:
|
|
480
|
-
interpolation:
|
|
481
|
-
},
|
|
565
|
+
bounciness: Be,
|
|
566
|
+
dynamics: le,
|
|
567
|
+
interpolation: ot
|
|
568
|
+
}, Mt = { navigation: yt }, R = {
|
|
482
569
|
x: 0,
|
|
483
570
|
y: 0
|
|
484
|
-
},
|
|
571
|
+
}, z = {
|
|
485
572
|
x: 0,
|
|
486
573
|
y: 0
|
|
487
574
|
};
|
|
488
|
-
function
|
|
575
|
+
function B(e, t) {
|
|
489
576
|
return Math.abs(e - t) / 2;
|
|
490
577
|
}
|
|
491
|
-
function
|
|
578
|
+
function V(e, t, n) {
|
|
492
579
|
return t > e ? n + Math.PI / 2 : n;
|
|
493
580
|
}
|
|
494
|
-
function
|
|
581
|
+
function Nt(e, t, n) {
|
|
495
582
|
return e === 2 ? t / 2 : e === 3 ? Math.min(t, n) / 2 : 0;
|
|
496
583
|
}
|
|
497
|
-
function
|
|
584
|
+
function Pt(e, t, n) {
|
|
498
585
|
return e === 2 ? t <= 0 : t <= 0 || n <= 0;
|
|
499
586
|
}
|
|
500
|
-
function
|
|
501
|
-
return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(
|
|
587
|
+
function H(e, t, n, r) {
|
|
588
|
+
return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.cos(V(t, n, r))) * B(t, n) + Math.min(t, n) / 2 : Wt(t, n, r);
|
|
502
589
|
}
|
|
503
|
-
function
|
|
504
|
-
return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(
|
|
590
|
+
function U(e, t, n, r) {
|
|
591
|
+
return e === 2 ? t / 2 : e === 3 ? Math.abs(Math.sin(V(t, n, r))) * B(t, n) + Math.min(t, n) / 2 : Gt(t, n, r);
|
|
505
592
|
}
|
|
506
|
-
function
|
|
507
|
-
if (
|
|
593
|
+
function Ft(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
594
|
+
if (Pt(e, r, i) || Pt(o, l, u)) return !1;
|
|
508
595
|
let f = e !== 1, p = o !== 1;
|
|
509
|
-
if (!f && !p) return
|
|
510
|
-
if (f && !p) return
|
|
511
|
-
let m =
|
|
512
|
-
if (!f) return
|
|
513
|
-
let y =
|
|
514
|
-
return
|
|
596
|
+
if (!f && !p) return Kt(t, n, r, i, a, s, c, l, u, d);
|
|
597
|
+
if (f && !p) return Ft(o, s, c, l, u, d, e, t, n, r, i, a);
|
|
598
|
+
let m = It(o, l, u), h = V(l, u, d), g = Math.cos(h) * m, _ = Math.sin(h) * m, v = Nt(o, l, u);
|
|
599
|
+
if (!f) return Jt(s - g, c - _, s + g, c + _, t, n, r, i, a) < v * v;
|
|
600
|
+
let y = It(e, r, i), b = V(r, i, a), x = Math.cos(b) * y, S = Math.sin(b) * y, C = Nt(e, r, i) + v;
|
|
601
|
+
return qt(t - x, n - S, t + x, n + S, s - g, c - _, s + g, c + _) < C * C;
|
|
515
602
|
}
|
|
516
|
-
function
|
|
517
|
-
return e === 3 ?
|
|
603
|
+
function It(e, t, n) {
|
|
604
|
+
return e === 3 ? B(t, n) : 0;
|
|
518
605
|
}
|
|
519
|
-
function
|
|
606
|
+
function Lt(e, t, n, r, i, a, o, s, c, l, u, d, f) {
|
|
520
607
|
let p = e !== 1, m = o !== 1;
|
|
521
|
-
return !p && !m ?
|
|
608
|
+
return !p && !m ? Rt(t, n, r, i, a, s, c, l, u, d, f) : p && m ? zt(e, t, n, r, i, a, o, s, c, l, u, d, f) : p ? Bt(s, c, l, u, d, e, t, n, r, i, a, f) : Bt(t, n, r, i, a, o, s, c, l, u, d, f) ? (f.x = -f.x, f.y = -f.y, !0) : !1;
|
|
522
609
|
}
|
|
523
|
-
function
|
|
524
|
-
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 =
|
|
610
|
+
function Rt(e, t, n, r, i, a, o, s, c, l, u) {
|
|
611
|
+
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 = W(d, f, y, b, h, g, d, f, _, v, p, m);
|
|
525
612
|
u.x = d, u.y = f;
|
|
526
|
-
let S =
|
|
527
|
-
return S < x && (x = S, u.x = -f, u.y = d), S =
|
|
613
|
+
let S = W(-f, d, y, b, h, g, d, f, _, v, p, m);
|
|
614
|
+
return S < x && (x = S, u.x = -f, u.y = d), S = W(p, m, y, b, h, g, d, f, _, v, p, m), S < x && (x = S, u.x = p, u.y = m), S = W(-m, p, y, b, h, g, d, f, _, v, p, m), S < x && (u.x = -m, u.y = p), Ht(y, b, u), !0;
|
|
528
615
|
}
|
|
529
|
-
function
|
|
530
|
-
let p =
|
|
531
|
-
return x > 0 ? (f.x =
|
|
616
|
+
function zt(e, t, n, r, i, a, o, s, c, l, u, d, f) {
|
|
617
|
+
let p = It(e, r, i), m = V(r, i, a), h = Math.cos(m) * p, g = Math.sin(m) * p, _ = It(o, l, u), v = V(l, u, d), y = Math.cos(v) * _, b = Math.sin(v) * _, x = Math.sqrt(qt(t - h, n - g, t + h, n + g, s - y, c - b, s + y, c + b, R));
|
|
618
|
+
return x > 0 ? (f.x = R.x / x, f.y = R.y / x, !0) : Ut(t - s, n - c, f);
|
|
532
619
|
}
|
|
533
|
-
function
|
|
534
|
-
let f =
|
|
535
|
-
if (g > 0) return d.x =
|
|
536
|
-
let _ = Math.cos(i), v = Math.sin(i), y = o - e, b = s - t, x = y * _ + b * v, S = -y * v + b * _, C = m * _ + h * v, w = -m * v + h * _, T =
|
|
620
|
+
function Bt(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
621
|
+
let f = It(a, c, l), p = V(c, l, u), m = Math.cos(p) * f, h = Math.sin(p) * f, g = Math.sqrt(Jt(o - m, s - h, o + m, s + h, e, t, n, r, i, R));
|
|
622
|
+
if (g > 0) return d.x = R.x / g, d.y = R.y / g, !0;
|
|
623
|
+
let _ = Math.cos(i), v = Math.sin(i), y = o - e, b = s - t, x = y * _ + b * v, S = -y * v + b * _, C = m * _ + h * v, w = -m * v + h * _, T = Nt(a, c, l), E = n / 2, D = r / 2, O = Vt(1, 0, x, S, C, w, T, E, D);
|
|
537
624
|
d.x = 1, d.y = 0;
|
|
538
|
-
let k =
|
|
539
|
-
k < O && (O = k, d.x = 0, d.y = 1),
|
|
625
|
+
let k = Vt(0, 1, x, S, C, w, T, E, D);
|
|
626
|
+
k < O && (O = k, d.x = 0, d.y = 1), Ut(-w, C, z) && (k = Vt(z.x, z.y, x, S, C, w, T, E, D), k < O && (d.x = z.x, d.y = z.y)), Ht(x, S, d);
|
|
540
627
|
let A = d.x, j = d.y;
|
|
541
628
|
return d.x = A * _ - j * v, d.y = A * v + j * _, !0;
|
|
542
629
|
}
|
|
543
|
-
function
|
|
630
|
+
function Vt(e, t, n, r, i, a, o, s, c) {
|
|
544
631
|
return s * Math.abs(e) + c * Math.abs(t) + (Math.abs(i * e + a * t) + o) - Math.abs(n * e + r * t);
|
|
545
632
|
}
|
|
546
|
-
function
|
|
633
|
+
function Ht(e, t, n) {
|
|
547
634
|
e * n.x + t * n.y < 0 && (n.x = -n.x, n.y = -n.y);
|
|
548
635
|
}
|
|
549
|
-
function
|
|
636
|
+
function Ut(e, t, n) {
|
|
550
637
|
let r = Math.sqrt(e * e + t * t);
|
|
551
638
|
return r !== 0 && (n.x = e / r, n.y = t / r, !0);
|
|
552
639
|
}
|
|
553
|
-
function
|
|
640
|
+
function Wt(e, t, n) {
|
|
554
641
|
return (Math.abs(Math.cos(n)) * e + Math.abs(Math.sin(n)) * t) / 2;
|
|
555
642
|
}
|
|
556
|
-
function
|
|
643
|
+
function Gt(e, t, n) {
|
|
557
644
|
return (Math.abs(Math.sin(n)) * e + Math.abs(Math.cos(n)) * t) / 2;
|
|
558
645
|
}
|
|
559
|
-
function
|
|
646
|
+
function Kt(e, t, n, r, i, a, o, s, c, l) {
|
|
560
647
|
if (n <= 0 || r <= 0 || s <= 0 || c <= 0) return !1;
|
|
561
648
|
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;
|
|
562
|
-
return
|
|
649
|
+
return W(u, d, v, y, m, h, u, d, g, _, f, p) > 0 && W(-d, u, v, y, m, h, u, d, g, _, f, p) > 0 && W(f, p, v, y, m, h, u, d, g, _, f, p) > 0 && W(-p, f, v, y, m, h, u, d, g, _, f, p) > 0;
|
|
563
650
|
}
|
|
564
|
-
function
|
|
651
|
+
function W(e, t, n, r, i, a, o, s, c, l, u, d) {
|
|
565
652
|
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);
|
|
566
653
|
}
|
|
567
|
-
function
|
|
654
|
+
function qt(e, t, n, r, i, a, o, s, c) {
|
|
568
655
|
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;
|
|
569
656
|
if (h <= 0 && g <= 0) return c && (c.x = p, c.y = m), p * p + m * m;
|
|
570
|
-
if (h <= 0) y =
|
|
657
|
+
if (h <= 0) y = q(_ / g);
|
|
571
658
|
else {
|
|
572
659
|
let e = l * p + u * m;
|
|
573
|
-
if (g <= 0) v =
|
|
660
|
+
if (g <= 0) v = q(-e / h);
|
|
574
661
|
else {
|
|
575
662
|
let t = l * d + u * f, n = h * g - t * t;
|
|
576
|
-
n !== 0 && (v =
|
|
663
|
+
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));
|
|
577
664
|
}
|
|
578
665
|
}
|
|
579
666
|
let b = e + l * v - (i + d * y), x = t + u * v - (a + f * y);
|
|
580
667
|
return c && (c.x = b, c.y = x), b * b + x * x;
|
|
581
668
|
}
|
|
582
|
-
function
|
|
669
|
+
function Jt(e, t, n, r, i, a, o, s, c, l) {
|
|
583
670
|
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;
|
|
584
|
-
if (!
|
|
585
|
-
if (!l) return Math.min(
|
|
586
|
-
let S =
|
|
587
|
-
S =
|
|
671
|
+
if (!Yt(v, y, b, x, f, p)) return l && (l.x = 0, l.y = 0), 0;
|
|
672
|
+
if (!l) return Math.min(Xt(v, y, f, p), Xt(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));
|
|
673
|
+
let S = Xt(v, y, f, p, l);
|
|
674
|
+
S = G(S, Xt(b, x, f, p, z), z, l, !1), S = G(S, K(-f, -p, v, y, b, x, z), z, l, !0), S = G(S, K(f, -p, v, y, b, x, z), z, l, !0), S = G(S, K(f, p, v, y, b, x, z), z, l, !0), S = G(S, K(-f, p, v, y, b, x, z), z, l, !0);
|
|
588
675
|
let C = l.x, w = l.y;
|
|
589
676
|
return l.x = C * u - w * d, l.y = C * d + w * u, S;
|
|
590
677
|
}
|
|
591
|
-
function
|
|
678
|
+
function G(e, t, n, r, i) {
|
|
592
679
|
return t >= e ? e : (r.x = i ? -n.x : n.x, r.y = i ? -n.y : n.y, t);
|
|
593
680
|
}
|
|
594
|
-
function
|
|
595
|
-
let s = i - n, c = a - r, l = s * s + c * c, u = l > 0 ?
|
|
681
|
+
function K(e, t, n, r, i, a, o) {
|
|
682
|
+
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);
|
|
596
683
|
return o && (o.x = d, o.y = f), d * d + f * f;
|
|
597
684
|
}
|
|
598
|
-
function
|
|
685
|
+
function Yt(e, t, n, r, i, a) {
|
|
599
686
|
if (Math.max(e, n) < -i || Math.min(e, n) > i || Math.max(t, r) < -a || Math.min(t, r) > a) return !0;
|
|
600
687
|
let o = -(r - t), s = n - e;
|
|
601
688
|
return Math.abs(o * e + s * t) > i * Math.abs(o) + a * Math.abs(s);
|
|
602
689
|
}
|
|
603
|
-
function
|
|
690
|
+
function Xt(e, t, n, r, i) {
|
|
604
691
|
let a = Math.abs(e) - n, o = Math.abs(t) - r, s = a > 0 ? a : 0, c = o > 0 ? o : 0;
|
|
605
692
|
return i && (i.x = e < 0 ? -s : s, i.y = t < 0 ? -c : c), s * s + c * c;
|
|
606
693
|
}
|
|
607
|
-
function
|
|
694
|
+
function q(e) {
|
|
608
695
|
return e < 0 ? 0 : e > 1 ? 1 : e;
|
|
609
696
|
}
|
|
610
697
|
//#endregion
|
|
611
698
|
//#region src/systems/spatial-bounds.ts
|
|
612
|
-
function
|
|
613
|
-
let t = e.transform, n = e.body ?
|
|
699
|
+
function J(e) {
|
|
700
|
+
let t = e.transform, n = e.body ? P(e.body) : 1, r = t[2], i = t[3], a = t[4], o = H(n, r, i, a), s = U(n, r, i, a), c = t[0], l = t[1];
|
|
614
701
|
return {
|
|
615
702
|
minX: c - o,
|
|
616
703
|
minY: l - s,
|
|
@@ -618,20 +705,23 @@ function Y(e) {
|
|
|
618
705
|
maxY: l + s
|
|
619
706
|
};
|
|
620
707
|
}
|
|
621
|
-
function
|
|
708
|
+
function Zt(e, t, n, r, i) {
|
|
622
709
|
return e.minX <= r && e.maxX >= t && e.minY <= i && e.maxY >= n;
|
|
623
710
|
}
|
|
624
|
-
function
|
|
711
|
+
function Qt(e, t) {
|
|
625
712
|
return t > e ? t - e : Math.max(1, Math.abs(e)) * 2 ** -52;
|
|
626
713
|
}
|
|
627
714
|
//#endregion
|
|
628
715
|
//#region src/world.ts
|
|
629
|
-
var
|
|
716
|
+
var $t = class extends e {
|
|
630
717
|
spatialMap;
|
|
631
718
|
spatialIds = /* @__PURE__ */ new Set();
|
|
632
719
|
constructor(e, t = {}) {
|
|
633
720
|
let { spatial: n, ...r } = t;
|
|
634
|
-
super(e, r), this.spatialMap = new o(this.heap,
|
|
721
|
+
super(e, r), this.spatialMap = new o(this.heap, {
|
|
722
|
+
type: Float64Array,
|
|
723
|
+
...n
|
|
724
|
+
}), this.on("entity-added", (e) => {
|
|
635
725
|
this.updateSpatialEntity(e), e.on("component-added", (t) => {
|
|
636
726
|
(t === "transform" || t === "body") && this.updateSpatialEntity(e);
|
|
637
727
|
}), e.on("component-removed", (t) => {
|
|
@@ -649,7 +739,7 @@ var Tt = class extends e {
|
|
|
649
739
|
this.spatialIds.delete(t.eid), this.spatialMap.remove(t.eid);
|
|
650
740
|
return;
|
|
651
741
|
}
|
|
652
|
-
let i =
|
|
742
|
+
let i = J({
|
|
653
743
|
transform: r,
|
|
654
744
|
body: n.body?.block
|
|
655
745
|
});
|
|
@@ -657,12 +747,12 @@ var Tt = class extends e {
|
|
|
657
747
|
}
|
|
658
748
|
searchSpatial(e, t, n, r, i) {
|
|
659
749
|
if (n < e || r < t) return [];
|
|
660
|
-
let a = [], o = Number.isFinite(e) && Number.isFinite(t) && Number.isFinite(n) && Number.isFinite(r) ? this.spatialMap.search(e, t,
|
|
750
|
+
let a = [], o = Number.isFinite(e) && Number.isFinite(t) && Number.isFinite(n) && Number.isFinite(r) ? this.spatialMap.search(e, t, Qt(e, n), Qt(t, r)) : this.spatialIds;
|
|
661
751
|
for (let s of o) {
|
|
662
752
|
let o = this.getEntityByEid(s);
|
|
663
753
|
if (!o || i && !i(o)) continue;
|
|
664
754
|
let c = o.components, l = c.transform?.block;
|
|
665
|
-
l &&
|
|
755
|
+
l && Zt(J({
|
|
666
756
|
transform: l,
|
|
667
757
|
body: c.body?.block
|
|
668
758
|
}), e, t, n, r) && a.push(o);
|
|
@@ -684,60 +774,60 @@ var Tt = class extends e {
|
|
|
684
774
|
return t ? [t] : [];
|
|
685
775
|
});
|
|
686
776
|
}
|
|
687
|
-
},
|
|
777
|
+
}, en = {
|
|
688
778
|
min: 0,
|
|
689
779
|
max: 0
|
|
690
|
-
},
|
|
780
|
+
}, tn = {
|
|
691
781
|
min: 0,
|
|
692
782
|
max: 0
|
|
693
|
-
},
|
|
783
|
+
}, Y = {
|
|
694
784
|
overlap: !0,
|
|
695
785
|
depth: Infinity,
|
|
696
786
|
x: 0,
|
|
697
787
|
y: 0
|
|
698
788
|
};
|
|
699
|
-
function
|
|
700
|
-
return
|
|
789
|
+
function nn(e, t, n, r, i, a, o, s, c, l, u, d, f, p) {
|
|
790
|
+
return an(e, t, n, r, i, a, o, s, c, l, u, d, f, p, !1);
|
|
701
791
|
}
|
|
702
|
-
function
|
|
703
|
-
return
|
|
792
|
+
function rn(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) {
|
|
793
|
+
return Y.depth = Infinity, !an(e, t, n, r, i, a, o, s, c, l, u, d, f, p, !0) || Y.depth === Infinity ? !1 : (m.x = Y.x, m.y = Y.y, !0);
|
|
704
794
|
}
|
|
705
|
-
function
|
|
706
|
-
return !(e === 4 && (!t || !
|
|
795
|
+
function an(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) {
|
|
796
|
+
return !(e === 4 && (!t || !on(t, n, r, i, a, o, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m)) || s === 4 && (!c || !on(c, l, u, d, f, p, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m)) || e === 1 && !sn(o, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) || s === 1 && !sn(p, e, t, n, r, i, a, o, s, c, l, u, d, f, p, m) || mn(e) && c && !cn(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) || mn(s) && t && !cn(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));
|
|
707
797
|
}
|
|
708
|
-
function
|
|
798
|
+
function on(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g, _, v, y, b) {
|
|
709
799
|
let x = e[0], S = Math.cos(a), C = Math.sin(a);
|
|
710
800
|
for (let a = 0; a < x; a++) {
|
|
711
|
-
let w = (a + 1) % x, T =
|
|
712
|
-
if (!
|
|
801
|
+
let w = (a + 1) % x, T = dn(e, a, t, r, i, S, C), E = fn(e, a, n, r, i, S, C), D = dn(e, w, t, r, i, S, C);
|
|
802
|
+
if (!ln(E - fn(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;
|
|
713
803
|
}
|
|
714
804
|
return !0;
|
|
715
805
|
}
|
|
716
|
-
function
|
|
806
|
+
function sn(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h) {
|
|
717
807
|
let g = Math.cos(e), _ = Math.sin(e);
|
|
718
|
-
return
|
|
808
|
+
return ln(g, _, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h) && ln(-_, g, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h);
|
|
719
809
|
}
|
|
720
|
-
function
|
|
721
|
-
let D = e === 3 ?
|
|
722
|
-
for (let e = 0; e <
|
|
723
|
-
let t =
|
|
724
|
-
if (!
|
|
810
|
+
function cn(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) {
|
|
811
|
+
let D = e === 3 ? B(r, i) : 0, O = V(r, i, a), k = Math.cos(O) * D, A = Math.sin(O) * D, j = t - k, ee = n - A, te = t + k, ne = n + A, re = o[0], M = Math.cos(d), N = Math.sin(d);
|
|
812
|
+
for (let e = 0; e < re; e++) {
|
|
813
|
+
let t = dn(o, e, s, l, u, M, N), n = fn(o, e, c, l, u, M, N), r = pn(j, ee, te, ne, t, n), i = j + (te - j) * r, a = ee + (ne - ee) * r;
|
|
814
|
+
if (!ln(t - i, n - a, f, p, m, h, g, _, v, y, b, x, S, C, w, T, E)) return !1;
|
|
725
815
|
}
|
|
726
816
|
return !0;
|
|
727
817
|
}
|
|
728
|
-
function
|
|
818
|
+
function ln(e, t, n, r, i, a, o, s, c, l, u, d, f, p, m, h, g) {
|
|
729
819
|
let _ = Math.hypot(e, t);
|
|
730
820
|
if (_ === 0) return !0;
|
|
731
|
-
e /= _, t /= _,
|
|
732
|
-
let v =
|
|
821
|
+
e /= _, t /= _, un(n, r, i, a, o, s, c, e, t, en), un(l, u, d, f, p, m, h, e, t, tn);
|
|
822
|
+
let v = en.max - tn.min, y = tn.max - en.min;
|
|
733
823
|
if (!g && (v <= 0 || y <= 0)) return !1;
|
|
734
824
|
if (g) {
|
|
735
825
|
let n, r;
|
|
736
|
-
v <= 0 ? (n = -v, r = -1) : y <= 0 ? (n = -y, r = 1) : v < y ? (n = v, r = -1) : (n = y, r = 1), n <
|
|
826
|
+
v <= 0 ? (n = -v, r = -1) : y <= 0 ? (n = -y, r = 1) : v < y ? (n = v, r = -1) : (n = y, r = 1), n < Y.depth && (Y.depth = n, Y.x = e * r, Y.y = t * r);
|
|
737
827
|
}
|
|
738
828
|
return !0;
|
|
739
829
|
}
|
|
740
|
-
function
|
|
830
|
+
function un(e, t, n, r, i, a, o, s, c, l) {
|
|
741
831
|
let u = n * s + r * c;
|
|
742
832
|
if (e === 2) {
|
|
743
833
|
let e = i / 2;
|
|
@@ -745,7 +835,7 @@ function Ft(e, t, n, r, i, a, o, s, c, l) {
|
|
|
745
835
|
return;
|
|
746
836
|
}
|
|
747
837
|
if (e === 3) {
|
|
748
|
-
let e =
|
|
838
|
+
let e = B(i, a), t = V(i, a, o), n = Math.abs(s * Math.cos(t) + c * Math.sin(t)) * e + Math.min(i, a) / 2;
|
|
749
839
|
l.min = u - n, l.max = u + n;
|
|
750
840
|
return;
|
|
751
841
|
}
|
|
@@ -761,28 +851,28 @@ function Ft(e, t, n, r, i, a, o, s, c, l) {
|
|
|
761
851
|
let d = t[0], f = Math.cos(o), p = Math.sin(o);
|
|
762
852
|
l.min = Infinity, l.max = -Infinity;
|
|
763
853
|
for (let e = 0; e < d; e++) {
|
|
764
|
-
let o =
|
|
854
|
+
let o = dn(t, e, n, i, a, f, p), u = fn(t, e, r, i, a, f, p), d = o * s + u * c;
|
|
765
855
|
l.min = Math.min(l.min, d), l.max = Math.max(l.max, d);
|
|
766
856
|
}
|
|
767
857
|
}
|
|
768
|
-
function
|
|
858
|
+
function dn(e, t, n, r, i, a, o) {
|
|
769
859
|
let s = 1 + t * 2;
|
|
770
860
|
return n + e[s] * r * a - e[s + 1] * i * o;
|
|
771
861
|
}
|
|
772
|
-
function
|
|
862
|
+
function fn(e, t, n, r, i, a, o) {
|
|
773
863
|
let s = 1 + t * 2;
|
|
774
864
|
return n + e[s] * r * o + e[s + 1] * i * a;
|
|
775
865
|
}
|
|
776
|
-
function
|
|
866
|
+
function pn(e, t, n, r, i, a) {
|
|
777
867
|
let o = n - e, s = r - t, c = o * o + s * s;
|
|
778
868
|
return c === 0 ? 0 : Math.min(1, Math.max(0, ((i - e) * o + (a - t) * s) / c));
|
|
779
869
|
}
|
|
780
|
-
function
|
|
870
|
+
function mn(e) {
|
|
781
871
|
return e === 2 || e === 3;
|
|
782
872
|
}
|
|
783
873
|
//#endregion
|
|
784
874
|
//#region src/actions/dynamics-commands.ts
|
|
785
|
-
function
|
|
875
|
+
function hn() {
|
|
786
876
|
return {
|
|
787
877
|
forceX: 0,
|
|
788
878
|
forceY: 0,
|
|
@@ -792,7 +882,7 @@ function Bt() {
|
|
|
792
882
|
}
|
|
793
883
|
//#endregion
|
|
794
884
|
//#region src/actions/find-dynamics-command.ts
|
|
795
|
-
function
|
|
885
|
+
function gn(e, t) {
|
|
796
886
|
if (!e) return;
|
|
797
887
|
let n = 0, r = e.length - 1;
|
|
798
888
|
for (; n <= r;) {
|
|
@@ -803,7 +893,7 @@ function Vt(e, t) {
|
|
|
803
893
|
}
|
|
804
894
|
//#endregion
|
|
805
895
|
//#region src/actions/find-dynamics-command-offset.ts
|
|
806
|
-
function
|
|
896
|
+
function _n(e, t) {
|
|
807
897
|
let n = 0, r = e.length / 8 - 1;
|
|
808
898
|
for (; n <= r;) {
|
|
809
899
|
let i = n + r >>> 1, a = i * 8, o = e[a + 0];
|
|
@@ -814,10 +904,10 @@ function Ht(e, t) {
|
|
|
814
904
|
}
|
|
815
905
|
//#endregion
|
|
816
906
|
//#region src/systems/collision.ts
|
|
817
|
-
var
|
|
907
|
+
var vn = 1e-4, yn = 24, X = [], bn = 2 ** 26, xn = {
|
|
818
908
|
fraction: 1,
|
|
819
|
-
blocking:
|
|
820
|
-
},
|
|
909
|
+
blocking: X
|
|
910
|
+
}, Sn = class {
|
|
821
911
|
buckets = [];
|
|
822
912
|
hasBounciness = !1;
|
|
823
913
|
resolved = /* @__PURE__ */ new Set();
|
|
@@ -828,18 +918,18 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
828
918
|
if (!o || !s) continue;
|
|
829
919
|
let c = s[1];
|
|
830
920
|
if (c === 0) continue;
|
|
831
|
-
let l =
|
|
832
|
-
if (
|
|
833
|
-
let f = o[4], p =
|
|
921
|
+
let l = P(s), u = o[2], d = o[3];
|
|
922
|
+
if (Pt(l, u, d)) continue;
|
|
923
|
+
let f = o[4], p = H(l, u, d, f), m = U(l, u, d, f);
|
|
834
924
|
e.bounciness && (this.hasBounciness = !0);
|
|
835
|
-
let h = e.velocity, g = e.dynamics, _ =
|
|
836
|
-
|
|
925
|
+
let h = e.velocity, g = e.dynamics, _ = gn(a, n.entityId), v = i ? _n(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, ee = E ?? A, te = Math.max(Math.abs(D), Math.abs(j)) * t, ne = Math.max(Math.abs(O), Math.abs(ee)) * t, re = o[0], M = o[1], N = r.get(c);
|
|
926
|
+
N || (N = {
|
|
837
927
|
entries: [],
|
|
838
928
|
bounds: []
|
|
839
|
-
}, r.set(c,
|
|
929
|
+
}, r.set(c, N)), N.entries.push({
|
|
840
930
|
entityId: n.entityId,
|
|
841
931
|
components: e
|
|
842
|
-
}),
|
|
932
|
+
}), N.bounds.push(re - p - te, M - m - ne, re + p + te, M + m + ne);
|
|
843
933
|
}
|
|
844
934
|
for (let [e, { entries: t, bounds: n }] of r) {
|
|
845
935
|
let r = new s(t.length);
|
|
@@ -852,26 +942,26 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
852
942
|
}
|
|
853
943
|
}
|
|
854
944
|
claimContact(e, t) {
|
|
855
|
-
let n = e < t ? e *
|
|
945
|
+
let n = e < t ? e * bn + t : t * bn + e;
|
|
856
946
|
return !this.resolved.has(n) && (this.resolved.add(n), !0);
|
|
857
947
|
}
|
|
858
948
|
forEachOverlapping(e, t, n = 0, r = 0) {
|
|
859
|
-
let i =
|
|
949
|
+
let i = Tn(e);
|
|
860
950
|
if (!i) return;
|
|
861
951
|
let { x: a, y: o, halfWidth: s, halfHeight: c } = i;
|
|
862
952
|
if (i.ccd && (n !== 0 || r !== 0)) {
|
|
863
953
|
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;
|
|
864
954
|
this.forEachCandidate(i, u, d, f, p, (a) => {
|
|
865
|
-
|
|
955
|
+
En(i, e, l, n, r, a) && t(a);
|
|
866
956
|
});
|
|
867
957
|
return;
|
|
868
958
|
}
|
|
869
959
|
this.forEachCandidate(i, a - s, o - c, a + s, o + c, (e) => {
|
|
870
|
-
|
|
960
|
+
Z(i, a, o, e) && t(e);
|
|
871
961
|
});
|
|
872
962
|
}
|
|
873
963
|
contactPoint(e, t, n, r) {
|
|
874
|
-
let i = e.components.transform, a = i[0], o = i[1], s = Math.sqrt(n * n + r * r), c =
|
|
964
|
+
let i = e.components.transform, a = i[0], o = i[1], s = Math.sqrt(n * n + r * r), c = Tn(e);
|
|
875
965
|
if (!c || s === 0) return {
|
|
876
966
|
x: a,
|
|
877
967
|
y: o
|
|
@@ -884,33 +974,33 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
884
974
|
};
|
|
885
975
|
}
|
|
886
976
|
contactNormal(e, t, n, r, i) {
|
|
887
|
-
let a =
|
|
977
|
+
let a = Tn(e);
|
|
888
978
|
if (!a) return !1;
|
|
889
979
|
let o = n === 0 && r === 0 ? {
|
|
890
980
|
x: a.x,
|
|
891
981
|
y: a.y
|
|
892
982
|
} : this.contactPoint(e, t, n, r);
|
|
893
|
-
return
|
|
983
|
+
return Cn(a, o.x, o.y, t, i);
|
|
894
984
|
}
|
|
895
985
|
sweep(e, t, n) {
|
|
896
|
-
let r = Math.sqrt(t * t + n * n), i =
|
|
986
|
+
let r = Math.sqrt(t * t + n * n), i = Tn(e);
|
|
897
987
|
if (!i || r === 0) return {
|
|
898
988
|
fraction: 1,
|
|
899
|
-
blocking:
|
|
989
|
+
blocking: X
|
|
900
990
|
};
|
|
901
991
|
if (i.ccd) return this.sweepContinuous(i, t, n, r);
|
|
902
992
|
let a = this.gatherCandidates(i, t, n);
|
|
903
993
|
return a.length === 0 ? {
|
|
904
994
|
fraction: 1,
|
|
905
|
-
blocking:
|
|
995
|
+
blocking: X
|
|
906
996
|
} : this.refine(i, a, t, n, r);
|
|
907
997
|
}
|
|
908
998
|
resolveMove(e, t, n, r) {
|
|
909
|
-
let i = Math.sqrt(t * t + n * n), a =
|
|
999
|
+
let i = Math.sqrt(t * t + n * n), a = Tn(e);
|
|
910
1000
|
if (!a || i === 0) return {
|
|
911
1001
|
moveX: t,
|
|
912
1002
|
moveY: n,
|
|
913
|
-
blocking:
|
|
1003
|
+
blocking: X
|
|
914
1004
|
};
|
|
915
1005
|
if (a.ccd) {
|
|
916
1006
|
let e = this.sweepContinuous(a, t, n, i);
|
|
@@ -924,20 +1014,20 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
924
1014
|
if (o.length === 0) return {
|
|
925
1015
|
moveX: t,
|
|
926
1016
|
moveY: n,
|
|
927
|
-
blocking:
|
|
1017
|
+
blocking: X
|
|
928
1018
|
};
|
|
929
1019
|
if (r && t !== 0 && n !== 0) {
|
|
930
1020
|
let e = this.gatherCandidates(a, t, 0), r = this.gatherCandidates(a, 0, n);
|
|
931
1021
|
if (e.length === 0 && r.length === 0) return Math.abs(t) >= Math.abs(n) ? {
|
|
932
1022
|
moveX: t,
|
|
933
1023
|
moveY: 0,
|
|
934
|
-
blocking:
|
|
1024
|
+
blocking: X
|
|
935
1025
|
} : {
|
|
936
1026
|
moveX: 0,
|
|
937
1027
|
moveY: n,
|
|
938
|
-
blocking:
|
|
1028
|
+
blocking: X
|
|
939
1029
|
};
|
|
940
|
-
let i = e.length === 0 ?
|
|
1030
|
+
let i = e.length === 0 ? xn : this.refine(a, e, t, 0, Math.abs(t)), o = r.length === 0 ? xn : this.refine(a, r, 0, n, Math.abs(n)), s = t * i.fraction, c = n * o.fraction;
|
|
941
1031
|
if (s !== 0 && c !== 0) {
|
|
942
1032
|
let e = this.gatherCandidates(a, s, c);
|
|
943
1033
|
if (e.length > 0) {
|
|
@@ -952,7 +1042,7 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
952
1042
|
return {
|
|
953
1043
|
moveX: s,
|
|
954
1044
|
moveY: c,
|
|
955
|
-
blocking:
|
|
1045
|
+
blocking: wn(i.blocking, o.blocking)
|
|
956
1046
|
};
|
|
957
1047
|
}
|
|
958
1048
|
let s = this.refine(a, o, t, n, i);
|
|
@@ -967,19 +1057,19 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
967
1057
|
if (e.sensor) return [];
|
|
968
1058
|
let s = r + t, c = i + n, l = [];
|
|
969
1059
|
return this.forEachCandidate(e, s - a, c - o, s + a, c + o, (t) => {
|
|
970
|
-
|
|
1060
|
+
Z(e, s, c, t) && (F(t.components.body) || Z(e, r, i, t) || l.push(t));
|
|
971
1061
|
}), l;
|
|
972
1062
|
}
|
|
973
1063
|
refine(e, t, n, r, i) {
|
|
974
|
-
let { x: a, y: o } = e, s = 0, c = 1, l =
|
|
975
|
-
for (let i = 0; i <
|
|
1064
|
+
let { x: a, y: o } = e, s = 0, c = 1, l = vn / i;
|
|
1065
|
+
for (let i = 0; i < yn && c - s > l; i++) {
|
|
976
1066
|
let i = (s + c) / 2;
|
|
977
1067
|
this.blockedAt(e, t, n, r, i) ? c = i : s = i;
|
|
978
1068
|
}
|
|
979
1069
|
let u = [], d = a + n * c, f = o + r * c;
|
|
980
|
-
for (let n of t)
|
|
1070
|
+
for (let n of t) Z(e, d, f, n) && u.push(n);
|
|
981
1071
|
return {
|
|
982
|
-
fraction: s * i >
|
|
1072
|
+
fraction: s * i > vn ? s : 0,
|
|
983
1073
|
blocking: u
|
|
984
1074
|
};
|
|
985
1075
|
}
|
|
@@ -987,22 +1077,22 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
987
1077
|
if (e.sensor) return [];
|
|
988
1078
|
let { x: r, y: i, halfWidth: a, halfHeight: o } = e, s = r + t, c = i + n, l = [];
|
|
989
1079
|
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) => {
|
|
990
|
-
|
|
1080
|
+
F(a.components.body) || Z(e, r, i, a) || En(e, r, i, t, n, a) && l.push(a);
|
|
991
1081
|
}), l;
|
|
992
1082
|
}
|
|
993
1083
|
sweepContinuous(e, t, n, r) {
|
|
994
1084
|
let i = this.gatherContinuousCandidates(e, t, n);
|
|
995
1085
|
if (i.length === 0) return {
|
|
996
1086
|
fraction: 1,
|
|
997
|
-
blocking:
|
|
1087
|
+
blocking: X
|
|
998
1088
|
};
|
|
999
|
-
let a = 1, o = [], s =
|
|
1089
|
+
let a = 1, o = [], s = vn / r;
|
|
1000
1090
|
for (let c of i) {
|
|
1001
1091
|
let i = this.entryFraction(e, c, t, n, r);
|
|
1002
1092
|
i < a - s ? (a = i, o = [c]) : i <= a + s && o.push(c);
|
|
1003
1093
|
}
|
|
1004
1094
|
return {
|
|
1005
|
-
fraction: a * r >
|
|
1095
|
+
fraction: a * r > vn ? a : 0,
|
|
1006
1096
|
blocking: o
|
|
1007
1097
|
};
|
|
1008
1098
|
}
|
|
@@ -1010,50 +1100,50 @@ var Ut = 1e-4, Wt = 24, Z = [], Gt = 2 ** 26, Kt = {
|
|
|
1010
1100
|
let a;
|
|
1011
1101
|
if (this.blockedAtOne(e, t, n, r, 1)) a = 1;
|
|
1012
1102
|
else {
|
|
1013
|
-
let o = t.components.transform, s = o[0] - e.x, c = o[1] - e.y, l =
|
|
1103
|
+
let o = t.components.transform, s = o[0] - e.x, c = o[1] - e.y, l = Dn((s * n + c * r) / (i * i));
|
|
1014
1104
|
if (!this.blockedAtOne(e, t, n, r, l)) return l;
|
|
1015
1105
|
a = l;
|
|
1016
1106
|
}
|
|
1017
|
-
let o = 0, s =
|
|
1018
|
-
for (let i = 0; i <
|
|
1107
|
+
let o = 0, s = vn / i;
|
|
1108
|
+
for (let i = 0; i < yn && a - o > s; i++) {
|
|
1019
1109
|
let i = (o + a) / 2;
|
|
1020
1110
|
this.blockedAtOne(e, t, n, r, i) ? a = i : o = i;
|
|
1021
1111
|
}
|
|
1022
1112
|
return o;
|
|
1023
1113
|
}
|
|
1024
1114
|
blockedAtOne(e, t, n, r, i) {
|
|
1025
|
-
return
|
|
1115
|
+
return Z(e, Math.fround(e.x + n * i), Math.fround(e.y + r * i), t);
|
|
1026
1116
|
}
|
|
1027
1117
|
blockedAt(e, t, n, r, i) {
|
|
1028
1118
|
let a = Math.fround(e.x + n * i), o = Math.fround(e.y + r * i);
|
|
1029
|
-
for (let n of t) if (
|
|
1119
|
+
for (let n of t) if (Z(e, a, o, n)) return !0;
|
|
1030
1120
|
return !1;
|
|
1031
1121
|
}
|
|
1032
1122
|
forEachCandidate(e, t, r, i, a, o) {
|
|
1033
1123
|
for (let s of this.buckets) if ((e.mask & s.category) !== 0) for (let c of s.index.search(t, r, i, a)) {
|
|
1034
1124
|
let t = s.entries[c];
|
|
1035
|
-
t.entityId !== e.entityId && (t.components.body[2] & e.category) !== 0 && t.components.entity?.[n] !== 1 && (
|
|
1125
|
+
t.entityId !== e.entityId && (t.components.body[2] & e.category) !== 0 && t.components.entity?.[n] !== 1 && (je(t.components.body) || o(t));
|
|
1036
1126
|
}
|
|
1037
1127
|
}
|
|
1038
1128
|
};
|
|
1039
|
-
function
|
|
1040
|
-
let a = r.components.transform, o =
|
|
1041
|
-
return e.shape === 4 || o === 4 ?
|
|
1129
|
+
function Cn(e, t, n, r, i) {
|
|
1130
|
+
let a = r.components.transform, o = P(r.components.body), s = a[0], c = a[1], l = a[2], u = a[3], d = a[4];
|
|
1131
|
+
return e.shape === 4 || o === 4 ? rn(e.shape, e.polygon, t, n, e.width, e.height, e.angle, o, r.components.polygon, s, c, l, u, d, i) : Lt(e.shape, t, n, e.width, e.height, e.angle, o, s, c, l, u, d, i);
|
|
1042
1132
|
}
|
|
1043
|
-
function
|
|
1133
|
+
function wn(e, t) {
|
|
1044
1134
|
if (e.length === 0) return t;
|
|
1045
1135
|
if (t.length === 0) return e;
|
|
1046
1136
|
let n = [...e];
|
|
1047
1137
|
for (let e of t) n.some((t) => t.entityId === e.entityId) || n.push(e);
|
|
1048
1138
|
return n;
|
|
1049
1139
|
}
|
|
1050
|
-
function
|
|
1140
|
+
function Tn(e) {
|
|
1051
1141
|
let t = e.components.body;
|
|
1052
1142
|
if (!t) return;
|
|
1053
1143
|
let n = t[2];
|
|
1054
1144
|
if (n === 0) return;
|
|
1055
|
-
let r = e.components.transform, i =
|
|
1056
|
-
if (
|
|
1145
|
+
let r = e.components.transform, i = P(t), a = r[2], o = r[3];
|
|
1146
|
+
if (Pt(i, a, o)) return;
|
|
1057
1147
|
let s = r[4], c = e.components.polygon;
|
|
1058
1148
|
if (i !== 4 || c) return {
|
|
1059
1149
|
entityId: e.entityId,
|
|
@@ -1064,36 +1154,36 @@ function Xt(e) {
|
|
|
1064
1154
|
width: a,
|
|
1065
1155
|
height: o,
|
|
1066
1156
|
angle: s,
|
|
1067
|
-
halfWidth:
|
|
1068
|
-
halfHeight:
|
|
1157
|
+
halfWidth: H(i, a, o, s),
|
|
1158
|
+
halfHeight: U(i, a, o, s),
|
|
1069
1159
|
category: t[1],
|
|
1070
1160
|
mask: n,
|
|
1071
|
-
sensor:
|
|
1072
|
-
ccd:
|
|
1161
|
+
sensor: F(t),
|
|
1162
|
+
ccd: ke(t)
|
|
1073
1163
|
};
|
|
1074
1164
|
}
|
|
1075
|
-
function
|
|
1076
|
-
let o = t + r, s = n + i, c = a.components.transform, l =
|
|
1165
|
+
function En(e, t, n, r, i, a) {
|
|
1166
|
+
let o = t + r, s = n + i, c = a.components.transform, l = P(a.components.body), u = c[0], d = c[1], f = c[2], p = c[3], m = c[4];
|
|
1077
1167
|
if (e.shape === 1 || e.shape === 4) {
|
|
1078
1168
|
let c = Math.cos(e.angle), h = Math.sin(e.angle), g = r * c + i * h, _ = -r * h + i * c;
|
|
1079
|
-
return
|
|
1169
|
+
return On(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);
|
|
1080
1170
|
}
|
|
1081
|
-
let h =
|
|
1082
|
-
return
|
|
1171
|
+
let h = Nt(e.shape, e.width, e.height), g = Math.sqrt(r * r + i * i), _ = g > 0 ? Math.atan2(i, r) : e.angle;
|
|
1172
|
+
return On(3, void 0, (t + o) / 2, (n + s) / 2, g + h * 2, h * 2, _, l, a.components.polygon, u, d, f, p, m) ? !0 : On(e.shape, e.polygon, o, s, e.width, e.height, e.angle, l, a.components.polygon, u, d, f, p, m);
|
|
1083
1173
|
}
|
|
1084
|
-
function
|
|
1174
|
+
function Dn(e) {
|
|
1085
1175
|
return e < 0 ? 0 : e > 1 ? 1 : e;
|
|
1086
1176
|
}
|
|
1087
|
-
function
|
|
1177
|
+
function Z(e, t, n, r) {
|
|
1088
1178
|
let i = r.components.transform;
|
|
1089
|
-
return
|
|
1179
|
+
return On(e.shape, e.polygon, t, n, e.width, e.height, e.angle, P(r.components.body), r.components.polygon, i[0], i[1], i[2], i[3], i[4]);
|
|
1090
1180
|
}
|
|
1091
|
-
function
|
|
1092
|
-
return e !== 4 && s !== 4 ?
|
|
1181
|
+
function On(e, t, n, r, i, a, o, s, c, l, u, d, f, p) {
|
|
1182
|
+
return e !== 4 && s !== 4 ? Ft(e, n, r, i, a, o, s, l, u, d, f, p) : nn(e, t, n, r, i, a, o, s, c, l, u, d, f, p);
|
|
1093
1183
|
}
|
|
1094
1184
|
//#endregion
|
|
1095
1185
|
//#region src/systems/spatial-index.ts
|
|
1096
|
-
var
|
|
1186
|
+
var kn = class {
|
|
1097
1187
|
entries = [];
|
|
1098
1188
|
index;
|
|
1099
1189
|
constructor(e) {
|
|
@@ -1101,7 +1191,7 @@ var en = class {
|
|
|
1101
1191
|
for (let n of e) {
|
|
1102
1192
|
let e = n.components, r = e.transform;
|
|
1103
1193
|
if (!r) continue;
|
|
1104
|
-
let i = e.body, a = i ?
|
|
1194
|
+
let i = e.body, a = i ? P(i) : 1, o = r[2], s = r[3], c = r[4], l = r[0], u = r[1], d = H(a, o, s, c), f = U(a, o, s, c);
|
|
1105
1195
|
this.entries.push({
|
|
1106
1196
|
entityId: n.entityId,
|
|
1107
1197
|
components: e
|
|
@@ -1136,44 +1226,44 @@ var en = class {
|
|
|
1136
1226
|
};
|
|
1137
1227
|
//#endregion
|
|
1138
1228
|
//#region src/actions/get-spatial-map.ts
|
|
1139
|
-
function
|
|
1229
|
+
function An(e) {
|
|
1140
1230
|
if (e.spatialMap) return e.spatialMap;
|
|
1141
1231
|
if (!e.heap || !e.spatialMapMemory) throw Error("Spatial system world is missing its shared MemoryHeap or spatial map");
|
|
1142
1232
|
return e.spatialMap = new o(e.heap, e.spatialMapMemory), e.spatialMap;
|
|
1143
1233
|
}
|
|
1144
1234
|
//#endregion
|
|
1145
1235
|
//#region src/actions/update-spatial-map.ts
|
|
1146
|
-
function
|
|
1236
|
+
function Q(e, t, n) {
|
|
1147
1237
|
if (!e.spatialMap && (!e.heap || !e.spatialMapMemory)) return;
|
|
1148
|
-
let r =
|
|
1238
|
+
let r = An(e), i = J(n);
|
|
1149
1239
|
r.update(t, i.minX, i.minY, i.maxX - i.minX, i.maxY - i.minY);
|
|
1150
1240
|
}
|
|
1151
1241
|
//#endregion
|
|
1152
1242
|
//#region src/actions/set-entity-position.ts
|
|
1153
|
-
function
|
|
1243
|
+
function jn(e, t, n) {
|
|
1154
1244
|
let r = t.components.transform;
|
|
1155
1245
|
if (!(r instanceof Float32Array)) return;
|
|
1156
1246
|
a(r, 0, n.x), a(r, 1, n.y);
|
|
1157
1247
|
let i = t.components.body;
|
|
1158
|
-
|
|
1248
|
+
Q(e, t.entityId, {
|
|
1159
1249
|
transform: r,
|
|
1160
1250
|
...i instanceof Uint32Array ? { body: i } : {}
|
|
1161
1251
|
});
|
|
1162
1252
|
}
|
|
1163
1253
|
//#endregion
|
|
1164
1254
|
//#region src/actions/add-physical-world-data.ts
|
|
1165
|
-
function
|
|
1255
|
+
function Mn(e, t) {
|
|
1166
1256
|
t.spatialMapMemory = e.spatialMap.getSharedMemory();
|
|
1167
1257
|
}
|
|
1168
1258
|
//#endregion
|
|
1169
1259
|
//#region src/actions/snap-entity.ts
|
|
1170
|
-
function
|
|
1260
|
+
function Nn(e) {
|
|
1171
1261
|
let { transform: t, interpolation: n } = e.components;
|
|
1172
1262
|
t && n && (n.targetX = n.x = t.x, n.targetY = n.y = t.y, n.previousX = t.x, n.previousY = t.y, n.remainingDuration = 0, n.syncedStepDuration = 0, n.syncedDuration = n.totalDuration);
|
|
1173
1263
|
}
|
|
1174
1264
|
//#endregion
|
|
1175
1265
|
//#region src/actions/start-spawn-interpolation.ts
|
|
1176
|
-
function
|
|
1266
|
+
function Pn(e, t) {
|
|
1177
1267
|
let { transform: n, velocity: r, interpolation: i } = e.components;
|
|
1178
1268
|
if (!n || !r || !i) return;
|
|
1179
1269
|
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;
|
|
@@ -1181,22 +1271,22 @@ function on(e, t) {
|
|
|
1181
1271
|
}
|
|
1182
1272
|
//#endregion
|
|
1183
1273
|
//#region src/actions/integrate-dynamics.ts
|
|
1184
|
-
function
|
|
1185
|
-
let i = e.dynamicsCommands, a = i instanceof Float64Array ? i : void 0, o =
|
|
1274
|
+
function Fn(e, t, n, r) {
|
|
1275
|
+
let i = e.dynamicsCommands, a = i instanceof Float64Array ? i : void 0, o = gn(i && !(i instanceof Float64Array) ? i : void 0, t), s = a ? _n(a, t) : -1, c = n[2];
|
|
1186
1276
|
if (!r && !o && s < 0 && c === 0) return;
|
|
1187
1277
|
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;
|
|
1188
1278
|
n[0] = g ?? y, n[1] = _ ?? b;
|
|
1189
1279
|
}
|
|
1190
1280
|
//#endregion
|
|
1191
1281
|
//#region src/systems/bounce.ts
|
|
1192
|
-
var
|
|
1282
|
+
var In = {
|
|
1193
1283
|
x: 0,
|
|
1194
1284
|
y: 0
|
|
1195
1285
|
};
|
|
1196
|
-
function
|
|
1197
|
-
(
|
|
1286
|
+
function Ln(e, t, n = !1) {
|
|
1287
|
+
(Bn(e, n) || Bn(t, n)) && Vn(e, t) && Hn(e, t, In) && (zn(e, In.x, In.y, n), zn(t, -In.x, -In.y, n));
|
|
1198
1288
|
}
|
|
1199
|
-
function
|
|
1289
|
+
function Rn(e, t, n) {
|
|
1200
1290
|
let r = e.components.bounciness, i = e.components.velocity;
|
|
1201
1291
|
if (!r || !i) return;
|
|
1202
1292
|
let a = i[0], o = i[1], s = a * t + o * n;
|
|
@@ -1204,9 +1294,9 @@ function un(e, t, n) {
|
|
|
1204
1294
|
let c = (1 + r[0]) * s;
|
|
1205
1295
|
i[0] = a - c * t, i[1] = o - c * n;
|
|
1206
1296
|
}
|
|
1207
|
-
function
|
|
1297
|
+
function zn(e, t, n, r) {
|
|
1208
1298
|
if (e.components.bounciness) {
|
|
1209
|
-
|
|
1299
|
+
Rn(e, t, n);
|
|
1210
1300
|
return;
|
|
1211
1301
|
}
|
|
1212
1302
|
let i = e.components.velocity;
|
|
@@ -1214,30 +1304,30 @@ function dn(e, t, n, r) {
|
|
|
1214
1304
|
let a = i[0], o = i[1], s = a * t + o * n;
|
|
1215
1305
|
s < 0 && (i[0] = a - s * t, i[1] = o - s * n);
|
|
1216
1306
|
}
|
|
1217
|
-
function
|
|
1307
|
+
function Bn(e, t) {
|
|
1218
1308
|
return e.components.velocity !== void 0 && (t || e.components.bounciness !== void 0);
|
|
1219
1309
|
}
|
|
1220
|
-
function
|
|
1221
|
-
return !
|
|
1310
|
+
function Vn(e, t) {
|
|
1311
|
+
return !Wn(e.components.body) && !Wn(t.components.body);
|
|
1222
1312
|
}
|
|
1223
|
-
function
|
|
1224
|
-
let r = e.components.transform, i = t.components.transform, a =
|
|
1225
|
-
return a === 4 || o === 4 ?
|
|
1313
|
+
function Hn(e, t, n) {
|
|
1314
|
+
let r = e.components.transform, i = t.components.transform, a = Un(e.components.body), o = Un(t.components.body);
|
|
1315
|
+
return a === 4 || o === 4 ? rn(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) : Lt(a, r[0], r[1], r[2], r[3], r[4], o, i[0], i[1], i[2], i[3], i[4], n);
|
|
1226
1316
|
}
|
|
1227
|
-
function
|
|
1228
|
-
return e ?
|
|
1317
|
+
function Un(e) {
|
|
1318
|
+
return e ? P(e) : 1;
|
|
1229
1319
|
}
|
|
1230
|
-
function
|
|
1231
|
-
return e !== void 0 &&
|
|
1320
|
+
function Wn(e) {
|
|
1321
|
+
return e !== void 0 && F(e);
|
|
1232
1322
|
}
|
|
1233
1323
|
//#endregion
|
|
1234
1324
|
//#region src/actions/combine-dynamics-commands.ts
|
|
1235
|
-
function
|
|
1325
|
+
function Gn(e, t) {
|
|
1236
1326
|
if (e.size === 0) return t;
|
|
1237
1327
|
let n = /* @__PURE__ */ new Map();
|
|
1238
1328
|
for (let [t, r] of e) n.set(t, { ...r });
|
|
1239
|
-
return
|
|
1240
|
-
let r = n.get(e) ??
|
|
1329
|
+
return Kn(t, (e, t) => {
|
|
1330
|
+
let r = n.get(e) ?? hn();
|
|
1241
1331
|
n.set(e, {
|
|
1242
1332
|
forceX: r.forceX + t.forceX,
|
|
1243
1333
|
forceY: r.forceY + t.forceY,
|
|
@@ -1251,7 +1341,7 @@ function _n(e, t) {
|
|
|
1251
1341
|
...t
|
|
1252
1342
|
})).sort((e, t) => e.entityId - t.entityId);
|
|
1253
1343
|
}
|
|
1254
|
-
function
|
|
1344
|
+
function Kn(e, t) {
|
|
1255
1345
|
if (e) {
|
|
1256
1346
|
if (!(e instanceof Float64Array)) {
|
|
1257
1347
|
for (let { entityId: n, ...r } of e) t(n, r);
|
|
@@ -1272,64 +1362,64 @@ function vn(e, t) {
|
|
|
1272
1362
|
}
|
|
1273
1363
|
//#endregion
|
|
1274
1364
|
//#region src/actions/queue-dynamics-vector.ts
|
|
1275
|
-
function
|
|
1276
|
-
if (
|
|
1277
|
-
let o = e.get(t) ??
|
|
1365
|
+
function qn(e, t, n, r, i, a) {
|
|
1366
|
+
if (Jn(n, r, "Force"), Jn(i, a, "Impulse"), n === 0 && r === 0 && i === 0 && a === 0) return;
|
|
1367
|
+
let o = e.get(t) ?? hn(), s = {
|
|
1278
1368
|
...o,
|
|
1279
1369
|
forceX: o.forceX + n,
|
|
1280
1370
|
forceY: o.forceY + r,
|
|
1281
1371
|
impulseX: o.impulseX + i,
|
|
1282
1372
|
impulseY: o.impulseY + a
|
|
1283
1373
|
};
|
|
1284
|
-
|
|
1374
|
+
Jn(s.forceX, s.forceY, "Accumulated force"), Jn(s.impulseX, s.impulseY, "Accumulated impulse"), e.set(t, s);
|
|
1285
1375
|
}
|
|
1286
|
-
function
|
|
1376
|
+
function Jn(e, t, n) {
|
|
1287
1377
|
if (!Number.isFinite(e) || !Number.isFinite(t)) throw Error(`${n} must contain finite numbers`);
|
|
1288
1378
|
}
|
|
1289
1379
|
//#endregion
|
|
1290
1380
|
//#region src/actions/queue-velocity-assignment.ts
|
|
1291
|
-
function
|
|
1292
|
-
|
|
1293
|
-
...e.get(t) ??
|
|
1381
|
+
function Yn(e, t, n) {
|
|
1382
|
+
Xn(n), (n.velocityX !== void 0 || n.velocityY !== void 0) && e.set(t, {
|
|
1383
|
+
...e.get(t) ?? hn(),
|
|
1294
1384
|
...n
|
|
1295
1385
|
});
|
|
1296
1386
|
}
|
|
1297
|
-
function
|
|
1387
|
+
function Xn(e) {
|
|
1298
1388
|
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");
|
|
1299
1389
|
}
|
|
1300
1390
|
//#endregion
|
|
1301
1391
|
//#region src/systems/physics-update.ts
|
|
1302
|
-
var
|
|
1392
|
+
var Zn = {
|
|
1303
1393
|
x: 0,
|
|
1304
1394
|
y: 0
|
|
1305
1395
|
};
|
|
1306
|
-
function
|
|
1396
|
+
function Qn(e = {}) {
|
|
1307
1397
|
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) => {
|
|
1308
1398
|
if (c.entity?.[n] === 1) return;
|
|
1309
|
-
if (c.body !== void 0 &&
|
|
1399
|
+
if (c.body !== void 0 && je(c.body)) {
|
|
1310
1400
|
u.entityDied(r);
|
|
1311
1401
|
return;
|
|
1312
1402
|
}
|
|
1313
|
-
let d = i ?
|
|
1403
|
+
let d = i ? er(c, i) : 0;
|
|
1314
1404
|
if (i && e.skipGroup === d) return;
|
|
1315
1405
|
let f = {
|
|
1316
1406
|
entityId: r,
|
|
1317
1407
|
components: c
|
|
1318
1408
|
}, p = c.interpolation, m = e.elapsedTime / 1e3;
|
|
1319
|
-
|
|
1409
|
+
Fn(e, r, c.velocity, c.dynamics);
|
|
1320
1410
|
let h = c.velocity[0] * m, g = c.velocity[1] * m;
|
|
1321
|
-
|
|
1411
|
+
ar(p, c.transform, e);
|
|
1322
1412
|
let _ = i ? s?.get(d) : o;
|
|
1323
1413
|
if (!_) {
|
|
1324
|
-
|
|
1414
|
+
sr(r, c.transform, h, g, u, e.reportMoves), Q(e, r, c), or(p, e.tick);
|
|
1325
1415
|
return;
|
|
1326
1416
|
}
|
|
1327
1417
|
let v = c.bounciness !== void 0, y = _.resolveMove(f, h, g, !v);
|
|
1328
|
-
if (
|
|
1418
|
+
if (sr(r, c.transform, y.moveX, y.moveY, u, e.reportMoves), Q(e, r, c), or(p, e.tick), _.hasBounciness || a || t) {
|
|
1329
1419
|
_.forEachOverlapping(f, (n) => {
|
|
1330
|
-
_.claimContact(r, n.entityId) &&
|
|
1420
|
+
_.claimContact(r, n.entityId) && tr(e, _, f, n, l, u, y.moveX, y.moveY, a, t);
|
|
1331
1421
|
}, y.moveX, y.moveY);
|
|
1332
|
-
for (let n of y.blocking) _.claimContact(r, n.entityId) &&
|
|
1422
|
+
for (let n of y.blocking) _.claimContact(r, n.entityId) && tr(e, _, f, n, l, u, y.moveX, y.moveY, a, t);
|
|
1333
1423
|
}
|
|
1334
1424
|
}, { physics: {
|
|
1335
1425
|
collision: !0,
|
|
@@ -1338,60 +1428,60 @@ function wn(e = {}) {
|
|
|
1338
1428
|
group: i
|
|
1339
1429
|
} });
|
|
1340
1430
|
return l.preRun = (e, t, n) => {
|
|
1341
|
-
|
|
1342
|
-
|
|
1431
|
+
$n(e, c), e.dieAtImpact = (t, n) => {
|
|
1432
|
+
rr(e, i ? s?.get(er(t.components, i)) : o, t, n);
|
|
1343
1433
|
};
|
|
1344
1434
|
let r = e.elapsedTime / 1e3, a = n.collidable ?? [];
|
|
1345
1435
|
if (!i) {
|
|
1346
|
-
o = new
|
|
1436
|
+
o = new Sn(a, r, e.dynamicsCommands);
|
|
1347
1437
|
return;
|
|
1348
1438
|
}
|
|
1349
1439
|
let l = /* @__PURE__ */ new Map();
|
|
1350
1440
|
for (let t of a) {
|
|
1351
|
-
let n =
|
|
1441
|
+
let n = er(t.components, i);
|
|
1352
1442
|
if (e.skipGroup === n) continue;
|
|
1353
1443
|
let r = l.get(n);
|
|
1354
1444
|
r || (r = [], l.set(n, r)), r.push(t);
|
|
1355
1445
|
}
|
|
1356
1446
|
s = /* @__PURE__ */ new Map();
|
|
1357
|
-
for (let [t, n] of l) s.set(t, new
|
|
1447
|
+
for (let [t, n] of l) s.set(t, new Sn(n, r, e.dynamicsCommands));
|
|
1358
1448
|
}, l;
|
|
1359
1449
|
}
|
|
1360
|
-
function
|
|
1450
|
+
function $n(e, t) {
|
|
1361
1451
|
let n = e, r = e.commandQueueId ?? 0, i = t.get(r);
|
|
1362
|
-
i && (e.dynamicsCommands =
|
|
1452
|
+
i && (e.dynamicsCommands = Gn(i, e.dynamicsCommands), t.delete(r));
|
|
1363
1453
|
let a = () => {
|
|
1364
1454
|
let e = t.get(r);
|
|
1365
1455
|
return e || (e = /* @__PURE__ */ new Map(), t.set(r, e)), e;
|
|
1366
1456
|
};
|
|
1367
1457
|
n.queueForce = (e, t, n) => {
|
|
1368
|
-
|
|
1458
|
+
qn(a(), e, t, n, 0, 0);
|
|
1369
1459
|
}, n.queueImpulse = (e, t, n) => {
|
|
1370
|
-
|
|
1460
|
+
qn(a(), e, 0, 0, t, n);
|
|
1371
1461
|
}, n.queueVelocity = (e, t) => {
|
|
1372
|
-
|
|
1462
|
+
Yn(a(), e, t);
|
|
1373
1463
|
};
|
|
1374
1464
|
}
|
|
1375
|
-
function
|
|
1465
|
+
function er(e, t) {
|
|
1376
1466
|
let n = e[t.component];
|
|
1377
1467
|
return n ? n[t.index] : 0;
|
|
1378
1468
|
}
|
|
1379
|
-
function
|
|
1380
|
-
if (
|
|
1381
|
-
let u =
|
|
1382
|
-
|
|
1383
|
-
normalX:
|
|
1384
|
-
normalY:
|
|
1385
|
-
}),
|
|
1469
|
+
function tr(e, t, n, r, i, a, o, s, c, l) {
|
|
1470
|
+
if (Ln(n, r, c), !l) return;
|
|
1471
|
+
let u = J(n.components), d = J(r.components);
|
|
1472
|
+
Zn.x = 0, Zn.y = 0, t.contactNormal(n, r, o, s, Zn), l(e, n, r, i, a, {
|
|
1473
|
+
normalX: Zn.x,
|
|
1474
|
+
normalY: Zn.y
|
|
1475
|
+
}), nr(e, n.entityId, n.components, u), nr(e, r.entityId, r.components, d);
|
|
1386
1476
|
}
|
|
1387
|
-
function
|
|
1388
|
-
let i =
|
|
1389
|
-
(i.minX !== r.minX || i.minY !== r.minY || i.maxX !== r.maxX || i.maxY !== r.maxY) &&
|
|
1477
|
+
function nr(e, t, n, r) {
|
|
1478
|
+
let i = J(n);
|
|
1479
|
+
(i.minX !== r.minX || i.minY !== r.minY || i.maxX !== r.maxX || i.maxY !== r.maxY) && Q(e, t, n);
|
|
1390
1480
|
}
|
|
1391
|
-
function
|
|
1481
|
+
function rr(e, t, n, r) {
|
|
1392
1482
|
let i = n.components.body;
|
|
1393
|
-
if (!i ||
|
|
1394
|
-
|
|
1483
|
+
if (!i || je(i)) return;
|
|
1484
|
+
Me(i);
|
|
1395
1485
|
let a = n.components.transform, o = n.components.velocity, s = r.components.transform, c = r.components.body;
|
|
1396
1486
|
if (!t || !a || !o || !s || !c) return;
|
|
1397
1487
|
let l = e.elapsedTime / 1e3, u = o[0] * l, d = o[1] * l;
|
|
@@ -1408,46 +1498,46 @@ function kn(e, t, n, r) {
|
|
|
1408
1498
|
} }, u, d);
|
|
1409
1499
|
a[0] = f.x, a[1] = f.y;
|
|
1410
1500
|
}
|
|
1411
|
-
function
|
|
1501
|
+
function ir(e, t, n, r, i) {
|
|
1412
1502
|
let a = e.elapsedTime / 1e3, o = n.interpolation;
|
|
1413
|
-
|
|
1503
|
+
Fn(e, t, n.velocity, n.dynamics), ar(o, n.transform, e), sr(t, n.transform, n.velocity[0] * a, n.velocity[1] * a, i, e.reportMoves), Q(e, t, n), or(o, e.tick);
|
|
1414
1504
|
}
|
|
1415
|
-
function
|
|
1505
|
+
function ar(e, t, n) {
|
|
1416
1506
|
e && (a(e, 16, NaN), e[12] = t[0], e[13] = t[1], e[14] = e[3], e[15] = e[5], a(e, 16, i(e, 4)), a(e, 4, NaN), e[11] = n.interpolationChannel ?? 0, e[3] = n.elapsedTime, e[5] += n.elapsedTime);
|
|
1417
1507
|
}
|
|
1418
|
-
function
|
|
1508
|
+
function or(e, t) {
|
|
1419
1509
|
e && a(e, 4, t);
|
|
1420
1510
|
}
|
|
1421
|
-
function
|
|
1511
|
+
function sr(e, t, n, r, i, a) {
|
|
1422
1512
|
(n !== 0 || r !== 0) && (n !== 0 && c(t, 0, n, Infinity), r !== 0 && c(t, 1, r, Infinity), a !== !1 && i.emitSystemEvent(l, e));
|
|
1423
1513
|
}
|
|
1424
1514
|
//#endregion
|
|
1425
1515
|
//#region src/systems/interpolation-channels.ts
|
|
1426
|
-
var
|
|
1427
|
-
function
|
|
1428
|
-
let n =
|
|
1429
|
-
return n || (n = [void 0],
|
|
1516
|
+
var cr = /* @__PURE__ */ new WeakMap();
|
|
1517
|
+
function lr(e, t) {
|
|
1518
|
+
let n = cr.get(e);
|
|
1519
|
+
return n || (n = [void 0], cr.set(e, n)), n.push(t), n.length - 1;
|
|
1430
1520
|
}
|
|
1431
|
-
function
|
|
1432
|
-
let n =
|
|
1521
|
+
function ur(e, t) {
|
|
1522
|
+
let n = cr.get(e);
|
|
1433
1523
|
n && t > 0 && t < n.length && (n[t] = void 0);
|
|
1434
1524
|
}
|
|
1435
|
-
function
|
|
1436
|
-
let t =
|
|
1525
|
+
function dr(e) {
|
|
1526
|
+
let t = cr.get(e);
|
|
1437
1527
|
if (t) return t.map((e) => e ? e.committedTick : NaN);
|
|
1438
1528
|
}
|
|
1439
1529
|
//#endregion
|
|
1440
1530
|
//#region src/systems/physics-system.ts
|
|
1441
|
-
var
|
|
1531
|
+
var fr = 1, pr = class extends r {
|
|
1442
1532
|
spatialWorld;
|
|
1443
1533
|
pendingDynamicsCommands = /* @__PURE__ */ new Map();
|
|
1444
|
-
commandQueueId =
|
|
1534
|
+
commandQueueId = fr++;
|
|
1445
1535
|
tick = 0;
|
|
1446
1536
|
interpolationChannel;
|
|
1447
1537
|
reportMoves;
|
|
1448
1538
|
skipGroup;
|
|
1449
1539
|
constructor(e, t = {}) {
|
|
1450
|
-
let n = t.updateFunction ??
|
|
1540
|
+
let n = t.updateFunction ?? ir, r = t.optional ?? n.physics?.optional ?? [], i = t.collision ?? n.physics?.collision ?? !1, a = n === ir || n.physics?.dynamics === !0, o = n.physics?.group, s = [];
|
|
1451
1541
|
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);
|
|
1452
1542
|
let c = s.length ? [...s, ...r] : r, l = r.includes("bounciness") ? [...r] : ["bounciness", ...r];
|
|
1453
1543
|
l.includes("polygon") || l.push("polygon"), a && !l.includes("dynamics") && l.push("dynamics"), o && !l.includes(o.component) && l.push(o.component);
|
|
@@ -1462,7 +1552,7 @@ var Rn = 1, zn = class extends r {
|
|
|
1462
1552
|
} } : void 0, f = d || t.queries ? {
|
|
1463
1553
|
...d,
|
|
1464
1554
|
...t.queries
|
|
1465
|
-
} : void 0, p =
|
|
1555
|
+
} : void 0, p = mr(t.scope, t.filter);
|
|
1466
1556
|
super(e, {
|
|
1467
1557
|
name: t.name ?? "PhysicsSystem",
|
|
1468
1558
|
deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
|
|
@@ -1476,17 +1566,17 @@ var Rn = 1, zn = class extends r {
|
|
|
1476
1566
|
getWorker: t.getWorker ?? (() => {
|
|
1477
1567
|
throw Error("PhysicsSystem cannot start a worker: no getWorker was supplied");
|
|
1478
1568
|
})
|
|
1479
|
-
}), this.spatialWorld = e, this.reportMoves = t.reportMoves, this.skipGroup = t.skipGroup, this.interpolationChannel =
|
|
1569
|
+
}), this.spatialWorld = e, this.reportMoves = t.reportMoves, this.skipGroup = t.skipGroup, this.interpolationChannel = lr(e, this);
|
|
1480
1570
|
}
|
|
1481
1571
|
get committedTick() {
|
|
1482
1572
|
return this.isCurrentlyRunning() ? this.tick - 1 : this.tick;
|
|
1483
1573
|
}
|
|
1484
1574
|
destroy() {
|
|
1485
|
-
|
|
1575
|
+
ur(this.world, this.interpolationChannel), super.destroy();
|
|
1486
1576
|
}
|
|
1487
1577
|
startInterpolation(e) {
|
|
1488
1578
|
let t = this.deltaBetweenRuns;
|
|
1489
|
-
t <= 0 ||
|
|
1579
|
+
t <= 0 || Pn(e, {
|
|
1490
1580
|
stepMs: t,
|
|
1491
1581
|
stepFraction: this.currentDelta / t,
|
|
1492
1582
|
tick: this.tick
|
|
@@ -1500,14 +1590,14 @@ var Rn = 1, zn = class extends r {
|
|
|
1500
1590
|
}
|
|
1501
1591
|
queueVelocity(e, t) {
|
|
1502
1592
|
let n = typeof e == "number" ? e : e.eid;
|
|
1503
|
-
|
|
1593
|
+
Yn(this.pendingDynamicsCommands, n, t);
|
|
1504
1594
|
}
|
|
1505
1595
|
addDataToWorld(e) {
|
|
1506
|
-
e.tick = ++this.tick, e.interpolationChannel = this.interpolationChannel,
|
|
1596
|
+
e.tick = ++this.tick, e.interpolationChannel = this.interpolationChannel, Mn(this.spatialWorld, e), e.reportMoves = this.reportMoves ?? this.listenerCount("position-updated") > 0, e.skipGroup = this.skipGroup, e.commandQueueId = this.commandQueueId, e.dynamicsCommands = this.snapshotDynamicsCommands();
|
|
1507
1597
|
}
|
|
1508
1598
|
queueDynamics(e, t, n, r, i) {
|
|
1509
1599
|
let a = typeof e == "number" ? e : e.eid;
|
|
1510
|
-
|
|
1600
|
+
qn(this.pendingDynamicsCommands, a, t, n, r, i);
|
|
1511
1601
|
}
|
|
1512
1602
|
snapshotDynamicsCommands() {
|
|
1513
1603
|
if (this.pendingDynamicsCommands.size === 0) return;
|
|
@@ -1523,12 +1613,626 @@ var Rn = 1, zn = class extends r {
|
|
|
1523
1613
|
return n;
|
|
1524
1614
|
}
|
|
1525
1615
|
};
|
|
1526
|
-
function
|
|
1616
|
+
function mr(e, t) {
|
|
1527
1617
|
return e ? t ? (n) => e(n) && t(n) : e : t;
|
|
1528
1618
|
}
|
|
1529
1619
|
//#endregion
|
|
1530
|
-
//#region src/
|
|
1531
|
-
var
|
|
1620
|
+
//#region src/pathfinding/nav-grid.ts
|
|
1621
|
+
var hr = 0, gr = class e {
|
|
1622
|
+
tilesWide;
|
|
1623
|
+
tilesHigh;
|
|
1624
|
+
cellSize;
|
|
1625
|
+
blockers;
|
|
1626
|
+
speeds;
|
|
1627
|
+
fastestSpeed = 1;
|
|
1628
|
+
regions;
|
|
1629
|
+
regionsDirty = !0;
|
|
1630
|
+
constructor(e, t, n) {
|
|
1631
|
+
if (!Number.isInteger(e) || !Number.isInteger(t) || e <= 0 || t <= 0) throw Error(`NavGrid needs a positive whole number of tiles, got ${e}x${t}`);
|
|
1632
|
+
if (!(n > 0)) throw Error(`NavGrid needs a positive cell size, got ${n}`);
|
|
1633
|
+
this.tilesWide = e, this.tilesHigh = t, this.cellSize = n, this.blockers = new Uint16Array(e * t), this.speeds = new Float32Array(e * t).fill(1), this.regions = new Int32Array(e * t);
|
|
1634
|
+
}
|
|
1635
|
+
clone() {
|
|
1636
|
+
let t = new e(this.tilesWide, this.tilesHigh, this.cellSize);
|
|
1637
|
+
return t.blockers.set(this.blockers), t.speeds.set(this.speeds), t.fastestSpeed = this.fastestSpeed, t;
|
|
1638
|
+
}
|
|
1639
|
+
get tileCount() {
|
|
1640
|
+
return this.tilesWide * this.tilesHigh;
|
|
1641
|
+
}
|
|
1642
|
+
get maxSpeed() {
|
|
1643
|
+
return this.fastestSpeed;
|
|
1644
|
+
}
|
|
1645
|
+
inBounds(e, t) {
|
|
1646
|
+
return e >= 0 && t >= 0 && e < this.tilesWide && t < this.tilesHigh;
|
|
1647
|
+
}
|
|
1648
|
+
index(e, t) {
|
|
1649
|
+
return t * this.tilesWide + e;
|
|
1650
|
+
}
|
|
1651
|
+
tileOf(e) {
|
|
1652
|
+
return Math.floor(e / this.cellSize);
|
|
1653
|
+
}
|
|
1654
|
+
tileCenter(e) {
|
|
1655
|
+
return (e + .5) * this.cellSize;
|
|
1656
|
+
}
|
|
1657
|
+
isBlocked(e, t) {
|
|
1658
|
+
return !this.inBounds(e, t) || this.blockers[this.index(e, t)] > 0;
|
|
1659
|
+
}
|
|
1660
|
+
isAreaClear(e, t, n, r) {
|
|
1661
|
+
if (!this.inBounds(e, t) || !this.inBounds(e + n - 1, t + r - 1)) return !1;
|
|
1662
|
+
for (let i = t; i < t + r; i++) for (let t = e; t < e + n; t++) if (this.blockers[this.index(t, i)] > 0) return !1;
|
|
1663
|
+
return !0;
|
|
1664
|
+
}
|
|
1665
|
+
blockerCount(e, t) {
|
|
1666
|
+
return this.inBounds(e, t) ? this.blockers[this.index(e, t)] : 0;
|
|
1667
|
+
}
|
|
1668
|
+
tilesIn(e) {
|
|
1669
|
+
return !(e.maxX > e.minX) || !(e.maxY > e.minY) ? {
|
|
1670
|
+
fromX: 0,
|
|
1671
|
+
fromY: 0,
|
|
1672
|
+
toX: -1,
|
|
1673
|
+
toY: -1
|
|
1674
|
+
} : {
|
|
1675
|
+
fromX: Math.max(0, Math.floor(e.minX / this.cellSize)),
|
|
1676
|
+
fromY: Math.max(0, Math.floor(e.minY / this.cellSize)),
|
|
1677
|
+
toX: Math.min(this.tilesWide - 1, Math.ceil(e.maxX / this.cellSize) - 1),
|
|
1678
|
+
toY: Math.min(this.tilesHigh - 1, Math.ceil(e.maxY / this.cellSize) - 1)
|
|
1679
|
+
};
|
|
1680
|
+
}
|
|
1681
|
+
addBlocker(e) {
|
|
1682
|
+
let t = this.tilesIn(e);
|
|
1683
|
+
for (let e = t.fromY; e <= t.toY; e++) for (let n = t.fromX; n <= t.toX; n++) {
|
|
1684
|
+
let t = this.index(n, e);
|
|
1685
|
+
this.blockers[t] < 65535 && this.blockers[t]++;
|
|
1686
|
+
}
|
|
1687
|
+
this.regionsDirty = !0;
|
|
1688
|
+
}
|
|
1689
|
+
removeBlocker(e) {
|
|
1690
|
+
let t = this.tilesIn(e);
|
|
1691
|
+
for (let e = t.fromY; e <= t.toY; e++) for (let n = t.fromX; n <= t.toX; n++) {
|
|
1692
|
+
let t = this.index(n, e);
|
|
1693
|
+
this.blockers[t] > 0 && this.blockers[t]--;
|
|
1694
|
+
}
|
|
1695
|
+
this.regionsDirty = !0;
|
|
1696
|
+
}
|
|
1697
|
+
setTerrainSpeed(e, t, n) {
|
|
1698
|
+
if (!(n > 0) || !Number.isFinite(n)) throw Error(`Terrain speed must be a positive finite number, got ${n}`);
|
|
1699
|
+
this.inBounds(e, t) && (this.speeds[this.index(e, t)] = n, this.fastestSpeed = Math.max(this.fastestSpeed, n));
|
|
1700
|
+
}
|
|
1701
|
+
terrainSpeed(e, t) {
|
|
1702
|
+
return this.inBounds(e, t) ? this.speeds[this.index(e, t)] : 1;
|
|
1703
|
+
}
|
|
1704
|
+
cost(e, t) {
|
|
1705
|
+
return this.cellSize / this.speeds[this.index(e, t)];
|
|
1706
|
+
}
|
|
1707
|
+
region(e, t) {
|
|
1708
|
+
return this.inBounds(e, t) ? (this.regionsDirty && this.rebuildRegions(), this.regions[this.index(e, t)]) : hr;
|
|
1709
|
+
}
|
|
1710
|
+
rebuildRegions() {
|
|
1711
|
+
let e = this.regions;
|
|
1712
|
+
e.fill(hr);
|
|
1713
|
+
let t = new Int32Array(this.tileCount), n = hr;
|
|
1714
|
+
for (let r = 0; r < e.length; r++) {
|
|
1715
|
+
if (e[r] !== hr || this.blockers[r] > 0) continue;
|
|
1716
|
+
n++, e[r] = n;
|
|
1717
|
+
let i = 0, a = 0;
|
|
1718
|
+
for (t[a++] = r; i < a;) {
|
|
1719
|
+
let e = t[i++], r = e % this.tilesWide, o = (e - r) / this.tilesWide;
|
|
1720
|
+
a = this.flood(r - 1, o, n, t, a), a = this.flood(r + 1, o, n, t, a), a = this.flood(r, o - 1, n, t, a), a = this.flood(r, o + 1, n, t, a);
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
this.regionsDirty = !1;
|
|
1724
|
+
}
|
|
1725
|
+
flood(e, t, n, r, i) {
|
|
1726
|
+
if (!this.inBounds(e, t)) return i;
|
|
1727
|
+
let a = this.index(e, t);
|
|
1728
|
+
return this.regions[a] !== hr || this.blockers[a] > 0 ? i : (this.regions[a] = n, r[i] = a, i + 1);
|
|
1729
|
+
}
|
|
1730
|
+
}, _r = class {
|
|
1731
|
+
ids;
|
|
1732
|
+
primary;
|
|
1733
|
+
secondary;
|
|
1734
|
+
count = 0;
|
|
1735
|
+
constructor(e = 64) {
|
|
1736
|
+
this.ids = new Int32Array(e), this.primary = new Float64Array(e), this.secondary = new Float64Array(e);
|
|
1737
|
+
}
|
|
1738
|
+
get size() {
|
|
1739
|
+
return this.count;
|
|
1740
|
+
}
|
|
1741
|
+
clear() {
|
|
1742
|
+
this.count = 0;
|
|
1743
|
+
}
|
|
1744
|
+
push(e, t, n = 0) {
|
|
1745
|
+
this.count === this.ids.length && this.grow();
|
|
1746
|
+
let r = this.count++;
|
|
1747
|
+
for (; r > 0;) {
|
|
1748
|
+
let e = r - 1 >> 1;
|
|
1749
|
+
if (!this.less(t, n, this.primary[e], this.secondary[e])) break;
|
|
1750
|
+
this.set(r, this.ids[e], this.primary[e], this.secondary[e]), r = e;
|
|
1751
|
+
}
|
|
1752
|
+
this.set(r, e, t, n);
|
|
1753
|
+
}
|
|
1754
|
+
pop() {
|
|
1755
|
+
if (this.count === 0) return -1;
|
|
1756
|
+
let e = this.ids[0], t = --this.count;
|
|
1757
|
+
if (t > 0) {
|
|
1758
|
+
let e = this.ids[t], n = this.primary[t], r = this.secondary[t], i = 0;
|
|
1759
|
+
for (;;) {
|
|
1760
|
+
let e = i * 2 + 1;
|
|
1761
|
+
if (e >= t) break;
|
|
1762
|
+
let a = e + 1, o = a < t && this.less(this.primary[a], this.secondary[a], this.primary[e], this.secondary[e]) ? a : e;
|
|
1763
|
+
if (!this.less(this.primary[o], this.secondary[o], n, r)) break;
|
|
1764
|
+
this.set(i, this.ids[o], this.primary[o], this.secondary[o]), i = o;
|
|
1765
|
+
}
|
|
1766
|
+
this.set(i, e, n, r);
|
|
1767
|
+
}
|
|
1768
|
+
return e;
|
|
1769
|
+
}
|
|
1770
|
+
less(e, t, n, r) {
|
|
1771
|
+
return e < n || e === n && t < r;
|
|
1772
|
+
}
|
|
1773
|
+
set(e, t, n, r) {
|
|
1774
|
+
this.ids[e] = t, this.primary[e] = n, this.secondary[e] = r;
|
|
1775
|
+
}
|
|
1776
|
+
grow() {
|
|
1777
|
+
let e = this.ids.length * 2, t = new Int32Array(e), n = new Float64Array(e), r = new Float64Array(e);
|
|
1778
|
+
t.set(this.ids), n.set(this.primary), r.set(this.secondary), this.ids = t, this.primary = n, this.secondary = r;
|
|
1779
|
+
}
|
|
1780
|
+
};
|
|
1781
|
+
//#endregion
|
|
1782
|
+
//#region src/pathfinding/line-of-sight.ts
|
|
1783
|
+
function vr(e, t, n, r, i, a, o) {
|
|
1784
|
+
let s = e.cellSize, c = r - t, l = i - n, u = o + s / 2, d = Math.floor((Math.min(n, i) - o) / s), f = Math.ceil((Math.max(n, i) + o) / s) - 1, p = 0;
|
|
1785
|
+
for (let r = d; r <= f; r++) {
|
|
1786
|
+
let i = (r + .5) * s, o, d;
|
|
1787
|
+
if (l === 0) {
|
|
1788
|
+
if (Math.abs(n - i) >= u) continue;
|
|
1789
|
+
o = -Infinity, d = Infinity;
|
|
1790
|
+
} else {
|
|
1791
|
+
let e = (i - u - n) / l, t = (i + u - n) / l;
|
|
1792
|
+
o = Math.min(e, t), d = Math.max(e, t);
|
|
1793
|
+
}
|
|
1794
|
+
let f = Math.max(o, 0), m = Math.min(d, 1);
|
|
1795
|
+
if (f > m || f === m && !(o < f && m < d)) continue;
|
|
1796
|
+
let h = t + c * f, g = t + c * m, _ = Math.floor((Math.min(h, g) - a) / s), v = Math.ceil((Math.max(h, g) + a) / s) - 1;
|
|
1797
|
+
for (let t = _; t <= v; t++) {
|
|
1798
|
+
if (e.isBlocked(t, r)) return Infinity;
|
|
1799
|
+
p = Math.max(p, 1 / e.terrainSpeed(t, r));
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
return p;
|
|
1803
|
+
}
|
|
1804
|
+
//#endregion
|
|
1805
|
+
//#region src/pathfinding/smooth-path.ts
|
|
1806
|
+
var yr = 24;
|
|
1807
|
+
function br(e, t, n, r, i) {
|
|
1808
|
+
let a = Cr(t);
|
|
1809
|
+
if (a.length <= 2) return a;
|
|
1810
|
+
let o = new Float64Array(a.length);
|
|
1811
|
+
for (let t = 1; t < a.length; t++) o[t] = o[t - 1] + xr(e, a[t - 1], a[t], n, r);
|
|
1812
|
+
let s = [0];
|
|
1813
|
+
for (let e = 1; e < a.length - 1; e++) Sr(a[e - 1], a[e], a[e + 1]) || s.push(e);
|
|
1814
|
+
s.push(a.length - 1);
|
|
1815
|
+
let c = [a[0]], l = 0;
|
|
1816
|
+
for (; l < s.length - 1;) {
|
|
1817
|
+
let t = l + 1, u = Math.min(s.length - 1, l + yr);
|
|
1818
|
+
for (let c = l + 2; c <= u; c++) {
|
|
1819
|
+
let u = a[s[l]], d = a[s[c]], f = vr(e, u.x, u.y, d.x, d.y, n + i, r + i), p = Math.hypot(d.x - u.x, d.y - u.y) * f;
|
|
1820
|
+
Number.isFinite(p) && p <= o[s[c]] - o[s[l]] + 1e-6 && (t = c);
|
|
1821
|
+
}
|
|
1822
|
+
c.push(a[s[t]]), l = t;
|
|
1823
|
+
}
|
|
1824
|
+
return c;
|
|
1825
|
+
}
|
|
1826
|
+
function xr(e, t, n, r, i) {
|
|
1827
|
+
let a = Math.hypot(n.x - t.x, n.y - t.y), o = vr(e, t.x, t.y, n.x, n.y, r, i);
|
|
1828
|
+
return a * (Number.isFinite(o) ? o : 1 / e.terrainSpeed(e.tileOf(n.x), e.tileOf(n.y)));
|
|
1829
|
+
}
|
|
1830
|
+
function Sr(e, t, n) {
|
|
1831
|
+
return Math.abs((t.x - e.x) * (n.y - t.y) - (t.y - e.y) * (n.x - t.x)) < 1e-9 && (t.x - e.x) * (n.x - t.x) + (t.y - e.y) * (n.y - t.y) > 0;
|
|
1832
|
+
}
|
|
1833
|
+
function Cr(e) {
|
|
1834
|
+
let t = [];
|
|
1835
|
+
for (let n of e) {
|
|
1836
|
+
let e = t[t.length - 1];
|
|
1837
|
+
(!e || e.x !== n.x || e.y !== n.y) && t.push(n);
|
|
1838
|
+
}
|
|
1839
|
+
return t;
|
|
1840
|
+
}
|
|
1841
|
+
//#endregion
|
|
1842
|
+
//#region src/pathfinding/grid-a-star.ts
|
|
1843
|
+
var wr = 5e4, Tr = 0, Er = 16, Dr = [
|
|
1844
|
+
[-1, 0],
|
|
1845
|
+
[1, 0],
|
|
1846
|
+
[0, -1],
|
|
1847
|
+
[0, 1]
|
|
1848
|
+
], Or = [
|
|
1849
|
+
[-1, -1],
|
|
1850
|
+
[1, -1],
|
|
1851
|
+
[-1, 1],
|
|
1852
|
+
[1, 1]
|
|
1853
|
+
], kr = class {
|
|
1854
|
+
diagonal;
|
|
1855
|
+
maxIterations;
|
|
1856
|
+
smooth;
|
|
1857
|
+
clearance;
|
|
1858
|
+
relocateRadius;
|
|
1859
|
+
heap = new _r(256);
|
|
1860
|
+
cost = /* @__PURE__ */ new Float64Array();
|
|
1861
|
+
parent = /* @__PURE__ */ new Int32Array();
|
|
1862
|
+
seen = /* @__PURE__ */ new Uint32Array();
|
|
1863
|
+
closed = /* @__PURE__ */ new Uint32Array();
|
|
1864
|
+
stamp = 0;
|
|
1865
|
+
constructor(e = {}) {
|
|
1866
|
+
this.diagonal = e.diagonal ?? !1, this.maxIterations = e.maxIterations ?? wr, this.smooth = e.smooth ?? !0, this.clearance = e.clearance ?? Tr, this.relocateRadius = e.relocateRadius ?? Er;
|
|
1867
|
+
}
|
|
1868
|
+
findPath(e, t) {
|
|
1869
|
+
let n = e.cellSize, r = Math.max(1, Math.ceil(t.agentWidth / n - 1e-9)), i = Math.max(1, Math.ceil(t.agentHeight / n - 1e-9));
|
|
1870
|
+
if (r > e.tilesWide || i > e.tilesHigh) return {
|
|
1871
|
+
status: I.Unreachable,
|
|
1872
|
+
points: [],
|
|
1873
|
+
iterations: 0
|
|
1874
|
+
};
|
|
1875
|
+
let a = (e, t) => ({
|
|
1876
|
+
x: Math.round((e - r * n / 2) / n),
|
|
1877
|
+
y: Math.round((t - i * n / 2) / n)
|
|
1878
|
+
}), o = (t) => ({
|
|
1879
|
+
x: jr(t.x, 0, e.tilesWide - r),
|
|
1880
|
+
y: jr(t.y, 0, e.tilesHigh - i)
|
|
1881
|
+
}), s = (e) => ({
|
|
1882
|
+
x: (e.x + r / 2) * n,
|
|
1883
|
+
y: (e.y + i / 2) * n
|
|
1884
|
+
}), c = this.relocate(e, o(a(t.startX, t.startY)), r, i, t.startX, t.startY, t.goalX, t.goalY), l = a(t.goalX, t.goalY), u = this.relocate(e, o(l), r, i, t.goalX, t.goalY, t.startX, t.startY);
|
|
1885
|
+
if (!c || !u || e.region(c.x, c.y) !== e.region(u.x, u.y)) return {
|
|
1886
|
+
status: I.Unreachable,
|
|
1887
|
+
points: [],
|
|
1888
|
+
iterations: 0
|
|
1889
|
+
};
|
|
1890
|
+
let d = u.x !== l.x || u.y !== l.y, f = this.search(e, c, u, r, i), p = [{
|
|
1891
|
+
x: t.startX,
|
|
1892
|
+
y: t.startY
|
|
1893
|
+
}];
|
|
1894
|
+
for (let t of f.tiles) p.push(s({
|
|
1895
|
+
x: t % e.tilesWide,
|
|
1896
|
+
y: Math.floor(t / e.tilesWide)
|
|
1897
|
+
}));
|
|
1898
|
+
let m = f.status;
|
|
1899
|
+
if (m === I.Found) {
|
|
1900
|
+
let n = s(u);
|
|
1901
|
+
d || !Number.isFinite(vr(e, n.x, n.y, t.goalX, t.goalY, t.agentWidth / 2, t.agentHeight / 2)) ? m = I.Unreachable : p.push({
|
|
1902
|
+
x: t.goalX,
|
|
1903
|
+
y: t.goalY
|
|
1904
|
+
});
|
|
1905
|
+
}
|
|
1906
|
+
let h = t.agentWidth / 2, g = t.agentHeight / 2, _ = this.smooth ? br(e, p, h, g, this.clearance) : Mr(p);
|
|
1907
|
+
return {
|
|
1908
|
+
status: m,
|
|
1909
|
+
points: _.slice(1),
|
|
1910
|
+
iterations: f.iterations
|
|
1911
|
+
};
|
|
1912
|
+
}
|
|
1913
|
+
relocate(e, t, n, r, i, a, o, s) {
|
|
1914
|
+
if (e.isAreaClear(t.x, t.y, n, r)) return t;
|
|
1915
|
+
let c = e.cellSize;
|
|
1916
|
+
for (let l = 1; l <= this.relocateRadius; l++) {
|
|
1917
|
+
let u, d = Infinity, f = Infinity;
|
|
1918
|
+
for (let p = t.y - l; p <= t.y + l; p++) {
|
|
1919
|
+
let m = p === t.y - l || p === t.y + l;
|
|
1920
|
+
for (let h = t.x - l; h <= t.x + l; h += m ? 1 : l * 2) {
|
|
1921
|
+
if (!e.isAreaClear(h, p, n, r)) continue;
|
|
1922
|
+
let t = (h + n / 2) * c, l = (p + r / 2) * c, m = Math.hypot(t - i, l - a), g = Math.hypot(t - o, l - s);
|
|
1923
|
+
(m < d || m === d && g < f) && (u = {
|
|
1924
|
+
x: h,
|
|
1925
|
+
y: p
|
|
1926
|
+
}, d = m, f = g);
|
|
1927
|
+
}
|
|
1928
|
+
}
|
|
1929
|
+
if (u) return u;
|
|
1930
|
+
}
|
|
1931
|
+
}
|
|
1932
|
+
search(e, t, n, r, i) {
|
|
1933
|
+
this.prepare(e.tileCount);
|
|
1934
|
+
let a = this.stamp, { cost: o, parent: s, seen: c, closed: l, heap: u } = this, d = e.tilesWide, f = e.index(t.x, t.y), p = e.index(n.x, n.y), m = e.cellSize / e.maxSpeed, h = (e, t) => {
|
|
1935
|
+
let r = Math.abs(e - n.x), i = Math.abs(t - n.y);
|
|
1936
|
+
return (this.diagonal ? Math.max(r, i) + (Math.SQRT2 - 1) * Math.min(r, i) : r + i) * m;
|
|
1937
|
+
};
|
|
1938
|
+
u.clear(), c[f] = a, o[f] = 0, s[f] = -1, u.push(f, h(t.x, t.y), h(t.x, t.y));
|
|
1939
|
+
let g = f, _ = h(t.x, t.y), v = 0;
|
|
1940
|
+
for (; u.size > 0;) {
|
|
1941
|
+
let t = u.pop();
|
|
1942
|
+
if (l[t] === a) continue;
|
|
1943
|
+
if (t === p) return {
|
|
1944
|
+
status: I.Found,
|
|
1945
|
+
tiles: this.trace(t),
|
|
1946
|
+
iterations: v
|
|
1947
|
+
};
|
|
1948
|
+
if (v >= this.maxIterations) return {
|
|
1949
|
+
status: I.Incomplete,
|
|
1950
|
+
tiles: this.trace(g),
|
|
1951
|
+
iterations: v
|
|
1952
|
+
};
|
|
1953
|
+
l[t] = a, v++;
|
|
1954
|
+
let n = t % d, s = (t - n) / d, c = h(n, s);
|
|
1955
|
+
(c < _ || c === _ && o[t] < o[g]) && (g = t, _ = c);
|
|
1956
|
+
for (let [a, o] of Dr) this.relax(e, t, n + a, s + o, 1, r, i, h);
|
|
1957
|
+
if (this.diagonal) for (let [a, o] of Or) e.isAreaClear(n + a, s, r, i) && e.isAreaClear(n, s + o, r, i) && this.relax(e, t, n + a, s + o, Math.SQRT2, r, i, h);
|
|
1958
|
+
}
|
|
1959
|
+
return {
|
|
1960
|
+
status: I.Unreachable,
|
|
1961
|
+
tiles: this.trace(g),
|
|
1962
|
+
iterations: v
|
|
1963
|
+
};
|
|
1964
|
+
}
|
|
1965
|
+
relax(e, t, n, r, i, a, o, s) {
|
|
1966
|
+
if (!e.isAreaClear(n, r, a, o)) return;
|
|
1967
|
+
let c = e.index(n, r);
|
|
1968
|
+
if (this.closed[c] === this.stamp) return;
|
|
1969
|
+
let l = this.cost[t] + i * Ar(e, n, r, a, o);
|
|
1970
|
+
if (this.seen[c] === this.stamp && l >= this.cost[c]) return;
|
|
1971
|
+
this.seen[c] = this.stamp, this.cost[c] = l, this.parent[c] = t;
|
|
1972
|
+
let u = s(n, r);
|
|
1973
|
+
this.heap.push(c, l + u, u);
|
|
1974
|
+
}
|
|
1975
|
+
trace(e) {
|
|
1976
|
+
let t = 0;
|
|
1977
|
+
for (let n = e; n !== -1; n = this.parent[n]) t++;
|
|
1978
|
+
let n = Array.from({ length: t }, () => 0);
|
|
1979
|
+
for (let r = e, i = t - 1; r !== -1; r = this.parent[r], i--) n[i] = r;
|
|
1980
|
+
return n;
|
|
1981
|
+
}
|
|
1982
|
+
prepare(e) {
|
|
1983
|
+
this.cost.length !== e && (this.cost = new Float64Array(e), this.parent = new Int32Array(e), this.seen = new Uint32Array(e), this.closed = new Uint32Array(e), this.stamp = 0), this.stamp++, this.stamp === 4294967295 && (this.seen.fill(0), this.closed.fill(0), this.stamp = 1);
|
|
1984
|
+
}
|
|
1985
|
+
};
|
|
1986
|
+
function Ar(e, t, n, r, i) {
|
|
1987
|
+
if (r === 1 && i === 1) return e.cost(t, n);
|
|
1988
|
+
let a = 0;
|
|
1989
|
+
for (let o = n; o < n + i; o++) for (let n = t; n < t + r; n++) a += e.cost(n, o);
|
|
1990
|
+
return a / (r * i);
|
|
1991
|
+
}
|
|
1992
|
+
function jr(e, t, n) {
|
|
1993
|
+
return Math.min(n, Math.max(t, e));
|
|
1994
|
+
}
|
|
1995
|
+
function Mr(e) {
|
|
1996
|
+
return e.filter((t, n) => n === 0 || t.x !== e[n - 1].x || t.y !== e[n - 1].y);
|
|
1997
|
+
}
|
|
1998
|
+
//#endregion
|
|
1999
|
+
//#region src/pathfinding/follow-path.ts
|
|
2000
|
+
var $ = {
|
|
2001
|
+
Waiting: 0,
|
|
2002
|
+
Waypoint: 1,
|
|
2003
|
+
Goal: 2,
|
|
2004
|
+
Stuck: 3
|
|
2005
|
+
};
|
|
2006
|
+
function Nr(e, t, n, r, a) {
|
|
2007
|
+
if (Tt(e)) return $.Waiting;
|
|
2008
|
+
let o = e[4], s = e[3];
|
|
2009
|
+
for (; s < o && Math.hypot(L(e, s) - t, kt(e, s) - n) <= r;) s++;
|
|
2010
|
+
if (e[3] = s, s < o) return a.x = L(e, s), a.y = kt(e, s), $.Waypoint;
|
|
2011
|
+
let c = e[2];
|
|
2012
|
+
return c === I.Incomplete ? (wt(e), $.Waiting) : c === I.Found ? (a.x = i(e, 6), a.y = i(e, 7), $.Goal) : $.Stuck;
|
|
2013
|
+
}
|
|
2014
|
+
//#endregion
|
|
2015
|
+
//#region src/pathfinding/path-blockers.ts
|
|
2016
|
+
var Pr = "pathBlockers", Fr = "pathGates";
|
|
2017
|
+
function Ir(e = {}) {
|
|
2018
|
+
let { gateCategories: t = 0, not: n, filter: r } = e, i = {
|
|
2019
|
+
required: ["transform", "body"],
|
|
2020
|
+
not: n,
|
|
2021
|
+
filter: (e) => {
|
|
2022
|
+
let t = e.components.body;
|
|
2023
|
+
return !!t && t.blocksPath && !t.sensor && (!r || r(e));
|
|
2024
|
+
}
|
|
2025
|
+
};
|
|
2026
|
+
if (!t) return { [Pr]: i };
|
|
2027
|
+
let a = {
|
|
2028
|
+
required: ["transform", "body"],
|
|
2029
|
+
not: n,
|
|
2030
|
+
filter: (e) => {
|
|
2031
|
+
let n = e.components.body;
|
|
2032
|
+
return !!n && !n.blocksPath && !n.sensor && (n.collideCategory & t) !== 0 && (!r || r(e));
|
|
2033
|
+
}
|
|
2034
|
+
};
|
|
2035
|
+
return {
|
|
2036
|
+
[Pr]: i,
|
|
2037
|
+
[Fr]: a
|
|
2038
|
+
};
|
|
2039
|
+
}
|
|
2040
|
+
function Lr(e, t) {
|
|
2041
|
+
let n = t[0] & 7, r = e[2], i = e[3], a = zr(e[4]), o = H(n, r, i, a), s = U(n, r, i, a), c = e[0], l = e[1];
|
|
2042
|
+
return {
|
|
2043
|
+
minX: c - o,
|
|
2044
|
+
minY: l - s,
|
|
2045
|
+
maxX: c + o,
|
|
2046
|
+
maxY: l + s
|
|
2047
|
+
};
|
|
2048
|
+
}
|
|
2049
|
+
function Rr(e, t, n) {
|
|
2050
|
+
let r = [...t];
|
|
2051
|
+
for (let t of n.removed) {
|
|
2052
|
+
let n = e.get(t);
|
|
2053
|
+
n && (r.forEach((e) => e.removeBlocker(n)), e.delete(t));
|
|
2054
|
+
}
|
|
2055
|
+
for (let { entityId: t, components: i } of n.added) {
|
|
2056
|
+
let n = e.get(t);
|
|
2057
|
+
n && r.forEach((e) => e.removeBlocker(n));
|
|
2058
|
+
let { transform: a, body: o } = i;
|
|
2059
|
+
if (!(a instanceof Float32Array) || !(o instanceof Uint32Array)) {
|
|
2060
|
+
e.delete(t);
|
|
2061
|
+
continue;
|
|
2062
|
+
}
|
|
2063
|
+
let s = Lr(a, o);
|
|
2064
|
+
r.forEach((e) => e.addBlocker(s)), e.set(t, s);
|
|
2065
|
+
}
|
|
2066
|
+
return n.added.length > 0;
|
|
2067
|
+
}
|
|
2068
|
+
function zr(e) {
|
|
2069
|
+
let t = Math.round(e / (Math.PI / 2)) * Math.PI / 2;
|
|
2070
|
+
return Math.abs(e - t) < 1e-5 ? t : e;
|
|
2071
|
+
}
|
|
2072
|
+
//#endregion
|
|
2073
|
+
//#region src/pathfinding/navigation-state.ts
|
|
2074
|
+
function Br(e, t, n, r = 0) {
|
|
2075
|
+
return {
|
|
2076
|
+
grid: new gr(e, t, n),
|
|
2077
|
+
blockers: /* @__PURE__ */ new Map(),
|
|
2078
|
+
gateCategories: r,
|
|
2079
|
+
gates: /* @__PURE__ */ new Map(),
|
|
2080
|
+
gatedGrids: /* @__PURE__ */ new Map()
|
|
2081
|
+
};
|
|
2082
|
+
}
|
|
2083
|
+
function Vr(e, t) {
|
|
2084
|
+
let n = t & e.gateCategories;
|
|
2085
|
+
if (!n) return e.grid;
|
|
2086
|
+
let r = e.gatedGrids.get(n);
|
|
2087
|
+
if (!r) {
|
|
2088
|
+
r = e.grid.clone();
|
|
2089
|
+
for (let t of e.gates.values()) t.category & n && r.addBlocker(t.rect);
|
|
2090
|
+
e.gatedGrids.set(n, r);
|
|
2091
|
+
}
|
|
2092
|
+
return r;
|
|
2093
|
+
}
|
|
2094
|
+
function Hr(e, t) {
|
|
2095
|
+
let n = t & e.gateCategories, r = [...e.blockers.values()];
|
|
2096
|
+
if (n) for (let t of e.gates.values()) t.category & n && r.push(t.rect);
|
|
2097
|
+
return r;
|
|
2098
|
+
}
|
|
2099
|
+
function Ur(e, t, n, r) {
|
|
2100
|
+
e.grid.setTerrainSpeed(t, n, r);
|
|
2101
|
+
for (let i of e.gatedGrids.values()) i.setTerrainSpeed(t, n, r);
|
|
2102
|
+
}
|
|
2103
|
+
function Wr(e, t) {
|
|
2104
|
+
return Rr(e.blockers, [e.grid, ...e.gatedGrids.values()], t);
|
|
2105
|
+
}
|
|
2106
|
+
function Gr(e, t) {
|
|
2107
|
+
for (let n of t.removed) {
|
|
2108
|
+
let t = e.gates.get(n);
|
|
2109
|
+
t && (Kr(e, t.category, (e) => e.removeBlocker(t.rect)), e.gates.delete(n));
|
|
2110
|
+
}
|
|
2111
|
+
for (let { entityId: n, components: r } of t.added) {
|
|
2112
|
+
let t = e.gates.get(n);
|
|
2113
|
+
t && Kr(e, t.category, (e) => e.removeBlocker(t.rect));
|
|
2114
|
+
let { transform: i, body: a } = r;
|
|
2115
|
+
if (!(i instanceof Float32Array) || !(a instanceof Uint32Array)) {
|
|
2116
|
+
e.gates.delete(n);
|
|
2117
|
+
continue;
|
|
2118
|
+
}
|
|
2119
|
+
let o = {
|
|
2120
|
+
rect: Lr(i, a),
|
|
2121
|
+
category: a[1] & e.gateCategories
|
|
2122
|
+
};
|
|
2123
|
+
Kr(e, o.category, (e) => e.addBlocker(o.rect)), e.gates.set(n, o);
|
|
2124
|
+
}
|
|
2125
|
+
return t.added.length > 0;
|
|
2126
|
+
}
|
|
2127
|
+
function Kr(e, t, n) {
|
|
2128
|
+
for (let [r, i] of e.gatedGrids) r & t && n(i);
|
|
2129
|
+
}
|
|
2130
|
+
//#endregion
|
|
2131
|
+
//#region src/pathfinding/pathfinding-update.ts
|
|
2132
|
+
var qr = 16e3;
|
|
2133
|
+
function Jr(e = {}) {
|
|
2134
|
+
let t = e.search ?? new kr({ diagonal: !0 }), n = e.iterationBudget ?? 16e3, r = e.gateCategories ?? 0, a = (e, r, a) => {
|
|
2135
|
+
let { navigation: o, transform: s, body: c } = a;
|
|
2136
|
+
if (!o[5]) return;
|
|
2137
|
+
let l = c ? c[2] : 0, u = Vr(e.navigation, l), d = Atomics.load(o, 0);
|
|
2138
|
+
if (d === Atomics.load(o, 1)) {
|
|
2139
|
+
if (!e.blockersAdded || Zr(u, o, s)) return;
|
|
2140
|
+
d = Atomics.add(o, 0, 1) + 1;
|
|
2141
|
+
}
|
|
2142
|
+
if ((e.searchIterations ?? 0) >= (e.iterationBudget ?? n)) return;
|
|
2143
|
+
let f = {
|
|
2144
|
+
startX: s[0],
|
|
2145
|
+
startY: s[1],
|
|
2146
|
+
goalX: i(o, 6),
|
|
2147
|
+
goalY: i(o, 7),
|
|
2148
|
+
agentWidth: s[2],
|
|
2149
|
+
agentHeight: s[3]
|
|
2150
|
+
}, p = Xr(e.navigation, u, l, f);
|
|
2151
|
+
p.forEach((e) => u.removeBlocker(e));
|
|
2152
|
+
let m = t.findPath(u, f);
|
|
2153
|
+
p.forEach((e) => u.addBlocker(e)), e.searchIterations = (e.searchIterations ?? 0) + m.iterations;
|
|
2154
|
+
let h = m.status === I.Found ? m.points.slice(0, -1) : m.points;
|
|
2155
|
+
At(o, m.status === I.Incomplete && h.length === 0 ? I.Unreachable : m.status, h), Atomics.store(o, 1, d);
|
|
2156
|
+
};
|
|
2157
|
+
return a.init = (t, n, i, a) => {
|
|
2158
|
+
let o = Br(n?.tilesWide ?? 1, n?.tilesHigh ?? 1, n?.cellSize ?? 1, r);
|
|
2159
|
+
return Wr(o, {
|
|
2160
|
+
added: a.pathBlockers ?? [],
|
|
2161
|
+
removed: []
|
|
2162
|
+
}), Gr(o, {
|
|
2163
|
+
added: a.pathGates ?? [],
|
|
2164
|
+
removed: []
|
|
2165
|
+
}), {
|
|
2166
|
+
...e.init?.(o, n, a),
|
|
2167
|
+
navigation: o
|
|
2168
|
+
};
|
|
2169
|
+
}, a.queryChanged = (t, n, r, i) => {
|
|
2170
|
+
n === "pathBlockers" ? t.blockersAdded = Wr(t.navigation, r) || !!t.blockersAdded : n === "pathGates" && (t.blockersAdded = Gr(t.navigation, r) || !!t.blockersAdded), e.queryChanged?.(t, n, r, i);
|
|
2171
|
+
}, a.preRun = (t, n, r, i) => {
|
|
2172
|
+
t.searchIterations = 0, e.preRun?.(t, n, r, i);
|
|
2173
|
+
}, Object.assign(a, { pathfinding: { gateCategories: r } });
|
|
2174
|
+
}
|
|
2175
|
+
var Yr = Jr();
|
|
2176
|
+
function Xr(e, t, n, r) {
|
|
2177
|
+
let i = r.agentWidth / 2, a = r.agentHeight / 2, o = {
|
|
2178
|
+
minX: r.startX - i,
|
|
2179
|
+
minY: r.startY - a,
|
|
2180
|
+
maxX: r.startX + i,
|
|
2181
|
+
maxY: r.startY + a
|
|
2182
|
+
}, s = t.tilesIn(o), c = !0;
|
|
2183
|
+
for (let e = s.fromY; e <= s.toY && c; e++) for (let n = s.fromX; n <= s.toX && c; n++) c = t.blockerCount(n, e) === 0;
|
|
2184
|
+
return c ? [] : Hr(e, n).filter((e) => e.minX < o.maxX && e.maxX > o.minX && e.minY < o.maxY && e.maxY > o.minY);
|
|
2185
|
+
}
|
|
2186
|
+
function Zr(e, t, n) {
|
|
2187
|
+
let r = n[2] / 2, a = n[3] / 2, o = n[0], s = n[1], c = t[4];
|
|
2188
|
+
for (let n = t[3]; n <= c; n++) {
|
|
2189
|
+
let l, u;
|
|
2190
|
+
if (n < c) l = L(t, n), u = kt(t, n);
|
|
2191
|
+
else if (t[2] === I.Found) l = i(t, 6), u = i(t, 7);
|
|
2192
|
+
else break;
|
|
2193
|
+
if (!Number.isFinite(vr(e, o, s, l, u, r, a))) return !1;
|
|
2194
|
+
o = l, s = u;
|
|
2195
|
+
}
|
|
2196
|
+
return !0;
|
|
2197
|
+
}
|
|
2198
|
+
//#endregion
|
|
2199
|
+
//#region src/pathfinding/pathfinding-system.ts
|
|
2200
|
+
var Qr = class extends r {
|
|
2201
|
+
iterationBudget;
|
|
2202
|
+
constructor(e, t) {
|
|
2203
|
+
let n = t.updateFunction ?? Jr(), r = t.optional ?? [];
|
|
2204
|
+
super(e, {
|
|
2205
|
+
name: t.name ?? "PathfindingSystem",
|
|
2206
|
+
deltaBetweenRuns: t.deltaBetweenRuns ?? 50,
|
|
2207
|
+
firstRun: t.firstRun,
|
|
2208
|
+
required: ["navigation", "transform"],
|
|
2209
|
+
optional: r.includes("body") ? r : ["body", ...r],
|
|
2210
|
+
queries: {
|
|
2211
|
+
...Ir({
|
|
2212
|
+
...t.blockers,
|
|
2213
|
+
gateCategories: n.pathfinding.gateCategories
|
|
2214
|
+
}),
|
|
2215
|
+
...t.queries
|
|
2216
|
+
},
|
|
2217
|
+
updateFunction: n,
|
|
2218
|
+
getInitData: t.getInitData,
|
|
2219
|
+
forceMainThread: t.forceMainThread ?? !t.getWorker,
|
|
2220
|
+
getWorker: t.getWorker ?? (() => {
|
|
2221
|
+
throw Error("PathfindingSystem cannot start a worker: no getWorker was supplied");
|
|
2222
|
+
})
|
|
2223
|
+
}), this.iterationBudget = t.iterationBudget;
|
|
2224
|
+
}
|
|
2225
|
+
addDataToWorld(e) {
|
|
2226
|
+
e.iterationBudget = this.iterationBudget;
|
|
2227
|
+
}
|
|
2228
|
+
loaded = !1;
|
|
2229
|
+
async init() {
|
|
2230
|
+
await super.init(), this.loaded || await this.finishLoading();
|
|
2231
|
+
}
|
|
2232
|
+
finishLoading() {
|
|
2233
|
+
return this.loaded = !0, super.finishLoading();
|
|
2234
|
+
}
|
|
2235
|
+
}, $r = (e, t, n) => {
|
|
1532
2236
|
let r = n.interpolation, a = n.transform, o = i(r, 4), s = r[3], c = r[5], l = a[0], u = a[1], d = i(r, 4), m = o === d, h = e.committedTicks?.[r[11]];
|
|
1533
2237
|
if (h !== void 0 && !Number.isNaN(h) && !(m && d <= h)) {
|
|
1534
2238
|
let e = i(r, 16);
|
|
@@ -1556,14 +2260,14 @@ var Vn = (e, t, n) => {
|
|
|
1556
2260
|
y > v && (_ += Math.min(y - v, _ * p));
|
|
1557
2261
|
let b = _ / g, x = r[0], S = r[1];
|
|
1558
2262
|
r[0] = x + (l - x) * b, r[1] = S + (u - S) * b, r[7] = g - _;
|
|
1559
|
-
},
|
|
2263
|
+
}, ei = class extends r {
|
|
1560
2264
|
constructor(e, t = {}) {
|
|
1561
2265
|
super(e, {
|
|
1562
2266
|
name: t.name ?? "InterpolationSystem",
|
|
1563
2267
|
deltaBetweenRuns: 0,
|
|
1564
2268
|
firstRun: t.firstRun,
|
|
1565
2269
|
required: ["transform", "interpolation"],
|
|
1566
|
-
updateFunction:
|
|
2270
|
+
updateFunction: $r,
|
|
1567
2271
|
forceMainThread: t.forceMainThread ?? !t.getWorker,
|
|
1568
2272
|
getWorker: t.getWorker ?? (() => {
|
|
1569
2273
|
throw Error("InterpolationSystem cannot start a worker: no getWorker was supplied");
|
|
@@ -1571,10 +2275,10 @@ var Vn = (e, t, n) => {
|
|
|
1571
2275
|
});
|
|
1572
2276
|
}
|
|
1573
2277
|
addDataToWorld(e) {
|
|
1574
|
-
e.committedTicks =
|
|
2278
|
+
e.committedTicks = dr(this.world);
|
|
1575
2279
|
}
|
|
1576
2280
|
};
|
|
1577
2281
|
//#endregion
|
|
1578
|
-
export {
|
|
2282
|
+
export { Ee as BODY_BLOCKS_PATH_FLAG, ye as BODY_CATEGORY_INDEX, we as BODY_CCD_FLAG, Te as BODY_DYING_FLAG, ve as BODY_FLAGS_INDEX, be as BODY_MASK_INDEX, Ce as BODY_SENSOR_FLAG, Se as BODY_SHAPE_MASK, xe as BODY_SIZE, Le as BOUNCINESS_INDEX, Re as BOUNCINESS_SIZE, u as COLLIDABLE_QUERY, Sn as CollisionBroadphase, ge as DEFAULT_COLLIDE_CATEGORY, _e as DEFAULT_COLLIDE_MASK, qr as DEFAULT_PATH_SEARCH_ITERATION_BUDGET, d as DEFAULT_PHYSICS_STEP_MS, ie as DYNAMICS_ACCELERATION_X_INDEX, ae as DYNAMICS_ACCELERATION_Y_INDEX, oe as DYNAMICS_INVERSE_MASS_INDEX, se as DYNAMICS_SIZE, $ as FollowStep, kr as GridAStar, Qe as INTERPOLATION_CHANNEL_INDEX, We as INTERPOLATION_DURATION_INDEX, tt as INTERPOLATION_PREVIOUS_DURATION_INDEX, rt as INTERPOLATION_PREVIOUS_TICK_INDEX, nt as INTERPOLATION_PREVIOUS_TOTAL_DURATION_INDEX, $e as INTERPOLATION_PREVIOUS_X_INDEX, et as INTERPOLATION_PREVIOUS_Y_INDEX, Je as INTERPOLATION_REMAINING_DURATION_INDEX, it as INTERPOLATION_SIZE, qe as INTERPOLATION_SYNCED_DURATION_INDEX, Ze as INTERPOLATION_SYNCED_STEP_DURATION_INDEX, Ue as INTERPOLATION_SYNCED_TICK_INDEX, Ye as INTERPOLATION_TARGET_X_INDEX, Xe as INTERPOLATION_TARGET_Y_INDEX, Ge as INTERPOLATION_TICK_INDEX, Ke as INTERPOLATION_TOTAL_DURATION_INDEX, Ve as INTERPOLATION_X_INDEX, He as INTERPOLATION_Y_INDEX, ei as InterpolationSystem, b as MAX_POLYGON_VERTICES, _r as MinHeap, ft as NAVIGATION_ACTIVE_INDEX, pt as NAVIGATION_GOAL_X_INDEX, mt as NAVIGATION_GOAL_Y_INDEX, gt as NAVIGATION_MAX_WAYPOINTS, lt as NAVIGATION_OUTCOME_INDEX, st as NAVIGATION_REQUEST_INDEX, ct as NAVIGATION_RESULT_INDEX, _t as NAVIGATION_SIZE, ht as NAVIGATION_WAYPOINTS_INDEX, dt as NAVIGATION_WAYPOINT_COUNT_INDEX, ut as NAVIGATION_WAYPOINT_INDEX, gr as NavGrid, Pr as PATH_BLOCKERS_QUERY, Fr as PATH_GATES_QUERY, C as POLYGON_SIZE, x as POLYGON_VERTEX_COUNT_INDEX, S as POLYGON_VERTICES_INDEX, l as POSITION_UPDATED_EVENT, I as PathStatus, Qr as PathfindingSystem, $t as PhysicalWorld, pr as PhysicsSystem, me as SHAPE_CAPSULE, pe as SHAPE_CIRCLE, he as SHAPE_POLYGON, fe as SHAPE_RECTANGLE, kn as SpatialIndex, v as TRANSFORM_ANGLE_INDEX, _ as TRANSFORM_HEIGHT_INDEX, y as TRANSFORM_SIZE, g as TRANSFORM_WIDTH_INDEX, m as TRANSFORM_X_INDEX, h as TRANSFORM_Y_INDEX, te as VELOCITY_DAMPING_INDEX, ne as VELOCITY_SIZE, j as VELOCITY_X_INDEX, ee as VELOCITY_Y_INDEX, Mn as addPhysicalWorldData, Wr as applyPathBlockerChanges, Gr as applyPathGateChanges, Rr as applyRectChanges, Lr as blockerRect, Hr as blockingRects, Ae as blocksPath, Pe as bodyDefinition, P as bodyShape, Be as bouncinessDefinition, Gt as boundsHalfHeight, Wt as boundsHalfWidth, Oe as canCollide, V as capsuleCoreAngle, B as capsuleHalfLength, Lt as contactNormal, Br as createNavigationState, Jr as createPathfindingUpdate, Qn as createPhysicsUpdate, le as dynamicsDefinition, Nr as followPath, An as getSpatialMap, Fn as integrateDynamics, ot as interpolationDefinition, $r as interpolationUpdate, ke as isContinuous, je as isDying, Ct as isNavigating, Tt as isPathPending, F as isSensor, Et as isUnreachable, Me as markDying, bt as navigateTo, yt as navigationDefinition, Dt as navigationGoal, Vr as navigationGridFor, Mt as navigationRegistry, Kt as orientedBoxesOverlap, Ir as pathBlockerQueries, Yr as pathfindingUpdate, jt as physicsRegistry, ir as physicsUpdate, K as pointSegmentDistanceSquared, rn as polygonContactNormal, T as polygonDefinition, nn as polygonShapesOverlap, E as preparePolygon, wt as requestPath, Jt as segmentBoxDistanceSquared, qt as segmentSegmentDistanceSquared, jn as setEntityPosition, xt as setNavigationGoal, Ur as setNavigationTerrainSpeed, U as shapeHalfHeight, H as shapeHalfWidth, Pt as shapeIsEmpty, Nt as shapeRadius, Ft as shapesOverlap, br as smoothPath, Nn as snapEntity, Pn as startSpawnInterpolation, St as stopNavigating, vr as sweepCost, A as transformDefinition, Q as updateSpatialMap, M as velocityDefinition, Ot as waypoint, L as waypointX, kt as waypointY, At as writePath };
|
|
1579
2283
|
|
|
1580
2284
|
//# sourceMappingURL=index.js.map
|