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