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