@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.
Files changed (112) hide show
  1. package/dist/collideContactManifold2D.d.ts +3 -0
  2. package/dist/collideContactManifold2D.d.ts.map +1 -0
  3. package/dist/{collideContactManifold.js → collideContactManifold2D.js} +6 -6
  4. package/dist/collideContactManifold2D.js.map +1 -0
  5. package/dist/collisionShapeValidation.d.ts +3 -3
  6. package/dist/collisionShapeValidation.d.ts.map +1 -1
  7. package/dist/collisionShapeValidation.js +6 -3
  8. package/dist/collisionShapeValidation.js.map +1 -1
  9. package/dist/collisionSupport2D.d.ts +12 -0
  10. package/dist/collisionSupport2D.d.ts.map +1 -0
  11. package/dist/collisionSupport2D.js +111 -0
  12. package/dist/collisionSupport2D.js.map +1 -0
  13. package/dist/contactFeatureId.js +1 -1
  14. package/dist/contactFeatureId.js.map +1 -1
  15. package/dist/contactManifold.d.ts +3 -3
  16. package/dist/contactManifold.d.ts.map +1 -1
  17. package/dist/contactManifold.js +2 -2
  18. package/dist/contactManifold.js.map +1 -1
  19. package/dist/contract.d.ts +8 -5
  20. package/dist/contract.d.ts.map +1 -1
  21. package/dist/contract.js +8 -5
  22. package/dist/contract.js.map +1 -1
  23. package/dist/convexVertices.d.ts +3 -3
  24. package/dist/convexVertices.d.ts.map +1 -1
  25. package/dist/convexVertices.js.map +1 -1
  26. package/dist/enableCollisionGuards.js +30 -11
  27. package/dist/enableCollisionGuards.js.map +1 -1
  28. package/dist/explainCollisionTest2D.d.ts +3 -0
  29. package/dist/explainCollisionTest2D.d.ts.map +1 -0
  30. package/dist/explainCollisionTest2D.js +38 -0
  31. package/dist/explainCollisionTest2D.js.map +1 -0
  32. package/dist/gjk2D.d.ts +4 -0
  33. package/dist/gjk2D.d.ts.map +1 -0
  34. package/dist/gjk2D.js +340 -0
  35. package/dist/gjk2D.js.map +1 -0
  36. package/dist/index.d.ts +4 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +4 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/manifold.d.ts +3 -3
  41. package/dist/manifold.d.ts.map +1 -1
  42. package/dist/manifold.js +2 -2
  43. package/dist/manifold.js.map +1 -1
  44. package/dist/pointContainment.d.ts +2 -2
  45. package/dist/pointContainment.d.ts.map +1 -1
  46. package/dist/pointContainment.js +3 -3
  47. package/dist/pointContainment.js.map +1 -1
  48. package/dist/raycastCollisionShape2D.d.ts +4 -0
  49. package/dist/raycastCollisionShape2D.d.ts.map +1 -0
  50. package/dist/{raycastCollisionShape.js → raycastCollisionShape2D.js} +7 -7
  51. package/dist/raycastCollisionShape2D.js.map +1 -0
  52. package/dist/registerBuiltInCollisionPairTests2D.d.ts +2 -0
  53. package/dist/registerBuiltInCollisionPairTests2D.d.ts.map +1 -0
  54. package/dist/registerBuiltInCollisionPairTests2D.js +32 -0
  55. package/dist/registerBuiltInCollisionPairTests2D.js.map +1 -0
  56. package/dist/segmentCollision.d.ts +6 -6
  57. package/dist/segmentCollision.d.ts.map +1 -1
  58. package/dist/segmentCollision.js +2 -2
  59. package/dist/segmentCollision.js.map +1 -1
  60. package/dist/shapeCollision.d.ts +11 -11
  61. package/dist/shapeCollision.d.ts.map +1 -1
  62. package/dist/shapeCollision.js +62 -65
  63. package/dist/shapeCollision.js.map +1 -1
  64. package/dist/shapeContact.d.ts +11 -11
  65. package/dist/shapeContact.d.ts.map +1 -1
  66. package/dist/shapeContact.js +12 -12
  67. package/dist/shapeContact.js.map +1 -1
  68. package/dist/sweepCollisionShape2D.d.ts +4 -0
  69. package/dist/sweepCollisionShape2D.d.ts.map +1 -0
  70. package/dist/{sweepCollisionShape.js → sweepCollisionShape2D.js} +10 -10
  71. package/dist/sweepCollisionShape2D.js.map +1 -0
  72. package/dist/testCollision2D.d.ts +4 -0
  73. package/dist/testCollision2D.d.ts.map +1 -0
  74. package/dist/testCollision2D.js +43 -0
  75. package/dist/testCollision2D.js.map +1 -0
  76. package/package.json +4 -4
  77. package/src/{collideContactManifold.test.ts → collideContactManifold2D.test.ts} +54 -54
  78. package/src/collisionShapeValidation.test.ts +13 -13
  79. package/src/collisionSupport2D.test.ts +166 -0
  80. package/src/contactManifold.test.ts +11 -11
  81. package/src/convexVertices.test.ts +4 -4
  82. package/src/enableCollisionGuards.test.ts +50 -15
  83. package/src/explainCollisionTest2D.test.ts +75 -0
  84. package/src/gjk2D.test.ts +219 -0
  85. package/src/manifold.test.ts +7 -7
  86. package/src/pointContainment.test.ts +45 -41
  87. package/src/{raycastCollisionShape.test.ts → raycastCollisionShape2D.test.ts} +26 -19
  88. package/src/registerBuiltInCollisionPairTests2D.test.ts +62 -0
  89. package/src/segmentCollision.test.ts +10 -10
  90. package/src/shapeCollision.test.ts +103 -103
  91. package/src/shapeContact.test.ts +76 -76
  92. package/src/{sweepCollisionShape.test.ts → sweepCollisionShape2D.test.ts} +26 -26
  93. package/src/testCollision2D.test.ts +175 -0
  94. package/dist/collideContactManifold.d.ts +0 -3
  95. package/dist/collideContactManifold.d.ts.map +0 -1
  96. package/dist/collideContactManifold.js.map +0 -1
  97. package/dist/explainCollisionTest.d.ts +0 -3
  98. package/dist/explainCollisionTest.d.ts.map +0 -1
  99. package/dist/explainCollisionTest.js +0 -21
  100. package/dist/explainCollisionTest.js.map +0 -1
  101. package/dist/raycastCollisionShape.d.ts +0 -4
  102. package/dist/raycastCollisionShape.d.ts.map +0 -1
  103. package/dist/raycastCollisionShape.js.map +0 -1
  104. package/dist/sweepCollisionShape.d.ts +0 -4
  105. package/dist/sweepCollisionShape.d.ts.map +0 -1
  106. package/dist/sweepCollisionShape.js.map +0 -1
  107. package/dist/testCollision.d.ts +0 -4
  108. package/dist/testCollision.d.ts.map +0 -1
  109. package/dist/testCollision.js +0 -97
  110. package/dist/testCollision.js.map +0 -1
  111. package/src/explainCollisionTest.test.ts +0 -52
  112. 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 { clearCollisionContactManifold } from './contactManifold';
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 `testCollision` dispatcher's contact-resolving twin.
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 `testCollision` does. Contact points are world-space and need no such
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 collideContactManifold(a, b, out) {
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
- clearCollisionContactManifold(out);
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=collideContactManifold.js.map
109
+ //# sourceMappingURL=collideContactManifold2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collideContactManifold2D.js","sourceRoot":"","sources":["../src/collideContactManifold2D.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC7B,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EAClC,+BAA+B,EAC/B,mCAAmC,EACnC,4BAA4B,EAC5B,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,gBAAgB,CAAC;AAExB,gGAAgG;AAChG,qGAAqG;AACrG,gGAAgG;AAChG,uGAAuG;AACvG,cAAc;AACd,EAAE;AACF,gGAAgG;AAChG,kGAAkG;AAClG,mGAAmG;AACnG,qGAAqG;AACrG,oGAAoG;AACpG,8FAA8F;AAC9F,kGAAkG;AAClG,2BAA2B;AAC3B,EAAE;AACF,gGAAgG;AAChG,sGAAsG;AACtG,mGAAmG;AACnG,qGAAqG;AACrG,qGAAqG;AACrG,uGAAuG;AACvG,iGAAiG;AACjG,8DAA8D;AAC9D,EAAE;AACF,oGAAoG;AACpG,sEAAsE;AACtE,MAAM,UAAU,wBAAwB,CACtC,CAAoC,EACpC,CAAoC,EACpC,GAA+B;IAE/B,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,+BAA+B,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,QAAQ;oBACX,WAAW,GAAG,kCAAkC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM;gBACR,KAAK,MAAM;oBACT,WAAW,GAAG,gCAAgC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC5D,MAAM;gBACR,KAAK,KAAK;oBACR,WAAW,GAAG,+BAA+B,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC3D,MAAM;gBACR,KAAK,SAAS;oBACZ,WAAW,GAAG,mCAAmC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC/D,MAAM;YACV,CAAC;YACD,MAAM;QACR,KAAK,MAAM;YACT,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,MAAM;oBACT,WAAW,GAAG,8BAA8B,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM;gBACR,KAAK,KAAK;oBACR,WAAW,GAAG,6BAA6B,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBACzD,MAAM;gBACR,KAAK,SAAS;oBACZ,WAAW,GAAG,iCAAiC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC7D,MAAM;YACV,CAAC;YACD,MAAM;QACR,KAAK,KAAK;YACR,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,KAAK;oBACR,WAAW,GAAG,4BAA4B,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBACxD,MAAM;gBACR,KAAK,SAAS;oBACZ,WAAW,GAAG,gCAAgC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;oBAC5D,MAAM;YACV,CAAC;YACD,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC1B,WAAW,GAAG,oCAAoC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;YACD,MAAM;IACV,CAAC;IAED,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QAC3B,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAC7B,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kGAAkG;AAClG,kGAAkG;AAClG,4BAA4B;AAC5B,SAAS,oBAAoB,CAAC,IAA0B;IACtD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { CollisionShape, CollisionTestStatus } from '@flighthq/types/contract';
2
- export declare function getCollisionPolygonValidationStatus(points: readonly number[]): CollisionTestStatus | null;
3
- export declare function getCollisionShapeValidationStatus(shape: Readonly<CollisionShape>): CollisionTestStatus | null;
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,cAAc,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpF,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CA2CzG;AAID,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,mBAAmB,GAAG,IAAI,CAwC7G"}
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 getCollisionPolygonValidationStatus(points) {
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
- export function getCollisionShapeValidationStatus(shape) {
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 getCollisionPolygonValidationStatus(shape.points);
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":"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"}
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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"}
@@ -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 `CollisionContactPoint.featureId` crosses the boundary.
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,8FAA8F;AAE9F,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
+ {"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 { CollisionContactManifold } from '@flighthq/types/contract';
2
- export declare function clearCollisionContactManifold(out: CollisionContactManifold): void;
3
- export declare function createCollisionContactManifold(): CollisionContactManifold;
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,wBAAwB,EAAyB,MAAM,0BAA0B,CAAC;AAUhG,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,wBAAwB,GAAG,IAAI,CAMjF;AAID,wBAAgB,8BAA8B,IAAI,wBAAwB,CASzE"}
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"}
@@ -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 clearCollisionContactManifold(out) {
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 createCollisionContactManifold() {
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,6BAA6B,CAAC,GAA6B;IACzE,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,8BAA8B;IAC5C,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"}
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"}
@@ -1,13 +1,16 @@
1
- export * from './collideContactManifold';
1
+ export * from './collideContactManifold2D';
2
+ export * from './collisionSupport2D';
2
3
  export * from './contactManifold';
3
4
  export * from './enableCollisionGuards';
4
- export * from './explainCollisionTest';
5
+ export * from './explainCollisionTest2D';
6
+ export * from './gjk2D';
5
7
  export * from './manifold';
6
8
  export * from './pointContainment';
7
- export * from './raycastCollisionShape';
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 './sweepCollisionShape';
12
- export * from './testCollision';
14
+ export * from './sweepCollisionShape2D';
15
+ export * from './testCollision2D';
13
16
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,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 './collideContactManifold';
1
+ export * from './collideContactManifold2D';
2
+ export * from './collisionSupport2D';
2
3
  export * from './contactManifold';
3
4
  export * from './enableCollisionGuards';
4
- export * from './explainCollisionTest';
5
+ export * from './explainCollisionTest2D';
6
+ export * from './gjk2D';
5
7
  export * from './manifold';
6
8
  export * from './pointContainment';
7
- export * from './raycastCollisionShape';
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 './sweepCollisionShape';
12
- export * from './testCollision';
14
+ export * from './sweepCollisionShape2D';
15
+ export * from './testCollision2D';
13
16
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,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"}
@@ -1,4 +1,4 @@
1
- import type { CollisionAabb, CollisionObb } from '@flighthq/types/contract';
2
- export declare function writeAabbVertices(aabb: Readonly<CollisionAabb>, out: Float64Array): void;
3
- export declare function writeObbVertices(obb: Readonly<CollisionObb>, out: Float64Array): void;
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,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQ5E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAaxF;AAGD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAmBrF"}
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,IAA6B,EAAE,GAAiB;IAChF,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,GAA2B,EAAE,GAAiB;IAC7E,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
+ {"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 { getCollisionShapeValidationStatus } from './collisionShapeValidation';
4
- import { setCollisionTestGuard } from './testCollision';
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
- setCollisionTestGuard(null);
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
- setCollisionTestGuard(warnOnInvalidCollisionShapes);
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 = getCollisionShapeValidationStatus(a);
20
- if (statusA === 'degenerate-shape' || statusA === 'non-convex-polygon') {
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 = getCollisionShapeValidationStatus(b);
25
- if (statusB === 'degenerate-shape' || statusB === 'non-convex-polygon') {
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 === 'non-convex-polygon'
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,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,UAAU,yBAAyB;IACvC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,sBAAsB,GAAG,KAAK,CAAC;AACjC,CAAC;AAED,oGAAoG;AACpG,oGAAoG;AACpG,MAAM,UAAU,qBAAqB;IACnC,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;IACpD,sBAAsB,GAAG,IAAI,CAAC;AAChC,CAAC;AAED,SAAS,4BAA4B,CAAC,CAA2B,EAAE,CAA2B;IAC5F,MAAM,OAAO,GAAG,iCAAiC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QACvE,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,iCAAiC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,kBAAkB,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QACvE,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,SAAS,2BAA2B,CAAC,WAA+C;IAClF,MAAM,OAAO,GACX,WAAW,CAAC,MAAM,KAAK,oBAAoB;QACzC,CAAC,CAAC,wKAAwK;QAC1K,CAAC,CAAC,2KAA2K,CAAC;IAClL,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,IAAI,sBAAsB,GAAG,KAAK,CAAC"}
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"}
@@ -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"}