@codexo/exojs-physics 0.15.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +51 -23
  2. package/dist/esm/Aabb.d.ts +6 -10
  3. package/dist/esm/Aabb.d.ts.map +1 -0
  4. package/dist/esm/Aabb.js +9 -5
  5. package/dist/esm/Aabb.js.map +1 -1
  6. package/dist/esm/Collider.d.ts +62 -10
  7. package/dist/esm/Collider.d.ts.map +1 -0
  8. package/dist/esm/Collider.js +263 -157
  9. package/dist/esm/Collider.js.map +1 -1
  10. package/dist/esm/ContactGraph.d.ts +51 -5
  11. package/dist/esm/ContactGraph.d.ts.map +1 -0
  12. package/dist/esm/ContactGraph.js +282 -223
  13. package/dist/esm/ContactGraph.js.map +1 -1
  14. package/dist/esm/ContactModifier.d.ts +85 -0
  15. package/dist/esm/ContactModifier.d.ts.map +1 -0
  16. package/dist/esm/ContactModifier.js +49 -0
  17. package/dist/esm/ContactModifier.js.map +1 -0
  18. package/dist/esm/PhysicsBody.d.ts +56 -22
  19. package/dist/esm/PhysicsBody.d.ts.map +1 -0
  20. package/dist/esm/PhysicsBody.js +461 -443
  21. package/dist/esm/PhysicsBody.js.map +1 -1
  22. package/dist/esm/PhysicsWorld.d.ts +276 -43
  23. package/dist/esm/PhysicsWorld.d.ts.map +1 -0
  24. package/dist/esm/PhysicsWorld.js +890 -626
  25. package/dist/esm/PhysicsWorld.js.map +1 -1
  26. package/dist/esm/TimeStepper.d.ts +3 -2
  27. package/dist/esm/TimeStepper.d.ts.map +1 -0
  28. package/dist/esm/TimeStepper.js +56 -67
  29. package/dist/esm/TimeStepper.js.map +1 -1
  30. package/dist/esm/backend/NativePhysicsBackend.d.ts +8 -4
  31. package/dist/esm/backend/NativePhysicsBackend.d.ts.map +1 -0
  32. package/dist/esm/backend/NativePhysicsBackend.js +48 -41
  33. package/dist/esm/backend/NativePhysicsBackend.js.map +1 -1
  34. package/dist/esm/backend/PhysicsBackend.d.ts +9 -2
  35. package/dist/esm/backend/PhysicsBackend.d.ts.map +1 -0
  36. package/dist/esm/binding/BindingRegistry.d.ts +25 -4
  37. package/dist/esm/binding/BindingRegistry.d.ts.map +1 -0
  38. package/dist/esm/binding/BindingRegistry.js +70 -36
  39. package/dist/esm/binding/BindingRegistry.js.map +1 -1
  40. package/dist/esm/binding/PhysicsBinding.d.ts +22 -5
  41. package/dist/esm/binding/PhysicsBinding.d.ts.map +1 -0
  42. package/dist/esm/binding/PhysicsBinding.js +46 -21
  43. package/dist/esm/binding/PhysicsBinding.js.map +1 -1
  44. package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts +68 -0
  45. package/dist/esm/broadphase/AabbTreeBroadPhase.d.ts.map +1 -0
  46. package/dist/esm/broadphase/AabbTreeBroadPhase.js +149 -0
  47. package/dist/esm/broadphase/AabbTreeBroadPhase.js.map +1 -0
  48. package/dist/esm/broadphase/BroadPhase.d.ts +7 -4
  49. package/dist/esm/broadphase/BroadPhase.d.ts.map +1 -0
  50. package/dist/esm/broadphase/index.d.ts +2 -1
  51. package/dist/esm/broadphase/index.d.ts.map +1 -0
  52. package/dist/esm/collision/CollisionProxy.d.ts +3 -2
  53. package/dist/esm/collision/CollisionProxy.d.ts.map +1 -0
  54. package/dist/esm/collision/Manifold.d.ts +5 -4
  55. package/dist/esm/collision/Manifold.d.ts.map +1 -0
  56. package/dist/esm/collision/Manifold.js +34 -25
  57. package/dist/esm/collision/Manifold.js.map +1 -1
  58. package/dist/esm/collision/chainAdjacency.d.ts +29 -0
  59. package/dist/esm/collision/chainAdjacency.d.ts.map +1 -0
  60. package/dist/esm/collision/chainAdjacency.js +44 -0
  61. package/dist/esm/collision/chainAdjacency.js.map +1 -0
  62. package/dist/esm/collision/dispatch.d.ts +35 -0
  63. package/dist/esm/collision/dispatch.d.ts.map +1 -0
  64. package/dist/esm/collision/dispatch.js +58 -0
  65. package/dist/esm/collision/dispatch.js.map +1 -0
  66. package/dist/esm/collision/index.d.ts +2 -0
  67. package/dist/esm/collision/index.d.ts.map +1 -0
  68. package/dist/esm/collision/narrowphase.d.ts +5 -2
  69. package/dist/esm/collision/narrowphase.d.ts.map +1 -0
  70. package/dist/esm/collision/narrowphase.js +524 -399
  71. package/dist/esm/collision/narrowphase.js.map +1 -1
  72. package/dist/esm/collision/segments.d.ts +19 -0
  73. package/dist/esm/collision/segments.d.ts.map +1 -0
  74. package/dist/esm/collision/segments.js +36 -0
  75. package/dist/esm/collision/segments.js.map +1 -0
  76. package/dist/esm/collision/sweep.d.ts +35 -0
  77. package/dist/esm/collision/sweep.d.ts.map +1 -0
  78. package/dist/esm/collision/sweep.js +437 -0
  79. package/dist/esm/collision/sweep.js.map +1 -0
  80. package/dist/esm/debug/PhysicsDebugDraw.d.ts +23 -4
  81. package/dist/esm/debug/PhysicsDebugDraw.d.ts.map +1 -0
  82. package/dist/esm/debug/PhysicsDebugDraw.js +230 -188
  83. package/dist/esm/debug/PhysicsDebugDraw.js.map +1 -1
  84. package/dist/esm/debug/index.d.ts +1 -0
  85. package/dist/esm/debug/index.d.ts.map +1 -0
  86. package/dist/esm/debug/index.js +3 -2
  87. package/dist/esm/events.d.ts +1 -0
  88. package/dist/esm/events.d.ts.map +1 -0
  89. package/dist/esm/index.d.ts +1 -0
  90. package/dist/esm/index.d.ts.map +1 -0
  91. package/dist/esm/index.js +24 -19
  92. package/dist/esm/joints/DistanceJoint.d.ts +4 -3
  93. package/dist/esm/joints/DistanceJoint.d.ts.map +1 -0
  94. package/dist/esm/joints/DistanceJoint.js +160 -172
  95. package/dist/esm/joints/DistanceJoint.js.map +1 -1
  96. package/dist/esm/joints/Joint.d.ts +5 -4
  97. package/dist/esm/joints/Joint.d.ts.map +1 -0
  98. package/dist/esm/joints/Joint.js +23 -21
  99. package/dist/esm/joints/Joint.js.map +1 -1
  100. package/dist/esm/joints/MouseJoint.d.ts +8 -7
  101. package/dist/esm/joints/MouseJoint.d.ts.map +1 -0
  102. package/dist/esm/joints/MouseJoint.js +132 -133
  103. package/dist/esm/joints/MouseJoint.js.map +1 -1
  104. package/dist/esm/joints/PrismaticJoint.d.ts +5 -4
  105. package/dist/esm/joints/PrismaticJoint.d.ts.map +1 -0
  106. package/dist/esm/joints/PrismaticJoint.js +211 -240
  107. package/dist/esm/joints/PrismaticJoint.js.map +1 -1
  108. package/dist/esm/joints/RevoluteJoint.d.ts +4 -3
  109. package/dist/esm/joints/RevoluteJoint.d.ts.map +1 -0
  110. package/dist/esm/joints/RevoluteJoint.js +191 -213
  111. package/dist/esm/joints/RevoluteJoint.js.map +1 -1
  112. package/dist/esm/joints/WeldJoint.d.ts +3 -2
  113. package/dist/esm/joints/WeldJoint.d.ts.map +1 -0
  114. package/dist/esm/joints/WeldJoint.js +156 -152
  115. package/dist/esm/joints/WeldJoint.js.map +1 -1
  116. package/dist/esm/joints/WheelJoint.d.ts +4 -3
  117. package/dist/esm/joints/WheelJoint.d.ts.map +1 -0
  118. package/dist/esm/joints/WheelJoint.js +228 -255
  119. package/dist/esm/joints/WheelJoint.js.map +1 -1
  120. package/dist/esm/math.d.ts +6 -9
  121. package/dist/esm/math.d.ts.map +1 -0
  122. package/dist/esm/math.js +37 -39
  123. package/dist/esm/math.js.map +1 -1
  124. package/dist/esm/physicsBuildInfo.d.ts +1 -0
  125. package/dist/esm/physicsBuildInfo.d.ts.map +1 -0
  126. package/dist/esm/physicsBuildInfo.js +6 -4
  127. package/dist/esm/physicsBuildInfo.js.map +1 -1
  128. package/dist/esm/public.d.ts +8 -3
  129. package/dist/esm/public.d.ts.map +1 -0
  130. package/dist/esm/query/QueryEngine.d.ts +56 -12
  131. package/dist/esm/query/QueryEngine.d.ts.map +1 -0
  132. package/dist/esm/query/QueryEngine.js +494 -237
  133. package/dist/esm/query/QueryEngine.js.map +1 -1
  134. package/dist/esm/query/SpatialIndex.d.ts +34 -0
  135. package/dist/esm/query/SpatialIndex.d.ts.map +1 -0
  136. package/dist/esm/shapes/AnyShape.d.ts +9 -4
  137. package/dist/esm/shapes/AnyShape.d.ts.map +1 -0
  138. package/dist/esm/shapes/BoxShape.d.ts +2 -1
  139. package/dist/esm/shapes/BoxShape.d.ts.map +1 -0
  140. package/dist/esm/shapes/BoxShape.js +37 -25
  141. package/dist/esm/shapes/BoxShape.js.map +1 -1
  142. package/dist/esm/shapes/CapsuleShape.d.ts +30 -0
  143. package/dist/esm/shapes/CapsuleShape.d.ts.map +1 -0
  144. package/dist/esm/shapes/CapsuleShape.js +88 -0
  145. package/dist/esm/shapes/CapsuleShape.js.map +1 -0
  146. package/dist/esm/shapes/ChainEdgeShape.d.ts +30 -0
  147. package/dist/esm/shapes/ChainEdgeShape.d.ts.map +1 -0
  148. package/dist/esm/shapes/ChainEdgeShape.js +66 -0
  149. package/dist/esm/shapes/ChainEdgeShape.js.map +1 -0
  150. package/dist/esm/shapes/ChainShape.d.ts +52 -0
  151. package/dist/esm/shapes/ChainShape.d.ts.map +1 -0
  152. package/dist/esm/shapes/ChainShape.js +85 -0
  153. package/dist/esm/shapes/ChainShape.js.map +1 -0
  154. package/dist/esm/shapes/CircleShape.d.ts +3 -4
  155. package/dist/esm/shapes/CircleShape.d.ts.map +1 -0
  156. package/dist/esm/shapes/CircleShape.js +27 -26
  157. package/dist/esm/shapes/CircleShape.js.map +1 -1
  158. package/dist/esm/shapes/PolygonShape.d.ts +7 -8
  159. package/dist/esm/shapes/PolygonShape.d.ts.map +1 -0
  160. package/dist/esm/shapes/PolygonShape.js +131 -162
  161. package/dist/esm/shapes/PolygonShape.js.map +1 -1
  162. package/dist/esm/shapes/SegmentShape.d.ts +31 -0
  163. package/dist/esm/shapes/SegmentShape.d.ts.map +1 -0
  164. package/dist/esm/shapes/SegmentShape.js +62 -0
  165. package/dist/esm/shapes/SegmentShape.js.map +1 -0
  166. package/dist/esm/shapes/Shape.d.ts +28 -17
  167. package/dist/esm/shapes/Shape.d.ts.map +1 -0
  168. package/dist/esm/shapes/Shape.js +12 -13
  169. package/dist/esm/shapes/Shape.js.map +1 -1
  170. package/dist/esm/shapes/convexParts.d.ts +21 -0
  171. package/dist/esm/shapes/convexParts.d.ts.map +1 -0
  172. package/dist/esm/shapes/convexParts.js +26 -0
  173. package/dist/esm/shapes/convexParts.js.map +1 -0
  174. package/dist/esm/shapes/decompose.d.ts +24 -0
  175. package/dist/esm/shapes/decompose.d.ts.map +1 -0
  176. package/dist/esm/shapes/decompose.js +272 -0
  177. package/dist/esm/shapes/decompose.js.map +1 -0
  178. package/dist/esm/shapes/index.d.ts +4 -0
  179. package/dist/esm/shapes/index.d.ts.map +1 -0
  180. package/dist/esm/solver/ContactSolver.d.ts +12 -5
  181. package/dist/esm/solver/ContactSolver.d.ts.map +1 -0
  182. package/dist/esm/solver/ContactSolver.js +425 -471
  183. package/dist/esm/solver/ContactSolver.js.map +1 -1
  184. package/dist/esm/solver/tolerances.d.ts +34 -0
  185. package/dist/esm/solver/tolerances.d.ts.map +1 -0
  186. package/dist/esm/solver/tolerances.js +38 -0
  187. package/dist/esm/solver/tolerances.js.map +1 -0
  188. package/dist/esm/sort.d.ts +5 -4
  189. package/dist/esm/sort.d.ts.map +1 -0
  190. package/dist/esm/sort.js +41 -51
  191. package/dist/esm/sort.js.map +1 -1
  192. package/dist/esm/types.d.ts +4 -8
  193. package/dist/esm/types.d.ts.map +1 -0
  194. package/dist/esm/types.js +15 -17
  195. package/dist/esm/types.js.map +1 -1
  196. package/package.json +6 -6
  197. package/dist/esm/broadphase/SweepAndPrune.d.ts +0 -15
  198. package/dist/esm/broadphase/SweepAndPrune.js +0 -77
  199. package/dist/esm/broadphase/SweepAndPrune.js.map +0 -1
  200. package/dist/esm/debug/index.js.map +0 -1
  201. package/dist/esm/index.js.map +0 -1
package/dist/esm/math.js CHANGED
@@ -1,62 +1,60 @@
1
- // Internal rigid-transform and angle helpers. Physics stores rotations as a
2
- // precomputed `sin`/`cos` pair so the hot collision paths never call the
3
- // trigonometric functions per vertex. `Mutable2D` is a tiny `{ x, y }` sink to
4
- // keep the rotate/transform helpers allocation-free at their call sites.
1
+ //#region src/math.ts
5
2
  /** Create a transform from a position and angle (radians). */
6
3
  const createTransform = (x = 0, y = 0, angle = 0) => ({
7
- x,
8
- y,
9
- angle,
10
- sin: Math.sin(angle),
11
- cos: Math.cos(angle),
4
+ x,
5
+ y,
6
+ angle,
7
+ sin: Math.sin(angle),
8
+ cos: Math.cos(angle)
12
9
  });
13
10
  /** Set a transform in place, refreshing sin/cos only when the angle changes. */
14
11
  const setTransform = (transform, x, y, angle) => {
15
- transform.x = x;
16
- transform.y = y;
17
- if (transform.angle !== angle) {
18
- transform.angle = angle;
19
- transform.sin = Math.sin(angle);
20
- transform.cos = Math.cos(angle);
21
- }
22
- return transform;
12
+ transform.x = x;
13
+ transform.y = y;
14
+ if (transform.angle !== angle) {
15
+ transform.angle = angle;
16
+ transform.sin = Math.sin(angle);
17
+ transform.cos = Math.cos(angle);
18
+ }
19
+ return transform;
23
20
  };
24
21
  /** Rotate and translate a local point by `transform`, writing into `out`. */
25
22
  const applyTransform = (transform, x, y, out) => {
26
- out.x = transform.cos * x - transform.sin * y + transform.x;
27
- out.y = transform.sin * x + transform.cos * y + transform.y;
28
- return out;
23
+ out.x = transform.cos * x - transform.sin * y + transform.x;
24
+ out.y = transform.sin * x + transform.cos * y + transform.y;
25
+ return out;
29
26
  };
30
27
  /** Rotate a local direction by `transform` (no translation), writing into `out`. */
31
28
  const applyRotation = (transform, x, y, out) => {
32
- out.x = transform.cos * x - transform.sin * y;
33
- out.y = transform.sin * x + transform.cos * y;
34
- return out;
29
+ out.x = transform.cos * x - transform.sin * y;
30
+ out.y = transform.sin * x + transform.cos * y;
31
+ return out;
35
32
  };
36
33
  /** Map a world point into `transform`'s local frame, writing into `out`. */
37
34
  const applyInverseTransform = (transform, x, y, out) => {
38
- const dx = x - transform.x;
39
- const dy = y - transform.y;
40
- out.x = transform.cos * dx + transform.sin * dy;
41
- out.y = -transform.sin * dx + transform.cos * dy;
42
- return out;
35
+ const dx = x - transform.x;
36
+ const dy = y - transform.y;
37
+ out.x = transform.cos * dx + transform.sin * dy;
38
+ out.y = -transform.sin * dx + transform.cos * dy;
39
+ return out;
43
40
  };
44
41
  /** Map a world direction into `transform`'s local frame, writing into `out`. */
45
42
  const applyInverseRotation = (transform, x, y, out) => {
46
- out.x = transform.cos * x + transform.sin * y;
47
- out.y = -transform.sin * x + transform.cos * y;
48
- return out;
43
+ out.x = transform.cos * x + transform.sin * y;
44
+ out.y = -transform.sin * x + transform.cos * y;
45
+ return out;
49
46
  };
50
47
  /**
51
- * Compose `world = body ∘ local` into `out`. The local transform is expressed
52
- * in the body frame (a collider's offset + local rotation); the result is the
53
- * collider's world transform.
54
- */
48
+ * Compose `world = body ∘ local` into `out`. The local transform is expressed
49
+ * in the body frame (a collider's offset + local rotation); the result is the
50
+ * collider's world transform.
51
+ */
55
52
  const composeTransforms = (body, local, out) => {
56
- const x = body.cos * local.x - body.sin * local.y + body.x;
57
- const y = body.sin * local.x + body.cos * local.y + body.y;
58
- return setTransform(out, x, y, body.angle + local.angle);
53
+ const x = body.cos * local.x - body.sin * local.y + body.x;
54
+ const y = body.sin * local.x + body.cos * local.y + body.y;
55
+ return setTransform(out, x, y, body.angle + local.angle);
59
56
  };
60
57
 
58
+ //#endregion
61
59
  export { applyInverseRotation, applyInverseTransform, applyRotation, applyTransform, composeTransforms, createTransform, setTransform };
62
- //# sourceMappingURL=math.js.map
60
+ //# sourceMappingURL=math.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sources":["../../../src/math.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"math.js","names":[],"sources":["../../src/math.ts"],"sourcesContent":["// Internal rigid-transform and angle helpers. Physics stores rotations as a\n// precomputed `sin`/`cos` pair so the hot collision paths never call the\n// trigonometric functions per vertex. The rotate/transform helpers write into a\n// caller-supplied `PointLike` sink so they allocate nothing at their call sites.\n\nimport type { PointLike } from '@codexo/exojs';\n\n/** A rigid 2D transform: translation plus the precomputed sin/cos of `angle`. */\nexport interface Transform {\n x: number;\n y: number;\n /** Rotation in radians. */\n angle: number;\n sin: number;\n cos: number;\n}\n\n/** Create a transform from a position and angle (radians). */\nexport const createTransform = (x = 0, y = 0, angle = 0): Transform => ({\n x,\n y,\n angle,\n sin: Math.sin(angle),\n cos: Math.cos(angle),\n});\n\n/** Set a transform in place, refreshing sin/cos only when the angle changes. */\nexport const setTransform = (transform: Transform, x: number, y: number, angle: number): Transform => {\n transform.x = x;\n transform.y = y;\n\n if (transform.angle !== angle) {\n transform.angle = angle;\n transform.sin = Math.sin(angle);\n transform.cos = Math.cos(angle);\n }\n\n return transform;\n};\n\n/** Rotate and translate a local point by `transform`, writing into `out`. */\nexport const applyTransform = (transform: Transform, x: number, y: number, out: PointLike): PointLike => {\n out.x = transform.cos * x - transform.sin * y + transform.x;\n out.y = transform.sin * x + transform.cos * y + transform.y;\n\n return out;\n};\n\n/** Rotate a local direction by `transform` (no translation), writing into `out`. */\nexport const applyRotation = (transform: Transform, x: number, y: number, out: PointLike): PointLike => {\n out.x = transform.cos * x - transform.sin * y;\n out.y = transform.sin * x + transform.cos * y;\n\n return out;\n};\n\n/** Map a world point into `transform`'s local frame, writing into `out`. */\nexport const applyInverseTransform = (transform: Transform, x: number, y: number, out: PointLike): PointLike => {\n const dx = x - transform.x;\n const dy = y - transform.y;\n\n out.x = transform.cos * dx + transform.sin * dy;\n out.y = -transform.sin * dx + transform.cos * dy;\n\n return out;\n};\n\n/** Map a world direction into `transform`'s local frame, writing into `out`. */\nexport const applyInverseRotation = (transform: Transform, x: number, y: number, out: PointLike): PointLike => {\n out.x = transform.cos * x + transform.sin * y;\n out.y = -transform.sin * x + transform.cos * y;\n\n return out;\n};\n\n/**\n * Compose `world = body ∘ local` into `out`. The local transform is expressed\n * in the body frame (a collider's offset + local rotation); the result is the\n * collider's world transform.\n */\nexport const composeTransforms = (body: Transform, local: Transform, out: Transform): Transform => {\n const x = body.cos * local.x - body.sin * local.y + body.x;\n const y = body.sin * local.x + body.cos * local.y + body.y;\n\n return setTransform(out, x, y, body.angle + local.angle);\n};\n"],"mappings":";;AAkBA,MAAa,mBAAmB,IAAI,GAAG,IAAI,GAAG,QAAQ,OAAkB;CACtE;CACA;CACA;CACA,KAAK,KAAK,IAAI,KAAK;CACnB,KAAK,KAAK,IAAI,KAAK;AACrB;;AAGA,MAAa,gBAAgB,WAAsB,GAAW,GAAW,UAA6B;CACpG,UAAU,IAAI;CACd,UAAU,IAAI;CAEd,IAAI,UAAU,UAAU,OAAO;EAC7B,UAAU,QAAQ;EAClB,UAAU,MAAM,KAAK,IAAI,KAAK;EAC9B,UAAU,MAAM,KAAK,IAAI,KAAK;CAChC;CAEA,OAAO;AACT;;AAGA,MAAa,kBAAkB,WAAsB,GAAW,GAAW,QAA8B;CACvG,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM,IAAI,UAAU;CAC1D,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM,IAAI,UAAU;CAE1D,OAAO;AACT;;AAGA,MAAa,iBAAiB,WAAsB,GAAW,GAAW,QAA8B;CACtG,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM;CAC5C,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM;CAE5C,OAAO;AACT;;AAGA,MAAa,yBAAyB,WAAsB,GAAW,GAAW,QAA8B;CAC9G,MAAM,KAAK,IAAI,UAAU;CACzB,MAAM,KAAK,IAAI,UAAU;CAEzB,IAAI,IAAI,UAAU,MAAM,KAAK,UAAU,MAAM;CAC7C,IAAI,IAAI,CAAC,UAAU,MAAM,KAAK,UAAU,MAAM;CAE9C,OAAO;AACT;;AAGA,MAAa,wBAAwB,WAAsB,GAAW,GAAW,QAA8B;CAC7G,IAAI,IAAI,UAAU,MAAM,IAAI,UAAU,MAAM;CAC5C,IAAI,IAAI,CAAC,UAAU,MAAM,IAAI,UAAU,MAAM;CAE7C,OAAO;AACT;;;;;;AAOA,MAAa,qBAAqB,MAAiB,OAAkB,QAA8B;CACjG,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK;CACzD,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK;CAEzD,OAAO,aAAa,KAAK,GAAG,GAAG,KAAK,QAAQ,MAAM,KAAK;AACzD"}
@@ -13,3 +13,4 @@ export interface PhysicsBuildInfo {
13
13
  readonly development: boolean;
14
14
  }
15
15
  export declare const physicsBuildInfo: PhysicsBuildInfo;
16
+ //# sourceMappingURL=physicsBuildInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"physicsBuildInfo.d.ts","sourceRoot":"","sources":["../../src/physicsBuildInfo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,gBAAgB,EAAE,gBAI7B,CAAC"}
@@ -1,8 +1,10 @@
1
+ //#region src/physicsBuildInfo.ts
1
2
  const physicsBuildInfo = Object.freeze({
2
- version: "0.15.2",
3
- revision: "e3df957",
4
- development: false,
3
+ version: "0.16.0",
4
+ revision: "3a59179",
5
+ development: false
5
6
  });
6
7
 
8
+ //#endregion
7
9
  export { physicsBuildInfo };
8
- //# sourceMappingURL=physicsBuildInfo.js.map
10
+ //# sourceMappingURL=physicsBuildInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"physicsBuildInfo.js","sources":["../../../src/physicsBuildInfo.ts"],"sourcesContent":[null],"names":[],"mappings":"AAeO,MAAM,gBAAgB,GAAqB,MAAM,CAAC,MAAM,CAAC;AAC9D,IAAA,OAAO,EAAE,QAAW;AACpB,IAAA,QAAQ,EAAE,SAAY;AACtB,IAAA,WAAW,EAAE,KAAO;AACrB,CAAA;;;;"}
1
+ {"version":3,"file":"physicsBuildInfo.js","names":[],"sources":["../../src/physicsBuildInfo.ts"],"sourcesContent":["/**\n * Immutable compile-time build metadata for `@codexo/exojs-physics`.\n *\n * `development` mirrors the `__DEV__` compile-time constant and is statically\n * replaced before tree shaking. `version` is the exact `package.json` version\n * of the Physics package at build time. `revision` is the short source-control\n * revision (appended with `-dirty` when uncommitted changes are present) or\n * `\"unknown\"` when no revision information is available.\n */\nexport interface PhysicsBuildInfo {\n readonly version: string;\n readonly revision: string;\n readonly development: boolean;\n}\n\nexport const physicsBuildInfo: PhysicsBuildInfo = Object.freeze({\n version: __VERSION__,\n revision: __REVISION__,\n development: __DEV__,\n});\n"],"mappings":";AAeA,MAAa,mBAAqC,OAAO,OAAO;CAC9D;CACA;CACA;AACF,CAAC"}
@@ -1,7 +1,7 @@
1
- export type { Aabb } from './Aabb';
2
1
  export { PhysicsBinding } from './binding/PhysicsBinding';
3
2
  export type { ColliderOptions } from './Collider';
4
3
  export { Collider } from './Collider';
4
+ export type { ContactModifier, ContactModifierContext } from './ContactModifier';
5
5
  export type { CollisionEvent, ContactPoint, SensorEvent } from './events';
6
6
  export { DistanceJoint, type DistanceJointOptions } from './joints/DistanceJoint';
7
7
  export { Joint } from './joints/Joint';
@@ -18,11 +18,16 @@ export { PhysicsWorld } from './PhysicsWorld';
18
18
  export type { QueryFilter, RayHit } from './query/QueryEngine';
19
19
  export type { AnyShape } from './shapes/AnyShape';
20
20
  export { BoxShape } from './shapes/BoxShape';
21
+ export { CapsuleShape } from './shapes/CapsuleShape';
22
+ export { ChainShape, type ChainShapeOptions } from './shapes/ChainShape';
21
23
  export { CircleShape } from './shapes/CircleShape';
24
+ export { toConvexPolygonShapes } from './shapes/convexParts';
22
25
  export { PolygonShape } from './shapes/PolygonShape';
23
- export type { ShapeType } from './shapes/Shape';
26
+ export { SegmentShape } from './shapes/SegmentShape';
27
+ export type { ShapeMassProperties, ShapeType } from './shapes/Shape';
24
28
  export { Shape } from './shapes/Shape';
25
29
  export type { TimeStepperOptions } from './TimeStepper';
26
30
  export { TimeStepper } from './TimeStepper';
27
- export type { BodyType, CollisionFilter, VectorLike } from './types';
31
+ export type { BodyType, CollisionFilter } from './types';
28
32
  export { defaultFilter, shouldCollide } from './types';
33
+ //# sourceMappingURL=public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/public.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -1,8 +1,8 @@
1
- import type { Aabb } from '../Aabb';
1
+ import type { AabbLike, PointLike } from '@codexo/exojs';
2
2
  import type { Collider } from '../Collider';
3
3
  import type { PhysicsBody } from '../PhysicsBody';
4
4
  import type { AnyShape } from '../shapes/AnyShape';
5
- import type { VectorLike } from '../types';
5
+ import type { SpatialIndex } from './SpatialIndex';
6
6
  /** A category/mask/group filter applied to a query. Omitting it matches everything. */
7
7
  export type QueryFilter = Partial<{
8
8
  category: number;
@@ -31,21 +31,65 @@ export interface RayHit {
31
31
  * reference to the world's collider array (kept world-synchronised on every
32
32
  * body move), so queries always see current placements. Array-returning queries
33
33
  * follow the three explicit allocation forms: fresh array, caller-owned `out`,
34
- * or an allocation-free callback never a hidden shared buffer.
34
+ * or an allocation-free callback - never a hidden shared buffer.
35
+ *
36
+ * The engine scans the geometry the broad phase holds, which for a chain
37
+ * collider is its per-edge proxies. Every result is reported as the authored
38
+ * collider, and an overlap query reports a chain once however many of its edges
39
+ * it touches. A ray still reports one hit per edge it crosses, because those are
40
+ * distinct intersections.
35
41
  */
36
42
  export declare class QueryEngine {
37
43
  private readonly _colliders;
38
- constructor(colliders: readonly Collider[]);
44
+ private readonly _spatialIndex;
45
+ private readonly _scratchHits;
46
+ private readonly _scratchHitsForEach;
47
+ /** Chains already reported by the running `forEachAabbHit`, so one chain is one callback. */
48
+ private readonly _scratchSeenForEach;
49
+ private readonly _scratchAabb;
50
+ constructor(colliders: readonly Collider[], spatialIndex?: SpatialIndex);
51
+ /**
52
+ * Colliders to scan for a query over `bounds` - the spatial index's narrowed
53
+ * result if one is wired, else every live collider. `sync` is called first so
54
+ * colliders added/moved since the index's last detection pass (including
55
+ * before the world's very first `step()`) are still found.
56
+ *
57
+ * `buffer` is the scratch array the spatial index writes candidates into
58
+ * (cleared and refilled in place). Callers whose per-candidate loop can
59
+ * re-enter `_candidatesFor` - directly or via caller-supplied callback code -
60
+ * must pass a buffer dedicated to them, so a nested call refilling its own
61
+ * buffer can't truncate/corrupt an outer call's still-live iteration.
62
+ */
63
+ private _candidatesFor;
39
64
  /** Colliders containing `point`. Allocates a fresh array. */
40
- queryPoint(point: VectorLike, filter?: QueryFilter): Collider[];
65
+ queryPoint(point: Readonly<PointLike>, filter?: QueryFilter): Collider[];
41
66
  /** Colliders whose AABB overlaps `bounds`. Writes into `out` (cleared first) when given, else a fresh array. */
42
- queryAabb(bounds: Aabb, filter?: QueryFilter, out?: Collider[]): Collider[];
43
- /** Invoke `callback` for each collider whose AABB overlaps `bounds`. Allocation-free. */
44
- forEachAabbHit(bounds: Aabb, filter: QueryFilter | undefined, callback: (collider: Collider) => void): void;
67
+ queryAabb(bounds: AabbLike, filter?: QueryFilter, out?: Collider[]): Collider[];
68
+ /**
69
+ * Invoke `callback` for each collider whose AABB overlaps `bounds`. Allocation-free.
70
+ *
71
+ * NOT re-entrant on itself: `callback` runs mid-traversal over a scratch
72
+ * buffer dedicated to this method, so it may safely call `queryPoint`,
73
+ * `queryAabb`, or `overlapShape` on this same `PhysicsWorld`/`QueryEngine`
74
+ * (they use a separate buffer and never invoke caller code mid-loop). It
75
+ * must NOT call `forEachAabbHit` again - directly or indirectly - on the
76
+ * same instance: the nested call would refill the same shared buffer this
77
+ * traversal is still iterating, silently truncating/corrupting it. This
78
+ * mirrors `DynamicAabbTree.query()`'s own non-reentrancy contract.
79
+ */
80
+ forEachAabbHit(bounds: AabbLike, filter: QueryFilter | undefined, callback: (collider: Collider) => void): void;
45
81
  /** Nearest collider hit by the ray from `origin` along `direction`, or `null`. */
46
- rayCast(origin: VectorLike, direction: VectorLike, filter?: QueryFilter, maxDistance?: number): RayHit | null;
82
+ rayCast(origin: Readonly<PointLike>, direction: Readonly<PointLike>, filter?: QueryFilter, maxDistance?: number): RayHit | null;
47
83
  /** All collider hits along the ray, sorted by distance. Writes into `out` (cleared first) when given. */
48
- rayCastAll(origin: VectorLike, direction: VectorLike, filter?: QueryFilter, out?: RayHit[], maxDistance?: number): RayHit[];
49
- /** Colliders overlapping `shape` placed at `position`/`angle`. Allocates a fresh array. */
50
- overlapShape(shape: AnyShape, position: VectorLike, filter?: QueryFilter, angle?: number): Collider[];
84
+ rayCastAll(origin: Readonly<PointLike>, direction: Readonly<PointLike>, filter?: QueryFilter, out?: RayHit[], maxDistance?: number): RayHit[];
85
+ /**
86
+ * Colliders overlapping `shape` placed at `position`/`angle`. Allocates a
87
+ * fresh array.
88
+ *
89
+ * A chain query shape is tested edge by edge, exactly as a chain collider is
90
+ * solved. Two boundaries have no overlap volume, so a chain - like a segment -
91
+ * never reports another chain or segment.
92
+ */
93
+ overlapShape(shape: AnyShape, position: Readonly<PointLike>, filter?: QueryFilter, angle?: number): Collider[];
51
94
  }
95
+ //# sourceMappingURL=QueryEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryEngine.d.ts","sourceRoot":"","sources":["../../../src/query/QueryEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQnD,uFAAuF;AACvF,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAErF,sCAAsC;AACtC,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB,gCAAgC;IAChC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,6EAA6E;IAC7E,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkB;IACtD,6FAA6F;IAC7F,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;gBAEpC,SAAS,EAAE,SAAS,QAAQ,EAAE,EAAE,YAAY,CAAC,EAAE,YAAY;IAK9E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAUtB,6DAA6D;IACtD,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,EAAE;IAyB/E,gHAAgH;IACzG,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE;IAoBtF;;;;;;;;;;;OAWG;IACI,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAyBtH,kFAAkF;IAC3E,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,SAAW,GAAG,MAAM,GAAG,IAAI;IAuCxI,yGAAyG;IAClG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,SAAW,GAAG,MAAM,EAAE;IAyCtJ;;;;;;;OAOG;IACI,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,SAAI,GAAG,QAAQ,EAAE;CA2BjH"}