@codexo/exojs-physics 0.15.3 → 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
@@ -0,0 +1,85 @@
1
+ import type { Collider } from './Collider';
2
+ import type { ContactRecord } from './ContactGraph';
3
+ import type { PhysicsBody } from './PhysicsBody';
4
+ /**
5
+ * A solid contact as the world's {@link ContactModifier} sees it: the pair that
6
+ * produced it, the contact normal, and the three per-step controls the modifier
7
+ * may change. Everything else is read-only.
8
+ *
9
+ * The object is reused for every contact and is only valid for the duration of
10
+ * the callback - read what you need, write the controls, do not retain it.
11
+ *
12
+ * Writing a control affects this step only; the values are re-derived from the
13
+ * two colliders before the modifier runs again.
14
+ *
15
+ * A chain collider is solved per edge, so a body touching several edges of one
16
+ * chain reaches the modifier once per edge, each time with the same authored
17
+ * collider pair. Decide from the contact's own normal and penetration rather
18
+ * than from the pair's identity if that distinction matters.
19
+ */
20
+ export interface ContactModifierContext {
21
+ readonly colliderA: Collider;
22
+ readonly colliderB: Collider;
23
+ readonly bodyA: PhysicsBody;
24
+ readonly bodyB: PhysicsBody;
25
+ /** X of the unit contact normal, pointing from A towards B. */
26
+ readonly normalX: number;
27
+ /** Y of the unit contact normal, pointing from A towards B. */
28
+ readonly normalY: number;
29
+ /** Manifold points backing this contact: `1` for a vertex/face hit, `2` for a face/face hit. */
30
+ readonly pointCount: number;
31
+ /** Deepest penetration across the manifold points, in px. */
32
+ readonly maxPenetration: number;
33
+ /**
34
+ * Set to `false` to skip this contact in the solver for this step. The
35
+ * contact stays geometrically touching, so `collisionStart`/`collisionEnd`
36
+ * still describe the real geometry; it just applies no impulse, and it does
37
+ * not join the two bodies into one sleeping island. Its warm-start impulses
38
+ * are dropped while it is disabled, so re-enabling it starts cold rather than
39
+ * releasing a stale impulse.
40
+ */
41
+ enabled: boolean;
42
+ /**
43
+ * Coulomb friction for this step. Defaults to `√(a.friction × b.friction)`
44
+ * over the two colliders.
45
+ */
46
+ friction: number;
47
+ /**
48
+ * Restitution for this step. Defaults to `max(a.restitution, b.restitution)`
49
+ * over the two colliders.
50
+ */
51
+ restitution: number;
52
+ }
53
+ /**
54
+ * Called once per solid contact per fixed step, after contact generation and
55
+ * before the solver runs, to adjust that contact for this step - the hook
56
+ * one-way platforms, conditional friction and per-pair material overrides are
57
+ * built on.
58
+ *
59
+ * A world has at most one modifier. It runs before islands are built, so
60
+ * disabling a contact also keeps the two bodies from sleeping as one.
61
+ */
62
+ export type ContactModifier = (contact: ContactModifierContext) => void;
63
+ /**
64
+ * The single reused {@link ContactModifierContext} instance. Bound to one record
65
+ * at a time so a step over thousands of contacts allocates nothing.
66
+ * @internal
67
+ */
68
+ export declare class MutableContactModifierContext implements ContactModifierContext {
69
+ colliderA: Collider;
70
+ colliderB: Collider;
71
+ bodyA: PhysicsBody;
72
+ bodyB: PhysicsBody;
73
+ normalX: number;
74
+ normalY: number;
75
+ pointCount: number;
76
+ maxPenetration: number;
77
+ enabled: boolean;
78
+ friction: number;
79
+ restitution: number;
80
+ /** Point this context at `record` and load its current per-step values. */
81
+ bind(record: ContactRecord): void;
82
+ /** Write the (possibly modified) controls back onto the bound record. */
83
+ flush(record: ContactRecord): void;
84
+ }
85
+ //# sourceMappingURL=ContactModifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactModifier.d.ts","sourceRoot":"","sources":["../../src/ContactModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gGAAgG;IAChG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;AAExE;;;;GAIG;AACH,qBAAa,6BAA8B,YAAW,sBAAsB;IACnE,SAAS,EAAG,QAAQ,CAAC;IACrB,SAAS,EAAG,QAAQ,CAAC;IACrB,KAAK,EAAG,WAAW,CAAC;IACpB,KAAK,EAAG,WAAW,CAAC;IACpB,OAAO,SAAK;IACZ,OAAO,SAAK;IACZ,UAAU,SAAK;IACf,cAAc,SAAK;IACnB,OAAO,UAAQ;IACf,QAAQ,SAAK;IACb,WAAW,SAAK;IAEvB,2EAA2E;IACpE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IA0BxC,yEAAyE;IAClE,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;CAK1C"}
@@ -0,0 +1,49 @@
1
+ //#region src/ContactModifier.ts
2
+ /**
3
+ * The single reused {@link ContactModifierContext} instance. Bound to one record
4
+ * at a time so a step over thousands of contacts allocates nothing.
5
+ * @internal
6
+ */
7
+ var MutableContactModifierContext = class {
8
+ colliderA;
9
+ colliderB;
10
+ bodyA;
11
+ bodyB;
12
+ normalX = 0;
13
+ normalY = 0;
14
+ pointCount = 0;
15
+ maxPenetration = 0;
16
+ enabled = true;
17
+ friction = 0;
18
+ restitution = 0;
19
+ /** Point this context at `record` and load its current per-step values. */
20
+ bind(record) {
21
+ const manifold = record.manifold;
22
+ this.colliderA = record.ownerA;
23
+ this.colliderB = record.ownerB;
24
+ this.bodyA = record.ownerA.body;
25
+ this.bodyB = record.ownerB.body;
26
+ this.normalX = manifold.normalX;
27
+ this.normalY = manifold.normalY;
28
+ this.pointCount = manifold.pointCount;
29
+ let deepest = 0;
30
+ for (let i = 0; i < manifold.pointCount; i++) {
31
+ const penetration = (i === 0 ? manifold.points[0] : manifold.points[1]).penetration;
32
+ deepest = penetration > deepest ? penetration : deepest;
33
+ }
34
+ this.maxPenetration = deepest;
35
+ this.enabled = record.enabled;
36
+ this.friction = record.friction;
37
+ this.restitution = record.restitution;
38
+ }
39
+ /** Write the (possibly modified) controls back onto the bound record. */
40
+ flush(record) {
41
+ record.enabled = this.enabled;
42
+ record.friction = this.friction;
43
+ record.restitution = this.restitution;
44
+ }
45
+ };
46
+
47
+ //#endregion
48
+ export { MutableContactModifierContext };
49
+ //# sourceMappingURL=ContactModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactModifier.js","names":[],"sources":["../../src/ContactModifier.ts"],"sourcesContent":["import type { Collider } from './Collider';\nimport type { ContactRecord } from './ContactGraph';\nimport type { PhysicsBody } from './PhysicsBody';\n\n/**\n * A solid contact as the world's {@link ContactModifier} sees it: the pair that\n * produced it, the contact normal, and the three per-step controls the modifier\n * may change. Everything else is read-only.\n *\n * The object is reused for every contact and is only valid for the duration of\n * the callback - read what you need, write the controls, do not retain it.\n *\n * Writing a control affects this step only; the values are re-derived from the\n * two colliders before the modifier runs again.\n *\n * A chain collider is solved per edge, so a body touching several edges of one\n * chain reaches the modifier once per edge, each time with the same authored\n * collider pair. Decide from the contact's own normal and penetration rather\n * than from the pair's identity if that distinction matters.\n */\nexport interface ContactModifierContext {\n readonly colliderA: Collider;\n readonly colliderB: Collider;\n readonly bodyA: PhysicsBody;\n readonly bodyB: PhysicsBody;\n /** X of the unit contact normal, pointing from A towards B. */\n readonly normalX: number;\n /** Y of the unit contact normal, pointing from A towards B. */\n readonly normalY: number;\n /** Manifold points backing this contact: `1` for a vertex/face hit, `2` for a face/face hit. */\n readonly pointCount: number;\n /** Deepest penetration across the manifold points, in px. */\n readonly maxPenetration: number;\n /**\n * Set to `false` to skip this contact in the solver for this step. The\n * contact stays geometrically touching, so `collisionStart`/`collisionEnd`\n * still describe the real geometry; it just applies no impulse, and it does\n * not join the two bodies into one sleeping island. Its warm-start impulses\n * are dropped while it is disabled, so re-enabling it starts cold rather than\n * releasing a stale impulse.\n */\n enabled: boolean;\n /**\n * Coulomb friction for this step. Defaults to `√(a.friction × b.friction)`\n * over the two colliders.\n */\n friction: number;\n /**\n * Restitution for this step. Defaults to `max(a.restitution, b.restitution)`\n * over the two colliders.\n */\n restitution: number;\n}\n\n/**\n * Called once per solid contact per fixed step, after contact generation and\n * before the solver runs, to adjust that contact for this step - the hook\n * one-way platforms, conditional friction and per-pair material overrides are\n * built on.\n *\n * A world has at most one modifier. It runs before islands are built, so\n * disabling a contact also keeps the two bodies from sleeping as one.\n */\nexport type ContactModifier = (contact: ContactModifierContext) => void;\n\n/**\n * The single reused {@link ContactModifierContext} instance. Bound to one record\n * at a time so a step over thousands of contacts allocates nothing.\n * @internal\n */\nexport class MutableContactModifierContext implements ContactModifierContext {\n public colliderA!: Collider;\n public colliderB!: Collider;\n public bodyA!: PhysicsBody;\n public bodyB!: PhysicsBody;\n public normalX = 0;\n public normalY = 0;\n public pointCount = 0;\n public maxPenetration = 0;\n public enabled = true;\n public friction = 0;\n public restitution = 0;\n\n /** Point this context at `record` and load its current per-step values. */\n public bind(record: ContactRecord): void {\n const manifold = record.manifold;\n\n this.colliderA = record.ownerA;\n this.colliderB = record.ownerB;\n this.bodyA = record.ownerA.body;\n this.bodyB = record.ownerB.body;\n this.normalX = manifold.normalX;\n this.normalY = manifold.normalY;\n this.pointCount = manifold.pointCount;\n\n let deepest = 0;\n\n for (let i = 0; i < manifold.pointCount; i++) {\n // i < pointCount <= 2, so the point exists.\n const penetration = (i === 0 ? manifold.points[0] : manifold.points[1]).penetration;\n\n deepest = penetration > deepest ? penetration : deepest;\n }\n\n this.maxPenetration = deepest;\n this.enabled = record.enabled;\n this.friction = record.friction;\n this.restitution = record.restitution;\n }\n\n /** Write the (possibly modified) controls back onto the bound record. */\n public flush(record: ContactRecord): void {\n record.enabled = this.enabled;\n record.friction = this.friction;\n record.restitution = this.restitution;\n }\n}\n"],"mappings":";;;;;;AAsEA,IAAa,gCAAb,MAA6E;CAC3E,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO,UAAU;CACjB,AAAO,UAAU;CACjB,AAAO,aAAa;CACpB,AAAO,iBAAiB;CACxB,AAAO,UAAU;CACjB,AAAO,WAAW;CAClB,AAAO,cAAc;;CAGrB,AAAO,KAAK,QAA6B;EACvC,MAAM,WAAW,OAAO;EAExB,KAAK,YAAY,OAAO;EACxB,KAAK,YAAY,OAAO;EACxB,KAAK,QAAQ,OAAO,OAAO;EAC3B,KAAK,QAAQ,OAAO,OAAO;EAC3B,KAAK,UAAU,SAAS;EACxB,KAAK,UAAU,SAAS;EACxB,KAAK,aAAa,SAAS;EAE3B,IAAI,UAAU;EAEd,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,YAAY,KAAK;GAE5C,MAAM,eAAe,MAAM,IAAI,SAAS,OAAO,KAAK,SAAS,OAAO,GAAE,CAAE;GAExE,UAAU,cAAc,UAAU,cAAc;EAClD;EAEA,KAAK,iBAAiB;EACtB,KAAK,UAAU,OAAO;EACtB,KAAK,WAAW,OAAO;EACvB,KAAK,cAAc,OAAO;CAC5B;;CAGA,AAAO,MAAM,QAA6B;EACxC,OAAO,UAAU,KAAK;EACtB,OAAO,WAAW,KAAK;EACvB,OAAO,cAAc,KAAK;CAC5B;AACF"}
@@ -1,13 +1,14 @@
1
+ import type { PointLike } from '@codexo/exojs';
1
2
  import { Vector } from '@codexo/exojs';
2
3
  import { Collider, type ColliderOptions } from './Collider';
3
4
  import type { Transform } from './math';
4
- import type { BodyType, VectorLike } from './types';
5
+ import type { BodyType } from './types';
5
6
  /** Construction options for a body. */
6
7
  export interface BodyOptions {
7
8
  /** Simulation role. Default `'dynamic'`. */
8
9
  type?: BodyType;
9
10
  /** Initial world position. Default `(0, 0)`. */
10
- position?: VectorLike;
11
+ position?: Readonly<PointLike>;
11
12
  /** Initial rotation in radians. Default `0`. */
12
13
  angle?: number;
13
14
  /** Linear damping applied to the velocity each sub-step. Default `0`. */
@@ -18,7 +19,7 @@ export interface BodyOptions {
18
19
  gravityScale?: number;
19
20
  /** When `true`, the body never rotates under contacts (infinite rotational inertia). Default `false`. */
20
21
  fixedRotation?: boolean;
21
- /** When `true`, the body is swept against static geometry each step (CCD) so it cannot tunnel through thin walls. Default `false`. */
22
+ /** When `true`, the body's colliders are shape-cast along each step's motion (CCD) so it cannot tunnel through thin geometry. Default `false`. */
22
23
  isBullet?: boolean;
23
24
  /** Colliders to attach up-front. Each may be a {@link Collider} instance or its {@link ColliderOptions}. */
24
25
  colliders?: Array<Collider | ColliderOptions>;
@@ -50,7 +51,7 @@ export declare class PhysicsBody {
50
51
  gravityScale: number;
51
52
  /** When `true`, rotational inertia is treated as infinite. */
52
53
  fixedRotation: boolean;
53
- /** When `true`, the body is swept against static geometry each step (CCD) so it cannot tunnel through thin walls. */
54
+ /** When `true`, the body's colliders are shape-cast along each step's motion (CCD) so it cannot tunnel through thin geometry. */
54
55
  isBullet: boolean;
55
56
  /** Total mass (0 for static/kinematic). */
56
57
  mass: number;
@@ -68,32 +69,42 @@ export declare class PhysicsBody {
68
69
  angularVelocity: number;
69
70
  /** When `false`, this body is never put to sleep. Default `true`. */
70
71
  allowSleep: boolean;
71
- /** @internal Delta position X accumulated across the frame's sub-steps by the TGS integrator; written into the transform once per frame by {@link _finalizePosition}. */
72
+ /** @internal - Delta position X accumulated across the frame's sub-steps by the TGS integrator; written into the transform once per frame by {@link _finalizePosition}. */
72
73
  _deltaPosX: number;
73
- /** @internal Delta position Y accumulated across the frame's sub-steps by the TGS integrator. */
74
+ /** @internal - Delta position Y accumulated across the frame's sub-steps by the TGS integrator. */
74
75
  _deltaPosY: number;
75
- /** @internal Delta rotation (radians) accumulated across the frame's sub-steps by the TGS integrator. */
76
+ /** @internal - Delta rotation (radians) accumulated across the frame's sub-steps by the TGS integrator. */
76
77
  _deltaAngle: number;
77
- /** @internal `cos(_deltaAngle)`, cached so the solver can rotate the contact anchors by the live sub-step rotation without a per-contact trig call. */
78
+ /** @internal - `cos(_deltaAngle)`, cached so the solver can rotate the contact anchors by the live sub-step rotation without a per-contact trig call. */
78
79
  _deltaCos: number;
79
- /** @internal `sin(_deltaAngle)`, cached alongside {@link _deltaCos}. */
80
+ /** @internal - `sin(_deltaAngle)`, cached alongside {@link _deltaCos}. */
80
81
  _deltaSin: number;
81
82
  private _forceX;
82
83
  private _forceY;
83
84
  private _torque;
84
- /** @internal seconds the body has stayed below the sleep thresholds (frozen while asleep). Read by the world's island pass. */
85
+ /** @internal - seconds the body has stayed below the sleep thresholds (frozen while asleep). Read by the world's island pass. */
85
86
  _sleepTime: number;
86
- /** @internal dense union-find index assigned by the world's island pass each step. */
87
+ /** @internal - dense union-find index assigned by the world's island pass each step. */
87
88
  _islandIndex: number;
88
- /** @internal — world-space centre of mass at the start of the current fixed step (CCD swept-test origin). */
89
+ /**
90
+ * @internal - raised by {@link setTransform}, cleared once the fixed step that
91
+ * saw it completes. A static/kinematic body driven by teleporting carries no
92
+ * velocity, so this is the world's only signal that such a body moved and its
93
+ * sleeping contact partners must be woken.
94
+ */
95
+ _teleported: boolean;
96
+ /** @internal - world-space centre of mass at the start of the current fixed step (CCD swept-test origin). */
89
97
  _ccdPrevX: number;
90
- /** @internal see {@link _ccdPrevX}. */
98
+ /** @internal - see {@link _ccdPrevX}. */
91
99
  _ccdPrevY: number;
92
100
  private _sleeping;
93
101
  private _id;
94
102
  private _owner;
95
103
  private _attached;
96
104
  private readonly _transform;
105
+ private _previousX;
106
+ private _previousY;
107
+ private _previousAngle;
97
108
  private readonly _colliders;
98
109
  private _comX;
99
110
  private _comY;
@@ -110,6 +121,20 @@ export declare class PhysicsBody {
110
121
  get y(): number;
111
122
  /** Rotation in radians. */
112
123
  get angle(): number;
124
+ /**
125
+ * World X at the start of the most recent fixed step. With {@link x} it
126
+ * brackets the last step, which is what an interpolating presentation blends
127
+ * between; a teleport collapses it onto {@link x}. Never read by the solver.
128
+ */
129
+ get previousX(): number;
130
+ /** World Y at the start of the most recent fixed step; see {@link previousX}. */
131
+ get previousY(): number;
132
+ /**
133
+ * Rotation in radians at the start of the most recent fixed step; see
134
+ * {@link previousX}. Body angles are continuous and unbounded, never wrapped
135
+ * to a range, so this and {@link angle} can be blended with a plain lerp.
136
+ */
137
+ get previousAngle(): number;
113
138
  /** A fresh `Vector` copy of the body's world position. */
114
139
  get position(): Vector;
115
140
  /** The body's world transform (read-only; mutate via {@link setTransform}). */
@@ -128,7 +153,7 @@ export declare class PhysicsBody {
128
153
  get isMassReady(): boolean;
129
154
  /** `true` after the owning world has destroyed this body. */
130
155
  get destroyed(): boolean;
131
- /** `true` when the body is asleep skipped by the integrator and solver until woken. */
156
+ /** `true` when the body is asleep - skipped by the integrator and solver until woken. */
132
157
  get isSleeping(): boolean;
133
158
  /**
134
159
  * Attach a collider to this body. Accepts a {@link Collider} instance or its
@@ -143,7 +168,7 @@ export declare class PhysicsBody {
143
168
  * Set the body's world transform. Resets the body's cached collider geometry
144
169
  * immediately so subsequent queries see the new placement. Returns `this`.
145
170
  */
146
- setTransform(position: VectorLike, angle?: number): this;
171
+ setTransform(position: Readonly<PointLike>, angle?: number): this;
147
172
  /** Refresh every collider's world geometry from the current transform. */
148
173
  synchronizeColliders(): void;
149
174
  /** World-space centre of mass X (body origin + rotated local centre of mass). */
@@ -167,17 +192,17 @@ export declare class PhysicsBody {
167
192
  */
168
193
  applyImpulse(impulseX: number, impulseY: number, pointX?: number, pointY?: number): this;
169
194
  /**
170
- * @internal integrate velocity from gravity, accumulated forces/torque and
195
+ * @internal - integrate velocity from gravity, accumulated forces/torque and
171
196
  * damping over the sub-step `h`. No-op for static/kinematic (infinite mass
172
197
  * keeps their velocity solver-driven only). Called once per TGS sub-step, so
173
198
  * gravity/forces are applied with `h` each sub-step (`N·h = dt`, same total
174
199
  * impulse, but the small-step position error scales with `h²`). The
175
- * force/torque accumulators are **not** cleared here they are consumed by
200
+ * force/torque accumulators are **not** cleared here - they are consumed by
176
201
  * every sub-step and cleared once per frame by {@link _finalizePosition}.
177
202
  */
178
203
  _integrateVelocity(h: number, gravityX: number, gravityY: number): void;
179
204
  /**
180
- * @internal accumulate this sub-step's velocity into the per-frame delta
205
+ * @internal - accumulate this sub-step's velocity into the per-frame delta
181
206
  * position/rotation (TGS sub-stepping). The transform itself is **not** moved
182
207
  * here; {@link _finalizePosition} writes the accumulated delta once per frame.
183
208
  * Tracking the delta (rather than moving the transform each sub-step) lets the
@@ -186,13 +211,13 @@ export declare class PhysicsBody {
186
211
  */
187
212
  _integratePosition(h: number): void;
188
213
  /**
189
- * @internal advance the sleep timer over one fixed step `dt`. A body below
214
+ * @internal - advance the sleep timer over one fixed step `dt`. A body below
190
215
  * both velocity thresholds accumulates time; a too-fast body, or one that opts
191
216
  * out via {@link allowSleep}, resets it. The sleep/wake decision is made per
192
217
  * island by the world (so a stack sleeps as a unit) from {@link _sleepTime}.
193
218
  */
194
219
  _accumulateSleepTime(dt: number, linearThreshold: number, angularThreshold: number): void;
195
- /** @internal set the sleep state. Sleeping zeroes the velocity; waking resets the sleep timer. */
220
+ /** @internal - set the sleep state. Sleeping zeroes the velocity; waking resets the sleep timer. */
196
221
  _setSleeping(sleeping: boolean): void;
197
222
  /**
198
223
  * Wake the body if it is asleep, resetting its sleep timer. The rest of its
@@ -201,7 +226,7 @@ export declare class PhysicsBody {
201
226
  */
202
227
  wake(): this;
203
228
  /**
204
- * @internal apply the frame's accumulated delta position/rotation to the
229
+ * @internal - apply the frame's accumulated delta position/rotation to the
205
230
  * transform (rotating about the centre of mass), re-sync collider geometry and
206
231
  * clear the force/torque accumulators. Called once per frame after the
207
232
  * sub-step loop. Static bodies never move; the force clear still runs (forces
@@ -213,7 +238,7 @@ export declare class PhysicsBody {
213
238
  /** Internal: detach a collider (called by the world during destruction). */
214
239
  _removeCollider(collider: Collider): void;
215
240
  /**
216
- * @internal join `owner`'s world with the allocated `id`. Allocates ids for
241
+ * @internal - join `owner`'s world with the allocated `id`. Allocates ids for
217
242
  * and registers every held collider, then aggregates the mass model and
218
243
  * synchronises world geometry. Called once by {@link PhysicsWorld.add}.
219
244
  *
@@ -228,6 +253,15 @@ export declare class PhysicsBody {
228
253
  _attachToWorld(owner: BodyOwner, id: number): void;
229
254
  /** Internal: mark destroyed (called by the world). */
230
255
  _markDestroyed(): void;
256
+ /**
257
+ * A dynamic body has to carry mass. Boundary geometry (a segment, a chain)
258
+ * reports no mass properties, and a collider may also be given zero density,
259
+ * so a dynamic body can end up with none at all - which the solver cannot tell
260
+ * apart from a static body, since both have `invMass === 0`. Rejecting it is
261
+ * the difference between a clear error and a body that silently stops moving.
262
+ */
263
+ private _assertDynamicCarriesMass;
231
264
  /** Recompute mass, centre of mass and rotational inertia from the colliders. */
232
265
  private _recomputeMass;
233
266
  }
267
+ //# sourceMappingURL=PhysicsBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PhysicsBody.d.ts","sourceRoot":"","sources":["../../src/PhysicsBody.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yGAAyG;IACzG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kJAAkJ;IAClJ,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4GAA4G;IAC5G,SAAS,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC;CAC/C;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,mBAAmB,IAAI,MAAM,CAAC;IAC9B,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC7C;AAED;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,SAAgB,IAAI,EAAE,QAAQ,CAAC;IAE/B,4DAA4D;IACrD,aAAa,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IAC9D,cAAc,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IAClE,YAAY,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IACvD,aAAa,EAAE,OAAO,CAAC;IAC9B,iIAAiI;IAC1H,QAAQ,EAAE,OAAO,CAAC;IAEzB,2CAA2C;IACpC,IAAI,SAAK;IAChB,sCAAsC;IAC/B,OAAO,SAAK;IACnB,8FAA8F;IACvF,OAAO,SAAK;IACnB,8DAA8D;IACvD,UAAU,SAAK;IAEtB,iCAAiC;IAC1B,eAAe,SAAK;IAC3B,iCAAiC;IAC1B,eAAe,SAAK;IAC3B,iCAAiC;IAC1B,eAAe,SAAK;IAE3B,qEAAqE;IAC9D,UAAU,UAAQ;IAEzB,2KAA2K;IACpK,UAAU,SAAK;IACtB,mGAAmG;IAC5F,UAAU,SAAK;IACtB,2GAA2G;IACpG,WAAW,SAAK;IACvB,yJAAyJ;IAClJ,SAAS,SAAK;IACrB,0EAA0E;IACnE,SAAS,SAAK;IAErB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IAEpB,iIAAiI;IAC1H,UAAU,SAAK;IACtB,wFAAwF;IACjF,YAAY,SAAK;IACxB;;;;;OAKG;IACI,WAAW,UAAS;IAC3B,6GAA6G;IACtG,SAAS,SAAK;IACrB,yCAAyC;IAClC,SAAS,SAAK;IAErB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IAIvC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAER,OAAO,GAAE,WAAgB;IAsB5C,0FAA0F;IAC1F,IAAW,EAAE,IAAI,MAAM,CAEtB;IAED,kFAAkF;IAClF,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,eAAe;IACf,IAAW,CAAC,IAAI,MAAM,CAErB;IAED,eAAe;IACf,IAAW,CAAC,IAAI,MAAM,CAErB;IAED,2BAA2B;IAC3B,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED;;;;OAIG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,iFAAiF;IACjF,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;;OAIG;IACH,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,0DAA0D;IAC1D,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED,+EAA+E;IAC/E,IAAW,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,CAE1C;IAED,6CAA6C;IAC7C,IAAW,SAAS,IAAI,SAAS,QAAQ,EAAE,CAE1C;IAED,wEAAwE;IACxE,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,wEAAwE;IACxE,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED;;;;OAIG;IACH,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,6DAA6D;IAC7D,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,yFAAyF;IACzF,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED;;;;;;;OAOG;IACI,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,QAAQ;IAyBlE;;;OAGG;IACI,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAE,MAA8B,GAAG,IAAI;IAwB/F,0EAA0E;IACnE,oBAAoB,IAAI,IAAI;IAMnC,iFAAiF;IACjF,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,oCAAoC;IACpC,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED;;;OAGG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvD;;;OAGG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOxC;;;;OAIG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAmB/F;;;;;;;;OAQG;IACI,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAe9E;;;;;;;OAOG;IACI,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAmB1C;;;;;OAKG;IACI,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAQhG,oGAAoG;IAC7F,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAgB5C;;;;OAIG;IACI,IAAI,IAAI,IAAI;IAOnB;;;;;;OAMG;IACI,iBAAiB,IAAI,IAAI;IAmChC,8FAA8F;IAC9F,OAAO,CAAC,WAAW;IAQnB,4EAA4E;IACrE,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAShD;;;;;;;;;;;;OAYG;IACI,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAyBzD,sDAAsD;IAC/C,cAAc,IAAI,IAAI;IAI7B;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IAUjC,gFAAgF;IAChF,OAAO,CAAC,cAAc;CA2DvB"}