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