@flighthq/collision 0.4.0-next.1663.d9c5746 → 0.4.0-next.1695.181dea5
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/dist/collideContactManifold2D.d.ts +3 -0
- package/dist/collideContactManifold2D.d.ts.map +1 -0
- package/dist/{collideContactManifold.js → collideContactManifold2D.js} +6 -6
- package/dist/collideContactManifold2D.js.map +1 -0
- package/dist/collisionShapeValidation.d.ts +3 -3
- package/dist/collisionShapeValidation.d.ts.map +1 -1
- package/dist/collisionShapeValidation.js +6 -3
- package/dist/collisionShapeValidation.js.map +1 -1
- package/dist/collisionSupport2D.d.ts +12 -0
- package/dist/collisionSupport2D.d.ts.map +1 -0
- package/dist/collisionSupport2D.js +111 -0
- package/dist/collisionSupport2D.js.map +1 -0
- package/dist/contactFeatureId.js +1 -1
- package/dist/contactFeatureId.js.map +1 -1
- package/dist/contactManifold.d.ts +3 -3
- package/dist/contactManifold.d.ts.map +1 -1
- package/dist/contactManifold.js +2 -2
- package/dist/contactManifold.js.map +1 -1
- package/dist/contract.d.ts +8 -5
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +8 -5
- package/dist/contract.js.map +1 -1
- package/dist/convexVertices.d.ts +3 -3
- package/dist/convexVertices.d.ts.map +1 -1
- package/dist/convexVertices.js.map +1 -1
- package/dist/enableCollisionGuards.js +30 -11
- package/dist/enableCollisionGuards.js.map +1 -1
- package/dist/explainCollisionTest2D.d.ts +3 -0
- package/dist/explainCollisionTest2D.d.ts.map +1 -0
- package/dist/explainCollisionTest2D.js +38 -0
- package/dist/explainCollisionTest2D.js.map +1 -0
- package/dist/gjk2D.d.ts +4 -0
- package/dist/gjk2D.d.ts.map +1 -0
- package/dist/gjk2D.js +340 -0
- package/dist/gjk2D.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/manifold.d.ts +3 -3
- package/dist/manifold.d.ts.map +1 -1
- package/dist/manifold.js +2 -2
- package/dist/manifold.js.map +1 -1
- package/dist/pointContainment.d.ts +2 -2
- package/dist/pointContainment.d.ts.map +1 -1
- package/dist/pointContainment.js +3 -3
- package/dist/pointContainment.js.map +1 -1
- package/dist/raycastCollisionShape2D.d.ts +4 -0
- package/dist/raycastCollisionShape2D.d.ts.map +1 -0
- package/dist/{raycastCollisionShape.js → raycastCollisionShape2D.js} +7 -7
- package/dist/raycastCollisionShape2D.js.map +1 -0
- package/dist/registerBuiltInCollisionPairTests2D.d.ts +2 -0
- package/dist/registerBuiltInCollisionPairTests2D.d.ts.map +1 -0
- package/dist/registerBuiltInCollisionPairTests2D.js +32 -0
- package/dist/registerBuiltInCollisionPairTests2D.js.map +1 -0
- package/dist/segmentCollision.d.ts +6 -6
- package/dist/segmentCollision.d.ts.map +1 -1
- package/dist/segmentCollision.js +2 -2
- package/dist/segmentCollision.js.map +1 -1
- package/dist/shapeCollision.d.ts +11 -11
- package/dist/shapeCollision.d.ts.map +1 -1
- package/dist/shapeCollision.js +62 -65
- package/dist/shapeCollision.js.map +1 -1
- package/dist/shapeContact.d.ts +11 -11
- package/dist/shapeContact.d.ts.map +1 -1
- package/dist/shapeContact.js +12 -12
- package/dist/shapeContact.js.map +1 -1
- package/dist/sweepCollisionShape2D.d.ts +4 -0
- package/dist/sweepCollisionShape2D.d.ts.map +1 -0
- package/dist/{sweepCollisionShape.js → sweepCollisionShape2D.js} +10 -10
- package/dist/sweepCollisionShape2D.js.map +1 -0
- package/dist/testCollision2D.d.ts +4 -0
- package/dist/testCollision2D.d.ts.map +1 -0
- package/dist/testCollision2D.js +43 -0
- package/dist/testCollision2D.js.map +1 -0
- package/package.json +4 -4
- package/src/{collideContactManifold.test.ts → collideContactManifold2D.test.ts} +54 -54
- package/src/collisionShapeValidation.test.ts +13 -13
- package/src/collisionSupport2D.test.ts +166 -0
- package/src/contactManifold.test.ts +11 -11
- package/src/convexVertices.test.ts +4 -4
- package/src/enableCollisionGuards.test.ts +50 -15
- package/src/explainCollisionTest2D.test.ts +75 -0
- package/src/gjk2D.test.ts +219 -0
- package/src/manifold.test.ts +7 -7
- package/src/pointContainment.test.ts +45 -41
- package/src/{raycastCollisionShape.test.ts → raycastCollisionShape2D.test.ts} +26 -19
- package/src/registerBuiltInCollisionPairTests2D.test.ts +62 -0
- package/src/segmentCollision.test.ts +10 -10
- package/src/shapeCollision.test.ts +103 -103
- package/src/shapeContact.test.ts +76 -76
- package/src/{sweepCollisionShape.test.ts → sweepCollisionShape2D.test.ts} +26 -26
- package/src/testCollision2D.test.ts +175 -0
- package/dist/collideContactManifold.d.ts +0 -3
- package/dist/collideContactManifold.d.ts.map +0 -1
- package/dist/collideContactManifold.js.map +0 -1
- package/dist/explainCollisionTest.d.ts +0 -3
- package/dist/explainCollisionTest.d.ts.map +0 -1
- package/dist/explainCollisionTest.js +0 -21
- package/dist/explainCollisionTest.js.map +0 -1
- package/dist/raycastCollisionShape.d.ts +0 -4
- package/dist/raycastCollisionShape.d.ts.map +0 -1
- package/dist/raycastCollisionShape.js.map +0 -1
- package/dist/sweepCollisionShape.d.ts +0 -4
- package/dist/sweepCollisionShape.d.ts.map +0 -1
- package/dist/sweepCollisionShape.js.map +0 -1
- package/dist/testCollision.d.ts +0 -4
- package/dist/testCollision.d.ts.map +0 -1
- package/dist/testCollision.js +0 -97
- package/dist/testCollision.js.map +0 -1
- package/src/explainCollisionTest.test.ts +0 -52
- package/src/testCollision.test.ts +0 -97
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CollisionContactManifold2D, CollisionBuiltInShape2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function collideContactManifold2D(a: Readonly<CollisionBuiltInShape2D>, b: Readonly<CollisionBuiltInShape2D>, out: CollisionContactManifold2D): boolean;
|
|
3
|
+
//# sourceMappingURL=collideContactManifold2D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collideContactManifold2D.d.ts","sourceRoot":"","sources":["../src/collideContactManifold2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EAExB,MAAM,0BAA0B,CAAC;AA0ClC,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EACpC,CAAC,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EACpC,GAAG,EAAE,0BAA0B,GAC9B,OAAO,CAiET"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { clearCollisionContactManifold2D } from './contactManifold';
|
|
2
2
|
import { collideAabbAabbContactManifold, collideAabbObbContactManifold, collideAabbPolygonContactManifold, collideCircleAabbContactManifold, collideCircleCircleContactManifold, collideCircleObbContactManifold, collideCirclePolygonContactManifold, collideObbObbContactManifold, collideObbPolygonContactManifold, collidePolygonPolygonContactManifold, } from './shapeContact';
|
|
3
|
-
// Generic narrow-phase contact test: the `
|
|
3
|
+
// Generic narrow-phase contact test: the `testCollision2D` dispatcher's contact-resolving twin.
|
|
4
4
|
// Dispatches on the two shapes' `kind`s and writes the full contact manifold pushing **A out of B**.
|
|
5
5
|
// Shapes are ordered by kind rank before dispatch, and the normal is negated when the arguments
|
|
6
|
-
// arrived reversed, exactly as `
|
|
6
|
+
// arrived reversed, exactly as `testCollision2D` does. Contact points are world-space and need no such
|
|
7
7
|
// correction.
|
|
8
8
|
//
|
|
9
9
|
// **Argument order.** Overlap, normal, and depth are order-invariant for every pair (the normal
|
|
@@ -26,11 +26,11 @@ import { collideAabbAabbContactManifold, collideAabbObbContactManifold, collideA
|
|
|
26
26
|
//
|
|
27
27
|
// Area-less kinds (`segment`, `point`) and unknown kinds carry no contact — the pair is reported as
|
|
28
28
|
// non-overlapping. The direct per-pair functions remain the hot path.
|
|
29
|
-
export function
|
|
29
|
+
export function collideContactManifold2D(a, b, out) {
|
|
30
30
|
const rankA = contactShapeKindRank(a.kind);
|
|
31
31
|
const rankB = contactShapeKindRank(b.kind);
|
|
32
32
|
if (rankA < 0 || rankB < 0) {
|
|
33
|
-
|
|
33
|
+
clearCollisionContactManifold2D(out);
|
|
34
34
|
return false;
|
|
35
35
|
}
|
|
36
36
|
const swapped = rankA > rankB;
|
|
@@ -106,4 +106,4 @@ function contactShapeKindRank(kind) {
|
|
|
106
106
|
return -1;
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
//# sourceMappingURL=
|
|
109
|
+
//# sourceMappingURL=collideContactManifold2D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collideContactManifold2D.js","sourceRoot":"","sources":["../src/collideContactManifold2D.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
1
|
+
import type { CollisionShape2D, CollisionTestStatus } from '@flighthq/types/contract';
|
|
2
|
+
export declare function getCollisionPolygonValidationStatus2D(points: readonly number[]): CollisionTestStatus | null;
|
|
3
|
+
export declare function getCollisionShapeValidationStatus2D(shape: Readonly<CollisionShape2D>): CollisionTestStatus | null;
|
|
4
4
|
//# sourceMappingURL=collisionShapeValidation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collisionShapeValidation.d.ts","sourceRoot":"","sources":["../src/collisionShapeValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"collisionShapeValidation.d.ts","sourceRoot":"","sources":["../src/collisionShapeValidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAItF,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CA2C3G;AAOD,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,mBAAmB,GAAG,IAAI,CAwCjH"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Validates the flat polygon contract and distinguishes zero-area/malformed input from a real but
|
|
2
2
|
// non-convex polygon. Winding and collinear vertices are accepted when the polygon still has area.
|
|
3
|
-
export function
|
|
3
|
+
export function getCollisionPolygonValidationStatus2D(points) {
|
|
4
4
|
if (points.length < 6 || (points.length & 1) !== 0)
|
|
5
5
|
return 'degenerate-shape';
|
|
6
6
|
let minX = Infinity;
|
|
@@ -54,7 +54,10 @@ export function getCollisionPolygonValidationStatus(points) {
|
|
|
54
54
|
}
|
|
55
55
|
// Returns the invalid/unsupported status that prevents a shape from participating in a manifold,
|
|
56
56
|
// or null when it is a finite, positive-area member of the supported manifold shape set.
|
|
57
|
-
|
|
57
|
+
// Takes the full `CollisionShape2D` rather than the built-in union, because naming an unrecognized kind
|
|
58
|
+
// is the whole job: the registry-free queries beside it — containment, raycast, sweep, contact clipping
|
|
59
|
+
// — take `CollisionBuiltInShape2D` and reject a vendor kind at compile time instead.
|
|
60
|
+
export function getCollisionShapeValidationStatus2D(shape) {
|
|
58
61
|
switch (shape.kind) {
|
|
59
62
|
case 'circle':
|
|
60
63
|
return Number.isFinite(shape.x) && Number.isFinite(shape.y) && Number.isFinite(shape.radius) && shape.radius > 0
|
|
@@ -80,7 +83,7 @@ export function getCollisionShapeValidationStatus(shape) {
|
|
|
80
83
|
? null
|
|
81
84
|
: 'degenerate-shape';
|
|
82
85
|
case 'polygon':
|
|
83
|
-
return
|
|
86
|
+
return getCollisionPolygonValidationStatus2D(shape.points);
|
|
84
87
|
case 'segment':
|
|
85
88
|
return Number.isFinite(shape.x0) &&
|
|
86
89
|
Number.isFinite(shape.y0) &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collisionShapeValidation.js","sourceRoot":"","sources":["../src/collisionShapeValidation.ts"],"names":[],"mappings":"AAEA,kGAAkG;AAClG,mGAAmG;AACnG,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"collisionShapeValidation.js","sourceRoot":"","sources":["../src/collisionShapeValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CollisionPairTest2D, CollisionShape2D, CollisionShapeKind2D, CollisionSupport2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function getCollisionPairTest2D(kindA: CollisionShapeKind2D, kindB: CollisionShapeKind2D): CollisionPairTest2D | null;
|
|
3
|
+
export declare function getCollisionSupport2D(kind: CollisionShapeKind2D): CollisionSupport2D | null;
|
|
4
|
+
export declare function registerBuiltInCollisionSupports2D(): void;
|
|
5
|
+
export declare function registerCollisionPairTest2D(kindA: CollisionShapeKind2D, kindB: CollisionShapeKind2D, test: CollisionPairTest2D): void;
|
|
6
|
+
export declare function registerCollisionSupport2D(kind: CollisionShapeKind2D, support: CollisionSupport2D): void;
|
|
7
|
+
export declare function supportCollisionAabb2D(shape: Readonly<CollisionShape2D>, dirX: number, dirY: number, out: number[]): void;
|
|
8
|
+
export declare function supportCollisionCircle2D(shape: Readonly<CollisionShape2D>, dirX: number, dirY: number, out: number[]): void;
|
|
9
|
+
export declare function supportCollisionObb2D(shape: Readonly<CollisionShape2D>, dirX: number, dirY: number, out: number[]): void;
|
|
10
|
+
export declare function supportCollisionPolygon2D(shape: Readonly<CollisionShape2D>, dirX: number, dirY: number, out: number[]): void;
|
|
11
|
+
export declare function writeVertexListSupport2D(vertices: Readonly<ArrayLike<number>>, count: number, dirX: number, dirY: number, out: number[]): void;
|
|
12
|
+
//# sourceMappingURL=collisionSupport2D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collisionSupport2D.d.ts","sourceRoot":"","sources":["../src/collisionSupport2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,mBAAmB,EAEnB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAmBlC,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,oBAAoB,GAC1B,mBAAmB,GAAG,IAAI,CAE5B;AAKD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,GAAG,IAAI,CAE3F;AAQD,wBAAgB,kCAAkC,IAAI,IAAI,CAKzD;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,mBAAmB,GACxB,IAAI,CAEN;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAExG;AAKD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,GACZ,IAAI,CAIN;AAOD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,GACZ,IAAI,CAWN;AAKD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,GACZ,IAAI,CAGN;AAKD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,GACZ,IAAI,CAGN;AAID,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,GACZ,IAAI,CAgBN"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { writeObbVertices } from './convexVertices';
|
|
2
|
+
// The two registries the narrow phase dispatches through.
|
|
3
|
+
//
|
|
4
|
+
// A SUPPORT REGISTRY keyed by shape kind is the floor: registering one function makes a shape work
|
|
5
|
+
// against every other registered shape immediately, through GJK/EPA. A PAIR REGISTRY keyed by the
|
|
6
|
+
// ordered kind pair sits over it, so a pair that earns a faster or better-conditioned path takes it.
|
|
7
|
+
// The result is O(N) coverage with O(1) hot paths, and a new shape is useful the moment its support
|
|
8
|
+
// function exists rather than after someone authors its column of the pair matrix.
|
|
9
|
+
//
|
|
10
|
+
// Registration is explicit and last-write-wins, matching every other registry in the SDK: a caller may
|
|
11
|
+
// override a built-in binding, and collisions are avoided by the vendor-prefix convention rather than
|
|
12
|
+
// by a guard that would make overriding impossible. Nothing here registers at module load, so a bundle
|
|
13
|
+
// that never calls `registerBuiltInCollisionSupports2D` links no support math.
|
|
14
|
+
// The specialization registered for this ORDERED pair, or null. The caller tries both orders and
|
|
15
|
+
// negates the normal when the reverse one answers, because a manifold is oriented A-out-of-B.
|
|
16
|
+
export function getCollisionPairTest2D(kindA, kindB) {
|
|
17
|
+
return collisionPairTests2D.get(getCollisionPairKey2D(kindA, kindB)) ?? null;
|
|
18
|
+
}
|
|
19
|
+
// The support function registered for `kind`, or null when none is. A missing support is an expected
|
|
20
|
+
// condition rather than an error: an area-less kind has no manifold to produce, and a vendor kind
|
|
21
|
+
// nobody registered is exactly the case `explainCollisionTest2D` reports and the guard warns about.
|
|
22
|
+
export function getCollisionSupport2D(kind) {
|
|
23
|
+
return collisionSupports2D.get(kind) ?? null;
|
|
24
|
+
}
|
|
25
|
+
// Installs the four built-in area kinds' support functions. Kept an explicit assembly rather than part
|
|
26
|
+
// of module load, so a caller using only the direct typed pair functions links none of this.
|
|
27
|
+
//
|
|
28
|
+
// `segment` and `point` are deliberately absent. They are area-less by design: a support function
|
|
29
|
+
// could be written for either, and GJK would then happily report a segment "overlapping" a box with a
|
|
30
|
+
// penetration depth that means nothing a solver can act on. The absence is the boundary.
|
|
31
|
+
export function registerBuiltInCollisionSupports2D() {
|
|
32
|
+
registerCollisionSupport2D('aabb', supportCollisionAabb2D);
|
|
33
|
+
registerCollisionSupport2D('circle', supportCollisionCircle2D);
|
|
34
|
+
registerCollisionSupport2D('obb', supportCollisionObb2D);
|
|
35
|
+
registerCollisionSupport2D('polygon', supportCollisionPolygon2D);
|
|
36
|
+
}
|
|
37
|
+
export function registerCollisionPairTest2D(kindA, kindB, test) {
|
|
38
|
+
collisionPairTests2D.set(getCollisionPairKey2D(kindA, kindB), test);
|
|
39
|
+
}
|
|
40
|
+
export function registerCollisionSupport2D(kind, support) {
|
|
41
|
+
collisionSupports2D.set(kind, support);
|
|
42
|
+
}
|
|
43
|
+
// The furthest point on an axis-aligned box along a direction — the corner the direction's signs pick
|
|
44
|
+
// out, with no search. Every box support is exact and branch-cheap, which is why boxes never need a
|
|
45
|
+
// pair specialization for correctness, only for the contact points clipping gives them.
|
|
46
|
+
export function supportCollisionAabb2D(shape, dirX, dirY, out) {
|
|
47
|
+
const aabb = shape;
|
|
48
|
+
out[0] = dirX >= 0 ? aabb.maxX : aabb.minX;
|
|
49
|
+
out[1] = dirY >= 0 ? aabb.maxY : aabb.minY;
|
|
50
|
+
}
|
|
51
|
+
// The furthest point on a circle: its centre pushed one radius along the direction.
|
|
52
|
+
//
|
|
53
|
+
// This is the case a vertex list cannot express, and the reason the support function is the right
|
|
54
|
+
// primitive rather than `convexVertices` carried one step further. A zero direction has no furthest
|
|
55
|
+
// point, so the centre is returned — a legal answer that keeps a degenerate GJK step finite.
|
|
56
|
+
export function supportCollisionCircle2D(shape, dirX, dirY, out) {
|
|
57
|
+
const circle = shape;
|
|
58
|
+
const length = Math.sqrt(dirX * dirX + dirY * dirY);
|
|
59
|
+
if (length === 0) {
|
|
60
|
+
out[0] = circle.x;
|
|
61
|
+
out[1] = circle.y;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const scale = circle.radius / length;
|
|
65
|
+
out[0] = circle.x + dirX * scale;
|
|
66
|
+
out[1] = circle.y + dirY * scale;
|
|
67
|
+
}
|
|
68
|
+
// The furthest corner of an oriented box. Materialized through the shared vertex writer rather than by
|
|
69
|
+
// rotating the direction into the box's frame: both are four multiplies, and going through the same
|
|
70
|
+
// corner list the SAT core uses means the two can never disagree about where a corner is.
|
|
71
|
+
export function supportCollisionObb2D(shape, dirX, dirY, out) {
|
|
72
|
+
writeObbVertices(shape, scratchVertices);
|
|
73
|
+
writeVertexListSupport2D(scratchVertices, 4, dirX, dirY, out);
|
|
74
|
+
}
|
|
75
|
+
// The furthest vertex of a convex polygon, by linear scan. Linear rather than by hill-climbing the
|
|
76
|
+
// edge loop: a collider polygon is a handful of vertices, and a scan has no winding assumption to get
|
|
77
|
+
// wrong.
|
|
78
|
+
export function supportCollisionPolygon2D(shape, dirX, dirY, out) {
|
|
79
|
+
const points = shape.points;
|
|
80
|
+
writeVertexListSupport2D(points, points.length >> 1, dirX, dirY, out);
|
|
81
|
+
}
|
|
82
|
+
// Writes the furthest of `count` vertices along a direction, reading a flat `[x0,y0,x1,y1,...]` list.
|
|
83
|
+
// The shared tail of every polytope support.
|
|
84
|
+
export function writeVertexListSupport2D(vertices, count, dirX, dirY, out) {
|
|
85
|
+
let bestX = vertices[0];
|
|
86
|
+
let bestY = vertices[1];
|
|
87
|
+
let best = bestX * dirX + bestY * dirY;
|
|
88
|
+
for (let i = 1; i < count; i += 1) {
|
|
89
|
+
const x = vertices[i * 2];
|
|
90
|
+
const y = vertices[i * 2 + 1];
|
|
91
|
+
const projection = x * dirX + y * dirY;
|
|
92
|
+
if (projection > best) {
|
|
93
|
+
best = projection;
|
|
94
|
+
bestX = x;
|
|
95
|
+
bestY = y;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
out[0] = bestX;
|
|
99
|
+
out[1] = bestY;
|
|
100
|
+
}
|
|
101
|
+
// Packs an ordered kind pair into one map key, separated by NUL. Concatenating the two kinds directly
|
|
102
|
+
// would let `('ab','c')` and `('a','bc')` land on one entry — a collision that cannot occur among the
|
|
103
|
+
// built-ins and appears the first time someone registers a vendor kind whose name is a prefix of
|
|
104
|
+
// another, which is exactly when nobody is looking for it.
|
|
105
|
+
function getCollisionPairKey2D(kindA, kindB) {
|
|
106
|
+
return `${kindA}\u0000${kindB}`;
|
|
107
|
+
}
|
|
108
|
+
const collisionPairTests2D = new Map();
|
|
109
|
+
const collisionSupports2D = new Map();
|
|
110
|
+
const scratchVertices = new Float64Array(8);
|
|
111
|
+
//# sourceMappingURL=collisionSupport2D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collisionSupport2D.js","sourceRoot":"","sources":["../src/collisionSupport2D.ts"],"names":[],"mappings":"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"}
|
package/dist/contactFeatureId.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Contact feature identity: the packing that lets a solver recognise, next frame, that it is looking
|
|
2
2
|
// at the same contact and may reuse the impulse it converged on. Private to the package — the packed
|
|
3
|
-
// value is opaque to callers, so only `
|
|
3
|
+
// value is opaque to callers, so only `CollisionContactPoint2D.featureId` crosses the boundary.
|
|
4
4
|
// The largest vertex count whose face indices still pack without aliasing. Face indices take 25 bits
|
|
5
5
|
// each, above a 1-bit contact-point slot and below the reference-shape bit. A convex polygon at this
|
|
6
6
|
// bound carries 67 million coordinates.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contactFeatureId.js","sourceRoot":"","sources":["../src/contactFeatureId.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,qGAAqG;AACrG,
|
|
1
|
+
{"version":3,"file":"contactFeatureId.js","sourceRoot":"","sources":["../src/contactFeatureId.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,qGAAqG;AACrG,gGAAgG;AAEhG,qGAAqG;AACrG,qGAAqG;AACrG,wCAAwC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,CAAC;AAE3C,oGAAoG;AACpG,kGAAkG;AAClG,WAAW;AACX,EAAE;AACF,sGAAsG;AACtG,sGAAsG;AACtG,qGAAqG;AACrG,oGAAoG;AACpG,kGAAkG;AAClG,6FAA6F;AAC7F,MAAM,UAAU,oBAAoB,CAClC,YAAqB,EACrB,aAAqB,EACrB,YAAoB,EACpB,WAAoB;IAEpB,OAAO,CACL,CAAC,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,aAAa,GAAG,kBAAkB;QAClC,YAAY,GAAG,CAAC;QAChB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;AACJ,CAAC;AAED,MAAM,kBAAkB,GAAG,mBAAmB,GAAG,CAAC,CAAC;AACnD,MAAM,uBAAuB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function
|
|
1
|
+
import type { CollisionContactManifold2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function clearCollisionContactManifold2D(out: CollisionContactManifold2D): void;
|
|
3
|
+
export declare function createCollisionContactManifold2D(): CollisionContactManifold2D;
|
|
4
4
|
//# sourceMappingURL=contactManifold.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contactManifold.d.ts","sourceRoot":"","sources":["../src/contactManifold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"contactManifold.d.ts","sourceRoot":"","sources":["../src/contactManifold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAA2B,MAAM,0BAA0B,CAAC;AAUpG,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,0BAA0B,GAAG,IAAI,CAMrF;AAID,wBAAgB,gCAAgC,IAAI,0BAA0B,CAS7E"}
|
package/dist/contactManifold.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// count zero. The contact-point entries themselves are left untouched — `pointCount` alone bounds
|
|
6
6
|
// what is readable, so clearing does not need to walk them and a stale point can never be read
|
|
7
7
|
// through the documented contract.
|
|
8
|
-
export function
|
|
8
|
+
export function clearCollisionContactManifold2D(out) {
|
|
9
9
|
out.overlapping = false;
|
|
10
10
|
out.normalX = 0;
|
|
11
11
|
out.normalY = 0;
|
|
@@ -14,7 +14,7 @@ export function clearCollisionContactManifold(out) {
|
|
|
14
14
|
}
|
|
15
15
|
// Allocates a fresh contact manifold in the non-overlapping state, with its fixed two-point array
|
|
16
16
|
// already populated, ready to be passed as an `out` parameter.
|
|
17
|
-
export function
|
|
17
|
+
export function createCollisionContactManifold2D() {
|
|
18
18
|
return {
|
|
19
19
|
overlapping: false,
|
|
20
20
|
normalX: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contactManifold.js","sourceRoot":"","sources":["../src/contactManifold.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,mGAAmG;AACnG,+DAA+D;AAE/D,gGAAgG;AAChG,kGAAkG;AAClG,+FAA+F;AAC/F,mCAAmC;AACnC,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"contactManifold.js","sourceRoot":"","sources":["../src/contactManifold.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,mGAAmG;AACnG,+DAA+D;AAE/D,gGAAgG;AAChG,kGAAkG;AAClG,+FAA+F;AAC/F,mCAAmC;AACnC,MAAM,UAAU,+BAA+B,CAAC,GAA+B;IAC7E,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACd,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,kGAAkG;AAClG,+DAA+D;AAC/D,MAAM,UAAU,gCAAgC;IAC9C,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,kBAAkB,EAAE,EAAE,kBAAkB,EAAE,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAChD,CAAC"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './collideContactManifold2D';
|
|
2
|
+
export * from './collisionSupport2D';
|
|
2
3
|
export * from './contactManifold';
|
|
3
4
|
export * from './enableCollisionGuards';
|
|
4
|
-
export * from './
|
|
5
|
+
export * from './explainCollisionTest2D';
|
|
6
|
+
export * from './gjk2D';
|
|
5
7
|
export * from './manifold';
|
|
6
8
|
export * from './pointContainment';
|
|
7
|
-
export * from './
|
|
9
|
+
export * from './raycastCollisionShape2D';
|
|
10
|
+
export * from './registerBuiltInCollisionPairTests2D';
|
|
8
11
|
export * from './segmentCollision';
|
|
9
12
|
export * from './shapeCollision';
|
|
10
13
|
export * from './shapeContact';
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
14
|
+
export * from './sweepCollisionShape2D';
|
|
15
|
+
export * from './testCollision2D';
|
|
13
16
|
//# sourceMappingURL=contract.d.ts.map
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
package/dist/contract.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './collideContactManifold2D';
|
|
2
|
+
export * from './collisionSupport2D';
|
|
2
3
|
export * from './contactManifold';
|
|
3
4
|
export * from './enableCollisionGuards';
|
|
4
|
-
export * from './
|
|
5
|
+
export * from './explainCollisionTest2D';
|
|
6
|
+
export * from './gjk2D';
|
|
5
7
|
export * from './manifold';
|
|
6
8
|
export * from './pointContainment';
|
|
7
|
-
export * from './
|
|
9
|
+
export * from './raycastCollisionShape2D';
|
|
10
|
+
export * from './registerBuiltInCollisionPairTests2D';
|
|
8
11
|
export * from './segmentCollision';
|
|
9
12
|
export * from './shapeCollision';
|
|
10
13
|
export * from './shapeContact';
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
14
|
+
export * from './sweepCollisionShape2D';
|
|
15
|
+
export * from './testCollision2D';
|
|
13
16
|
//# sourceMappingURL=contract.js.map
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uCAAuC,CAAC;AACtD,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
|
package/dist/convexVertices.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function writeAabbVertices(aabb: Readonly<
|
|
3
|
-
export declare function writeObbVertices(obb: Readonly<
|
|
1
|
+
import type { CollisionAabb2D, CollisionObb2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function writeAabbVertices(aabb: Readonly<CollisionAabb2D>, out: Float64Array): void;
|
|
3
|
+
export declare function writeObbVertices(obb: Readonly<CollisionObb2D>, out: Float64Array): void;
|
|
4
4
|
//# sourceMappingURL=convexVertices.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convexVertices.d.ts","sourceRoot":"","sources":["../src/convexVertices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"convexVertices.d.ts","sourceRoot":"","sources":["../src/convexVertices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAQhF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAa1F;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAmBvF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convexVertices.js","sourceRoot":"","sources":["../src/convexVertices.ts"],"names":[],"mappings":"AAEA,iGAAiG;AACjG,mGAAmG;AACnG,iGAAiG;AACjG,iGAAiG;AAEjG,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"convexVertices.js","sourceRoot":"","sources":["../src/convexVertices.ts"],"names":[],"mappings":"AAEA,iGAAiG;AACjG,mGAAmG;AACnG,iGAAiG;AACjG,iGAAiG;AAEjG,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,IAA+B,EAAE,GAAiB;IAClF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,GAA6B,EAAE,GAAiB;IAC/E,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;IACjB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;IACvB,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;IACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -1,35 +1,47 @@
|
|
|
1
1
|
import { logOnce } from '@flighthq/log/contract';
|
|
2
2
|
import { LogLevel } from '@flighthq/types/contract';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { getCollisionShapeValidationStatus2D } from './collisionShapeValidation';
|
|
4
|
+
import { setCollisionTestGuard2D } from './testCollision2D';
|
|
5
5
|
export function areCollisionGuardsEnabled() {
|
|
6
6
|
return collisionGuardsEnabled;
|
|
7
7
|
}
|
|
8
8
|
export function disableCollisionGuards() {
|
|
9
|
-
|
|
9
|
+
setCollisionTestGuard2D(null);
|
|
10
10
|
collisionGuardsEnabled = false;
|
|
11
11
|
}
|
|
12
12
|
// Installs opt-in diagnostics for invalid generic manifold inputs. Direct typed pair functions stay
|
|
13
13
|
// logger-free, and applications that omit this module shed both the message text and @flighthq/log.
|
|
14
14
|
export function enableCollisionGuards() {
|
|
15
|
-
|
|
15
|
+
setCollisionTestGuard2D(warnOnInvalidCollisionShapes);
|
|
16
16
|
collisionGuardsEnabled = true;
|
|
17
17
|
}
|
|
18
|
+
// Warns on the first shape the generic dispatcher cannot resolve a manifold for.
|
|
19
|
+
//
|
|
20
|
+
// All three warnable statuses are reported, including `'unsupported-shape-kind'`, which is the one
|
|
21
|
+
// worth the most: a degenerate or non-convex shape at least LOOKS wrong at the callsite, while an
|
|
22
|
+
// unrecognized kind — a vendor collider, or a `segment` or `point`, which are area-less by design —
|
|
23
|
+
// returns a silent `false` that is indistinguishable from two shapes genuinely not touching. A missed
|
|
24
|
+
// collision is the worst sentinel this package can hand back, and it used to be the only one the
|
|
25
|
+
// guard stayed quiet about.
|
|
18
26
|
function warnOnInvalidCollisionShapes(a, b) {
|
|
19
|
-
const statusA =
|
|
20
|
-
if (statusA
|
|
27
|
+
const statusA = getCollisionShapeValidationStatus2D(a);
|
|
28
|
+
if (isWarnableCollisionStatus(statusA)) {
|
|
21
29
|
warnOnInvalidCollisionShape({ kind: a.kind, overlapping: false, shapeIndex: 0, status: statusA });
|
|
22
30
|
return;
|
|
23
31
|
}
|
|
24
|
-
const statusB =
|
|
25
|
-
if (statusB
|
|
32
|
+
const statusB = getCollisionShapeValidationStatus2D(b);
|
|
33
|
+
if (isWarnableCollisionStatus(statusB)) {
|
|
26
34
|
warnOnInvalidCollisionShape({ kind: b.kind, overlapping: false, shapeIndex: 1, status: statusB });
|
|
27
35
|
}
|
|
28
36
|
}
|
|
37
|
+
// Whether a validation status names a shape the dispatcher will refuse. `null` is a usable shape, and
|
|
38
|
+
// the two result statuses — `'overlapping'` and `'separated'` — describe an answer rather than an input,
|
|
39
|
+
// so neither reaches this seam.
|
|
40
|
+
function isWarnableCollisionStatus(status) {
|
|
41
|
+
return status === 'degenerate-shape' || status === 'non-convex-polygon' || status === 'unsupported-shape-kind';
|
|
42
|
+
}
|
|
29
43
|
function warnOnInvalidCollisionShape(explanation) {
|
|
30
|
-
const message = explanation.status
|
|
31
|
-
? 'testCollision: a polygon is non-convex and cannot produce a supported manifold — call explainCollisionTest(a, b) and replace the reported shape with a convex polygon.'
|
|
32
|
-
: 'testCollision: a shape is degenerate and cannot produce a manifold — call explainCollisionTest(a, b) and replace the reported shape with a finite positive-area collider.';
|
|
44
|
+
const message = collisionGuardMessages[explanation.status] ?? collisionGuardMessages['degenerate-shape'];
|
|
33
45
|
logOnce(`collision:${explanation.status}:${explanation.shapeIndex}:${explanation.kind}`, LogLevel.Warn, {
|
|
34
46
|
kind: explanation.kind,
|
|
35
47
|
message,
|
|
@@ -37,5 +49,12 @@ function warnOnInvalidCollisionShape(explanation) {
|
|
|
37
49
|
status: explanation.status,
|
|
38
50
|
}, 'collision');
|
|
39
51
|
}
|
|
52
|
+
// One message per refusable status, each naming the explain seam and the repair rather than only the
|
|
53
|
+
// fault. A warning a caller cannot act on is noise.
|
|
54
|
+
const collisionGuardMessages = {
|
|
55
|
+
'degenerate-shape': 'testCollision2D: a shape is degenerate and cannot produce a manifold — call explainCollisionTest2D(a, b) and replace the reported shape with a finite positive-area collider.',
|
|
56
|
+
'non-convex-polygon': 'testCollision2D: a polygon is non-convex and cannot produce a supported manifold — call explainCollisionTest2D(a, b) and replace the reported shape with a convex polygon.',
|
|
57
|
+
'unsupported-shape-kind': 'testCollision2D: a shape kind has no manifold path and was reported as not overlapping — call explainCollisionTest2D(a, b) for the kind. Segments and points are area-less by design and answer the boolean testSegment*Collision and getCollisionShapeContainsPoint2D lanes instead.',
|
|
58
|
+
};
|
|
40
59
|
let collisionGuardsEnabled = false;
|
|
41
60
|
//# sourceMappingURL=enableCollisionGuards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableCollisionGuards.js","sourceRoot":"","sources":["../src/enableCollisionGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"enableCollisionGuards.js","sourceRoot":"","sources":["../src/enableCollisionGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,UAAU,yBAAyB;IACvC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,GAAG,KAAK,CAAC;AACjC,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,MAAM,UAAU,qBAAqB;IACnC,uBAAuB,CAAC,4BAA4B,CAAC,CAAC;IACtD,sBAAsB,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,iFAAiF;AACjF,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,sGAAsG;AACtG,iGAAiG;AACjG,4BAA4B;AAC5B,SAAS,4BAA4B,CAAC,CAA6B,EAAE,CAA6B;IAChG,MAAM,OAAO,GAAG,mCAAmC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,2BAA2B,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAClG,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,mCAAmC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,2BAA2B,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,yGAAyG;AACzG,gCAAgC;AAChC,SAAS,yBAAyB,CAChC,MAAkC;IAElC,OAAO,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,oBAAoB,IAAI,MAAM,KAAK,wBAAwB,CAAC;AACjH,CAAC;AAED,SAAS,2BAA2B,CAAC,WAAiD;IACpF,MAAM,OAAO,GAAG,sBAAsB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC,kBAAkB,CAAC,CAAC;IACzG,OAAO,CACL,aAAa,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,IAAI,EAAE,EAC/E,QAAQ,CAAC,IAAI,EACb;QACE,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,OAAO;QACP,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,MAAM,EAAE,WAAW,CAAC,MAAM;KAC3B,EACD,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,oDAAoD;AACpD,MAAM,sBAAsB,GAAiD;IAC3E,kBAAkB,EAChB,+KAA+K;IACjL,oBAAoB,EAClB,4KAA4K;IAC9K,wBAAwB,EACtB,uRAAuR;CAC1R,CAAC;AAEF,IAAI,sBAAsB,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CollisionShape2D, CollisionTestExplanation2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function explainCollisionTest2D(a: Readonly<CollisionShape2D>, b: Readonly<CollisionShape2D>): CollisionTestExplanation2D;
|
|
3
|
+
//# sourceMappingURL=explainCollisionTest2D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainCollisionTest2D.d.ts","sourceRoot":"","sources":["../src/explainCollisionTest2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAS7F,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAC7B,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAC5B,0BAA0B,CA8B5B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getCollisionShapeValidationStatus2D } from './collisionShapeValidation';
|
|
2
|
+
import { getCollisionPairTest2D, getCollisionSupport2D } from './collisionSupport2D';
|
|
3
|
+
import { testCollision2D } from './testCollision2D';
|
|
4
|
+
// Pure diagnostic twin of testCollision2D. It classifies invalid and unsupported inputs before
|
|
5
|
+
// running the ordinary dispatcher, so callers can distinguish its silent false sentinel from a
|
|
6
|
+
// legitimate separated pair without retaining state or enabling guards.
|
|
7
|
+
export function explainCollisionTest2D(a, b) {
|
|
8
|
+
const statusA = getCollisionShapeValidationStatus2D(a);
|
|
9
|
+
if (statusA !== null)
|
|
10
|
+
return { kind: a.kind, overlapping: false, shapeIndex: 0, status: statusA };
|
|
11
|
+
const statusB = getCollisionShapeValidationStatus2D(b);
|
|
12
|
+
if (statusB !== null)
|
|
13
|
+
return { kind: b.kind, overlapping: false, shapeIndex: 1, status: statusB };
|
|
14
|
+
// A valid shape whose kind has no RUNTIME binding is the sentinel the two registries introduced, and
|
|
15
|
+
// it is invisible to shape validation: a circle is a perfectly valid circle whether or not anyone
|
|
16
|
+
// registered anything for it. Without this, forgetting `registerBuiltInCollisionSupports2D` reports
|
|
17
|
+
// two overlapping circles as `separated` — the diagnostic seam repeating the dispatcher's silence
|
|
18
|
+
// instead of explaining it, which is the one thing it exists not to do.
|
|
19
|
+
//
|
|
20
|
+
// Asked only when no specialization covers the pair in either order, because a pair test needs no
|
|
21
|
+
// support functions at all.
|
|
22
|
+
if (getCollisionPairTest2D(a.kind, b.kind) === null && getCollisionPairTest2D(b.kind, a.kind) === null) {
|
|
23
|
+
if (getCollisionSupport2D(a.kind) === null) {
|
|
24
|
+
return { kind: a.kind, overlapping: false, shapeIndex: 0, status: 'unsupported-shape-kind' };
|
|
25
|
+
}
|
|
26
|
+
if (getCollisionSupport2D(b.kind) === null) {
|
|
27
|
+
return { kind: b.kind, overlapping: false, shapeIndex: 1, status: 'unsupported-shape-kind' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const overlapping = testCollision2D(a, b, { depth: 0, normalX: 0, normalY: 0, overlapping: false });
|
|
31
|
+
return {
|
|
32
|
+
kind: null,
|
|
33
|
+
overlapping,
|
|
34
|
+
shapeIndex: null,
|
|
35
|
+
status: overlapping ? 'overlapping' : 'separated',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=explainCollisionTest2D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainCollisionTest2D.js","sourceRoot":"","sources":["../src/explainCollisionTest2D.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+FAA+F;AAC/F,+FAA+F;AAC/F,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CACpC,CAA6B,EAC7B,CAA6B;IAE7B,MAAM,OAAO,GAAG,mCAAmC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAClG,MAAM,OAAO,GAAG,mCAAmC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAElG,qGAAqG;IACrG,kGAAkG;IAClG,oGAAoG;IACpG,kGAAkG;IAClG,wEAAwE;IACxE,EAAE;IACF,kGAAkG;IAClG,4BAA4B;IAC5B,IAAI,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,sBAAsB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACvG,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC/F,CAAC;QACD,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,OAAO;QACL,IAAI,EAAE,IAAI;QACV,WAAW;QACX,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;KAClD,CAAC;AACJ,CAAC"}
|
package/dist/gjk2D.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CollisionManifold2D, CollisionShape2D } from '@flighthq/types/contract';
|
|
2
|
+
export declare function testCollisionSupport2D(a: Readonly<CollisionShape2D>, b: Readonly<CollisionShape2D>, out: CollisionManifold2D): boolean;
|
|
3
|
+
export declare function testCollisionSupportOverlap2D(a: Readonly<CollisionShape2D>, b: Readonly<CollisionShape2D>): boolean;
|
|
4
|
+
//# sourceMappingURL=gjk2D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gjk2D.d.ts","sourceRoot":"","sources":["../src/gjk2D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAsB,MAAM,0BAA0B,CAAC;AAkC1G,wBAAgB,sBAAsB,CACpC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAC7B,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAC7B,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAOT;AAQD,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAKnH"}
|