@codexo/exojs-physics 0.13.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/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/esm/Aabb.d.ts +14 -0
- package/dist/esm/Aabb.js +12 -0
- package/dist/esm/Aabb.js.map +1 -0
- package/dist/esm/Collider.d.ts +77 -0
- package/dist/esm/Collider.js +138 -0
- package/dist/esm/Collider.js.map +1 -0
- package/dist/esm/ContactGraph.d.ts +34 -0
- package/dist/esm/ContactGraph.js +157 -0
- package/dist/esm/ContactGraph.js.map +1 -0
- package/dist/esm/PhysicsBody.d.ts +103 -0
- package/dist/esm/PhysicsBody.js +186 -0
- package/dist/esm/PhysicsBody.js.map +1 -0
- package/dist/esm/PhysicsWorld.d.ts +126 -0
- package/dist/esm/PhysicsWorld.js +253 -0
- package/dist/esm/PhysicsWorld.js.map +1 -0
- package/dist/esm/TimeStepper.d.ts +39 -0
- package/dist/esm/TimeStepper.js +70 -0
- package/dist/esm/TimeStepper.js.map +1 -0
- package/dist/esm/backend/NativePhysicsBackend.d.ts +19 -0
- package/dist/esm/backend/NativePhysicsBackend.js +31 -0
- package/dist/esm/backend/NativePhysicsBackend.js.map +1 -0
- package/dist/esm/backend/PhysicsBackend.d.ts +23 -0
- package/dist/esm/binding/BindingRegistry.d.ts +21 -0
- package/dist/esm/binding/BindingRegistry.js +40 -0
- package/dist/esm/binding/BindingRegistry.js.map +1 -0
- package/dist/esm/binding/PhysicsBinding.d.ts +27 -0
- package/dist/esm/binding/PhysicsBinding.js +24 -0
- package/dist/esm/binding/PhysicsBinding.js.map +1 -0
- package/dist/esm/broadphase/BroadPhase.d.ts +22 -0
- package/dist/esm/broadphase/SweepAndPrune.d.ts +14 -0
- package/dist/esm/broadphase/SweepAndPrune.js +48 -0
- package/dist/esm/broadphase/SweepAndPrune.js.map +1 -0
- package/dist/esm/broadphase/index.d.ts +2 -0
- package/dist/esm/collision/CollisionProxy.d.ts +14 -0
- package/dist/esm/collision/Manifold.d.ts +33 -0
- package/dist/esm/collision/Manifold.js +28 -0
- package/dist/esm/collision/Manifold.js.map +1 -0
- package/dist/esm/collision/index.d.ts +3 -0
- package/dist/esm/collision/narrowphase.d.ts +14 -0
- package/dist/esm/collision/narrowphase.js +377 -0
- package/dist/esm/collision/narrowphase.js.map +1 -0
- package/dist/esm/debug/PhysicsDebugDraw.d.ts +46 -0
- package/dist/esm/debug/PhysicsDebugDraw.js +171 -0
- package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -0
- package/dist/esm/debug/index.d.ts +1 -0
- package/dist/esm/debug/index.js +2 -0
- package/dist/esm/debug/index.js.map +1 -0
- package/dist/esm/events.d.ts +35 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/math.d.ts +32 -0
- package/dist/esm/math.js +48 -0
- package/dist/esm/math.js.map +1 -0
- package/dist/esm/physicsBuildInfo.d.ts +15 -0
- package/dist/esm/physicsBuildInfo.js +8 -0
- package/dist/esm/physicsBuildInfo.js.map +1 -0
- package/dist/esm/public.d.ts +21 -0
- package/dist/esm/query/QueryEngine.d.ts +51 -0
- package/dist/esm/query/QueryEngine.js +246 -0
- package/dist/esm/query/QueryEngine.js.map +1 -0
- package/dist/esm/shapes/BoxShape.d.ts +11 -0
- package/dist/esm/shapes/BoxShape.js +29 -0
- package/dist/esm/shapes/BoxShape.js.map +1 -0
- package/dist/esm/shapes/CircleShape.d.ts +16 -0
- package/dist/esm/shapes/CircleShape.js +30 -0
- package/dist/esm/shapes/CircleShape.js.map +1 -0
- package/dist/esm/shapes/PolygonShape.d.ts +26 -0
- package/dist/esm/shapes/PolygonShape.js +156 -0
- package/dist/esm/shapes/PolygonShape.js.map +1 -0
- package/dist/esm/shapes/Shape.d.ts +26 -0
- package/dist/esm/shapes/Shape.js +16 -0
- package/dist/esm/shapes/Shape.js.map +1 -0
- package/dist/esm/shapes/index.d.ts +4 -0
- package/dist/esm/types.d.ts +39 -0
- package/dist/esm/types.js +28 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
const eps = 1e-9;
|
|
2
|
+
/**
|
|
3
|
+
* Generate the contact manifold for `a` vs `b`, writing into `manifold` and
|
|
4
|
+
* returning `true` when the colliders touch. The manifold normal is oriented
|
|
5
|
+
* from `a` toward `b`. Dispatches on shape pair; polygon/circle is handled by
|
|
6
|
+
* the circle/polygon routine with a `flip` so the normal stays `a → b`.
|
|
7
|
+
*/
|
|
8
|
+
const collide = (a, b, manifold) => {
|
|
9
|
+
manifold.reset();
|
|
10
|
+
const ta = a.shape.type;
|
|
11
|
+
const tb = b.shape.type;
|
|
12
|
+
if (ta === 'circle') {
|
|
13
|
+
return tb === 'circle' ? collideCircles(a, b, manifold) : collideCirclePolygon(a, b, manifold, false);
|
|
14
|
+
}
|
|
15
|
+
return tb === 'circle' ? collideCirclePolygon(b, a, manifold, true) : collidePolygons(a, b, manifold);
|
|
16
|
+
};
|
|
17
|
+
const radiusOf = (collider) => collider.shape.radius;
|
|
18
|
+
const countOf = (collider) => collider.shape.count;
|
|
19
|
+
const collideCircles = (a, b, manifold) => {
|
|
20
|
+
const ca = a.worldCenter;
|
|
21
|
+
const cb = b.worldCenter;
|
|
22
|
+
const ra = radiusOf(a);
|
|
23
|
+
const rb = radiusOf(b);
|
|
24
|
+
let nx = cb.x - ca.x;
|
|
25
|
+
let ny = cb.y - ca.y;
|
|
26
|
+
const rsum = ra + rb;
|
|
27
|
+
const distSq = nx * nx + ny * ny;
|
|
28
|
+
if (distSq > rsum * rsum) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const dist = Math.sqrt(distSq);
|
|
32
|
+
if (dist > eps) {
|
|
33
|
+
nx /= dist;
|
|
34
|
+
ny /= dist;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
nx = 0;
|
|
38
|
+
ny = 1;
|
|
39
|
+
}
|
|
40
|
+
manifold.normalX = nx;
|
|
41
|
+
manifold.normalY = ny;
|
|
42
|
+
const point = manifold.points[0];
|
|
43
|
+
// Midpoint of the two surface contact points.
|
|
44
|
+
point.x = (ca.x + nx * ra + cb.x - nx * rb) * 0.5;
|
|
45
|
+
point.y = (ca.y + ny * ra + cb.y - ny * rb) * 0.5;
|
|
46
|
+
point.penetration = rsum - dist;
|
|
47
|
+
point.id = 0;
|
|
48
|
+
manifold.pointCount = 1;
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Circle (the `circle` collider) vs polygon. Produces the normal pointing from
|
|
53
|
+
* the circle toward the polygon; when `flip` is set (the polygon is collider A),
|
|
54
|
+
* the normal is negated so it stays `a → b`.
|
|
55
|
+
*/
|
|
56
|
+
const collideCirclePolygon = (circle, polygon, manifold, flip) => {
|
|
57
|
+
const c = circle.worldCenter;
|
|
58
|
+
const r = radiusOf(circle);
|
|
59
|
+
const verts = polygon.worldVertices;
|
|
60
|
+
const normals = polygon.worldNormals;
|
|
61
|
+
const count = countOf(polygon);
|
|
62
|
+
let maxSep = -Infinity;
|
|
63
|
+
let refEdge = 0;
|
|
64
|
+
for (let i = 0; i < count; i++) {
|
|
65
|
+
const s = normals[i * 2] * (c.x - verts[i * 2]) + normals[i * 2 + 1] * (c.y - verts[i * 2 + 1]);
|
|
66
|
+
if (s > r) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (s > maxSep) {
|
|
70
|
+
maxSep = s;
|
|
71
|
+
refEdge = i;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
let nx;
|
|
75
|
+
let ny;
|
|
76
|
+
let penetration;
|
|
77
|
+
let px;
|
|
78
|
+
let py;
|
|
79
|
+
let id;
|
|
80
|
+
if (maxSep < eps) {
|
|
81
|
+
// Centre inside the polygon: push out along the least-penetrating face.
|
|
82
|
+
nx = -normals[refEdge * 2];
|
|
83
|
+
ny = -normals[refEdge * 2 + 1];
|
|
84
|
+
penetration = r - maxSep;
|
|
85
|
+
px = c.x + nx * r;
|
|
86
|
+
py = c.y + ny * r;
|
|
87
|
+
id = refEdge;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
const j = (refEdge + 1) % count;
|
|
91
|
+
const v1x = verts[refEdge * 2];
|
|
92
|
+
const v1y = verts[refEdge * 2 + 1];
|
|
93
|
+
const v2x = verts[j * 2];
|
|
94
|
+
const v2y = verts[j * 2 + 1];
|
|
95
|
+
const u1 = (c.x - v1x) * (v2x - v1x) + (c.y - v1y) * (v2y - v1y);
|
|
96
|
+
const u2 = (c.x - v2x) * (v1x - v2x) + (c.y - v2y) * (v1y - v2y);
|
|
97
|
+
if (u1 <= 0) {
|
|
98
|
+
// Nearest feature is vertex v1 (Voronoi corner region).
|
|
99
|
+
const dx = c.x - v1x;
|
|
100
|
+
const dy = c.y - v1y;
|
|
101
|
+
const d2 = dx * dx + dy * dy;
|
|
102
|
+
if (d2 > r * r) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const d = Math.sqrt(d2);
|
|
106
|
+
nx = d > eps ? -dx / d : -normals[refEdge * 2];
|
|
107
|
+
ny = d > eps ? -dy / d : -normals[refEdge * 2 + 1];
|
|
108
|
+
penetration = r - d;
|
|
109
|
+
px = v1x;
|
|
110
|
+
py = v1y;
|
|
111
|
+
id = refEdge;
|
|
112
|
+
}
|
|
113
|
+
else if (u2 <= 0) {
|
|
114
|
+
const dx = c.x - v2x;
|
|
115
|
+
const dy = c.y - v2y;
|
|
116
|
+
const d2 = dx * dx + dy * dy;
|
|
117
|
+
if (d2 > r * r) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
const d = Math.sqrt(d2);
|
|
121
|
+
nx = d > eps ? -dx / d : -normals[refEdge * 2];
|
|
122
|
+
ny = d > eps ? -dy / d : -normals[refEdge * 2 + 1];
|
|
123
|
+
penetration = r - d;
|
|
124
|
+
px = v2x;
|
|
125
|
+
py = v2y;
|
|
126
|
+
id = j;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// Face region.
|
|
130
|
+
nx = -normals[refEdge * 2];
|
|
131
|
+
ny = -normals[refEdge * 2 + 1];
|
|
132
|
+
penetration = r - maxSep;
|
|
133
|
+
px = c.x + nx * r;
|
|
134
|
+
py = c.y + ny * r;
|
|
135
|
+
id = refEdge;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (flip) {
|
|
139
|
+
nx = -nx;
|
|
140
|
+
ny = -ny;
|
|
141
|
+
}
|
|
142
|
+
manifold.normalX = nx;
|
|
143
|
+
manifold.normalY = ny;
|
|
144
|
+
const point = manifold.points[0];
|
|
145
|
+
point.x = px;
|
|
146
|
+
point.y = py;
|
|
147
|
+
point.penetration = penetration < 0 ? 0 : penetration;
|
|
148
|
+
point.id = id;
|
|
149
|
+
manifold.pointCount = 1;
|
|
150
|
+
return true;
|
|
151
|
+
};
|
|
152
|
+
const newClipPair = () => [
|
|
153
|
+
{ x: 0, y: 0, id: 0 },
|
|
154
|
+
{ x: 0, y: 0, id: 0 },
|
|
155
|
+
];
|
|
156
|
+
/** Max separation of `b` from any face of `a`, with the supporting face index. */
|
|
157
|
+
const findMaxSeparation = (a, b) => {
|
|
158
|
+
const av = a.worldVertices;
|
|
159
|
+
const an = a.worldNormals;
|
|
160
|
+
const ac = countOf(a);
|
|
161
|
+
const bv = b.worldVertices;
|
|
162
|
+
const bc = countOf(b);
|
|
163
|
+
let best = -Infinity;
|
|
164
|
+
let bestEdge = 0;
|
|
165
|
+
for (let i = 0; i < ac; i++) {
|
|
166
|
+
const nx = an[i * 2];
|
|
167
|
+
const ny = an[i * 2 + 1];
|
|
168
|
+
const vx = av[i * 2];
|
|
169
|
+
const vy = av[i * 2 + 1];
|
|
170
|
+
// Support of b along -n = vertex of b minimising dot(n, vertex).
|
|
171
|
+
let minDot = Infinity;
|
|
172
|
+
let sx = 0;
|
|
173
|
+
let sy = 0;
|
|
174
|
+
for (let j = 0; j < bc; j++) {
|
|
175
|
+
const d = nx * bv[j * 2] + ny * bv[j * 2 + 1];
|
|
176
|
+
if (d < minDot) {
|
|
177
|
+
minDot = d;
|
|
178
|
+
sx = bv[j * 2];
|
|
179
|
+
sy = bv[j * 2 + 1];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const separation = nx * (sx - vx) + ny * (sy - vy);
|
|
183
|
+
if (separation > best) {
|
|
184
|
+
best = separation;
|
|
185
|
+
bestEdge = i;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { separation: best, edge: bestEdge };
|
|
189
|
+
};
|
|
190
|
+
/** Incident face of `inc` = the face most anti-parallel to the reference normal. */
|
|
191
|
+
const findIncidentFace = (refNx, refNy, inc, out) => {
|
|
192
|
+
const iv = inc.worldVertices;
|
|
193
|
+
const inrm = inc.worldNormals;
|
|
194
|
+
const ic = countOf(inc);
|
|
195
|
+
let minDot = Infinity;
|
|
196
|
+
let idx = 0;
|
|
197
|
+
for (let i = 0; i < ic; i++) {
|
|
198
|
+
const d = refNx * inrm[i * 2] + refNy * inrm[i * 2 + 1];
|
|
199
|
+
if (d < minDot) {
|
|
200
|
+
minDot = d;
|
|
201
|
+
idx = i;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const j = (idx + 1) % ic;
|
|
205
|
+
out[0].x = iv[idx * 2];
|
|
206
|
+
out[0].y = iv[idx * 2 + 1];
|
|
207
|
+
out[0].id = idx;
|
|
208
|
+
out[1].x = iv[j * 2];
|
|
209
|
+
out[1].y = iv[j * 2 + 1];
|
|
210
|
+
out[1].id = j;
|
|
211
|
+
};
|
|
212
|
+
/** Clip the 2-vertex segment `input` to the half-plane `dot(n, p) ≤ offset`. */
|
|
213
|
+
const clipSegment = (nx, ny, offset, input, output, syntheticId) => {
|
|
214
|
+
let count = 0;
|
|
215
|
+
const d1 = nx * input[0].x + ny * input[0].y - offset;
|
|
216
|
+
const d2 = nx * input[1].x + ny * input[1].y - offset;
|
|
217
|
+
if (d1 <= 0) {
|
|
218
|
+
copyClip(input[0], output[count++]);
|
|
219
|
+
}
|
|
220
|
+
if (d2 <= 0) {
|
|
221
|
+
copyClip(input[1], output[count++]);
|
|
222
|
+
}
|
|
223
|
+
if (d1 * d2 < 0 && count < 2) {
|
|
224
|
+
const alpha = d1 / (d1 - d2);
|
|
225
|
+
const target = output[count++];
|
|
226
|
+
target.x = input[0].x + alpha * (input[1].x - input[0].x);
|
|
227
|
+
target.y = input[0].y + alpha * (input[1].y - input[0].y);
|
|
228
|
+
target.id = syntheticId;
|
|
229
|
+
}
|
|
230
|
+
return count;
|
|
231
|
+
};
|
|
232
|
+
const copyClip = (from, to) => {
|
|
233
|
+
to.x = from.x;
|
|
234
|
+
to.y = from.y;
|
|
235
|
+
to.id = from.id;
|
|
236
|
+
};
|
|
237
|
+
const encodeId = (flip, refEdge, incidentId) => (flip ? 1 << 20 : 0) | ((refEdge & 0xff) << 12) | (incidentId & 0xfff);
|
|
238
|
+
/** Convex polygon vs convex polygon: SAT reference face + Sutherland-Hodgman clip. */
|
|
239
|
+
const collidePolygons = (a, b, manifold) => {
|
|
240
|
+
const sepA = findMaxSeparation(a, b);
|
|
241
|
+
if (sepA.separation >= 0) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
const sepB = findMaxSeparation(b, a);
|
|
245
|
+
if (sepB.separation >= 0) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
let ref;
|
|
249
|
+
let inc;
|
|
250
|
+
let refEdge;
|
|
251
|
+
let flip;
|
|
252
|
+
// Bias toward keeping A as the reference for stability (reduces ref/incident
|
|
253
|
+
// role flapping when a body rocks slightly — gate SG-M3).
|
|
254
|
+
if (sepA.separation >= sepB.separation * 0.95 + sepA.separation * 0.01) {
|
|
255
|
+
ref = a;
|
|
256
|
+
inc = b;
|
|
257
|
+
refEdge = sepA.edge;
|
|
258
|
+
flip = false;
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
ref = b;
|
|
262
|
+
inc = a;
|
|
263
|
+
refEdge = sepB.edge;
|
|
264
|
+
flip = true;
|
|
265
|
+
}
|
|
266
|
+
const rv = ref.worldVertices;
|
|
267
|
+
const rn = ref.worldNormals;
|
|
268
|
+
const rc = countOf(ref);
|
|
269
|
+
const i2 = (refEdge + 1) % rc;
|
|
270
|
+
const v1x = rv[refEdge * 2];
|
|
271
|
+
const v1y = rv[refEdge * 2 + 1];
|
|
272
|
+
const v2x = rv[i2 * 2];
|
|
273
|
+
const v2y = rv[i2 * 2 + 1];
|
|
274
|
+
const refNx = rn[refEdge * 2];
|
|
275
|
+
const refNy = rn[refEdge * 2 + 1];
|
|
276
|
+
const incident = newClipPair();
|
|
277
|
+
findIncidentFace(refNx, refNy, inc, incident);
|
|
278
|
+
// Reference-face tangent (the side-plane direction).
|
|
279
|
+
let tx = v2x - v1x;
|
|
280
|
+
let ty = v2y - v1y;
|
|
281
|
+
const tl = Math.hypot(tx, ty);
|
|
282
|
+
tx /= tl;
|
|
283
|
+
ty /= tl;
|
|
284
|
+
const negSide = -(tx * v1x + ty * v1y);
|
|
285
|
+
const posSide = tx * v2x + ty * v2y;
|
|
286
|
+
const clipped1 = newClipPair();
|
|
287
|
+
if (clipSegment(-tx, -ty, negSide, incident, clipped1, encodeId(flip, refEdge, 0xffe)) < 2) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
const clipped2 = newClipPair();
|
|
291
|
+
if (clipSegment(tx, ty, posSide, clipped1, clipped2, encodeId(flip, refEdge, 0xfff)) < 2) {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
manifold.normalX = flip ? -refNx : refNx;
|
|
295
|
+
manifold.normalY = flip ? -refNy : refNy;
|
|
296
|
+
const refC = refNx * v1x + refNy * v1y;
|
|
297
|
+
let cp = 0;
|
|
298
|
+
for (let k = 0; k < 2; k++) {
|
|
299
|
+
const separation = refNx * clipped2[k].x + refNy * clipped2[k].y - refC;
|
|
300
|
+
if (separation <= 0) {
|
|
301
|
+
const point = manifold.points[cp];
|
|
302
|
+
point.x = clipped2[k].x;
|
|
303
|
+
point.y = clipped2[k].y;
|
|
304
|
+
point.penetration = -separation;
|
|
305
|
+
point.id = encodeId(flip, refEdge, clipped2[k].id);
|
|
306
|
+
cp++;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
manifold.pointCount = cp;
|
|
310
|
+
return cp > 0;
|
|
311
|
+
};
|
|
312
|
+
/**
|
|
313
|
+
* Boolean overlap test (no manifold) used by sensors and shape-overlap queries.
|
|
314
|
+
* Exact for the circle/circle, circle/polygon and polygon/polygon pairs.
|
|
315
|
+
*/
|
|
316
|
+
const testOverlap = (a, b) => {
|
|
317
|
+
const ta = a.shape.type;
|
|
318
|
+
const tb = b.shape.type;
|
|
319
|
+
if (ta === 'circle') {
|
|
320
|
+
if (tb === 'circle') {
|
|
321
|
+
const ca = a.worldCenter;
|
|
322
|
+
const cb = b.worldCenter;
|
|
323
|
+
const rsum = radiusOf(a) + radiusOf(b);
|
|
324
|
+
const dx = cb.x - ca.x;
|
|
325
|
+
const dy = cb.y - ca.y;
|
|
326
|
+
return dx * dx + dy * dy <= rsum * rsum;
|
|
327
|
+
}
|
|
328
|
+
return circlePolygonOverlap(a, b);
|
|
329
|
+
}
|
|
330
|
+
if (tb === 'circle') {
|
|
331
|
+
return circlePolygonOverlap(b, a);
|
|
332
|
+
}
|
|
333
|
+
return findMaxSeparation(a, b).separation < 0 && findMaxSeparation(b, a).separation < 0;
|
|
334
|
+
};
|
|
335
|
+
const circlePolygonOverlap = (circle, polygon) => {
|
|
336
|
+
const c = circle.worldCenter;
|
|
337
|
+
const r = radiusOf(circle);
|
|
338
|
+
const verts = polygon.worldVertices;
|
|
339
|
+
const normals = polygon.worldNormals;
|
|
340
|
+
const count = countOf(polygon);
|
|
341
|
+
let maxSep = -Infinity;
|
|
342
|
+
let refEdge = 0;
|
|
343
|
+
for (let i = 0; i < count; i++) {
|
|
344
|
+
const s = normals[i * 2] * (c.x - verts[i * 2]) + normals[i * 2 + 1] * (c.y - verts[i * 2 + 1]);
|
|
345
|
+
if (s > r) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
if (s > maxSep) {
|
|
349
|
+
maxSep = s;
|
|
350
|
+
refEdge = i;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (maxSep < eps) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
const j = (refEdge + 1) % count;
|
|
357
|
+
const v1x = verts[refEdge * 2];
|
|
358
|
+
const v1y = verts[refEdge * 2 + 1];
|
|
359
|
+
const v2x = verts[j * 2];
|
|
360
|
+
const v2y = verts[j * 2 + 1];
|
|
361
|
+
const u1 = (c.x - v1x) * (v2x - v1x) + (c.y - v1y) * (v2y - v1y);
|
|
362
|
+
const u2 = (c.x - v2x) * (v1x - v2x) + (c.y - v2y) * (v1y - v2y);
|
|
363
|
+
if (u1 <= 0) {
|
|
364
|
+
const dx = c.x - v1x;
|
|
365
|
+
const dy = c.y - v1y;
|
|
366
|
+
return dx * dx + dy * dy <= r * r;
|
|
367
|
+
}
|
|
368
|
+
if (u2 <= 0) {
|
|
369
|
+
const dx = c.x - v2x;
|
|
370
|
+
const dy = c.y - v2y;
|
|
371
|
+
return dx * dx + dy * dy <= r * r;
|
|
372
|
+
}
|
|
373
|
+
return maxSep <= r;
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
export { collide, testOverlap };
|
|
377
|
+
//# sourceMappingURL=narrowphase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrowphase.js","sources":["../../../../src/collision/narrowphase.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Application, RenderBackend } from '@codexo/exojs';
|
|
2
|
+
import type { DebugLayerViewMode } from '@codexo/exojs/debug';
|
|
3
|
+
import { DebugLayer } from '@codexo/exojs/debug';
|
|
4
|
+
import type { PhysicsWorld } from '../PhysicsWorld';
|
|
5
|
+
/** Toggles for the physics debug overlay. */
|
|
6
|
+
export interface PhysicsDebugDrawOptions {
|
|
7
|
+
/** Collider shape outlines, coloured by body type. Default `true`. */
|
|
8
|
+
drawShapes?: boolean;
|
|
9
|
+
/** Collider world AABBs. Default `false`. */
|
|
10
|
+
drawAabb?: boolean;
|
|
11
|
+
/** Contact points. Default `false`. */
|
|
12
|
+
drawContacts?: boolean;
|
|
13
|
+
/** Contact normals. Default `false`. */
|
|
14
|
+
drawNormals?: boolean;
|
|
15
|
+
/** Body origins (centre markers). Default `false`. */
|
|
16
|
+
drawCenters?: boolean;
|
|
17
|
+
/** Broad-phase candidate links between AABB-overlapping colliders. Default `false`. */
|
|
18
|
+
drawBroadphase?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* `DebugLayer` that visualises a {@link PhysicsWorld} — shapes, AABBs, contacts,
|
|
22
|
+
* normals, centres and broad-phase links. It reads the world's public state and
|
|
23
|
+
* recomputes contacts/broad-phase locally only while visible, so it never
|
|
24
|
+
* perturbs the simulation and works over any backend. Lives in the `./debug`
|
|
25
|
+
* subpath so it tree-shakes out of production bundles.
|
|
26
|
+
*/
|
|
27
|
+
export declare class PhysicsDebugDraw extends DebugLayer {
|
|
28
|
+
/** Mutable option flags (read each frame). */
|
|
29
|
+
readonly options: Required<PhysicsDebugDrawOptions>;
|
|
30
|
+
private readonly _world;
|
|
31
|
+
private _graphics;
|
|
32
|
+
private readonly _broadPhase;
|
|
33
|
+
private readonly _manifold;
|
|
34
|
+
private readonly _pairs;
|
|
35
|
+
constructor(app: Application, world: PhysicsWorld, options?: PhysicsDebugDrawOptions);
|
|
36
|
+
get viewMode(): DebugLayerViewMode;
|
|
37
|
+
update(): void;
|
|
38
|
+
render(backend: RenderBackend): void;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
private _strokeShape;
|
|
41
|
+
private _strokeAabb;
|
|
42
|
+
private _strokeCircle;
|
|
43
|
+
private _strokeCross;
|
|
44
|
+
private _renderBroadphase;
|
|
45
|
+
private _renderContacts;
|
|
46
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Color, Graphics } from '@codexo/exojs';
|
|
2
|
+
import { DebugLayer } from '@codexo/exojs/debug';
|
|
3
|
+
import { SweepAndPrune } from '../broadphase/SweepAndPrune.js';
|
|
4
|
+
import { Manifold } from '../collision/Manifold.js';
|
|
5
|
+
import { collide } from '../collision/narrowphase.js';
|
|
6
|
+
|
|
7
|
+
const segments = 24;
|
|
8
|
+
const colorStatic = new Color(0.3, 0.9, 0.4, 0.9);
|
|
9
|
+
const colorKinematic = new Color(0.4, 0.7, 1, 0.9);
|
|
10
|
+
const colorDynamic = new Color(1, 0.85, 0.3, 0.9);
|
|
11
|
+
const colorSensor = new Color(1, 0.3, 1, 0.9);
|
|
12
|
+
const colorAabb = new Color(0.5, 0.5, 0.5, 0.5);
|
|
13
|
+
const colorContact = new Color(1, 0.2, 0.2, 1);
|
|
14
|
+
const colorNormal = new Color(1, 0.6, 0.1, 1);
|
|
15
|
+
const colorCenter = new Color(1, 1, 1, 0.9);
|
|
16
|
+
const colorBroadphase = new Color(0.2, 0.8, 0.8, 0.5);
|
|
17
|
+
/**
|
|
18
|
+
* `DebugLayer` that visualises a {@link PhysicsWorld} — shapes, AABBs, contacts,
|
|
19
|
+
* normals, centres and broad-phase links. It reads the world's public state and
|
|
20
|
+
* recomputes contacts/broad-phase locally only while visible, so it never
|
|
21
|
+
* perturbs the simulation and works over any backend. Lives in the `./debug`
|
|
22
|
+
* subpath so it tree-shakes out of production bundles.
|
|
23
|
+
*/
|
|
24
|
+
class PhysicsDebugDraw extends DebugLayer {
|
|
25
|
+
/** Mutable option flags (read each frame). */
|
|
26
|
+
options;
|
|
27
|
+
_world;
|
|
28
|
+
_graphics = null;
|
|
29
|
+
_broadPhase = new SweepAndPrune();
|
|
30
|
+
_manifold = new Manifold();
|
|
31
|
+
_pairs = [];
|
|
32
|
+
constructor(app, world, options = {}) {
|
|
33
|
+
super(app);
|
|
34
|
+
this._world = world;
|
|
35
|
+
this.options = {
|
|
36
|
+
drawShapes: options.drawShapes ?? true,
|
|
37
|
+
drawAabb: options.drawAabb ?? false,
|
|
38
|
+
drawContacts: options.drawContacts ?? false,
|
|
39
|
+
drawNormals: options.drawNormals ?? false,
|
|
40
|
+
drawCenters: options.drawCenters ?? false,
|
|
41
|
+
drawBroadphase: options.drawBroadphase ?? false,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
get viewMode() {
|
|
45
|
+
return 'world';
|
|
46
|
+
}
|
|
47
|
+
update() {
|
|
48
|
+
// All state is read from the world in render().
|
|
49
|
+
}
|
|
50
|
+
render(backend) {
|
|
51
|
+
const gfx = (this._graphics ??= new Graphics());
|
|
52
|
+
const options = this.options;
|
|
53
|
+
gfx.clear();
|
|
54
|
+
gfx.lineWidth = 1;
|
|
55
|
+
if (options.drawBroadphase) {
|
|
56
|
+
this._renderBroadphase(gfx);
|
|
57
|
+
}
|
|
58
|
+
if (options.drawAabb) {
|
|
59
|
+
for (const collider of this._world.colliders) {
|
|
60
|
+
this._strokeAabb(gfx, collider);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (options.drawShapes) {
|
|
64
|
+
for (const collider of this._world.colliders) {
|
|
65
|
+
this._strokeShape(gfx, collider);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (options.drawCenters) {
|
|
69
|
+
gfx.lineColor = colorCenter;
|
|
70
|
+
for (const body of this._world.bodies) {
|
|
71
|
+
this._strokeCross(gfx, body.x, body.y, 4);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (options.drawContacts || options.drawNormals) {
|
|
75
|
+
this._renderContacts(gfx);
|
|
76
|
+
}
|
|
77
|
+
gfx.render(backend);
|
|
78
|
+
}
|
|
79
|
+
destroy() {
|
|
80
|
+
if (this._graphics !== null) {
|
|
81
|
+
this._graphics.destroy();
|
|
82
|
+
this._graphics = null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// ── helpers ────────────────────────────────────────────────────────────
|
|
86
|
+
_strokeShape(gfx, collider) {
|
|
87
|
+
gfx.lineColor = collider.isSensor ? colorSensor : colorForType(collider.body.type);
|
|
88
|
+
if (collider.shape.type === 'circle') {
|
|
89
|
+
const c = collider.worldCenter;
|
|
90
|
+
const r = collider.shape.radius;
|
|
91
|
+
this._strokeCircle(gfx, c.x, c.y, r);
|
|
92
|
+
// A spoke to the surface conveys orientation once bodies rotate.
|
|
93
|
+
gfx.moveTo(c.x, c.y);
|
|
94
|
+
gfx.lineTo(c.x + collider.worldTransform.cos * r, c.y + collider.worldTransform.sin * r);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const verts = collider.worldVertices;
|
|
98
|
+
const count = collider.shape.count;
|
|
99
|
+
gfx.moveTo(verts[0], verts[1]);
|
|
100
|
+
for (let i = 1; i <= count; i++) {
|
|
101
|
+
const j = i % count;
|
|
102
|
+
gfx.lineTo(verts[j * 2], verts[j * 2 + 1]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_strokeAabb(gfx, collider) {
|
|
106
|
+
const box = collider.aabb;
|
|
107
|
+
gfx.lineColor = colorAabb;
|
|
108
|
+
gfx.moveTo(box.minX, box.minY);
|
|
109
|
+
gfx.lineTo(box.maxX, box.minY);
|
|
110
|
+
gfx.lineTo(box.maxX, box.maxY);
|
|
111
|
+
gfx.lineTo(box.minX, box.maxY);
|
|
112
|
+
gfx.lineTo(box.minX, box.minY);
|
|
113
|
+
}
|
|
114
|
+
_strokeCircle(gfx, cx, cy, r) {
|
|
115
|
+
gfx.moveTo(cx + r, cy);
|
|
116
|
+
for (let i = 1; i <= segments; i++) {
|
|
117
|
+
const a = (i / segments) * Math.PI * 2;
|
|
118
|
+
gfx.lineTo(cx + Math.cos(a) * r, cy + Math.sin(a) * r);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
_strokeCross(gfx, x, y, size) {
|
|
122
|
+
gfx.moveTo(x - size, y);
|
|
123
|
+
gfx.lineTo(x + size, y);
|
|
124
|
+
gfx.moveTo(x, y - size);
|
|
125
|
+
gfx.lineTo(x, y + size);
|
|
126
|
+
}
|
|
127
|
+
_renderBroadphase(gfx) {
|
|
128
|
+
this._broadPhase.computePairs(this._world.colliders, this._pairs);
|
|
129
|
+
gfx.lineColor = colorBroadphase;
|
|
130
|
+
for (const pair of this._pairs) {
|
|
131
|
+
const a = pair.a.aabb;
|
|
132
|
+
const b = pair.b.aabb;
|
|
133
|
+
gfx.moveTo((a.minX + a.maxX) * 0.5, (a.minY + a.maxY) * 0.5);
|
|
134
|
+
gfx.lineTo((b.minX + b.maxX) * 0.5, (b.minY + b.maxY) * 0.5);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
_renderContacts(gfx) {
|
|
138
|
+
this._broadPhase.computePairs(this._world.colliders, this._pairs);
|
|
139
|
+
for (const pair of this._pairs) {
|
|
140
|
+
const a = pair.a;
|
|
141
|
+
const b = pair.b;
|
|
142
|
+
if (a.isSensor || b.isSensor) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!collide(a, b, this._manifold)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
for (let i = 0; i < this._manifold.pointCount; i++) {
|
|
149
|
+
const point = this._manifold.points[i];
|
|
150
|
+
if (this.options.drawContacts) {
|
|
151
|
+
gfx.lineColor = colorContact;
|
|
152
|
+
this._strokeCross(gfx, point.x, point.y, 3);
|
|
153
|
+
}
|
|
154
|
+
if (this.options.drawNormals) {
|
|
155
|
+
gfx.lineColor = colorNormal;
|
|
156
|
+
gfx.moveTo(point.x, point.y);
|
|
157
|
+
gfx.lineTo(point.x + this._manifold.normalX * 12, point.y + this._manifold.normalY * 12);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const colorForType = (type) => {
|
|
164
|
+
if (type === 'static') {
|
|
165
|
+
return colorStatic;
|
|
166
|
+
}
|
|
167
|
+
return type === 'kinematic' ? colorKinematic : colorDynamic;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export { PhysicsDebugDraw };
|
|
171
|
+
//# sourceMappingURL=PhysicsDebugDraw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhysicsDebugDraw.js","sources":["../../../../src/debug/PhysicsDebugDraw.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AA8BA,MAAM,QAAQ,GAAG,EAAE;AAEnB,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACjD,MAAM,cAAc,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;AAC7C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAC/C,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC9C,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;AAC3C,MAAM,eAAe,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAErD;;;;;;AAMG;AACG,MAAO,gBAAiB,SAAQ,UAAU,CAAA;;AAE9B,IAAA,OAAO;AAEN,IAAA,MAAM;IACf,SAAS,GAAoB,IAAI;AACxB,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;AACjC,IAAA,SAAS,GAAG,IAAI,QAAQ,EAAE;IAC1B,MAAM,GAAoB,EAAE;AAE7C,IAAA,WAAA,CAAmB,GAAgB,EAAE,KAAmB,EAAE,UAAmC,EAAE,EAAA;QAC7F,KAAK,CAAC,GAAG,CAAC;AAEV,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;AACtC,YAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;AACnC,YAAA,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK;AAC3C,YAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;AACzC,YAAA,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;AACzC,YAAA,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;SAChD;IACH;AAEA,IAAA,IAAoB,QAAQ,GAAA;AAC1B,QAAA,OAAO,OAAO;IAChB;IAEgB,MAAM,GAAA;;IAEtB;AAEgB,IAAA,MAAM,CAAC,OAAsB,EAAA;QAC3C,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,QAAQ,EAAE,CAAC;AAC/C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;QAE5B,GAAG,CAAC,KAAK,EAAE;AACX,QAAA,GAAG,CAAC,SAAS,GAAG,CAAC;AAEjB,QAAA,IAAI,OAAO,CAAC,cAAc,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;QAC7B;AAEA,QAAA,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAC5C,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AAC5C,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC;YAClC;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,YAAA,GAAG,CAAC,SAAS,GAAG,WAAW;YAE3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACrC,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C;QACF;QAEA,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE;AAC/C,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC3B;AAEA,QAAA,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACrB;IAEgB,OAAO,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;;IAIQ,YAAY,CAAC,GAAa,EAAE,QAAkB,EAAA;QACpD,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAElF,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AACpC,YAAA,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW;AAC9B,YAAA,MAAM,CAAC,GAAI,QAAQ,CAAC,KAAqB,CAAC,MAAM;AAEhD,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;YAEpC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;YAExF;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa;AACpC,QAAA,MAAM,KAAK,GAAI,QAAQ,CAAC,KAAsB,CAAC,KAAK;AAEpD,QAAA,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAE9B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;AAEnB,YAAA,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C;IACF;IAEQ,WAAW,CAAC,GAAa,EAAE,QAAkB,EAAA;AACnD,QAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI;AAEzB,QAAA,GAAG,CAAC,SAAS,GAAG,SAAS;QACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;IAChC;AAEQ,IAAA,aAAa,CAAC,GAAa,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS,EAAA;QACpE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE;AAClC,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC;YAEtC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxD;IACF;AAEQ,IAAA,YAAY,CAAC,GAAa,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY,EAAA;QACpE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACvB,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB;AAEQ,IAAA,iBAAiB,CAAC,GAAa,EAAA;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;AACjE,QAAA,GAAG,CAAC,SAAS,GAAG,eAAe;AAE/B,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AAC9B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI;AACrB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI;YAErB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;QAC9D;IACF;AAEQ,IAAA,eAAe,CAAC,GAAa,EAAA;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;AAEjE,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AAC9B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AAChB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YAEhB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE;gBAC5B;YACF;AAEA,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;gBAClC;YACF;AAEA,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAEtC,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAC7B,oBAAA,GAAG,CAAC,SAAS,GAAG,YAAY;AAC5B,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7C;AAEA,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AAC5B,oBAAA,GAAG,CAAC,SAAS,GAAG,WAAW;oBAC3B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC5B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC;gBAC1F;YACF;QACF;IACF;AACD;AAED,MAAM,YAAY,GAAG,CAAC,IAAwC,KAAW;AACvE,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,QAAA,OAAO,WAAW;IACpB;IAEA,OAAO,IAAI,KAAK,WAAW,GAAG,cAAc,GAAG,YAAY;AAC7D,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PhysicsDebugDraw, type PhysicsDebugDrawOptions } from './PhysicsDebugDraw';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|