@pibbl/core 0.0.1 → 0.0.3-alpha.109.1

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 (683) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +81 -0
  3. package/dist/features/machines/animation.d.ts +64 -0
  4. package/dist/features/machines/animation.js +55 -0
  5. package/dist/features/machines/animation.js.map +7 -0
  6. package/dist/features/machines/animation.mjs +1 -0
  7. package/dist/features/machines/assign.d.ts +16 -0
  8. package/dist/features/machines/assign.js +15 -0
  9. package/dist/features/machines/assign.js.map +7 -0
  10. package/dist/features/machines/callback.d.ts +9 -0
  11. package/dist/features/machines/callback.js +7 -0
  12. package/dist/features/machines/callback.js.map +7 -0
  13. package/dist/features/machines/hook.d.ts +30 -0
  14. package/dist/features/machines/hook.js +37 -0
  15. package/dist/features/machines/hook.js.map +7 -0
  16. package/dist/features/machines/index.d.ts +6 -0
  17. package/dist/features/machines/index.js +12 -0
  18. package/dist/features/machines/index.js.map +7 -0
  19. package/dist/features/machines/index.mjs +1 -0
  20. package/dist/features/machines/runtime.d.ts +18 -0
  21. package/dist/features/machines/runtime.js +363 -0
  22. package/dist/features/machines/runtime.js.map +7 -0
  23. package/dist/features/machines/types.d.ts +164 -0
  24. package/dist/features/physics/2d-geometry.d.ts +3 -3
  25. package/dist/features/physics/2d-geometry.js.map +1 -1
  26. package/dist/features/physics/2d-testing.d.ts +1 -1
  27. package/dist/features/physics/2d-testing.js +2 -2
  28. package/dist/features/physics/2d-testing.js.map +2 -2
  29. package/dist/features/physics/2d.d.ts +115 -62
  30. package/dist/features/physics/2d.js +59 -28
  31. package/dist/features/physics/2d.js.map +2 -2
  32. package/dist/features/physics/lib/2d/canvas/components.js +25 -21
  33. package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
  34. package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
  35. package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
  36. package/dist/features/physics/lib/2d/collision/casts.js +4 -2
  37. package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
  38. package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
  39. package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
  40. package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
  41. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  42. package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
  43. package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
  44. package/dist/features/physics/lib/2d/shapes.js +8 -9
  45. package/dist/features/physics/lib/2d/shapes.js.map +2 -2
  46. package/dist/features/physics/lib/2d/types.d.ts +8 -30
  47. package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
  48. package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
  49. package/dist/features/physics/lib/2d/world/rapier.js +22 -26
  50. package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
  51. package/dist/features/sprites/formats/aseprite.d.ts +5 -0
  52. package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
  53. package/dist/features/sprites/index.d.ts +6 -0
  54. package/dist/features/sprites/loader.d.ts +25 -0
  55. package/dist/features/sprites/loader.js +6 -3
  56. package/dist/features/sprites/loader.js.map +2 -2
  57. package/dist/features/sprites/model.d.ts +75 -0
  58. package/dist/features/sprites/sprite.d.ts +22 -0
  59. package/dist/features/textures/index.d.ts +12 -2
  60. package/dist/features/textures/index.js +33 -1
  61. package/dist/features/textures/index.js.map +2 -2
  62. package/dist/features/textures/lib/chemical-field.d.ts +56 -0
  63. package/dist/features/textures/lib/chemical-field.js +154 -0
  64. package/dist/features/textures/lib/chemical-field.js.map +7 -0
  65. package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
  66. package/dist/features/textures/lib/chemical-recipes.js +275 -0
  67. package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
  68. package/dist/features/textures/lib/definitions.d.ts +3 -18
  69. package/dist/features/textures/lib/definitions.js +17 -24
  70. package/dist/features/textures/lib/definitions.js.map +2 -2
  71. package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
  72. package/dist/features/textures/lib/geometric-patterns.js +305 -0
  73. package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
  74. package/dist/features/textures/lib/gray-scott.d.ts +55 -0
  75. package/dist/features/textures/lib/gray-scott.js +37 -0
  76. package/dist/features/textures/lib/gray-scott.js.map +7 -0
  77. package/dist/features/textures/lib/palette.js +1 -3
  78. package/dist/features/textures/lib/palette.js.map +2 -2
  79. package/dist/features/textures/lib/patterns.d.ts +123 -0
  80. package/dist/features/textures/lib/patterns.js +344 -0
  81. package/dist/features/textures/lib/patterns.js.map +7 -0
  82. package/dist/features/textures/lib/rain-drops.js +2 -1
  83. package/dist/features/textures/lib/rain-drops.js.map +2 -2
  84. package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
  85. package/dist/features/textures/lib/reaction-diffusion.js +9 -20
  86. package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
  87. package/dist/features/textures/lib/simulation.d.ts +10 -4
  88. package/dist/features/textures/lib/simulation.js +23 -13
  89. package/dist/features/textures/lib/simulation.js.map +2 -2
  90. package/dist/features/textures/lib/wasm/electric.js +8 -1
  91. package/dist/features/textures/lib/wasm/electric.js.map +2 -2
  92. package/dist/features/textures/lib/water-surface.js +1 -3
  93. package/dist/features/textures/lib/water-surface.js.map +2 -2
  94. package/dist/features/viz/index.d.ts +92 -5
  95. package/dist/features/viz/index.js +202 -4
  96. package/dist/features/viz/index.js.map +2 -2
  97. package/dist/features/viz/inspection/bar.d.ts +79 -0
  98. package/dist/features/viz/inspection/bar.js +49 -0
  99. package/dist/features/viz/inspection/bar.js.map +7 -0
  100. package/dist/features/viz/inspection/candle.d.ts +156 -0
  101. package/dist/features/viz/inspection/candle.js +120 -0
  102. package/dist/features/viz/inspection/candle.js.map +7 -0
  103. package/dist/features/viz/inspection/capture-types.d.ts +65 -0
  104. package/dist/features/viz/inspection/capture.d.ts +16 -0
  105. package/dist/features/viz/inspection/capture.js +49 -0
  106. package/dist/features/viz/inspection/capture.js.map +7 -0
  107. package/dist/features/viz/inspection/handler.d.ts +36 -0
  108. package/dist/features/viz/inspection/handler.js +91 -0
  109. package/dist/features/viz/inspection/handler.js.map +7 -0
  110. package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
  111. package/dist/features/viz/inspection/ohlc-bar.js +118 -0
  112. package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
  113. package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
  114. package/dist/features/viz/inspection/owned-ref.js +99 -0
  115. package/dist/features/viz/inspection/owned-ref.js.map +7 -0
  116. package/dist/features/viz/inspection/painted-point.d.ts +22 -0
  117. package/dist/features/viz/inspection/painted-point.js +29 -0
  118. package/dist/features/viz/inspection/painted-point.js.map +7 -0
  119. package/dist/features/viz/inspection/queries.d.ts +100 -0
  120. package/dist/features/viz/inspection/queries.js +192 -0
  121. package/dist/features/viz/inspection/queries.js.map +7 -0
  122. package/dist/features/viz/inspection/query-types.d.ts +177 -0
  123. package/dist/features/viz/inspection/volume.d.ts +104 -0
  124. package/dist/features/viz/inspection/volume.js +95 -0
  125. package/dist/features/viz/inspection/volume.js.map +7 -0
  126. package/dist/features/viz/inspection.d.ts +19 -0
  127. package/dist/features/viz/inspection.js +54 -0
  128. package/dist/features/viz/inspection.js.map +7 -0
  129. package/dist/features/viz/inspection.mjs +1 -0
  130. package/dist/features/viz/lib/area-series.d.ts +62 -0
  131. package/dist/features/viz/lib/area-series.js +120 -0
  132. package/dist/features/viz/lib/area-series.js.map +7 -0
  133. package/dist/features/viz/lib/axis-labels.d.ts +2 -0
  134. package/dist/features/viz/lib/axis-labels.js +41 -0
  135. package/dist/features/viz/lib/axis-labels.js.map +7 -0
  136. package/dist/features/viz/lib/axis-title.d.ts +23 -0
  137. package/dist/features/viz/lib/axis-title.js +24 -0
  138. package/dist/features/viz/lib/axis-title.js.map +7 -0
  139. package/dist/features/viz/lib/axis.d.ts +1 -1
  140. package/dist/features/viz/lib/axis.js +50 -50
  141. package/dist/features/viz/lib/axis.js.map +2 -2
  142. package/dist/features/viz/lib/bar-scale.d.ts +7 -0
  143. package/dist/features/viz/lib/bar-scale.js +34 -0
  144. package/dist/features/viz/lib/bar-scale.js.map +7 -0
  145. package/dist/features/viz/lib/bar-series.d.ts +3 -1
  146. package/dist/features/viz/lib/bar-series.js +21 -5
  147. package/dist/features/viz/lib/bar-series.js.map +2 -2
  148. package/dist/features/viz/lib/baseline-series.d.ts +55 -0
  149. package/dist/features/viz/lib/baseline-series.js +136 -0
  150. package/dist/features/viz/lib/baseline-series.js.map +7 -0
  151. package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
  152. package/dist/features/viz/lib/candlestick-series.js +150 -0
  153. package/dist/features/viz/lib/candlestick-series.js.map +7 -0
  154. package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
  155. package/dist/features/viz/lib/censored-point-series.js +129 -0
  156. package/dist/features/viz/lib/censored-point-series.js.map +7 -0
  157. package/dist/features/viz/lib/chart-lines.d.ts +41 -0
  158. package/dist/features/viz/lib/chart-lines.js +32 -0
  159. package/dist/features/viz/lib/chart-lines.js.map +7 -0
  160. package/dist/features/viz/lib/color-context.d.ts +4 -0
  161. package/dist/features/viz/lib/color-context.js +41 -0
  162. package/dist/features/viz/lib/color-context.js.map +7 -0
  163. package/dist/features/viz/lib/color-math.d.ts +4 -0
  164. package/dist/features/viz/lib/color-math.js +31 -0
  165. package/dist/features/viz/lib/color-math.js.map +7 -0
  166. package/dist/features/viz/lib/color-types.d.ts +53 -0
  167. package/dist/features/viz/lib/curve-definition.d.ts +49 -0
  168. package/dist/features/viz/lib/curve-definition.js +142 -0
  169. package/dist/features/viz/lib/curve-definition.js.map +7 -0
  170. package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
  171. package/dist/features/viz/lib/diverging-color-scale.js +51 -0
  172. package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
  173. package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
  174. package/dist/features/viz/lib/domain-navigation.js +77 -0
  175. package/dist/features/viz/lib/domain-navigation.js.map +7 -0
  176. package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
  177. package/dist/features/viz/lib/editable-chart-elements.js +733 -0
  178. package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
  179. package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
  180. package/dist/features/viz/lib/financial-aggregation.js +116 -0
  181. package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
  182. package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
  183. package/dist/features/viz/lib/financial-autoscale.js +61 -0
  184. package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
  185. package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
  186. package/dist/features/viz/lib/financial-comparison.js +98 -0
  187. package/dist/features/viz/lib/financial-comparison.js.map +7 -0
  188. package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
  189. package/dist/features/viz/lib/financial-geometry.js +67 -0
  190. package/dist/features/viz/lib/financial-geometry.js.map +7 -0
  191. package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
  192. package/dist/features/viz/lib/financial-indicators.js +135 -0
  193. package/dist/features/viz/lib/financial-indicators.js.map +7 -0
  194. package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
  195. package/dist/features/viz/lib/financial-oscillators.js +265 -0
  196. package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
  197. package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
  198. package/dist/features/viz/lib/graph/bipartite.js +250 -0
  199. package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
  200. package/dist/features/viz/lib/graph/chord.d.ts +44 -0
  201. package/dist/features/viz/lib/graph/chord.js +348 -0
  202. package/dist/features/viz/lib/graph/chord.js.map +7 -0
  203. package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
  204. package/dist/features/viz/lib/graph/dependency.js +140 -0
  205. package/dist/features/viz/lib/graph/dependency.js.map +7 -0
  206. package/dist/features/viz/lib/graph/force.d.ts +28 -0
  207. package/dist/features/viz/lib/graph/force.js +580 -0
  208. package/dist/features/viz/lib/graph/force.js.map +7 -0
  209. package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
  210. package/dist/features/viz/lib/graph/hierarchy.js +112 -0
  211. package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
  212. package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
  213. package/dist/features/viz/lib/graph/icicle.js +153 -0
  214. package/dist/features/viz/lib/graph/icicle.js.map +7 -0
  215. package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
  216. package/dist/features/viz/lib/graph/matrix.js +243 -0
  217. package/dist/features/viz/lib/graph/matrix.js.map +7 -0
  218. package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
  219. package/dist/features/viz/lib/graph/neighborhood.js +281 -0
  220. package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
  221. package/dist/features/viz/lib/graph/routes.d.ts +35 -0
  222. package/dist/features/viz/lib/graph/routes.js +101 -0
  223. package/dist/features/viz/lib/graph/routes.js.map +7 -0
  224. package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
  225. package/dist/features/viz/lib/graph/sankey.js +341 -0
  226. package/dist/features/viz/lib/graph/sankey.js.map +7 -0
  227. package/dist/features/viz/lib/graph/shared.d.ts +59 -0
  228. package/dist/features/viz/lib/graph/shared.js +301 -0
  229. package/dist/features/viz/lib/graph/shared.js.map +7 -0
  230. package/dist/features/viz/lib/graph/tree.d.ts +11 -0
  231. package/dist/features/viz/lib/graph/tree.js +232 -0
  232. package/dist/features/viz/lib/graph/tree.js.map +7 -0
  233. package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
  234. package/dist/features/viz/lib/graph/treemap.js +227 -0
  235. package/dist/features/viz/lib/graph/treemap.js.map +7 -0
  236. package/dist/features/viz/lib/graph/types.d.ts +1097 -0
  237. package/dist/features/viz/lib/hover-card.js +8 -9
  238. package/dist/features/viz/lib/hover-card.js.map +2 -2
  239. package/dist/features/viz/lib/hover-data.d.ts +1 -1
  240. package/dist/features/viz/lib/hover-data.js +6 -3
  241. package/dist/features/viz/lib/hover-data.js.map +2 -2
  242. package/dist/features/viz/lib/hover-types.d.ts +5 -5
  243. package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
  244. package/dist/features/viz/lib/interval-band-series.js +136 -0
  245. package/dist/features/viz/lib/interval-band-series.js.map +7 -0
  246. package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
  247. package/dist/features/viz/lib/interval-diamond-series.js +122 -0
  248. package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
  249. package/dist/features/viz/lib/interval-series.d.ts +79 -0
  250. package/dist/features/viz/lib/interval-series.js +158 -0
  251. package/dist/features/viz/lib/interval-series.js.map +7 -0
  252. package/dist/features/viz/lib/layout-pie.js +9 -13
  253. package/dist/features/viz/lib/layout-pie.js.map +2 -2
  254. package/dist/features/viz/lib/line-series.d.ts +1 -1
  255. package/dist/features/viz/lib/line-series.js +47 -28
  256. package/dist/features/viz/lib/line-series.js.map +2 -2
  257. package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
  258. package/dist/features/viz/lib/linear-scale-component.js +18 -0
  259. package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
  260. package/dist/features/viz/lib/linear-scale.js +1 -1
  261. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  262. package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
  263. package/dist/features/viz/lib/log-scale-component.js +19 -0
  264. package/dist/features/viz/lib/log-scale-component.js.map +7 -0
  265. package/dist/features/viz/lib/log-scale.d.ts +2 -0
  266. package/dist/features/viz/lib/log-scale.js +53 -0
  267. package/dist/features/viz/lib/log-scale.js.map +7 -0
  268. package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
  269. package/dist/features/viz/lib/monotone-curve.js +63 -0
  270. package/dist/features/viz/lib/monotone-curve.js.map +7 -0
  271. package/dist/features/viz/lib/nearest.d.ts +9 -9
  272. package/dist/features/viz/lib/nearest.js.map +1 -1
  273. package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
  274. package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
  275. package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
  276. package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
  277. package/dist/features/viz/lib/numeric-ticks.js +54 -0
  278. package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
  279. package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
  280. package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
  281. package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
  282. package/dist/features/viz/lib/paired-series.d.ts +44 -0
  283. package/dist/features/viz/lib/paired-series.js +93 -0
  284. package/dist/features/viz/lib/paired-series.js.map +7 -0
  285. package/dist/features/viz/lib/pie-layout.js +2 -1
  286. package/dist/features/viz/lib/pie-layout.js.map +2 -2
  287. package/dist/features/viz/lib/plot-series.js +11 -6
  288. package/dist/features/viz/lib/plot-series.js.map +2 -2
  289. package/dist/features/viz/lib/plot-types.d.ts +4 -3
  290. package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
  291. package/dist/features/viz/lib/point-scale-component.js +19 -0
  292. package/dist/features/viz/lib/point-scale-component.js.map +7 -0
  293. package/dist/features/viz/lib/point-scale.d.ts +2 -0
  294. package/dist/features/viz/lib/point-scale.js +45 -0
  295. package/dist/features/viz/lib/point-scale.js.map +7 -0
  296. package/dist/features/viz/lib/point-series.d.ts +1 -1
  297. package/dist/features/viz/lib/point-series.js +36 -9
  298. package/dist/features/viz/lib/point-series.js.map +2 -2
  299. package/dist/features/viz/lib/point-types.d.ts +5 -2
  300. package/dist/features/viz/lib/reference-band.d.ts +16 -0
  301. package/dist/features/viz/lib/reference-band.js +30 -0
  302. package/dist/features/viz/lib/reference-band.js.map +7 -0
  303. package/dist/features/viz/lib/scale-adjust.js +9 -4
  304. package/dist/features/viz/lib/scale-adjust.js.map +2 -2
  305. package/dist/features/viz/lib/scale-context.d.ts +5 -4
  306. package/dist/features/viz/lib/scale-context.js +15 -11
  307. package/dist/features/viz/lib/scale-context.js.map +2 -2
  308. package/dist/features/viz/lib/scale-provider.d.ts +2 -0
  309. package/dist/features/viz/lib/scale-provider.js +13 -0
  310. package/dist/features/viz/lib/scale-provider.js.map +7 -0
  311. package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
  312. package/dist/features/viz/lib/scale-ticks.js +64 -0
  313. package/dist/features/viz/lib/scale-ticks.js.map +7 -0
  314. package/dist/features/viz/lib/scale-view.d.ts +4 -0
  315. package/dist/features/viz/lib/scale-view.js +21 -0
  316. package/dist/features/viz/lib/scale-view.js.map +7 -0
  317. package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
  318. package/dist/features/viz/lib/sequential-color-scale.js +49 -0
  319. package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
  320. package/dist/features/viz/lib/series-position.d.ts +12 -0
  321. package/dist/features/viz/lib/series-position.js +44 -0
  322. package/dist/features/viz/lib/series-position.js.map +7 -0
  323. package/dist/features/viz/lib/step-curves.d.ts +19 -0
  324. package/dist/features/viz/lib/step-curves.js +53 -0
  325. package/dist/features/viz/lib/step-curves.js.map +7 -0
  326. package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
  327. package/dist/features/viz/lib/symlog-scale-component.js +19 -0
  328. package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
  329. package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
  330. package/dist/features/viz/lib/symlog-scale.js +38 -0
  331. package/dist/features/viz/lib/symlog-scale.js.map +7 -0
  332. package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
  333. package/dist/features/viz/lib/threshold-color-scale.js +59 -0
  334. package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
  335. package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
  336. package/dist/features/viz/lib/trading-time-mapping.js +89 -0
  337. package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
  338. package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
  339. package/dist/features/viz/lib/trading-time-scale.js +96 -0
  340. package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
  341. package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
  342. package/dist/features/viz/lib/trajectory-series.js +111 -0
  343. package/dist/features/viz/lib/trajectory-series.js.map +7 -0
  344. package/dist/features/viz/lib/types.d.ts +114 -21
  345. package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
  346. package/dist/features/viz/lib/use-bar-scale.js +9 -0
  347. package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
  348. package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
  349. package/dist/features/viz/lib/use-continuous-scale.js +14 -0
  350. package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
  351. package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
  352. package/dist/features/viz/lib/use-linear-scale.js +9 -0
  353. package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
  354. package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
  355. package/dist/features/viz/lib/use-log-scale.js +9 -0
  356. package/dist/features/viz/lib/use-log-scale.js.map +7 -0
  357. package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
  358. package/dist/features/viz/lib/use-point-scale.js +9 -0
  359. package/dist/features/viz/lib/use-point-scale.js.map +7 -0
  360. package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
  361. package/dist/features/viz/lib/use-symlog-scale.js +9 -0
  362. package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
  363. package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
  364. package/dist/features/viz/lib/use-utc-scale.js +9 -0
  365. package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
  366. package/dist/features/viz/lib/utc-labels.d.ts +12 -0
  367. package/dist/features/viz/lib/utc-labels.js +27 -0
  368. package/dist/features/viz/lib/utc-labels.js.map +7 -0
  369. package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
  370. package/dist/features/viz/lib/utc-scale-component.js +18 -0
  371. package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
  372. package/dist/features/viz/lib/utc-scale.d.ts +21 -0
  373. package/dist/features/viz/lib/utc-scale.js +124 -0
  374. package/dist/features/viz/lib/utc-scale.js.map +7 -0
  375. package/dist/features/viz/lib/volume-series.d.ts +59 -0
  376. package/dist/features/viz/lib/volume-series.js +117 -0
  377. package/dist/features/viz/lib/volume-series.js.map +7 -0
  378. package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
  379. package/dist/features/viz/lib/weighted-point-series.js +169 -0
  380. package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
  381. package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
  382. package/dist/filters/backdrop-contrast-gpu.js +33 -0
  383. package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
  384. package/dist/filters/backdrop-contrast.d.ts +21 -0
  385. package/dist/filters/backdrop-contrast.js +61 -0
  386. package/dist/filters/backdrop-contrast.js.map +7 -0
  387. package/dist/filters/displacement.js +1 -1
  388. package/dist/filters/displacement.js.map +2 -2
  389. package/dist/filters/emboss-gpu.d.ts +4 -0
  390. package/dist/filters/emboss-gpu.js +39 -0
  391. package/dist/filters/emboss-gpu.js.map +7 -0
  392. package/dist/filters/emboss.d.ts +32 -0
  393. package/dist/filters/emboss.js +104 -0
  394. package/dist/filters/emboss.js.map +7 -0
  395. package/dist/filters/filter-executor.d.ts +11 -4
  396. package/dist/filters/filter-executor.js +104 -49
  397. package/dist/filters/filter-executor.js.map +2 -2
  398. package/dist/filters/reflected-light.js +1 -1
  399. package/dist/filters/reflected-light.js.map +2 -2
  400. package/dist/filters/reflection-gpu.d.ts +3 -1
  401. package/dist/filters/reflection-gpu.js +5 -2
  402. package/dist/filters/reflection-gpu.js.map +2 -2
  403. package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
  404. package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
  405. package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
  406. package/dist/filters/render-emboss-boundary.d.ts +13 -0
  407. package/dist/filters/render-emboss-boundary.js +131 -0
  408. package/dist/filters/render-emboss-boundary.js.map +7 -0
  409. package/dist/filters.d.ts +9 -5
  410. package/dist/filters.js +4 -0
  411. package/dist/filters.js.map +2 -2
  412. package/dist/index.d.ts +10 -6
  413. package/dist/index.js +18 -2
  414. package/dist/index.js.map +2 -2
  415. package/dist/internal.d.ts +4 -0
  416. package/dist/internal.js +6 -0
  417. package/dist/internal.js.map +2 -2
  418. package/dist/layout-kernel.d.ts +12 -0
  419. package/dist/layout-kernel.js +11 -0
  420. package/dist/layout-kernel.js.map +7 -0
  421. package/dist/layout-kernel.mjs +1 -0
  422. package/dist/lib/animation/definition.d.ts +5 -3
  423. package/dist/lib/animation/definition.js +29 -4
  424. package/dist/lib/animation/definition.js.map +2 -2
  425. package/dist/lib/animation/playback.d.ts +8 -0
  426. package/dist/lib/animation/playback.js +33 -11
  427. package/dist/lib/animation/playback.js.map +2 -2
  428. package/dist/lib/animation/spring.d.ts +3 -1
  429. package/dist/lib/animation/spring.js.map +2 -2
  430. package/dist/lib/animation/types.d.ts +29 -73
  431. package/dist/lib/backend/types.d.ts +13 -1
  432. package/dist/lib/backend/types.js.map +2 -2
  433. package/dist/lib/components/arc-geometry.js +2 -1
  434. package/dist/lib/components/arc-geometry.js.map +2 -2
  435. package/dist/lib/components/g.js +2 -0
  436. package/dist/lib/components/g.js.map +2 -2
  437. package/dist/lib/components/html-box.js +2 -1
  438. package/dist/lib/components/html-box.js.map +2 -2
  439. package/dist/lib/components/img.js +3 -3
  440. package/dist/lib/components/img.js.map +2 -2
  441. package/dist/lib/components/layer.js +98 -16
  442. package/dist/lib/components/layer.js.map +3 -3
  443. package/dist/lib/components/text.d.ts +16 -0
  444. package/dist/lib/components/text.js +131 -24
  445. package/dist/lib/components/text.js.map +2 -2
  446. package/dist/lib/define-primitive.d.ts +4 -2
  447. package/dist/lib/define-primitive.js +3 -1
  448. package/dist/lib/define-primitive.js.map +2 -2
  449. package/dist/lib/element/metadata.d.ts +9 -0
  450. package/dist/lib/element/metadata.js +19 -0
  451. package/dist/lib/element/metadata.js.map +2 -2
  452. package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
  453. package/dist/lib/element/resolve-primitive-inputs.js +17 -4
  454. package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
  455. package/dist/lib/events/event-facade.d.ts +18 -0
  456. package/dist/lib/events/event-facade.js +28 -2
  457. package/dist/lib/events/event-facade.js.map +2 -2
  458. package/dist/lib/events/hit-test.js +2 -1
  459. package/dist/lib/events/hit-test.js.map +2 -2
  460. package/dist/lib/events/propagation.d.ts +2 -1
  461. package/dist/lib/events/propagation.js +22 -16
  462. package/dist/lib/events/propagation.js.map +2 -2
  463. package/dist/lib/events/registrations.d.ts +10 -0
  464. package/dist/lib/events/registrations.js +160 -5
  465. package/dist/lib/events/registrations.js.map +2 -2
  466. package/dist/lib/execute-render.js +25 -1
  467. package/dist/lib/execute-render.js.map +2 -2
  468. package/dist/lib/filter/filter-region.js +3 -10
  469. package/dist/lib/filter/filter-region.js.map +2 -2
  470. package/dist/lib/focus/focus-manager.d.ts +8 -1
  471. package/dist/lib/focus/focus-manager.js +87 -43
  472. package/dist/lib/focus/focus-manager.js.map +2 -2
  473. package/dist/lib/focus/geometry.d.ts +2 -0
  474. package/dist/lib/focus/geometry.js +6 -0
  475. package/dist/lib/focus/geometry.js.map +2 -2
  476. package/dist/lib/geometry/path-bend-guide.js +1 -1
  477. package/dist/lib/geometry/path-bend-guide.js.map +2 -2
  478. package/dist/lib/geometry/path-geometry.js +12 -11
  479. package/dist/lib/geometry/path-geometry.js.map +2 -2
  480. package/dist/lib/geometry/path-transforms.js +17 -21
  481. package/dist/lib/geometry/path-transforms.js.map +2 -2
  482. package/dist/lib/geometry/path-warp-bezier.js +3 -1
  483. package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
  484. package/dist/lib/geometry/path-warp.js +1 -1
  485. package/dist/lib/geometry/path-warp.js.map +2 -2
  486. package/dist/lib/global-state.js +2 -0
  487. package/dist/lib/global-state.js.map +2 -2
  488. package/dist/lib/hooks/use-animated-value.d.ts +11 -21
  489. package/dist/lib/hooks/use-animated-value.js +23 -70
  490. package/dist/lib/hooks/use-animated-value.js.map +3 -3
  491. package/dist/lib/hooks/use-playback.js +1 -0
  492. package/dist/lib/hooks/use-playback.js.map +2 -2
  493. package/dist/lib/html/html-events.d.ts +32 -0
  494. package/dist/lib/html/html-events.js +179 -0
  495. package/dist/lib/html/html-events.js.map +7 -0
  496. package/dist/lib/html/html-service.d.ts +8 -2
  497. package/dist/lib/html/html-service.js +198 -65
  498. package/dist/lib/html/html-service.js.map +2 -2
  499. package/dist/lib/html/overlay-config.js +7 -6
  500. package/dist/lib/html/overlay-config.js.map +2 -2
  501. package/dist/lib/html/types.d.ts +29 -2
  502. package/dist/lib/layout/absolute.d.ts +11 -5
  503. package/dist/lib/layout/absolute.js +329 -55
  504. package/dist/lib/layout/absolute.js.map +3 -3
  505. package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
  506. package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
  507. package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
  508. package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
  509. package/dist/lib/layout/allocation-checkpoint.js +463 -0
  510. package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
  511. package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
  512. package/dist/lib/layout/allocation-dependencies.js +90 -0
  513. package/dist/lib/layout/allocation-dependencies.js.map +7 -0
  514. package/dist/lib/layout/allocation-revision.d.ts +13 -0
  515. package/dist/lib/layout/allocation-revision.js +67 -0
  516. package/dist/lib/layout/allocation-revision.js.map +7 -0
  517. package/dist/lib/layout/box-insets.d.ts +17 -0
  518. package/dist/lib/layout/box-insets.js +138 -0
  519. package/dist/lib/layout/box-insets.js.map +7 -0
  520. package/dist/lib/layout/box-sizing.d.ts +16 -0
  521. package/dist/lib/layout/box-sizing.js +77 -0
  522. package/dist/lib/layout/box-sizing.js.map +7 -0
  523. package/dist/lib/layout/box.js +42 -12
  524. package/dist/lib/layout/box.js.map +2 -2
  525. package/dist/lib/layout/canvas-measurement.d.ts +13 -0
  526. package/dist/lib/layout/canvas-measurement.js +57 -0
  527. package/dist/lib/layout/canvas-measurement.js.map +7 -0
  528. package/dist/lib/layout/context.d.ts +35 -6
  529. package/dist/lib/layout/context.js +72 -3
  530. package/dist/lib/layout/context.js.map +2 -2
  531. package/dist/lib/layout/define-layout-component.d.ts +23 -0
  532. package/dist/lib/layout/define-layout-component.js +84 -0
  533. package/dist/lib/layout/define-layout-component.js.map +7 -0
  534. package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
  535. package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
  536. package/dist/lib/layout/flex-baseline-mode.js +7 -0
  537. package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
  538. package/dist/lib/layout/flex.d.ts +50 -15
  539. package/dist/lib/layout/flex.js +2124 -195
  540. package/dist/lib/layout/flex.js.map +3 -3
  541. package/dist/lib/layout/flow.js +225 -49
  542. package/dist/lib/layout/flow.js.map +2 -2
  543. package/dist/lib/layout/geometry-publication.d.ts +53 -0
  544. package/dist/lib/layout/geometry-publication.js +244 -0
  545. package/dist/lib/layout/geometry-publication.js.map +7 -0
  546. package/dist/lib/layout/grid-kernel.d.ts +63 -0
  547. package/dist/lib/layout/grid-kernel.js +168 -0
  548. package/dist/lib/layout/grid-kernel.js.map +7 -0
  549. package/dist/lib/layout/grid.d.ts +63 -4
  550. package/dist/lib/layout/grid.js +767 -171
  551. package/dist/lib/layout/grid.js.map +3 -3
  552. package/dist/lib/layout/measure.d.ts +55 -3
  553. package/dist/lib/layout/measure.js +448 -15
  554. package/dist/lib/layout/measure.js.map +2 -2
  555. package/dist/lib/layout/overlay.js +81 -23
  556. package/dist/lib/layout/overlay.js.map +2 -2
  557. package/dist/lib/layout/participation.d.ts +27 -0
  558. package/dist/lib/layout/participation.js +188 -0
  559. package/dist/lib/layout/participation.js.map +7 -0
  560. package/dist/lib/layout/place-child.js +1 -1
  561. package/dist/lib/layout/place-child.js.map +2 -2
  562. package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
  563. package/dist/lib/layout/positioning-diagnostics.js +13 -2
  564. package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
  565. package/dist/lib/layout/prepared-root.d.ts +121 -0
  566. package/dist/lib/layout/prepared-root.js +360 -0
  567. package/dist/lib/layout/prepared-root.js.map +7 -0
  568. package/dist/lib/layout/standalone-kernel.d.ts +60 -0
  569. package/dist/lib/layout/standalone-kernel.js +722 -0
  570. package/dist/lib/layout/standalone-kernel.js.map +7 -0
  571. package/dist/lib/layout/topology.d.ts +21 -0
  572. package/dist/lib/layout/topology.js +113 -0
  573. package/dist/lib/layout/topology.js.map +7 -0
  574. package/dist/lib/layout/types.d.ts +5 -0
  575. package/dist/lib/layout/wasm/artifact.d.ts +1 -0
  576. package/dist/lib/layout/wasm/artifact.js +5 -0
  577. package/dist/lib/layout/wasm/artifact.js.map +7 -0
  578. package/dist/lib/layout/wasm/bytes.d.ts +1 -0
  579. package/dist/lib/layout/wasm/bytes.js +5 -0
  580. package/dist/lib/layout/wasm/bytes.js.map +7 -0
  581. package/dist/lib/layout/wasm/embedded.d.ts +2 -0
  582. package/dist/lib/layout/wasm/embedded.js +12 -0
  583. package/dist/lib/layout/wasm/embedded.js.map +7 -0
  584. package/dist/lib/layout/wasm/layout.wasm +0 -0
  585. package/dist/lib/layout/wasm/module.d.ts +8 -0
  586. package/dist/lib/layout/wasm/module.js +70 -0
  587. package/dist/lib/layout/wasm/module.js.map +7 -0
  588. package/dist/lib/layout/wasm/region.d.ts +267 -0
  589. package/dist/lib/layout/wasm/region.js +1018 -0
  590. package/dist/lib/layout/wasm/region.js.map +7 -0
  591. package/dist/lib/manipulation/controller.js +4 -7
  592. package/dist/lib/manipulation/controller.js.map +2 -2
  593. package/dist/lib/manipulation/frame.js +1 -1
  594. package/dist/lib/manipulation/frame.js.map +2 -2
  595. package/dist/lib/manipulation/handles.js +32 -33
  596. package/dist/lib/manipulation/handles.js.map +2 -2
  597. package/dist/lib/manipulation/solve.js +12 -10
  598. package/dist/lib/manipulation/solve.js.map +2 -2
  599. package/dist/lib/mount-pibbl.js +1 -0
  600. package/dist/lib/mount-pibbl.js.map +2 -2
  601. package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
  602. package/dist/lib/mount-prepared-pibbl.js +29 -0
  603. package/dist/lib/mount-prepared-pibbl.js.map +7 -0
  604. package/dist/lib/mount-request.d.ts +8 -0
  605. package/dist/lib/mount-request.js +41 -0
  606. package/dist/lib/mount-request.js.map +7 -0
  607. package/dist/lib/pibbl.d.ts +21 -13
  608. package/dist/lib/pibbl.js +18 -16
  609. package/dist/lib/pibbl.js.map +2 -2
  610. package/dist/lib/recording/recording.d.ts +43 -0
  611. package/dist/lib/recording/recording.js +555 -0
  612. package/dist/lib/recording/recording.js.map +7 -0
  613. package/dist/lib/recording/types.d.ts +118 -0
  614. package/dist/lib/recording/wasm-bytes.d.ts +1 -0
  615. package/dist/lib/recording/wasm-bytes.js +5 -0
  616. package/dist/lib/recording/wasm-bytes.js.map +7 -0
  617. package/dist/lib/recording/worker-source.d.ts +1 -0
  618. package/dist/lib/recording/worker-source.js +5 -0
  619. package/dist/lib/recording/worker-source.js.map +7 -0
  620. package/dist/lib/render-layer/controller.d.ts +9 -3
  621. package/dist/lib/render-layer/controller.js +259 -110
  622. package/dist/lib/render-layer/controller.js.map +2 -2
  623. package/dist/lib/render-transaction.d.ts +12 -2
  624. package/dist/lib/render-transaction.js +69 -1
  625. package/dist/lib/render-transaction.js.map +2 -2
  626. package/dist/lib/render.js +32 -8
  627. package/dist/lib/render.js.map +2 -2
  628. package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
  629. package/dist/lib/scheduler/realm-scheduler.js +55 -26
  630. package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
  631. package/dist/lib/scheduler/renderer-participant.js +1 -0
  632. package/dist/lib/scheduler/renderer-participant.js.map +2 -2
  633. package/dist/lib/series-inspection-frame.d.ts +18 -0
  634. package/dist/lib/series-inspection-frame.js +70 -0
  635. package/dist/lib/series-inspection-frame.js.map +7 -0
  636. package/dist/lib/signals/edge.d.ts +7 -4
  637. package/dist/lib/signals/edge.js +25 -3
  638. package/dist/lib/signals/edge.js.map +2 -2
  639. package/dist/lib/signals/graph.d.ts +16 -2
  640. package/dist/lib/signals/graph.js +54 -12
  641. package/dist/lib/signals/graph.js.map +2 -2
  642. package/dist/lib/signals/input-provision.d.ts +15 -0
  643. package/dist/lib/signals/input-provision.js +53 -3
  644. package/dist/lib/signals/input-provision.js.map +2 -2
  645. package/dist/lib/signals/render-consumer.d.ts +3 -0
  646. package/dist/lib/signals/render-consumer.js +22 -14
  647. package/dist/lib/signals/render-consumer.js.map +2 -2
  648. package/dist/lib/style/positioning.d.ts +50 -2
  649. package/dist/lib/style/positioning.js +28 -4
  650. package/dist/lib/style/positioning.js.map +2 -2
  651. package/dist/lib/style/resolve-built-in.d.ts +4 -3
  652. package/dist/lib/style/resolve-built-in.js +17 -3
  653. package/dist/lib/style/resolve-built-in.js.map +2 -2
  654. package/dist/lib/style/resolve-dispatch.d.ts +3 -0
  655. package/dist/lib/style/resolve-dispatch.js +77 -4
  656. package/dist/lib/style/resolve-dispatch.js.map +2 -2
  657. package/dist/lib/style/resolve-length.d.ts +2 -0
  658. package/dist/lib/style/resolve-length.js +13 -9
  659. package/dist/lib/style/resolve-length.js.map +2 -2
  660. package/dist/lib/style/sizing-length.d.ts +51 -0
  661. package/dist/lib/style/sizing-length.js +77 -0
  662. package/dist/lib/style/sizing-length.js.map +7 -0
  663. package/dist/lib/style/types.d.ts +63 -25
  664. package/dist/lib/surface/root-surface.js +10 -6
  665. package/dist/lib/surface/root-surface.js.map +2 -2
  666. package/dist/lib/textures/texture.js +10 -8
  667. package/dist/lib/textures/texture.js.map +2 -2
  668. package/dist/lib/transitions/capture.js +4 -1
  669. package/dist/lib/transitions/capture.js.map +2 -2
  670. package/dist/lib/transitions/embers-physics.js +17 -10
  671. package/dist/lib/transitions/embers-physics.js.map +2 -2
  672. package/dist/lib/types.d.ts +110 -1
  673. package/dist/sync.d.ts +16 -0
  674. package/dist/sync.js +13 -0
  675. package/dist/sync.js.map +7 -0
  676. package/dist/sync.mjs +1 -0
  677. package/package.json +43 -6
  678. package/dist/features/viz/lib/scale.d.ts +0 -11
  679. package/dist/features/viz/lib/scale.js +0 -80
  680. package/dist/features/viz/lib/scale.js.map +0 -7
  681. package/dist/features/viz/lib/use-scale.d.ts +0 -20
  682. package/dist/features/viz/lib/use-scale.js +0 -10
  683. package/dist/features/viz/lib/use-scale.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/features/physics/lib/2d/runtime/controller.ts"],
4
- "sourcesContent": ["import { CommittedObstacles2D } from \"./obstacles.js\";\nimport { boundsOfShape2D } from \"../../../2d-geometry.js\";\nimport { createShape2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyInspection2D,\n PibblPhysicsInspection2D,\n} from \"../inspection-types.js\";\nimport { RapierSimulation2D } from \"../world/rapier.js\";\nimport { signal, type WritableSignal } from \"@pibbl/core\";\nimport {\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentRenderOwner,\n type PibblInternalSignalConsumer,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n type PibblInternalSignalBatch,\n type PibblInternalSimulationOwner,\n} from \"@pibbl/core/internal\";\nimport type {\n PibblPhysicsAabb2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsVector2,\n} from \"../../../2d-geometry.js\";\nimport type { ShapeRecord2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyHandle2D,\n PibblPhysicsColliderHandle2D,\n PibblPhysicsQueryHit2D,\n PibblPhysicsQueryMatch2D,\n PibblPhysicsQueryMode,\n PibblPhysicsQueryOptions2D,\n PibblPhysicsQueryResult2D,\n PibblPhysicsWorldHandle2D,\n} from \"../types.js\";\nimport type { PibblResolvedPhysicsWorld2DProps } from \"./world-props.js\";\nimport { BODY_CCD_2D } from \"../world/ccd.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nimport {\n BODY_FIXED_ROTATION_2D,\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n} from \"../world/integrator.js\";\nimport { BODY_SLEEP_DISABLED_2D, BODY_SLEEPING_2D } from \"../world/solver.js\";\nimport type { BodyDefinition2D } from \"../world/storage.js\";\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n} from \"../../shared/validation.js\";\nimport {\n normalizePhysicsWorld2DConfiguration,\n PhysicsWorld2DKernel,\n type NormalizedPhysicsWorld2DConfiguration,\n type PhysicsBodyTopologyRecord2D,\n type PhysicsBodyCommand2D,\n type PhysicsColliderTopologyRecord2D,\n type PhysicsCommand2D,\n type PhysicsWorld2DConfiguration,\n type PhysicsTopologyRecord2D,\n type PhysicsWorld2DCandidate,\n} from \"../world/world.js\";\nimport { CommittedWorldQueries2D } from \"../world/queries.js\";\nimport {\n bindPhysicsBodyHandle2D,\n createPhysicsBodyHandle2D,\n physicsBodyHandleBinding2D,\n stagePhysicsBodyHandle2D,\n type PhysicsBodyHandleValues2D,\n unbindPhysicsBodyHandle2D,\n} from \"./body-handle.js\";\nimport {\n createPhysicsColliderHandle2D,\n isPhysicsBodyEventDelivery2D,\n materializePhysicsBodyEvent2D,\n materializePhysicsContactEvent2D,\n physicsColliderHandleIdentity2D,\n sortPhysicsEventDeliveries2D,\n type PhysicsBodyEventDelivery2D,\n type PhysicsContactEventDelivery2D,\n type PhysicsEventDelivery2D,\n} from \"./events.js\";\nimport {\n type MountedPhysicsAttachment2D,\n type NormalizedPhysicsColliderConfiguration2D,\n type PhysicsBodyAttachment2DDescriptor,\n} from \"./descriptors.js\";\n\nconst worldController2DSymbol = Symbol(\"PhysicsWorld2DController\");\n\ntype InternalWorldHandle2D = PibblPhysicsWorldHandle2D &\n Readonly<{\n readonly [worldController2DSymbol]: PhysicsWorld2DController;\n }>;\n\ninterface BodyDraft2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n}\n\ninterface ColliderDraft2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n readonly shape: ShapeRecord2D;\n}\n\ninterface RenderDraft2D {\n readonly simulationToRoot: DOMMatrix;\n readonly configuration: NormalizedPhysicsWorld2DConfiguration;\n readonly props: PibblResolvedPhysicsWorld2DProps;\n readonly bodies: Map<number, BodyDraft2D>;\n readonly colliders: Map<number, ColliderDraft2D>;\n}\n\ninterface AcceptedBody2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n readonly handleBindingGeneration: number | undefined;\n}\n\ninterface AcceptedCollider2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n}\n\ninterface AttachmentIds2D {\n bodyId?: number;\n colliderId?: number;\n}\n\ninterface BodyVelocity2D {\n readonly linearVelocityX: number;\n readonly linearVelocityY: number;\n readonly angularVelocity: number;\n}\n\nexport interface PhysicsWorld2DControllerSnapshot {\n readonly revision: number;\n readonly revisionMaterialized: boolean;\n readonly materializedBodyHandles: number;\n readonly materializedColliderHandles: number;\n readonly advanceRegistered: boolean;\n readonly bodyIds: readonly number[];\n readonly colliderIds: readonly number[];\n readonly kernel: ReturnType<PhysicsWorld2DKernel[\"snapshot\"]>;\n}\n\nexport class PhysicsWorld2DController {\n readonly handle: PibblPhysicsWorldHandle2D;\n private revision: WritableSignal<number> | undefined;\n private committedRevision = 0;\n private obstacles: CommittedObstacles2D | undefined;\n private obstacleSource: Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> | undefined;\n\n getObstacleSource(): Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> {\n this.assertActive();\n if (!this.obstacleSource) {\n if (this.liveCandidate) throw new Error(\"Create physics obstacles before simulation Advance.\");\n this.obstacles = new CommittedObstacles2D();\n this.obstacles.publish(this.kernel, this.acceptedColliders, this.committedRevision);\n this.obstacleSource = Object.freeze({ read: () => {\n this.assertActive();\n return this.obstacles!.read();\n } });\n }\n return this.obstacleSource;\n }\n private failedFrames = 0;\n private lastFailure: string | null = null;\n private readonly kernel: PhysicsWorld2DKernel;\n private readonly ids = new WeakMap<object, AttachmentIds2D>();\n private nextId = 0;\n private draft: RenderDraft2D | undefined;\n private acceptedTopology: readonly PhysicsTopologyRecord2D[] = Object.freeze(\n [],\n );\n private acceptedBodies: readonly AcceptedBody2D[] = Object.freeze([]);\n private acceptedColliders: readonly AcceptedCollider2D[] = Object.freeze([]);\n private acceptedConfiguration: NormalizedPhysicsWorld2DConfiguration;\n private acceptedProps: PibblResolvedPhysicsWorld2DProps = Object.freeze({});\n private readonly suspendedVelocities = new Map<number, BodyVelocity2D>();\n private readonly materializedBodyHandles = new Map<\n string,\n PibblPhysicsBodyHandle2D\n >();\n private readonly materializedColliderHandles = new Map<\n string,\n PibblPhysicsColliderHandle2D\n >();\n private materializedHandleTopologyPending = false;\n private readonly queries: CommittedWorldQueries2D;\n private queuedBegin: Readonly<{ cancel(): void }> | undefined;\n private releaseAdvance: (() => void) | undefined;\n private readonly releasePassiveAdvance: () => void;\n private liveCandidate: PhysicsWorld2DCandidate | undefined;\n private active = true;\n private readonly space: \"root\" | \"local\";\n private simulationToRoot = new DOMMatrix();\n private readonly targetConsumer: PibblInternalSignalConsumer;\n\n constructor(\n private readonly owner: PibblInternalSimulationOwner,\n initialProps: PibblResolvedPhysicsWorld2DProps,\n ) {\n this.space = initialProps.space ?? \"root\";\n if (this.space !== \"root\" && this.space !== \"local\")\n throw new TypeError('PhysicsWorld2D space must be \"root\" or \"local\".');\n this.targetConsumer = pibblInternalCreateSignalConsumer({\n owner: pibblInternalCurrentRenderOwner(),\n debugName: \"PhysicsWorld2D kinematic targets\",\n invalidate: () => {\n if (this.active) this.ensureAdvance();\n },\n });\n const configuration = normalizeWorldConfiguration(initialProps);\n this.kernel = new PhysicsWorld2DKernel(\n denormalizeWorldConfiguration(configuration),\n new RapierSimulation2D(),\n );\n // Idle worlds still observe animation's staged target in the same Advance\n // phase, without keeping the host clock alive themselves.\n this.releasePassiveAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => {\n if (this.releaseAdvance !== undefined) return;\n const targets = this.readKinematicTargets(batch);\n for (const [id, target] of targets) {\n if (this.kernel.bodyIdentity(id) === undefined) continue;\n const pose = this.kernel.authoritativePose(id);\n if (\n target.position[0] !== pose.position[0] ||\n target.position[1] !== pose.position[1] ||\n target.rotationDegrees !== pose.rotationDegrees\n ) {\n this.ensureAdvance();\n this.advance(frame.frameId, frame.logicalTime, batch);\n return;\n }\n }\n },\n false,\n );\n this.queries = new CommittedWorldQueries2D({\n generation: 1,\n bodies: this.kernel.bodies,\n colliders: this.kernel.colliders,\n broadPhase: this.kernel.broadPhase,\n materializeBody: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n materializeCollider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n resolveBody: (handle) => this.resolveBodyHandle(handle),\n resolveCollider: (handle) => this.resolveColliderHandle(handle),\n });\n this.acceptedConfiguration = configuration;\n const target = {\n [worldController2DSymbol]: this,\n } as Record<PropertyKey, unknown>;\n Object.defineProperty(target, \"revision\", {\n enumerable: true,\n get: () => this.materializeRevision().asReadonly(),\n });\n this.handle = Object.freeze(target) as unknown as InternalWorldHandle2D;\n }\n\n beginRender(\n props: PibblResolvedPhysicsWorld2DProps,\n rootTransform = new DOMMatrix(),\n ): void {\n if ((props.space ?? \"root\") !== this.space)\n throw new Error(\n \"PhysicsWorld2D space is creation-only; remount the world with a new key to change it.\",\n );\n const simulationToRoot =\n this.space === \"local\" ? rootTransform : new DOMMatrix();\n const { a, b, c, d, e, f } = simulationToRoot;\n if (\n ![a, b, c, d, e, f].every(Number.isFinite) ||\n Math.abs(a * d - b * c) < 1e-10\n )\n throw new Error(\n \"PhysicsWorld2D viewport transform must be finite and invertible.\",\n );\n this.assertActive();\n if (this.draft !== undefined) {\n throw new Error(\n \"PhysicsWorld2D began a second render before finishing the first.\",\n );\n }\n this.draft = {\n simulationToRoot,\n configuration: normalizeWorldConfiguration(props),\n props,\n bodies: new Map(),\n colliders: new Map(),\n };\n pibblInternalOnSimulationRenderTransactionFinish(this.owner, (success) =>\n this.finishRender(success),\n );\n }\n\n simulationTransform(root: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot)\n .inverse()\n .multiply(root);\n }\n\n rootTransform(local: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot).multiply(\n local,\n );\n }\n\n convertPoint(point: PibblPhysicsVector2, toRoot: boolean): PibblPhysicsVector2 {\n this.assertActive();\n const value = copyFiniteVector2(point, \"point\");\n const matrix = toRoot\n ? this.simulationToRoot\n : this.simulationToRoot.inverse();\n return Object.freeze([\n matrix.a * value[0] + matrix.c * value[1] + matrix.e,\n matrix.b * value[0] + matrix.d * value[1] + matrix.f,\n ]);\n }\n\n bodyIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.bodyId ??= this.allocateId());\n }\n\n colliderIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.colliderId ??= this.allocateId());\n }\n\n collectBody(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n descriptor: PhysicsBodyAttachment2DDescriptor,\n initialPose: PibblPhysicsPose2D = ZERO_POSE_2D,\n ): void {\n const draft = this.requireDraft();\n draft.bodies.set(bodyId, {\n id: bodyId,\n attachment,\n descriptor,\n initialPose: copyPhysicsPose2D(initialPose),\n });\n const collider = descriptor.options.collider;\n if (\n collider !== false &&\n collider.shape !== \"self\" &&\n descriptor.options.enabled\n ) {\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options: collider,\n shape: attachment.resolveShape(collider),\n });\n }\n }\n\n collectCollider(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n options: NormalizedPhysicsColliderConfiguration2D,\n ): void {\n if (options.shape === \"self\") return;\n const draft = this.requireDraft();\n if (draft.bodies.get(bodyId)?.descriptor.options.enabled === false) return;\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options,\n shape: attachment.resolveShape(options),\n });\n }\n\n queueCommands(commands: readonly PhysicsCommand2D[]): void {\n this.assertActive();\n if (commands.length === 0) return;\n pibblInternalQueueSimulationBegin(this.owner, () => {\n this.kernel.applyBegin(commands);\n });\n this.ensureAdvance();\n }\n\n acceptBodyHandleCommand(\n handle: PibblPhysicsBodyHandle2D,\n bindingGeneration: number,\n command: PhysicsBodyCommand2D,\n ): boolean {\n if (!this.active) return false;\n const binding = physicsBodyHandleBinding2D(handle);\n const accepted = this.acceptedBodies.find(\n (body) =>\n body.id === command.bodyId &&\n body.descriptor.options.handle === handle &&\n body.handleBindingGeneration === bindingGeneration,\n );\n const identity = this.kernel.bodyIdentity(command.bodyId);\n const materialized =\n identity === undefined\n ? undefined\n : this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (\n binding?.controller !== this ||\n binding.bindingGeneration !== bindingGeneration ||\n (accepted === undefined && materialized !== handle)\n ) {\n return false;\n }\n this.kernel.applyBegin([command]);\n this.ensureAdvance();\n return true;\n }\n\n presentationPose(bodyId: number): PibblPhysicsPose2D | undefined {\n return this.kernel.bodyIdentity(bodyId) !== undefined\n ? this.kernel.presentationPose(bodyId)\n : undefined;\n }\n\n raycast<Mode extends PibblPhysicsQueryMode = \"closest\">(\n ray: PibblPhysicsRay2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.raycast(1, ray, options);\n }\n\n shapeCast<Mode extends PibblPhysicsQueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n from: PibblPhysicsPose2D,\n translation: PibblPhysicsVector2,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.shapeCast(1, shape, from, translation, options);\n }\n\n overlapShape<Mode extends PibblPhysicsQueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n pose: PibblPhysicsPose2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.overlapShape(1, shape, pose, options);\n }\n\n queryAabb<Mode extends PibblPhysicsQueryMode = \"closest\">(\n bounds: PibblPhysicsAabb2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryAabb(1, bounds, options);\n }\n\n queryPoint<Mode extends PibblPhysicsQueryMode = \"closest\">(\n point: PibblPhysicsVector2,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryPoint(1, point, options);\n }\n\n bodyHandleValues(bodyId: number): PhysicsBodyHandleValues2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n if (identity === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const state = {\n linearVelocityX: bodies.linearVelocityX[index]!,\n linearVelocityY: bodies.linearVelocityY[index]!,\n angularVelocity: bodies.angularVelocity[index]!,\n flags: bodies.flags[index]!,\n generation: identity.generation,\n };\n const pose = this.kernel.authoritativePose(bodyId);\n return Object.freeze({\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n state.linearVelocityX,\n state.linearVelocityY,\n ] as const),\n angularVelocityDegreesPerSecond: (state.angularVelocity * 180) / Math.PI,\n sleeping: (state.flags & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(bodyId),\n generation: state.generation,\n });\n }\n\n inspectBody(bodyId: number): PibblPhysicsBodyInspection2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n const declared = this.acceptedBodies.find((body) => body.id === bodyId);\n if (identity === undefined || declared === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const flags = bodies.flags[index]!;\n return Object.freeze({\n id: bodyId,\n generation: identity.generation,\n type: declared.descriptor.bodyType,\n enabled: this.kernel.isBodyEnabled(bodyId),\n sleeping: !!(flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(bodyId),\n presentationPose: this.kernel.presentationPose(bodyId),\n centerOfMass: Object.freeze([\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n ] as const),\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[index]!,\n bodies.linearVelocityY[index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[index]! * 180) / Math.PI,\n mass: bodies.inverseMass[index]! > 0 ? 1 / bodies.inverseMass[index]! : null,\n });\n }\n\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n this.targetConsumer.dispose();\n this.releasePassiveAdvance();\n this.queuedBegin?.cancel();\n this.queuedBegin = undefined;\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n if (this.liveCandidate !== undefined) {\n this.kernel.discard(this.liveCandidate);\n this.liveCandidate = undefined;\n }\n for (const body of this.acceptedBodies) this.unbindBodyHandle(body);\n for (const handle of this.materializedBodyHandles.values()) {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n }\n this.materializedBodyHandles.clear();\n this.materializedColliderHandles.clear();\n this.materializedHandleTopologyPending = false;\n this.obstacles = undefined;\n this.obstacleSource = undefined;\n this.kernel.dispose();\n this.queries.invalidate();\n this.acceptedBodies = Object.freeze([]);\n this.acceptedColliders = Object.freeze([]);\n this.draft = undefined;\n this.suspendedVelocities.clear();\n }\n\n inspect(): PibblPhysicsInspection2D {\n this.assertActive();\n const snapshot = this.kernel.snapshot();\n const vector = (x: number, y: number): PibblPhysicsVector2 =>\n Object.freeze([x, y]);\n const contacts = this.kernel.contacts;\n const declaredTypes = new Map(\n this.acceptedBodies.map((body) => [body.id, body.descriptor.bodyType]),\n );\n return Object.freeze({\n engine: \"rapier-2d@0.21.0\",\n space: this.space,\n revision: this.committedRevision,\n tick: snapshot.tick,\n advancing: this.releaseAdvance !== undefined,\n failedFrames: this.failedFrames,\n lastFailure: this.lastFailure,\n bodies: Object.freeze(\n snapshot.bodies.map((body) =>\n Object.freeze({\n id: body.id,\n generation: body.generation,\n type: declaredTypes.get(body.id)!,\n enabled: this.kernel.isBodyEnabled(body.id),\n sleeping: !!(body.flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(body.id),\n presentationPose: this.kernel.presentationPose(body.id),\n centerOfMass: vector(body.positionX, body.positionY),\n linearVelocity: vector(body.linearVelocityX, body.linearVelocityY),\n angularVelocityDegreesPerSecond:\n (body.angularVelocity * 180) / Math.PI,\n mass: body.inverseMass > 0 ? 1 / body.inverseMass : null,\n }),\n ),\n ),\n colliders: Object.freeze(\n this.acceptedColliders.flatMap((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n if (!identity) return [];\n const shape = this.kernel.colliders.shapes[identity.index]!;\n return [\n Object.freeze({\n id: collider.id,\n generation: identity.generation,\n bodyId: collider.bodyId,\n sensor: !!(\n this.kernel.colliders.flags[identity.index]! &\n COLLIDER_SENSOR_2D\n ),\n label:\n typeof collider.options.tag === \"string\"\n ? collider.options.tag\n : null,\n shapeKinds: Object.freeze(shape.leaves.map((leaf) => leaf.kind)),\n bounds: boundsOfShape2D(\n createShape2D(shape),\n this.kernel.authoritativePose(collider.bodyId),\n ),\n }),\n ];\n }),\n ),\n contacts: Object.freeze(\n Array.from(\n { length: contacts.contactCount },\n (_, index) => index,\n ).flatMap((index) => {\n const firstColliderId = this.kernel.colliderIdForIdentity(\n contacts.firstColliderIndices[index]!,\n contacts.firstColliderGenerations[index]!,\n );\n const secondColliderId = this.kernel.colliderIdForIdentity(\n contacts.secondColliderIndices[index]!,\n contacts.secondColliderGenerations[index]!,\n );\n if (firstColliderId === undefined || secondColliderId === undefined)\n return [];\n return [\n Object.freeze({\n firstColliderId,\n secondColliderId,\n sensor: contacts.sensorFlags[index] !== 0,\n normal: vector(\n contacts.normalX[index]!,\n contacts.normalY[index]!,\n ),\n normalImpulse:\n contacts.pointNormalImpulses[index * 2]! +\n (contacts.pointCounts[index]! > 1\n ? contacts.pointNormalImpulses[index * 2 + 1]!\n : 0),\n points: Object.freeze(\n Array.from(\n { length: contacts.pointCounts[index]! },\n (_, point) => {\n const offset = index * 2 + point;\n return Object.freeze({\n pointOnFirst: vector(\n contacts.pointFirstX[offset]!,\n contacts.pointFirstY[offset]!,\n ),\n pointOnSecond: vector(\n contacts.pointSecondX[offset]!,\n contacts.pointSecondY[offset]!,\n ),\n separation: contacts.pointSeparations[offset]!,\n });\n },\n ),\n ),\n }),\n ];\n }),\n ),\n });\n }\n\n snapshot(): PhysicsWorld2DControllerSnapshot {\n return Object.freeze({\n revision: this.committedRevision,\n revisionMaterialized: this.revision !== undefined,\n materializedBodyHandles: this.materializedBodyHandles.size,\n materializedColliderHandles: this.materializedColliderHandles.size,\n advanceRegistered: this.releaseAdvance !== undefined,\n bodyIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => record.id),\n ),\n colliderIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsColliderTopologyRecord2D =>\n record.kind === \"collider\",\n )\n .map((record) => record.id),\n ),\n kernel: this.kernel.snapshot(),\n });\n }\n\n private finishRender(success: boolean): void {\n const draft = this.draft;\n this.draft = undefined;\n if (!success || draft === undefined || !this.active) return;\n validateAutomaticMass(draft);\n const reenableVelocities = this.resolveReenableVelocities(draft);\n const previousBodyDefinitions = new Map(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => [record.id, record.definition] as const),\n );\n const topology = materializeTopology(\n draft,\n reenableVelocities,\n previousBodyDefinitions,\n );\n const topologyChanged = !sameTopology(this.acceptedTopology, topology);\n const configurationChanged = !sameConfiguration(\n this.acceptedConfiguration,\n draft.configuration,\n );\n const nextBodies = [...draft.bodies.values()].sort(\n (left, right) => left.id - right.id,\n );\n validateUniqueBodyHandles(nextBodies);\n const nextBodiesById = new Map(nextBodies.map((body) => [body.id, body]));\n for (const body of this.acceptedBodies) {\n const next = nextBodiesById.get(body.id);\n const retained =\n next !== undefined &&\n next.descriptor.options.handle === body.descriptor.options.handle;\n if (!retained) this.unbindBodyHandle(body);\n }\n this.simulationToRoot = draft.simulationToRoot;\n this.acceptedProps = draft.props;\n this.acceptedBodies = Object.freeze(\n nextBodies.map(({ id, attachment, descriptor, initialPose }) =>\n Object.freeze({\n id,\n attachment,\n descriptor,\n initialPose,\n handleBindingGeneration:\n descriptor.options.handle === undefined\n ? undefined\n : bindPhysicsBodyHandle2D(descriptor.options.handle, this, id),\n }),\n ),\n );\n this.acceptedColliders = Object.freeze(\n [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map(({ id, bodyId, attachment, options }) =>\n Object.freeze({ id, bodyId, attachment, options }),\n ),\n );\n this.targetConsumer.collect(() => {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n body.descriptor.options.target.position?.get();\n body.descriptor.options.target.rotationDegrees?.get();\n }\n });\n this.targetConsumer.markClean();\n this.acceptedTopology = topology;\n this.kernel.updateColliderMetadata(topology);\n if (topologyChanged) this.materializedHandleTopologyPending = true;\n if (!topologyChanged && !configurationChanged) return;\n this.acceptedConfiguration = draft.configuration;\n this.queuedBegin?.cancel();\n this.queuedBegin = pibblInternalQueueSimulationBegin(this.owner, () => {\n this.queuedBegin = undefined;\n if (topologyChanged) this.kernel.proposeTopology(this.acceptedTopology);\n if (configurationChanged) {\n this.kernel.applyBegin([\n {\n kind: \"configure\",\n configuration: denormalizeWorldConfiguration(draft.configuration),\n },\n ]);\n }\n });\n this.ensureAdvance();\n }\n\n private ensureAdvance(): void {\n if (this.releaseAdvance !== undefined) return;\n this.releaseAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => this.advance(frame.frameId, frame.logicalTime, batch),\n );\n }\n\n private resolveReenableVelocities(\n draft: RenderDraft2D,\n ): ReadonlyMap<number, BodyVelocity2D> {\n const previousById = new Map(\n this.acceptedBodies.map((body) => [body.id, body]),\n );\n const overrides = new Map<number, BodyVelocity2D>();\n for (const body of draft.bodies.values()) {\n const previous = previousById.get(body.id);\n const currentDynamic =\n body.descriptor.bodyType === \"dynamic\" ? body.descriptor : undefined;\n const previousDynamic =\n previous?.descriptor.bodyType === \"dynamic\"\n ? previous.descriptor\n : undefined;\n if (\n currentDynamic !== undefined &&\n !currentDynamic.options.enabled &&\n previousDynamic?.options.enabled\n ) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity !== undefined) {\n const bodies = this.kernel.bodies;\n this.suspendedVelocities.set(\n body.id,\n Object.freeze({\n linearVelocityX: bodies.linearVelocityX[identity.index]!,\n linearVelocityY: bodies.linearVelocityY[identity.index]!,\n angularVelocity: bodies.angularVelocity[identity.index]!,\n }),\n );\n }\n }\n if (\n currentDynamic?.options.enabled &&\n previousDynamic !== undefined &&\n !previousDynamic.options.enabled\n ) {\n const preserved = this.suspendedVelocities.get(body.id);\n overrides.set(\n body.id,\n currentDynamic.options.reenableVelocity === \"preserve\" && preserved\n ? preserved\n : ZERO_VELOCITY_2D,\n );\n }\n }\n const retained = new Set(draft.bodies.keys());\n for (const id of this.suspendedVelocities.keys()) {\n if (!retained.has(id)) this.suspendedVelocities.delete(id);\n }\n return overrides;\n }\n\n private advance(\n frameId: number,\n logicalTime: number,\n batch: PibblInternalSignalBatch,\n ): void {\n let candidate: PhysicsWorld2DCandidate | undefined;\n try {\n candidate = this.kernel.advance({\n frameId,\n logicalTime,\n stagedKinematicTargets: this.readKinematicTargets(batch),\n });\n if (candidate === undefined) return;\n this.liveCandidate = candidate;\n const nextRevision = this.committedRevision + 1;\n this.stagePublicSignals(batch, nextRevision);\n const events = this.copyEventDeliveries(candidate);\n let adopted = false;\n if (events.length > 0) {\n pibblInternalQueueSimulationComplete(this.owner, () => {\n if (adopted) this.deliverEvents(events);\n });\n }\n pibblInternalQueueSimulationCommitAcknowledgement(\n this.owner,\n (_frame, outcome) => {\n if (this.liveCandidate !== candidate) return;\n this.liveCandidate = undefined;\n if (!outcome.applied) {\n this.kernel.discard(candidate!);\n return;\n }\n this.kernel.adopt(candidate!);\n if (this.materializedHandleTopologyPending) {\n this.evictRetiredMaterializedHandles();\n this.materializedHandleTopologyPending = false;\n }\n this.committedRevision = nextRevision;\n this.obstacles?.publish(this.kernel, this.acceptedColliders, nextRevision);\n adopted = true;\n pibblInternalRequestSimulationRender(this.owner);\n if (\n !this.hasAwakeBodies() &&\n (candidate!.stepCount > 0 ||\n !this.acceptedBodies.some(\n (body) => body.descriptor.bodyType === \"kinematic\",\n ))\n ) {\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n }\n },\n );\n } catch (error) {\n this.failedFrames++;\n this.lastFailure = error instanceof Error ? error.message : String(error);\n if (candidate?.lifecycle === \"live\") this.kernel.discard(candidate);\n if (this.liveCandidate === candidate) this.liveCandidate = undefined;\n const onError = this.acceptedProps.onError;\n if (onError) {\n pibblInternalQueueSimulationComplete(this.owner, () => onError(error));\n }\n throw error;\n }\n }\n\n private readKinematicTargets(\n batch: PibblInternalSignalBatch,\n ): ReadonlyMap<number, PibblPhysicsPose2D> {\n const targets = new Map<number, PibblPhysicsPose2D>();\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n const target = body.descriptor.options.target;\n if (\n target.position === undefined &&\n target.rotationDegrees === undefined\n ) {\n continue;\n }\n const position =\n target.position === undefined\n ? body.initialPose.position\n : batch.read(\n target.position as WritableSignal<readonly [number, number]>,\n );\n const rotationDegrees =\n target.rotationDegrees === undefined\n ? body.initialPose.rotationDegrees\n : batch.read(target.rotationDegrees as WritableSignal<number>);\n targets.set(\n body.id,\n Object.freeze({\n position: Object.freeze([position[0], position[1]] as const),\n rotationDegrees,\n }),\n );\n }\n return targets;\n }\n\n private stagePublicSignals(\n batch: PibblInternalSignalBatch,\n nextRevision: number,\n ): void {\n if (this.revision !== undefined) {\n batch.stage(this.revision, nextRevision, this);\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const explicit = body.descriptor.options.handle;\n const materialized = this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (explicit === undefined && materialized === undefined) continue;\n const pose = this.kernel.authoritativePose(body.id);\n const values = {\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[identity.index]!,\n bodies.linearVelocityY[identity.index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[identity.index]! * 180) / Math.PI,\n sleeping: (bodies.flags[identity.index]! & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(body.id),\n generation: identity.generation,\n } as const;\n if (explicit !== undefined) {\n stagePhysicsBodyHandle2D(batch, explicit, values, this);\n }\n if (materialized !== undefined && materialized !== explicit) {\n stagePhysicsBodyHandle2D(batch, materialized, values, this);\n }\n }\n }\n\n private copyEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n ): readonly PhysicsEventDelivery2D[] {\n const events: PhysicsEventDelivery2D[] = [];\n for (let offset = 0; offset < candidate.eventCount; offset += 1) {\n const eventIndex = candidate.eventOffset + offset;\n const kind = candidate.eventKinds[eventIndex];\n if (kind === 5 || kind === 6) {\n const handler =\n kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n if (handler === undefined) continue;\n const bodyIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const bodyGeneration = this.kernel.bodies.generations[bodyIndex]!;\n const bodyId = this.kernel.bodyIdForIdentity(bodyIndex, bodyGeneration);\n if (bodyId === undefined) continue;\n events.push(\n Object.freeze({\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n bodyIndex,\n bodyGeneration,\n bodyId,\n handler,\n }) satisfies PhysicsBodyEventDelivery2D,\n );\n continue;\n }\n if (kind !== 1 && kind !== 2 && kind !== 3 && kind !== 4 && kind !== 7) {\n continue;\n }\n this.copyContactEventDeliveries(candidate, eventIndex, kind, events);\n }\n return sortPhysicsEventDeliveries2D(events);\n }\n\n private copyContactEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n eventIndex: number,\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n events: PhysicsEventDelivery2D[],\n ): void {\n const firstColliderIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const firstColliderGeneration =\n candidate.eventFirstColliderGenerations[eventIndex]!;\n const secondColliderIndex =\n candidate.eventSecondColliderIndices[eventIndex]!;\n const secondColliderGeneration =\n candidate.eventSecondColliderGenerations[eventIndex]!;\n const first = this.acceptedColliderForIdentity(\n firstColliderIndex,\n firstColliderGeneration,\n );\n const second = this.acceptedColliderForIdentity(\n secondColliderIndex,\n secondColliderGeneration,\n );\n if (first === undefined || second === undefined) return;\n const handlerName = eventHandlerName(kind);\n const firstHandler = first.options.handlers[handlerName];\n const secondHandler = second.options.handlers[handlerName];\n if (firstHandler === undefined && secondHandler === undefined) return;\n const firstBodyIdentity = this.kernel.bodyIdentity(first.bodyId);\n const secondBodyIdentity = this.kernel.bodyIdentity(second.bodyId);\n if (firstBodyIdentity === undefined || secondBodyIdentity === undefined)\n return;\n const points: Array<PhysicsContactEventDelivery2D[\"points\"][number]> = [];\n const pointBase = eventIndex * 2;\n for (\n let point = 0;\n point < candidate.eventPointCounts[eventIndex]!;\n point += 1\n ) {\n points.push(\n Object.freeze({\n firstX: candidate.eventPointFirstX[pointBase + point]!,\n firstY: candidate.eventPointFirstY[pointBase + point]!,\n secondX: candidate.eventPointSecondX[pointBase + point]!,\n secondY: candidate.eventPointSecondY[pointBase + point]!,\n separation: candidate.eventPointSeparations[pointBase + point]!,\n }),\n );\n }\n const common = {\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n firstColliderIndex,\n firstColliderGeneration,\n secondColliderIndex,\n secondColliderGeneration,\n firstBodyIndex: firstBodyIdentity.index,\n firstBodyGeneration: firstBodyIdentity.generation,\n secondBodyIndex: secondBodyIdentity.index,\n secondBodyGeneration: secondBodyIdentity.generation,\n normalX: candidate.eventNormalX[eventIndex]!,\n normalY: candidate.eventNormalY[eventIndex]!,\n points: Object.freeze(points),\n totalNormalImpulse: candidate.eventTotalNormalImpulses[eventIndex]!,\n } as const;\n if (firstHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"first\",\n receiverColliderId: first.id,\n receiverBodyId: first.bodyId,\n handler: firstHandler,\n selfTag: first.options.tag,\n otherTag: second.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n if (secondHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"second\",\n receiverColliderId: second.id,\n receiverBodyId: second.bodyId,\n handler: secondHandler,\n selfTag: second.options.tag,\n otherTag: first.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n }\n\n private deliverEvents(events: readonly PhysicsEventDelivery2D[]): void {\n if (!this.active) return;\n const errors: unknown[] = [];\n for (const fact of events) {\n try {\n if (isPhysicsBodyEventDelivery2D(fact)) {\n const handler = this.bodyEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsBodyEvent2D(\n fact,\n this.materializeBodyHandle(fact.bodyIndex, fact.bodyGeneration),\n ),\n );\n continue;\n }\n const handler = this.contactEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsContactEvent2D(fact, {\n body: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n collider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n }) as never,\n );\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n \"Multiple physics 2D event callbacks failed.\",\n );\n }\n }\n\n private bodyEventHandler(\n fact: PhysicsBodyEventDelivery2D,\n ): PhysicsBodyEventDelivery2D[\"handler\"] | undefined {\n const handler =\n fact.kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n const identity = this.kernel.bodyIdentity(fact.bodyId);\n return identity?.index === fact.bodyIndex &&\n identity.generation === fact.bodyGeneration\n ? handler\n : undefined;\n }\n\n private contactEventHandler(\n fact: PhysicsContactEventDelivery2D,\n ): PhysicsContactEventDelivery2D[\"handler\"] | undefined {\n const receiver = this.acceptedColliders.find(\n (collider) => collider.id === fact.receiverColliderId,\n );\n if (receiver === undefined || receiver.bodyId !== fact.receiverBodyId)\n return undefined;\n const handler = receiver.options.handlers[eventHandlerName(fact.kind)];\n const colliderIdentity = this.kernel.colliderIdentity(receiver.id);\n const expectedIndex =\n fact.receiver === \"first\"\n ? fact.firstColliderIndex\n : fact.secondColliderIndex;\n const expectedGeneration =\n fact.receiver === \"first\"\n ? fact.firstColliderGeneration\n : fact.secondColliderGeneration;\n return colliderIdentity?.index === expectedIndex &&\n colliderIdentity.generation === expectedGeneration\n ? handler\n : undefined;\n }\n\n private acceptedColliderForIdentity(\n index: number,\n generation: number,\n ): AcceptedCollider2D | undefined {\n return this.acceptedColliders.find((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n return identity?.index === index && identity.generation === generation;\n });\n }\n\n private hasAwakeBodies(): boolean {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled ||\n this.kernel.bodyIdentity(body.id) === undefined\n )\n continue;\n const pose = this.kernel.authoritativePose(body.id);\n const target = body.descriptor.options.target;\n const position = target.position?.get() ?? body.initialPose.position;\n const rotation =\n target.rotationDegrees?.get() ?? body.initialPose.rotationDegrees;\n if (\n (position &&\n (position[0] !== pose.position[0] ||\n position[1] !== pose.position[1])) ||\n (rotation !== undefined && rotation !== pose.rotationDegrees)\n )\n return true;\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const index = identity.index;\n const flags = bodies.flags[index]!;\n if (\n (flags & BODY_TYPE_KINEMATIC_2D) !== 0 &&\n (bodies.linearVelocityX[index]! !== 0 ||\n bodies.linearVelocityY[index]! !== 0 ||\n bodies.angularVelocity[index]! !== 0)\n )\n return true;\n if (\n (flags & BODY_TYPE_DYNAMIC_2D) !== 0 &&\n (flags & BODY_SLEEPING_2D) === 0\n )\n return true;\n }\n return false;\n }\n\n private requireDraft(): RenderDraft2D {\n const draft = this.draft;\n if (draft === undefined) {\n throw new Error(\n \"A physics attachment requires an active PhysicsWorld2D render draft.\",\n );\n }\n return draft;\n }\n\n private allocateId(): number {\n if (this.nextId === Number.MAX_SAFE_INTEGER) {\n throw new Error(\"PhysicsWorld2D exhausted stable attachment identities.\");\n }\n return this.nextId++;\n }\n\n private assertActive(): void {\n if (!this.active) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n }\n\n private materializeRevision(): WritableSignal<number> {\n return (this.revision ??= signal(this.committedRevision, {\n debugName: \"PhysicsWorld2D.revision\",\n }));\n }\n\n /** Query handles are cached only while their kernel identity remains live. */\n private evictRetiredMaterializedHandles(): void {\n for (const [key, handle] of this.materializedBodyHandles) {\n const separator = key.indexOf(\":\");\n const index = Number(key.slice(0, separator));\n const generation = Number(key.slice(separator + 1));\n if (this.kernel.bodyIdForIdentity(index, generation) !== undefined)\n continue;\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n this.materializedBodyHandles.delete(key);\n }\n for (const [key, handle] of this.materializedColliderHandles) {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (\n identity?.controller === this &&\n this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) !== undefined\n )\n continue;\n this.materializedColliderHandles.delete(key);\n }\n }\n\n private materializeBodyHandle(\n index: number,\n generation: number,\n ): PibblPhysicsBodyHandle2D {\n const bodyId = this.kernel.bodyIdForIdentity(index, generation);\n if (bodyId === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D body query result.\",\n );\n }\n const accepted = this.acceptedBodies.find((body) => body.id === bodyId);\n const explicit = accepted?.descriptor.options.handle;\n if (explicit !== undefined) return explicit;\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedBodyHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsBodyHandle2D(this.owner);\n bindPhysicsBodyHandle2D(handle, this, bodyId);\n this.materializedBodyHandles.set(key, handle);\n }\n return handle;\n }\n\n private materializeColliderHandle(\n index: number,\n generation: number,\n ): PibblPhysicsColliderHandle2D {\n if (this.kernel.colliderIdForIdentity(index, generation) === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D collider query result.\",\n );\n }\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedColliderHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsColliderHandle2D(this, index, generation);\n this.materializedColliderHandles.set(key, handle);\n }\n return handle;\n }\n\n private resolveBodyHandle(\n handle: PibblPhysicsBodyHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller !== this) return null;\n return this.kernel.bodyIdentity(binding.bodyId) ?? null;\n }\n\n private resolveColliderHandle(\n handle: PibblPhysicsColliderHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (identity?.controller !== this) return null;\n return this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) === undefined\n ? null\n : identity;\n }\n\n private unbindBodyHandle(body: AcceptedBody2D): void {\n const handle = body.descriptor.options.handle;\n const generation = body.handleBindingGeneration;\n if (handle !== undefined && generation !== undefined) {\n unbindPhysicsBodyHandle2D(handle, this, body.id, generation);\n }\n }\n}\n\nexport function requirePhysicsWorld2DController(\n handle: PibblPhysicsWorldHandle2D,\n): PhysicsWorld2DController {\n const controller = (handle as Partial<InternalWorldHandle2D>)[\n worldController2DSymbol\n ];\n if (!(controller instanceof PhysicsWorld2DController)) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n return controller;\n}\n\nexport function snapshotPhysicsWorld2DControllerForTest(\n controller: PhysicsWorld2DController,\n): PhysicsWorld2DControllerSnapshot {\n return controller.snapshot();\n}\n\nfunction normalizeWorldConfiguration(\n props: PibblResolvedPhysicsWorld2DProps,\n): NormalizedPhysicsWorld2DConfiguration {\n return normalizePhysicsWorld2DConfiguration({\n gravity: props.gravity,\n fixedStepMilliseconds: props.fixedStepMilliseconds,\n maxCatchUpSteps: props.maxCatchUpSteps,\n interpolation: props.interpolation,\n sleeping: props.sleeping,\n solver: props.solver,\n });\n}\n\nfunction denormalizeWorldConfiguration(\n configuration: NormalizedPhysicsWorld2DConfiguration,\n): PhysicsWorld2DConfiguration {\n return Object.freeze({\n gravity: Object.freeze([\n configuration.gravityX,\n configuration.gravityY,\n ] as const),\n fixedStepMilliseconds: configuration.fixedStepMilliseconds,\n maxCatchUpSteps: configuration.maxCatchUpSteps,\n interpolation: configuration.interpolation,\n sleeping: configuration.sleeping,\n solver: Object.freeze({\n velocityIterations: configuration.velocityIterations,\n positionIterations: configuration.positionIterations,\n }),\n });\n}\n\nfunction materializeTopology(\n draft: RenderDraft2D,\n reenableVelocities: ReadonlyMap<number, BodyVelocity2D>,\n previousBodyDefinitions: ReadonlyMap<number, BodyDefinition2D>,\n): readonly PhysicsTopologyRecord2D[] {\n const collidersByBody = new Map<number, ColliderDraft2D[]>();\n for (const collider of draft.colliders.values()) {\n const entries = collidersByBody.get(collider.bodyId) ?? [];\n entries.push(collider);\n collidersByBody.set(collider.bodyId, entries);\n }\n const bodies = [...draft.bodies.values()]\n .sort((left, right) => left.id - right.id)\n .map((body): PhysicsBodyTopologyRecord2D =>\n Object.freeze({\n kind: \"body\",\n id: body.id,\n definition: bodyDefinition(\n body,\n collidersByBody.get(body.id) ?? [],\n reenableVelocities.get(body.id),\n previousBodyDefinitions.get(body.id),\n ),\n }),\n );\n const colliders = [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map((collider): PhysicsColliderTopologyRecord2D =>\n Object.freeze({\n kind: \"collider\",\n id: collider.id,\n bodyId: collider.bodyId,\n definition: Object.freeze({\n shape: collider.shape,\n material: Object.freeze({\n friction: collider.options.friction,\n restitution: collider.options.restitution,\n }),\n filter: collider.options.collisionFilter,\n tag: collider.options.tag,\n handlers: collider.options.handlers,\n owner: collider.attachment,\n flags: collider.options.sensor ? COLLIDER_SENSOR_2D : 0,\n }),\n }),\n );\n return Object.freeze([...bodies, ...colliders]);\n}\n\nfunction validateAutomaticMass(draft: RenderDraft2D): void {\n const massByBody = new Map<number, number>();\n for (const collider of draft.colliders.values()) {\n if (!collider.options.contributesToMass) continue;\n massByBody.set(\n collider.bodyId,\n (massByBody.get(collider.bodyId) ?? 0) +\n collider.shape.area * collider.options.density,\n );\n }\n for (const body of draft.bodies.values()) {\n if (\n body.descriptor.bodyType !== \"dynamic\" ||\n !body.descriptor.options.enabled ||\n body.descriptor.options.mass !== \"auto\"\n ) {\n continue;\n }\n if ((massByBody.get(body.id) ?? 0) <= 0) {\n throw new RangeError(\n \"A dynamic body with automatic mass requires positive derived area from at least one active mass-contributing collider.\",\n );\n }\n }\n}\n\nfunction bodyDefinition(\n body: BodyDraft2D,\n colliders: readonly ColliderDraft2D[],\n reenableVelocity?: BodyVelocity2D,\n previous?: BodyDefinition2D,\n): BodyDefinition2D {\n const descriptor = body.descriptor;\n const enabled = descriptor.options.enabled;\n const massData = compoundMassData(colliders);\n let flags = 0;\n let linearVelocityX = 0;\n let linearVelocityY = 0;\n let angularVelocity = 0;\n let linearDamping = 0;\n let angularDamping = 0;\n let gravityScale = 0;\n let inverseMass = 0;\n let inverseInertia = 0;\n let localCenterX = 0;\n let localCenterY = 0;\n if (enabled && descriptor.bodyType === \"dynamic\") {\n flags |= BODY_TYPE_DYNAMIC_2D;\n if (descriptor.options.fixedRotation) flags |= BODY_FIXED_ROTATION_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n if (descriptor.options.ccd) flags |= BODY_CCD_2D;\n linearVelocityX =\n reenableVelocity?.linearVelocityX ?? descriptor.options.linearVelocity[0];\n linearVelocityY =\n reenableVelocity?.linearVelocityY ?? descriptor.options.linearVelocity[1];\n angularVelocity =\n reenableVelocity?.angularVelocity ??\n (descriptor.options.angularVelocityDegreesPerSecond * Math.PI) / 180;\n linearDamping = descriptor.options.linearDamping;\n angularDamping = descriptor.options.angularDamping;\n gravityScale = descriptor.options.gravityScale;\n const mass =\n descriptor.options.mass === \"auto\"\n ? massData.mass\n : descriptor.options.mass;\n inverseMass = mass > 0 ? 1 / mass : 1;\n localCenterX = massData.centerX;\n localCenterY = massData.centerY;\n const inertia =\n massData.mass > 0 ? massData.inertia * (mass / massData.mass) : 0;\n inverseInertia = descriptor.options.fixedRotation\n ? 0\n : inertia > 0\n ? 1 / inertia\n : inverseMass;\n } else if (enabled && descriptor.bodyType === \"kinematic\") {\n flags |= BODY_TYPE_KINEMATIC_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n }\n const authoredRotationRadians =\n (body.initialPose.rotationDegrees * Math.PI) / 180;\n const previousKinematic =\n previous !== undefined && (previous.flags & BODY_TYPE_KINEMATIC_2D) !== 0\n ? previous\n : undefined;\n const preserveTargetBoundKinematicPose =\n descriptor.bodyType === \"kinematic\" &&\n (descriptor.options.target.position !== undefined ||\n descriptor.options.target.rotationDegrees !== undefined) &&\n previousKinematic !== undefined;\n const previousRotationRadians = previousKinematic?.rotationRadians ?? 0;\n const previousCosine = Math.cos(previousRotationRadians);\n const previousSine = Math.sin(previousRotationRadians);\n const previousOriginX =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionX -\n previousCosine * (previousKinematic.localCenterX ?? 0) +\n previousSine * (previousKinematic.localCenterY ?? 0);\n const previousOriginY =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionY -\n previousSine * (previousKinematic.localCenterX ?? 0) -\n previousCosine * (previousKinematic.localCenterY ?? 0);\n const positionX = preserveTargetBoundKinematicPose\n ? previousOriginX\n : body.initialPose.position[0];\n const positionY = preserveTargetBoundKinematicPose\n ? previousOriginY\n : body.initialPose.position[1];\n const effectiveRotationRadians = preserveTargetBoundKinematicPose\n ? previousKinematic!.rotationRadians\n : authoredRotationRadians;\n const cosine = Math.cos(effectiveRotationRadians);\n const sine = Math.sin(effectiveRotationRadians);\n return Object.freeze({\n positionX: positionX + cosine * localCenterX - sine * localCenterY,\n positionY: positionY + sine * localCenterX + cosine * localCenterY,\n rotationRadians: effectiveRotationRadians,\n localCenterX,\n localCenterY,\n linearVelocityX,\n linearVelocityY,\n angularVelocity,\n forceX: 0,\n forceY: 0,\n torque: 0,\n inverseMass,\n inverseInertia,\n linearDamping,\n angularDamping,\n gravityScale,\n sleepTime: 0,\n flags,\n owner: body.attachment,\n });\n}\n\nconst ZERO_VELOCITY_2D: BodyVelocity2D = Object.freeze({\n linearVelocityX: 0,\n linearVelocityY: 0,\n angularVelocity: 0,\n});\n\nfunction compoundMassData(colliders: readonly ColliderDraft2D[]): Readonly<{\n mass: number;\n centerX: number;\n centerY: number;\n inertia: number;\n}> {\n const entries = colliders\n .filter((collider) => collider.options.contributesToMass)\n .map((collider) => {\n const shape = collider.shape;\n const cosine = Math.cos(shape.localPose.rotationRadians);\n const sine = Math.sin(shape.localPose.rotationRadians);\n const centerX =\n shape.localPose.x + cosine * shape.centroidX - sine * shape.centroidY;\n const centerY =\n shape.localPose.y + sine * shape.centroidX + cosine * shape.centroidY;\n return {\n mass: shape.area * collider.options.density,\n centerX,\n centerY,\n centroidInertia: shape.unitInertia * collider.options.density,\n };\n });\n const mass = entries.reduce((sum, entry) => sum + entry.mass, 0);\n if (mass <= 0) {\n return { mass: 0, centerX: 0, centerY: 0, inertia: 0 };\n }\n const centerX =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerX, 0) / mass;\n const centerY =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerY, 0) / mass;\n const inertia = entries.reduce((sum, entry) => {\n const offsetX = entry.centerX - centerX;\n const offsetY = entry.centerY - centerY;\n return (\n sum +\n entry.centroidInertia +\n entry.mass * (offsetX * offsetX + offsetY * offsetY)\n );\n }, 0);\n return { mass, centerX, centerY, inertia };\n}\n\nfunction sameConfiguration(\n left: NormalizedPhysicsWorld2DConfiguration,\n right: NormalizedPhysicsWorld2DConfiguration,\n): boolean {\n return (\n left.gravityX === right.gravityX &&\n left.gravityY === right.gravityY &&\n left.fixedStepMilliseconds === right.fixedStepMilliseconds &&\n left.maxCatchUpSteps === right.maxCatchUpSteps &&\n left.interpolation === right.interpolation &&\n left.sleeping === right.sleeping &&\n left.velocityIterations === right.velocityIterations &&\n left.positionIterations === right.positionIterations\n );\n}\n\nfunction copyPhysicsPose2D(pose: PibblPhysicsPose2D): PibblPhysicsPose2D {\n return Object.freeze({\n position: copyFiniteVector2(pose.position, \"initial physics pose.position\"),\n rotationDegrees: requireFiniteNumber(\n pose.rotationDegrees,\n \"initial physics pose.rotationDegrees\",\n ),\n });\n}\n\nfunction sameTopology(\n left: readonly PhysicsTopologyRecord2D[],\n right: readonly PhysicsTopologyRecord2D[],\n): boolean {\n if (left.length !== right.length) return false;\n return left.every((first, index) => {\n const second = right[index];\n if (!second || first.kind !== second.kind || first.id !== second.id)\n return false;\n if (first.kind === \"body\" && second.kind === \"body\") {\n return sameRecord(first.definition, second.definition);\n }\n if (first.kind === \"collider\" && second.kind === \"collider\") {\n return (\n first.bodyId === second.bodyId &&\n first.definition.shape === second.definition.shape &&\n first.definition.flags === second.definition.flags &&\n sameRecord(first.definition.material, second.definition.material) &&\n sameRecord(first.definition.filter, second.definition.filter)\n );\n }\n return false;\n });\n}\n\nfunction sameRecord(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (\n typeof left !== \"object\" ||\n left === null ||\n typeof right !== \"object\" ||\n right === null\n )\n return false;\n const leftEntries = Object.entries(left);\n const rightRecord = right as Record<string, unknown>;\n return (\n leftEntries.length === Object.keys(rightRecord).length &&\n leftEntries.every(([key, value]) => rightRecord[key] === value)\n );\n}\n\nfunction validateUniqueBodyHandles(bodies: readonly BodyDraft2D[]): void {\n const ids = new Map<PibblPhysicsBodyHandle2D, number>();\n for (const body of bodies) {\n const handle = body.descriptor.options.handle;\n if (handle === undefined) continue;\n const previous = ids.get(handle);\n if (previous !== undefined && previous !== body.id) {\n throw new Error(\n \"A Pibbl physics 2D body handle may bind to at most one live body.\",\n );\n }\n ids.set(handle, body.id);\n }\n}\n\nfunction eventHandlerName(\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n): keyof NormalizedPhysicsColliderConfiguration2D[\"handlers\"] {\n switch (kind) {\n case 1:\n return \"onCollisionStart\";\n case 2:\n return \"onCollisionEnd\";\n case 3:\n return \"onOverlapStart\";\n case 4:\n return \"onOverlapEnd\";\n case 7:\n return \"onHit\";\n }\n}\n\nconst ZERO_POSE_2D: PibblPhysicsPose2D = Object.freeze({\n position: Object.freeze([0, 0] as const),\n rotationDegrees: 0,\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { QueryMode, QueryOptions, QueryResult } from '../query-types.js';\nimport { CommittedObstacles2D } from \"./obstacles.js\";\nimport { boundsOfShape2D } from \"../../../2d-geometry.js\";\nimport { createShape2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyInspection2D,\n PibblPhysicsInspection2D,\n} from \"../inspection-types.js\";\nimport { RapierSimulation2D } from \"../world/rapier.js\";\nimport { signal, type WritableSignal } from \"@pibbl/core\";\nimport {\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentRenderOwner,\n type PibblInternalSignalConsumer,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n type PibblInternalSignalBatch,\n type PibblInternalSimulationOwner,\n} from \"@pibbl/core/internal\";\nimport type {\n PibblPhysicsAabb2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsVector2,\n} from \"../../../2d-geometry.js\";\nimport type { ShapeRecord2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyHandle2D,\n PibblPhysicsColliderHandle2D,\n PibblPhysicsQueryHit2D,\n PibblPhysicsQueryMatch2D,\n PibblPhysicsWorldHandle2D,\n} from \"../types.js\";\nimport type { PibblResolvedPhysicsWorld2DProps } from \"./world-props.js\";\nimport { BODY_CCD_2D } from \"../world/ccd.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nimport {\n BODY_FIXED_ROTATION_2D,\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n} from \"../world/integrator.js\";\nimport { BODY_SLEEP_DISABLED_2D, BODY_SLEEPING_2D } from \"../world/solver.js\";\nimport type { BodyDefinition2D } from \"../world/storage.js\";\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n} from \"../../shared/validation.js\";\nimport {\n normalizePhysicsWorld2DConfiguration,\n PhysicsWorld2DKernel,\n type NormalizedPhysicsWorld2DConfiguration,\n type PhysicsBodyTopologyRecord2D,\n type PhysicsBodyCommand2D,\n type PhysicsColliderTopologyRecord2D,\n type PhysicsCommand2D,\n type PhysicsWorld2DConfiguration,\n type PhysicsTopologyRecord2D,\n type PhysicsWorld2DCandidate,\n} from \"../world/world.js\";\nimport { CommittedWorldQueries2D } from \"../world/queries.js\";\nimport {\n bindPhysicsBodyHandle2D,\n createPhysicsBodyHandle2D,\n physicsBodyHandleBinding2D,\n stagePhysicsBodyHandle2D,\n type PhysicsBodyHandleValues2D,\n unbindPhysicsBodyHandle2D,\n} from \"./body-handle.js\";\nimport {\n createPhysicsColliderHandle2D,\n isPhysicsBodyEventDelivery2D,\n materializePhysicsBodyEvent2D,\n materializePhysicsContactEvent2D,\n physicsColliderHandleIdentity2D,\n sortPhysicsEventDeliveries2D,\n type PhysicsBodyEventDelivery2D,\n type PhysicsContactEventDelivery2D,\n type PhysicsEventDelivery2D,\n} from \"./events.js\";\nimport {\n type MountedPhysicsAttachment2D,\n type NormalizedPhysicsColliderConfiguration2D,\n type PhysicsBodyAttachment2DDescriptor,\n} from \"./descriptors.js\";\n\nconst worldController2DSymbol = Symbol(\"PhysicsWorld2DController\");\n\ntype InternalWorldHandle2D = PibblPhysicsWorldHandle2D &\n Readonly<{\n readonly [worldController2DSymbol]: PhysicsWorld2DController;\n }>;\n\ninterface BodyDraft2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n}\n\ninterface ColliderDraft2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n readonly shape: ShapeRecord2D;\n}\n\ninterface RenderDraft2D {\n readonly simulationToRoot: DOMMatrix;\n readonly configuration: NormalizedPhysicsWorld2DConfiguration;\n readonly props: PibblResolvedPhysicsWorld2DProps;\n readonly bodies: Map<number, BodyDraft2D>;\n readonly colliders: Map<number, ColliderDraft2D>;\n}\n\ninterface AcceptedBody2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n readonly handleBindingGeneration: number | undefined;\n}\n\ninterface AcceptedCollider2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n}\n\ninterface AttachmentIds2D {\n bodyId?: number;\n colliderId?: number;\n}\n\ninterface BodyVelocity2D {\n readonly linearVelocityX: number;\n readonly linearVelocityY: number;\n readonly angularVelocity: number;\n}\n\nexport interface PhysicsWorld2DControllerSnapshot {\n readonly revision: number;\n readonly revisionMaterialized: boolean;\n readonly materializedBodyHandles: number;\n readonly materializedColliderHandles: number;\n readonly advanceRegistered: boolean;\n readonly bodyIds: readonly number[];\n readonly colliderIds: readonly number[];\n readonly kernel: ReturnType<PhysicsWorld2DKernel[\"snapshot\"]>;\n}\n\nexport class PhysicsWorld2DController {\n readonly handle: PibblPhysicsWorldHandle2D;\n private revision: WritableSignal<number> | undefined;\n private committedRevision = 0;\n private obstacles: CommittedObstacles2D | undefined;\n private obstacleSource: Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> | undefined;\n\n getObstacleSource(): Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> {\n this.assertActive();\n if (!this.obstacleSource) {\n if (this.liveCandidate) throw new Error(\"Create physics obstacles before simulation Advance.\");\n this.obstacles = new CommittedObstacles2D();\n this.obstacles.publish(this.kernel, this.acceptedColliders, this.committedRevision);\n this.obstacleSource = Object.freeze({ read: () => {\n this.assertActive();\n return this.obstacles!.read();\n } });\n }\n return this.obstacleSource;\n }\n private failedFrames = 0;\n private lastFailure: string | null = null;\n private readonly kernel: PhysicsWorld2DKernel;\n private readonly ids = new WeakMap<object, AttachmentIds2D>();\n private nextId = 0;\n private draft: RenderDraft2D | undefined;\n private acceptedTopology: readonly PhysicsTopologyRecord2D[] = Object.freeze(\n [],\n );\n private acceptedBodies: readonly AcceptedBody2D[] = Object.freeze([]);\n private acceptedColliders: readonly AcceptedCollider2D[] = Object.freeze([]);\n private acceptedConfiguration: NormalizedPhysicsWorld2DConfiguration;\n private acceptedProps: PibblResolvedPhysicsWorld2DProps = Object.freeze({});\n private readonly suspendedVelocities = new Map<number, BodyVelocity2D>();\n private readonly materializedBodyHandles = new Map<\n string,\n PibblPhysicsBodyHandle2D\n >();\n private readonly materializedColliderHandles = new Map<\n string,\n PibblPhysicsColliderHandle2D\n >();\n private materializedHandleTopologyPending = false;\n private readonly queries: CommittedWorldQueries2D;\n private queuedBegin: Readonly<{ cancel(): void }> | undefined;\n private releaseAdvance: (() => void) | undefined;\n private readonly releasePassiveAdvance: () => void;\n private liveCandidate: PhysicsWorld2DCandidate | undefined;\n private active = true;\n private readonly space: \"root\" | \"local\";\n private simulationToRoot = new DOMMatrix();\n private readonly targetConsumer: PibblInternalSignalConsumer;\n\n constructor(\n private readonly owner: PibblInternalSimulationOwner,\n initialProps: PibblResolvedPhysicsWorld2DProps,\n ) {\n this.space = initialProps.space ?? \"root\";\n if (this.space !== \"root\" && this.space !== \"local\")\n throw new TypeError('PhysicsWorld2D space must be \"root\" or \"local\".');\n this.targetConsumer = pibblInternalCreateSignalConsumer({\n owner: pibblInternalCurrentRenderOwner(),\n debugName: \"PhysicsWorld2D kinematic targets\",\n invalidate: () => {\n if (this.active) this.ensureAdvance();\n },\n });\n const configuration = normalizeWorldConfiguration(initialProps);\n this.kernel = new PhysicsWorld2DKernel(\n denormalizeWorldConfiguration(configuration),\n new RapierSimulation2D(),\n );\n // Idle worlds still observe animation's staged target in the same Advance\n // phase, without keeping the host clock alive themselves.\n this.releasePassiveAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => {\n if (this.releaseAdvance !== undefined) return;\n const targets = this.readKinematicTargets(batch);\n for (const [id, target] of targets) {\n if (this.kernel.bodyIdentity(id) === undefined) continue;\n const pose = this.kernel.authoritativePose(id);\n if (\n target.position[0] !== pose.position[0] ||\n target.position[1] !== pose.position[1] ||\n target.rotationDegrees !== pose.rotationDegrees\n ) {\n this.ensureAdvance();\n this.advance(frame.frameId, frame.logicalTime, batch);\n return;\n }\n }\n },\n false,\n );\n this.queries = new CommittedWorldQueries2D({\n generation: 1,\n bodies: this.kernel.bodies,\n colliders: this.kernel.colliders,\n broadPhase: this.kernel.broadPhase,\n materializeBody: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n materializeCollider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n resolveBody: (handle) => this.resolveBodyHandle(handle),\n resolveCollider: (handle) => this.resolveColliderHandle(handle),\n });\n this.acceptedConfiguration = configuration;\n const target = {\n [worldController2DSymbol]: this,\n } as Record<PropertyKey, unknown>;\n Object.defineProperty(target, \"revision\", {\n enumerable: true,\n get: () => this.materializeRevision().asReadonly(),\n });\n this.handle = Object.freeze(target) as unknown as InternalWorldHandle2D;\n }\n\n beginRender(\n props: PibblResolvedPhysicsWorld2DProps,\n rootTransform = new DOMMatrix(),\n ): void {\n if ((props.space ?? \"root\") !== this.space)\n throw new Error(\n \"PhysicsWorld2D space is creation-only; remount the world with a new key to change it.\",\n );\n const simulationToRoot =\n this.space === \"local\" ? rootTransform : new DOMMatrix();\n const { a, b, c, d, e, f } = simulationToRoot;\n if (\n !(\n Number.isFinite(a) &&\n Number.isFinite(b) &&\n Number.isFinite(c) &&\n Number.isFinite(d) &&\n Number.isFinite(e) &&\n Number.isFinite(f)\n ) ||\n Math.abs(a * d - b * c) < 1e-10\n )\n throw new Error(\n \"PhysicsWorld2D viewport transform must be finite and invertible.\",\n );\n this.assertActive();\n if (this.draft !== undefined) {\n throw new Error(\n \"PhysicsWorld2D began a second render before finishing the first.\",\n );\n }\n this.draft = {\n simulationToRoot,\n configuration: normalizeWorldConfiguration(props),\n props,\n bodies: new Map(),\n colliders: new Map(),\n };\n pibblInternalOnSimulationRenderTransactionFinish(this.owner, (success) =>\n this.finishRender(success),\n );\n }\n\n simulationTransform(root: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot)\n .inverse()\n .multiply(root);\n }\n\n rootTransform(local: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot).multiply(\n local,\n );\n }\n\n convertPoint(point: PibblPhysicsVector2, toRoot: boolean): PibblPhysicsVector2 {\n this.assertActive();\n const value = copyFiniteVector2(point, \"point\");\n const matrix = toRoot\n ? this.simulationToRoot\n : this.simulationToRoot.inverse();\n return Object.freeze([\n matrix.a * value[0] + matrix.c * value[1] + matrix.e,\n matrix.b * value[0] + matrix.d * value[1] + matrix.f,\n ]);\n }\n\n bodyIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.bodyId ??= this.allocateId());\n }\n\n colliderIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.colliderId ??= this.allocateId());\n }\n\n collectBody(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n descriptor: PhysicsBodyAttachment2DDescriptor,\n initialPose: PibblPhysicsPose2D = ZERO_POSE_2D,\n ): void {\n const draft = this.requireDraft();\n draft.bodies.set(bodyId, {\n id: bodyId,\n attachment,\n descriptor,\n initialPose: copyPhysicsPose2D(initialPose),\n });\n const collider = descriptor.options.collider;\n if (\n collider !== false &&\n collider.shape !== \"self\" &&\n descriptor.options.enabled\n ) {\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options: collider,\n shape: attachment.resolveShape(collider),\n });\n }\n }\n\n collectCollider(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n options: NormalizedPhysicsColliderConfiguration2D,\n ): void {\n if (options.shape === \"self\") return;\n const draft = this.requireDraft();\n if (draft.bodies.get(bodyId)?.descriptor.options.enabled === false) return;\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options,\n shape: attachment.resolveShape(options),\n });\n }\n\n queueCommands(commands: readonly PhysicsCommand2D[]): void {\n this.assertActive();\n if (commands.length === 0) return;\n pibblInternalQueueSimulationBegin(this.owner, () => {\n this.kernel.applyBegin(commands);\n });\n this.ensureAdvance();\n }\n\n acceptBodyHandleCommand(\n handle: PibblPhysicsBodyHandle2D,\n bindingGeneration: number,\n command: PhysicsBodyCommand2D,\n ): boolean {\n if (!this.active) return false;\n const binding = physicsBodyHandleBinding2D(handle);\n const accepted = this.acceptedBodies.find(\n (body) =>\n body.id === command.bodyId &&\n body.descriptor.options.handle === handle &&\n body.handleBindingGeneration === bindingGeneration,\n );\n const identity = this.kernel.bodyIdentity(command.bodyId);\n const materialized =\n identity === undefined\n ? undefined\n : this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (\n binding?.controller !== this ||\n binding.bindingGeneration !== bindingGeneration ||\n (accepted === undefined && materialized !== handle)\n ) {\n return false;\n }\n this.kernel.applyBegin([command]);\n this.ensureAdvance();\n return true;\n }\n\n presentationPose(bodyId: number): PibblPhysicsPose2D | undefined {\n return this.kernel.bodyIdentity(bodyId) !== undefined\n ? this.kernel.presentationPose(bodyId)\n : undefined;\n }\n\n raycast<Mode extends QueryMode = \"closest\">(\n ray: PibblPhysicsRay2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.raycast(1, ray, options);\n }\n\n shapeCast<Mode extends QueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n from: PibblPhysicsPose2D,\n translation: PibblPhysicsVector2,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.shapeCast(1, shape, from, translation, options);\n }\n\n overlapShape<Mode extends QueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n pose: PibblPhysicsPose2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.overlapShape(1, shape, pose, options);\n }\n\n queryAabb<Mode extends QueryMode = \"closest\">(\n bounds: PibblPhysicsAabb2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryAabb(1, bounds, options);\n }\n\n queryPoint<Mode extends QueryMode = \"closest\">(\n point: PibblPhysicsVector2,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryPoint(1, point, options);\n }\n\n bodyHandleValues(bodyId: number): PhysicsBodyHandleValues2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n if (identity === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const state = {\n linearVelocityX: bodies.linearVelocityX[index]!,\n linearVelocityY: bodies.linearVelocityY[index]!,\n angularVelocity: bodies.angularVelocity[index]!,\n flags: bodies.flags[index]!,\n generation: identity.generation,\n };\n const pose = this.kernel.authoritativePose(bodyId);\n return Object.freeze({\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n state.linearVelocityX,\n state.linearVelocityY,\n ] as const),\n angularVelocityDegreesPerSecond: (state.angularVelocity * 180) / Math.PI,\n sleeping: (state.flags & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(bodyId),\n generation: state.generation,\n });\n }\n\n inspectBody(bodyId: number): PibblPhysicsBodyInspection2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n const declared = this.acceptedBodies.find((body) => body.id === bodyId);\n if (identity === undefined || declared === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const flags = bodies.flags[index]!;\n return Object.freeze({\n id: bodyId,\n generation: identity.generation,\n type: declared.descriptor.bodyType,\n enabled: this.kernel.isBodyEnabled(bodyId),\n sleeping: !!(flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(bodyId),\n presentationPose: this.kernel.presentationPose(bodyId),\n centerOfMass: Object.freeze([\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n ] as const),\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[index]!,\n bodies.linearVelocityY[index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[index]! * 180) / Math.PI,\n mass: bodies.inverseMass[index]! > 0 ? 1 / bodies.inverseMass[index]! : null,\n });\n }\n\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n this.targetConsumer.dispose();\n this.releasePassiveAdvance();\n this.queuedBegin?.cancel();\n this.queuedBegin = undefined;\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n if (this.liveCandidate !== undefined) {\n this.kernel.discard(this.liveCandidate);\n this.liveCandidate = undefined;\n }\n for (const body of this.acceptedBodies) this.unbindBodyHandle(body);\n for (const handle of this.materializedBodyHandles.values()) {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n }\n this.materializedBodyHandles.clear();\n this.materializedColliderHandles.clear();\n this.materializedHandleTopologyPending = false;\n this.obstacles = undefined;\n this.obstacleSource = undefined;\n this.kernel.dispose();\n this.queries.invalidate();\n this.acceptedBodies = Object.freeze([]);\n this.acceptedColliders = Object.freeze([]);\n this.draft = undefined;\n this.suspendedVelocities.clear();\n }\n\n inspect(): PibblPhysicsInspection2D {\n this.assertActive();\n const snapshot = this.kernel.snapshot();\n const vector = (x: number, y: number): PibblPhysicsVector2 =>\n Object.freeze([x, y]);\n const contacts = this.kernel.contacts;\n const declaredTypes = new Map(\n this.acceptedBodies.map((body) => [body.id, body.descriptor.bodyType]),\n );\n return Object.freeze({\n engine: \"rapier-2d@0.21.0\",\n space: this.space,\n revision: this.committedRevision,\n tick: snapshot.tick,\n advancing: this.releaseAdvance !== undefined,\n failedFrames: this.failedFrames,\n lastFailure: this.lastFailure,\n bodies: Object.freeze(\n snapshot.bodies.map((body) =>\n Object.freeze({\n id: body.id,\n generation: body.generation,\n type: declaredTypes.get(body.id)!,\n enabled: this.kernel.isBodyEnabled(body.id),\n sleeping: !!(body.flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(body.id),\n presentationPose: this.kernel.presentationPose(body.id),\n centerOfMass: vector(body.positionX, body.positionY),\n linearVelocity: vector(body.linearVelocityX, body.linearVelocityY),\n angularVelocityDegreesPerSecond:\n (body.angularVelocity * 180) / Math.PI,\n mass: body.inverseMass > 0 ? 1 / body.inverseMass : null,\n }),\n ),\n ),\n colliders: Object.freeze(\n this.acceptedColliders.flatMap((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n if (!identity) return [];\n const shape = this.kernel.colliders.shapes[identity.index]!;\n return [\n Object.freeze({\n id: collider.id,\n generation: identity.generation,\n bodyId: collider.bodyId,\n sensor: !!(\n this.kernel.colliders.flags[identity.index]! &\n COLLIDER_SENSOR_2D\n ),\n label:\n typeof collider.options.tag === \"string\"\n ? collider.options.tag\n : null,\n shapeKinds: Object.freeze(shape.leaves.map((leaf) => leaf.kind)),\n bounds: boundsOfShape2D(\n createShape2D(shape),\n this.kernel.authoritativePose(collider.bodyId),\n ),\n }),\n ];\n }),\n ),\n contacts: Object.freeze(\n Array.from(\n { length: contacts.contactCount },\n (_, index) => index,\n ).flatMap((index) => {\n const firstColliderId = this.kernel.colliderIdForIdentity(\n contacts.firstColliderIndices[index]!,\n contacts.firstColliderGenerations[index]!,\n );\n const secondColliderId = this.kernel.colliderIdForIdentity(\n contacts.secondColliderIndices[index]!,\n contacts.secondColliderGenerations[index]!,\n );\n if (firstColliderId === undefined || secondColliderId === undefined)\n return [];\n return [\n Object.freeze({\n firstColliderId,\n secondColliderId,\n sensor: contacts.sensorFlags[index] !== 0,\n normal: vector(\n contacts.normalX[index]!,\n contacts.normalY[index]!,\n ),\n normalImpulse:\n contacts.pointNormalImpulses[index * 2]! +\n (contacts.pointCounts[index]! > 1\n ? contacts.pointNormalImpulses[index * 2 + 1]!\n : 0),\n points: Object.freeze(\n Array.from(\n { length: contacts.pointCounts[index]! },\n (_, point) => {\n const offset = index * 2 + point;\n return Object.freeze({\n pointOnFirst: vector(\n contacts.pointFirstX[offset]!,\n contacts.pointFirstY[offset]!,\n ),\n pointOnSecond: vector(\n contacts.pointSecondX[offset]!,\n contacts.pointSecondY[offset]!,\n ),\n separation: contacts.pointSeparations[offset]!,\n });\n },\n ),\n ),\n }),\n ];\n }),\n ),\n });\n }\n\n snapshot(): PhysicsWorld2DControllerSnapshot {\n return Object.freeze({\n revision: this.committedRevision,\n revisionMaterialized: this.revision !== undefined,\n materializedBodyHandles: this.materializedBodyHandles.size,\n materializedColliderHandles: this.materializedColliderHandles.size,\n advanceRegistered: this.releaseAdvance !== undefined,\n bodyIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => record.id),\n ),\n colliderIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsColliderTopologyRecord2D =>\n record.kind === \"collider\",\n )\n .map((record) => record.id),\n ),\n kernel: this.kernel.snapshot(),\n });\n }\n\n private finishRender(success: boolean): void {\n const draft = this.draft;\n this.draft = undefined;\n if (!success || draft === undefined || !this.active) return;\n validateAutomaticMass(draft);\n const reenableVelocities = this.resolveReenableVelocities(draft);\n const previousBodyDefinitions = new Map(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => [record.id, record.definition] as const),\n );\n const topology = materializeTopology(\n draft,\n reenableVelocities,\n previousBodyDefinitions,\n );\n const topologyChanged = !sameTopology(this.acceptedTopology, topology);\n const configurationChanged = !sameConfiguration(\n this.acceptedConfiguration,\n draft.configuration,\n );\n const nextBodies = [...draft.bodies.values()].sort(\n (left, right) => left.id - right.id,\n );\n validateUniqueBodyHandles(nextBodies);\n const nextBodiesById = new Map(nextBodies.map((body) => [body.id, body]));\n for (const body of this.acceptedBodies) {\n const next = nextBodiesById.get(body.id);\n const retained =\n next !== undefined &&\n next.descriptor.options.handle === body.descriptor.options.handle;\n if (!retained) this.unbindBodyHandle(body);\n }\n this.simulationToRoot = draft.simulationToRoot;\n this.acceptedProps = draft.props;\n this.acceptedBodies = Object.freeze(\n nextBodies.map(({ id, attachment, descriptor, initialPose }) =>\n Object.freeze({\n id,\n attachment,\n descriptor,\n initialPose,\n handleBindingGeneration:\n descriptor.options.handle === undefined\n ? undefined\n : bindPhysicsBodyHandle2D(descriptor.options.handle, this, id),\n }),\n ),\n );\n this.acceptedColliders = Object.freeze(\n [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map(({ id, bodyId, attachment, options }) =>\n Object.freeze({ id, bodyId, attachment, options }),\n ),\n );\n this.targetConsumer.collect(() => {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n body.descriptor.options.target.position?.get();\n body.descriptor.options.target.rotationDegrees?.get();\n }\n });\n this.targetConsumer.markClean();\n this.acceptedTopology = topology;\n this.kernel.updateColliderMetadata(topology);\n if (topologyChanged) this.materializedHandleTopologyPending = true;\n if (!topologyChanged && !configurationChanged) return;\n this.acceptedConfiguration = draft.configuration;\n this.queuedBegin?.cancel();\n this.queuedBegin = pibblInternalQueueSimulationBegin(this.owner, () => {\n this.queuedBegin = undefined;\n if (topologyChanged) this.kernel.proposeTopology(this.acceptedTopology);\n if (configurationChanged) {\n this.kernel.applyBegin([\n {\n kind: \"configure\",\n configuration: denormalizeWorldConfiguration(draft.configuration),\n },\n ]);\n }\n });\n this.ensureAdvance();\n }\n\n private ensureAdvance(): void {\n if (this.releaseAdvance !== undefined) return;\n this.releaseAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => this.advance(frame.frameId, frame.logicalTime, batch),\n );\n }\n\n private resolveReenableVelocities(\n draft: RenderDraft2D,\n ): ReadonlyMap<number, BodyVelocity2D> {\n const previousById = new Map(\n this.acceptedBodies.map((body) => [body.id, body]),\n );\n const overrides = new Map<number, BodyVelocity2D>();\n for (const body of draft.bodies.values()) {\n const previous = previousById.get(body.id);\n const currentDynamic =\n body.descriptor.bodyType === \"dynamic\" ? body.descriptor : undefined;\n const previousDynamic =\n previous?.descriptor.bodyType === \"dynamic\"\n ? previous.descriptor\n : undefined;\n if (\n currentDynamic !== undefined &&\n !currentDynamic.options.enabled &&\n previousDynamic?.options.enabled\n ) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity !== undefined) {\n const bodies = this.kernel.bodies;\n this.suspendedVelocities.set(\n body.id,\n Object.freeze({\n linearVelocityX: bodies.linearVelocityX[identity.index]!,\n linearVelocityY: bodies.linearVelocityY[identity.index]!,\n angularVelocity: bodies.angularVelocity[identity.index]!,\n }),\n );\n }\n }\n if (\n currentDynamic?.options.enabled &&\n previousDynamic !== undefined &&\n !previousDynamic.options.enabled\n ) {\n const preserved = this.suspendedVelocities.get(body.id);\n overrides.set(\n body.id,\n currentDynamic.options.reenableVelocity === \"preserve\" && preserved\n ? preserved\n : ZERO_VELOCITY_2D,\n );\n }\n }\n const retained = new Set(draft.bodies.keys());\n for (const id of this.suspendedVelocities.keys()) {\n if (!retained.has(id)) this.suspendedVelocities.delete(id);\n }\n return overrides;\n }\n\n private advance(\n frameId: number,\n logicalTime: number,\n batch: PibblInternalSignalBatch,\n ): void {\n let candidate: PhysicsWorld2DCandidate | undefined;\n try {\n candidate = this.kernel.advance({\n frameId,\n logicalTime,\n stagedKinematicTargets: this.readKinematicTargets(batch),\n });\n if (candidate === undefined) return;\n this.liveCandidate = candidate;\n const nextRevision = this.committedRevision + 1;\n this.stagePublicSignals(batch, nextRevision);\n const events = this.copyEventDeliveries(candidate);\n let adopted = false;\n if (events.length > 0) {\n pibblInternalQueueSimulationComplete(this.owner, () => {\n if (adopted) this.deliverEvents(events);\n });\n }\n pibblInternalQueueSimulationCommitAcknowledgement(\n this.owner,\n (_frame, outcome) => {\n if (this.liveCandidate !== candidate) return;\n this.liveCandidate = undefined;\n if (!outcome.applied) {\n this.kernel.discard(candidate!);\n return;\n }\n this.kernel.adopt(candidate!);\n if (this.materializedHandleTopologyPending) {\n this.evictRetiredMaterializedHandles();\n this.materializedHandleTopologyPending = false;\n }\n this.committedRevision = nextRevision;\n this.obstacles?.publish(this.kernel, this.acceptedColliders, nextRevision);\n adopted = true;\n pibblInternalRequestSimulationRender(this.owner);\n if (\n !this.hasAwakeBodies() &&\n (candidate!.stepCount > 0 ||\n !this.acceptedBodies.some(\n (body) => body.descriptor.bodyType === \"kinematic\",\n ))\n ) {\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n }\n },\n );\n } catch (error) {\n this.failedFrames++;\n this.lastFailure = error instanceof Error ? error.message : String(error);\n if (candidate?.lifecycle === \"live\") this.kernel.discard(candidate);\n if (this.liveCandidate === candidate) this.liveCandidate = undefined;\n const onError = this.acceptedProps.onError;\n if (onError) {\n pibblInternalQueueSimulationComplete(this.owner, () => onError(error));\n }\n throw error;\n }\n }\n\n private readKinematicTargets(\n batch: PibblInternalSignalBatch,\n ): ReadonlyMap<number, PibblPhysicsPose2D> {\n const targets = new Map<number, PibblPhysicsPose2D>();\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n const target = body.descriptor.options.target;\n if (\n target.position === undefined &&\n target.rotationDegrees === undefined\n ) {\n continue;\n }\n const position =\n target.position === undefined\n ? body.initialPose.position\n : batch.read(\n target.position as WritableSignal<readonly [number, number]>,\n );\n const rotationDegrees =\n target.rotationDegrees === undefined\n ? body.initialPose.rotationDegrees\n : batch.read(target.rotationDegrees as WritableSignal<number>);\n targets.set(\n body.id,\n Object.freeze({\n position: Object.freeze([position[0], position[1]] as const),\n rotationDegrees,\n }),\n );\n }\n return targets;\n }\n\n private stagePublicSignals(\n batch: PibblInternalSignalBatch,\n nextRevision: number,\n ): void {\n if (this.revision !== undefined) {\n batch.stage(this.revision, nextRevision, this);\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const explicit = body.descriptor.options.handle;\n const materialized = this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (explicit === undefined && materialized === undefined) continue;\n const pose = this.kernel.authoritativePose(body.id);\n const values = {\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[identity.index]!,\n bodies.linearVelocityY[identity.index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[identity.index]! * 180) / Math.PI,\n sleeping: (bodies.flags[identity.index]! & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(body.id),\n generation: identity.generation,\n } as const;\n if (explicit !== undefined) {\n stagePhysicsBodyHandle2D(batch, explicit, values, this);\n }\n if (materialized !== undefined && materialized !== explicit) {\n stagePhysicsBodyHandle2D(batch, materialized, values, this);\n }\n }\n }\n\n private copyEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n ): readonly PhysicsEventDelivery2D[] {\n const events: PhysicsEventDelivery2D[] = [];\n for (let offset = 0; offset < candidate.eventCount; offset += 1) {\n const eventIndex = candidate.eventOffset + offset;\n const kind = candidate.eventKinds[eventIndex];\n if (kind === 5 || kind === 6) {\n const handler =\n kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n if (handler === undefined) continue;\n const bodyIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const bodyGeneration = this.kernel.bodies.generations[bodyIndex]!;\n const bodyId = this.kernel.bodyIdForIdentity(bodyIndex, bodyGeneration);\n if (bodyId === undefined) continue;\n events.push(\n Object.freeze({\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n bodyIndex,\n bodyGeneration,\n bodyId,\n handler,\n }) satisfies PhysicsBodyEventDelivery2D,\n );\n continue;\n }\n if (kind !== 1 && kind !== 2 && kind !== 3 && kind !== 4 && kind !== 7) {\n continue;\n }\n this.copyContactEventDeliveries(candidate, eventIndex, kind, events);\n }\n return sortPhysicsEventDeliveries2D(events);\n }\n\n private copyContactEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n eventIndex: number,\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n events: PhysicsEventDelivery2D[],\n ): void {\n const firstColliderIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const firstColliderGeneration =\n candidate.eventFirstColliderGenerations[eventIndex]!;\n const secondColliderIndex =\n candidate.eventSecondColliderIndices[eventIndex]!;\n const secondColliderGeneration =\n candidate.eventSecondColliderGenerations[eventIndex]!;\n const first = this.acceptedColliderForIdentity(\n firstColliderIndex,\n firstColliderGeneration,\n );\n const second = this.acceptedColliderForIdentity(\n secondColliderIndex,\n secondColliderGeneration,\n );\n if (first === undefined || second === undefined) return;\n const handlerName = eventHandlerName(kind);\n const firstHandler = first.options.handlers[handlerName];\n const secondHandler = second.options.handlers[handlerName];\n if (firstHandler === undefined && secondHandler === undefined) return;\n const firstBodyIdentity = this.kernel.bodyIdentity(first.bodyId);\n const secondBodyIdentity = this.kernel.bodyIdentity(second.bodyId);\n if (firstBodyIdentity === undefined || secondBodyIdentity === undefined)\n return;\n const points: Array<PhysicsContactEventDelivery2D[\"points\"][number]> = [];\n const pointBase = eventIndex * 2;\n for (\n let point = 0;\n point < candidate.eventPointCounts[eventIndex]!;\n point += 1\n ) {\n points.push(\n Object.freeze({\n firstX: candidate.eventPointFirstX[pointBase + point]!,\n firstY: candidate.eventPointFirstY[pointBase + point]!,\n secondX: candidate.eventPointSecondX[pointBase + point]!,\n secondY: candidate.eventPointSecondY[pointBase + point]!,\n separation: candidate.eventPointSeparations[pointBase + point]!,\n }),\n );\n }\n const common = {\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n firstColliderIndex,\n firstColliderGeneration,\n secondColliderIndex,\n secondColliderGeneration,\n firstBodyIndex: firstBodyIdentity.index,\n firstBodyGeneration: firstBodyIdentity.generation,\n secondBodyIndex: secondBodyIdentity.index,\n secondBodyGeneration: secondBodyIdentity.generation,\n normalX: candidate.eventNormalX[eventIndex]!,\n normalY: candidate.eventNormalY[eventIndex]!,\n points: Object.freeze(points),\n totalNormalImpulse: candidate.eventTotalNormalImpulses[eventIndex]!,\n } as const;\n if (firstHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"first\",\n receiverColliderId: first.id,\n receiverBodyId: first.bodyId,\n handler: firstHandler,\n selfTag: first.options.tag,\n otherTag: second.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n if (secondHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"second\",\n receiverColliderId: second.id,\n receiverBodyId: second.bodyId,\n handler: secondHandler,\n selfTag: second.options.tag,\n otherTag: first.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n }\n\n private deliverEvents(events: readonly PhysicsEventDelivery2D[]): void {\n if (!this.active) return;\n const errors: unknown[] = [];\n for (const fact of events) {\n try {\n if (isPhysicsBodyEventDelivery2D(fact)) {\n const handler = this.bodyEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsBodyEvent2D(\n fact,\n this.materializeBodyHandle(fact.bodyIndex, fact.bodyGeneration),\n ),\n );\n continue;\n }\n const handler = this.contactEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsContactEvent2D(fact, {\n body: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n collider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n }) as never,\n );\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n \"Multiple physics 2D event callbacks failed.\",\n );\n }\n }\n\n private bodyEventHandler(\n fact: PhysicsBodyEventDelivery2D,\n ): PhysicsBodyEventDelivery2D[\"handler\"] | undefined {\n const handler =\n fact.kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n const identity = this.kernel.bodyIdentity(fact.bodyId);\n return identity?.index === fact.bodyIndex &&\n identity.generation === fact.bodyGeneration\n ? handler\n : undefined;\n }\n\n private contactEventHandler(\n fact: PhysicsContactEventDelivery2D,\n ): PhysicsContactEventDelivery2D[\"handler\"] | undefined {\n const receiver = this.acceptedColliders.find(\n (collider) => collider.id === fact.receiverColliderId,\n );\n if (receiver === undefined || receiver.bodyId !== fact.receiverBodyId)\n return undefined;\n const handler = receiver.options.handlers[eventHandlerName(fact.kind)];\n const colliderIdentity = this.kernel.colliderIdentity(receiver.id);\n const expectedIndex =\n fact.receiver === \"first\"\n ? fact.firstColliderIndex\n : fact.secondColliderIndex;\n const expectedGeneration =\n fact.receiver === \"first\"\n ? fact.firstColliderGeneration\n : fact.secondColliderGeneration;\n return colliderIdentity?.index === expectedIndex &&\n colliderIdentity.generation === expectedGeneration\n ? handler\n : undefined;\n }\n\n private acceptedColliderForIdentity(\n index: number,\n generation: number,\n ): AcceptedCollider2D | undefined {\n return this.acceptedColliders.find((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n return identity?.index === index && identity.generation === generation;\n });\n }\n\n private hasAwakeBodies(): boolean {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled ||\n this.kernel.bodyIdentity(body.id) === undefined\n )\n continue;\n const pose = this.kernel.authoritativePose(body.id);\n const target = body.descriptor.options.target;\n const position = target.position?.get() ?? body.initialPose.position;\n const rotation =\n target.rotationDegrees?.get() ?? body.initialPose.rotationDegrees;\n if (\n (position &&\n (position[0] !== pose.position[0] ||\n position[1] !== pose.position[1])) ||\n (rotation !== undefined && rotation !== pose.rotationDegrees)\n )\n return true;\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const index = identity.index;\n const flags = bodies.flags[index]!;\n if (\n (flags & BODY_TYPE_KINEMATIC_2D) !== 0 &&\n (bodies.linearVelocityX[index]! !== 0 ||\n bodies.linearVelocityY[index]! !== 0 ||\n bodies.angularVelocity[index]! !== 0)\n )\n return true;\n if (\n (flags & BODY_TYPE_DYNAMIC_2D) !== 0 &&\n (flags & BODY_SLEEPING_2D) === 0\n )\n return true;\n }\n return false;\n }\n\n private requireDraft(): RenderDraft2D {\n const draft = this.draft;\n if (draft === undefined) {\n throw new Error(\n \"A physics attachment requires an active PhysicsWorld2D render draft.\",\n );\n }\n return draft;\n }\n\n private allocateId(): number {\n if (this.nextId === Number.MAX_SAFE_INTEGER) {\n throw new Error(\"PhysicsWorld2D exhausted stable attachment identities.\");\n }\n return this.nextId++;\n }\n\n private assertActive(): void {\n if (!this.active) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n }\n\n private materializeRevision(): WritableSignal<number> {\n return (this.revision ??= signal(this.committedRevision, {\n debugName: \"PhysicsWorld2D.revision\",\n }));\n }\n\n /** Query handles are cached only while their kernel identity remains live. */\n private evictRetiredMaterializedHandles(): void {\n for (const [key, handle] of this.materializedBodyHandles) {\n const separator = key.indexOf(\":\");\n const index = Number(key.slice(0, separator));\n const generation = Number(key.slice(separator + 1));\n if (this.kernel.bodyIdForIdentity(index, generation) !== undefined)\n continue;\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n this.materializedBodyHandles.delete(key);\n }\n for (const [key, handle] of this.materializedColliderHandles) {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (\n identity?.controller === this &&\n this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) !== undefined\n )\n continue;\n this.materializedColliderHandles.delete(key);\n }\n }\n\n private materializeBodyHandle(\n index: number,\n generation: number,\n ): PibblPhysicsBodyHandle2D {\n const bodyId = this.kernel.bodyIdForIdentity(index, generation);\n if (bodyId === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D body query result.\",\n );\n }\n const accepted = this.acceptedBodies.find((body) => body.id === bodyId);\n const explicit = accepted?.descriptor.options.handle;\n if (explicit !== undefined) return explicit;\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedBodyHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsBodyHandle2D(this.owner);\n bindPhysicsBodyHandle2D(handle, this, bodyId);\n this.materializedBodyHandles.set(key, handle);\n }\n return handle;\n }\n\n private materializeColliderHandle(\n index: number,\n generation: number,\n ): PibblPhysicsColliderHandle2D {\n if (this.kernel.colliderIdForIdentity(index, generation) === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D collider query result.\",\n );\n }\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedColliderHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsColliderHandle2D(this, index, generation);\n this.materializedColliderHandles.set(key, handle);\n }\n return handle;\n }\n\n private resolveBodyHandle(\n handle: PibblPhysicsBodyHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller !== this) return null;\n return this.kernel.bodyIdentity(binding.bodyId) ?? null;\n }\n\n private resolveColliderHandle(\n handle: PibblPhysicsColliderHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (identity?.controller !== this) return null;\n return this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) === undefined\n ? null\n : identity;\n }\n\n private unbindBodyHandle(body: AcceptedBody2D): void {\n const handle = body.descriptor.options.handle;\n const generation = body.handleBindingGeneration;\n if (handle !== undefined && generation !== undefined) {\n unbindPhysicsBodyHandle2D(handle, this, body.id, generation);\n }\n }\n}\n\nexport function requirePhysicsWorld2DController(\n handle: PibblPhysicsWorldHandle2D,\n): PhysicsWorld2DController {\n const controller = (handle as Partial<InternalWorldHandle2D>)[\n worldController2DSymbol\n ];\n if (!(controller instanceof PhysicsWorld2DController)) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n return controller;\n}\n\nexport function snapshotPhysicsWorld2DControllerForTest(\n controller: PhysicsWorld2DController,\n): PhysicsWorld2DControllerSnapshot {\n return controller.snapshot();\n}\n\nfunction normalizeWorldConfiguration(\n props: PibblResolvedPhysicsWorld2DProps,\n): NormalizedPhysicsWorld2DConfiguration {\n return normalizePhysicsWorld2DConfiguration({\n gravity: props.gravity,\n fixedStepMilliseconds: props.fixedStepMilliseconds,\n maxCatchUpSteps: props.maxCatchUpSteps,\n interpolation: props.interpolation,\n sleeping: props.sleeping,\n solver: props.solver,\n });\n}\n\nfunction denormalizeWorldConfiguration(\n configuration: NormalizedPhysicsWorld2DConfiguration,\n): PhysicsWorld2DConfiguration {\n return Object.freeze({\n gravity: Object.freeze([\n configuration.gravityX,\n configuration.gravityY,\n ] as const),\n fixedStepMilliseconds: configuration.fixedStepMilliseconds,\n maxCatchUpSteps: configuration.maxCatchUpSteps,\n interpolation: configuration.interpolation,\n sleeping: configuration.sleeping,\n solver: Object.freeze({\n velocityIterations: configuration.velocityIterations,\n positionIterations: configuration.positionIterations,\n }),\n });\n}\n\nfunction materializeTopology(\n draft: RenderDraft2D,\n reenableVelocities: ReadonlyMap<number, BodyVelocity2D>,\n previousBodyDefinitions: ReadonlyMap<number, BodyDefinition2D>,\n): readonly PhysicsTopologyRecord2D[] {\n const collidersByBody = new Map<number, ColliderDraft2D[]>();\n for (const collider of draft.colliders.values()) {\n const entries = collidersByBody.get(collider.bodyId) ?? [];\n entries.push(collider);\n collidersByBody.set(collider.bodyId, entries);\n }\n const bodies = [...draft.bodies.values()]\n .sort((left, right) => left.id - right.id)\n .map((body): PhysicsBodyTopologyRecord2D =>\n Object.freeze({\n kind: \"body\",\n id: body.id,\n definition: bodyDefinition(\n body,\n collidersByBody.get(body.id) ?? [],\n reenableVelocities.get(body.id),\n previousBodyDefinitions.get(body.id),\n ),\n }),\n );\n const colliders = [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map((collider): PhysicsColliderTopologyRecord2D =>\n Object.freeze({\n kind: \"collider\",\n id: collider.id,\n bodyId: collider.bodyId,\n definition: Object.freeze({\n shape: collider.shape,\n material: Object.freeze({\n friction: collider.options.friction,\n restitution: collider.options.restitution,\n }),\n filter: collider.options.collisionFilter,\n tag: collider.options.tag,\n handlers: collider.options.handlers,\n owner: collider.attachment,\n flags: collider.options.sensor ? COLLIDER_SENSOR_2D : 0,\n }),\n }),\n );\n return Object.freeze([...bodies, ...colliders]);\n}\n\nfunction validateAutomaticMass(draft: RenderDraft2D): void {\n const massByBody = new Map<number, number>();\n for (const collider of draft.colliders.values()) {\n if (!collider.options.contributesToMass) continue;\n massByBody.set(\n collider.bodyId,\n (massByBody.get(collider.bodyId) ?? 0) +\n collider.shape.area * collider.options.density,\n );\n }\n for (const body of draft.bodies.values()) {\n if (\n body.descriptor.bodyType !== \"dynamic\" ||\n !body.descriptor.options.enabled ||\n body.descriptor.options.mass !== \"auto\"\n ) {\n continue;\n }\n if ((massByBody.get(body.id) ?? 0) <= 0) {\n throw new RangeError(\n \"A dynamic body with automatic mass requires positive derived area from at least one active mass-contributing collider.\",\n );\n }\n }\n}\n\nfunction bodyDefinition(\n body: BodyDraft2D,\n colliders: readonly ColliderDraft2D[],\n reenableVelocity?: BodyVelocity2D,\n previous?: BodyDefinition2D,\n): BodyDefinition2D {\n const descriptor = body.descriptor;\n const enabled = descriptor.options.enabled;\n const massData = compoundMassData(colliders);\n let flags = 0;\n let linearVelocityX = 0;\n let linearVelocityY = 0;\n let angularVelocity = 0;\n let linearDamping = 0;\n let angularDamping = 0;\n let gravityScale = 0;\n let inverseMass = 0;\n let inverseInertia = 0;\n let localCenterX = 0;\n let localCenterY = 0;\n if (enabled && descriptor.bodyType === \"dynamic\") {\n flags |= BODY_TYPE_DYNAMIC_2D;\n if (descriptor.options.fixedRotation) flags |= BODY_FIXED_ROTATION_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n if (descriptor.options.ccd) flags |= BODY_CCD_2D;\n linearVelocityX =\n reenableVelocity?.linearVelocityX ?? descriptor.options.linearVelocity[0];\n linearVelocityY =\n reenableVelocity?.linearVelocityY ?? descriptor.options.linearVelocity[1];\n angularVelocity =\n reenableVelocity?.angularVelocity ??\n (descriptor.options.angularVelocityDegreesPerSecond * Math.PI) / 180;\n linearDamping = descriptor.options.linearDamping;\n angularDamping = descriptor.options.angularDamping;\n gravityScale = descriptor.options.gravityScale;\n const mass =\n descriptor.options.mass === \"auto\"\n ? massData.mass\n : descriptor.options.mass;\n inverseMass = mass > 0 ? 1 / mass : 1;\n localCenterX = massData.centerX;\n localCenterY = massData.centerY;\n const inertia =\n massData.mass > 0 ? massData.inertia * (mass / massData.mass) : 0;\n inverseInertia = descriptor.options.fixedRotation\n ? 0\n : inertia > 0\n ? 1 / inertia\n : inverseMass;\n } else if (enabled && descriptor.bodyType === \"kinematic\") {\n flags |= BODY_TYPE_KINEMATIC_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n }\n const authoredRotationRadians =\n (body.initialPose.rotationDegrees * Math.PI) / 180;\n const previousKinematic =\n previous !== undefined && (previous.flags & BODY_TYPE_KINEMATIC_2D) !== 0\n ? previous\n : undefined;\n const preserveTargetBoundKinematicPose =\n descriptor.bodyType === \"kinematic\" &&\n (descriptor.options.target.position !== undefined ||\n descriptor.options.target.rotationDegrees !== undefined) &&\n previousKinematic !== undefined;\n const previousRotationRadians = previousKinematic?.rotationRadians ?? 0;\n const previousCosine = Math.cos(previousRotationRadians);\n const previousSine = Math.sin(previousRotationRadians);\n const previousOriginX =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionX -\n previousCosine * (previousKinematic.localCenterX ?? 0) +\n previousSine * (previousKinematic.localCenterY ?? 0);\n const previousOriginY =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionY -\n previousSine * (previousKinematic.localCenterX ?? 0) -\n previousCosine * (previousKinematic.localCenterY ?? 0);\n const positionX = preserveTargetBoundKinematicPose\n ? previousOriginX\n : body.initialPose.position[0];\n const positionY = preserveTargetBoundKinematicPose\n ? previousOriginY\n : body.initialPose.position[1];\n const effectiveRotationRadians = preserveTargetBoundKinematicPose\n ? previousKinematic!.rotationRadians\n : authoredRotationRadians;\n const cosine = Math.cos(effectiveRotationRadians);\n const sine = Math.sin(effectiveRotationRadians);\n return Object.freeze({\n positionX: positionX + cosine * localCenterX - sine * localCenterY,\n positionY: positionY + sine * localCenterX + cosine * localCenterY,\n rotationRadians: effectiveRotationRadians,\n localCenterX,\n localCenterY,\n linearVelocityX,\n linearVelocityY,\n angularVelocity,\n forceX: 0,\n forceY: 0,\n torque: 0,\n inverseMass,\n inverseInertia,\n linearDamping,\n angularDamping,\n gravityScale,\n sleepTime: 0,\n flags,\n owner: body.attachment,\n });\n}\n\nconst ZERO_VELOCITY_2D: BodyVelocity2D = Object.freeze({\n linearVelocityX: 0,\n linearVelocityY: 0,\n angularVelocity: 0,\n});\n\nfunction compoundMassData(colliders: readonly ColliderDraft2D[]): Readonly<{\n mass: number;\n centerX: number;\n centerY: number;\n inertia: number;\n}> {\n const entries = colliders\n .filter((collider) => collider.options.contributesToMass)\n .map((collider) => {\n const shape = collider.shape;\n const cosine = Math.cos(shape.localPose.rotationRadians);\n const sine = Math.sin(shape.localPose.rotationRadians);\n const centerX =\n shape.localPose.x + cosine * shape.centroidX - sine * shape.centroidY;\n const centerY =\n shape.localPose.y + sine * shape.centroidX + cosine * shape.centroidY;\n return {\n mass: shape.area * collider.options.density,\n centerX,\n centerY,\n centroidInertia: shape.unitInertia * collider.options.density,\n };\n });\n const mass = entries.reduce((sum, entry) => sum + entry.mass, 0);\n if (mass <= 0) {\n return { mass: 0, centerX: 0, centerY: 0, inertia: 0 };\n }\n const centerX =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerX, 0) / mass;\n const centerY =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerY, 0) / mass;\n const inertia = entries.reduce((sum, entry) => {\n const offsetX = entry.centerX - centerX;\n const offsetY = entry.centerY - centerY;\n return (\n sum +\n entry.centroidInertia +\n entry.mass * (offsetX * offsetX + offsetY * offsetY)\n );\n }, 0);\n return { mass, centerX, centerY, inertia };\n}\n\nfunction sameConfiguration(\n left: NormalizedPhysicsWorld2DConfiguration,\n right: NormalizedPhysicsWorld2DConfiguration,\n): boolean {\n return (\n left.gravityX === right.gravityX &&\n left.gravityY === right.gravityY &&\n left.fixedStepMilliseconds === right.fixedStepMilliseconds &&\n left.maxCatchUpSteps === right.maxCatchUpSteps &&\n left.interpolation === right.interpolation &&\n left.sleeping === right.sleeping &&\n left.velocityIterations === right.velocityIterations &&\n left.positionIterations === right.positionIterations\n );\n}\n\nfunction copyPhysicsPose2D(pose: PibblPhysicsPose2D): PibblPhysicsPose2D {\n return Object.freeze({\n position: copyFiniteVector2(pose.position, \"initial physics pose.position\"),\n rotationDegrees: requireFiniteNumber(\n pose.rotationDegrees,\n \"initial physics pose.rotationDegrees\",\n ),\n });\n}\n\nfunction sameTopology(\n left: readonly PhysicsTopologyRecord2D[],\n right: readonly PhysicsTopologyRecord2D[],\n): boolean {\n if (left.length !== right.length) return false;\n return left.every((first, index) => {\n const second = right[index];\n if (!second || first.kind !== second.kind || first.id !== second.id)\n return false;\n if (first.kind === \"body\" && second.kind === \"body\") {\n return sameRecord(first.definition, second.definition);\n }\n if (first.kind === \"collider\" && second.kind === \"collider\") {\n return (\n first.bodyId === second.bodyId &&\n first.definition.shape === second.definition.shape &&\n first.definition.flags === second.definition.flags &&\n sameRecord(first.definition.material, second.definition.material) &&\n sameRecord(first.definition.filter, second.definition.filter)\n );\n }\n return false;\n });\n}\n\nfunction sameRecord(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (\n typeof left !== \"object\" ||\n left === null ||\n typeof right !== \"object\" ||\n right === null\n )\n return false;\n const leftEntries = Object.entries(left);\n const rightRecord = right as Record<string, unknown>;\n return (\n leftEntries.length === Object.keys(rightRecord).length &&\n leftEntries.every(([key, value]) => rightRecord[key] === value)\n );\n}\n\nfunction validateUniqueBodyHandles(bodies: readonly BodyDraft2D[]): void {\n const ids = new Map<PibblPhysicsBodyHandle2D, number>();\n for (const body of bodies) {\n const handle = body.descriptor.options.handle;\n if (handle === undefined) continue;\n const previous = ids.get(handle);\n if (previous !== undefined && previous !== body.id) {\n throw new Error(\n \"A Pibbl physics 2D body handle may bind to at most one live body.\",\n );\n }\n ids.set(handle, body.id);\n }\n}\n\nfunction eventHandlerName(\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n): keyof NormalizedPhysicsColliderConfiguration2D[\"handlers\"] {\n switch (kind) {\n case 1:\n return \"onCollisionStart\";\n case 2:\n return \"onCollisionEnd\";\n case 3:\n return \"onOverlapStart\";\n case 4:\n return \"onOverlapEnd\";\n case 7:\n return \"onHit\";\n }\n}\n\nconst ZERO_POSE_2D: PibblPhysicsPose2D = Object.freeze({\n position: Object.freeze([0, 0] as const),\n rotationDegrees: 0,\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["target", "handler", "centerX", "centerY"]
7
7
  }
@@ -48,17 +48,15 @@ class CommittedObstacles2D {
48
48
  canonicalLeafIndex
49
49
  });
50
50
  if (radius > 0)
51
- for (const y of [-1, 1])
52
- for (const x of [-1, 1])
53
- parts.push({
54
- kind: "circle",
55
- center: new Float64Array([
56
- center[0] + x * (hw - radius),
57
- center[1] + y * (hh - radius)
58
- ]),
59
- radius,
60
- canonicalLeafIndex
61
- });
51
+ for (let y = -1; y <= 1; y += 2) for (let x = -1; x <= 1; x += 2) parts.push({
52
+ kind: "circle",
53
+ center: new Float64Array([
54
+ center[0] + x * (hw - radius),
55
+ center[1] + y * (hh - radius)
56
+ ]),
57
+ radius,
58
+ canonicalLeafIndex
59
+ });
62
60
  expanded = parts;
63
61
  this.expandedLeaves.set(leaf, expanded);
64
62
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/features/physics/lib/2d/runtime/obstacles.ts"],
4
- "sourcesContent": ["import type { ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PhysicsWorld2DKernel } from \"../world/world.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nexport interface PhysicsObstacleBatch2D {\n readonly revision: number;\n readonly boxes: Float64Array;\n readonly ellipses: Float64Array;\n readonly polygons: Float64Array;\n}\n/** Published copies: no borrowed physics-engine memory or candidate state. */\nexport class CommittedObstacles2D {\n private batch = {\n revision: 0,\n boxes: new Float64Array(0),\n ellipses: new Float64Array(0),\n polygons: new Float64Array(0),\n };\n private readonly expandedShapes = new WeakMap<\n readonly ConvexLeaf2D[],\n readonly ConvexLeaf2D[]\n >();\n private readonly expandedLeaves = new WeakMap<\n ConvexLeaf2D,\n readonly ConvexLeaf2D[]\n >();\n private leaves(leaves: readonly ConvexLeaf2D[]): readonly ConvexLeaf2D[] {\n // A rounded rectangle with equal corner radii is exactly the union of two\n // central boxes and four disks. Cache the immutable geometry, not world poses.\n const cached = this.expandedShapes.get(leaves);\n if (cached) return cached;\n const result: ConvexLeaf2D[] = [];\n for (const leaf of leaves) {\n if (leaf.kind !== \"rounded-box\") {\n result.push(leaf);\n continue;\n }\n let expanded = this.expandedLeaves.get(leaf);\n if (!expanded) {\n const radius = leaf.radii[0]!;\n if (!leaf.radii.every((r) => r === radius)) {\n result.push(leaf);\n continue;\n }\n const {\n halfWidth: hw,\n halfHeight: hh,\n center,\n canonicalLeafIndex,\n } = leaf;\n const parts: ConvexLeaf2D[] = [];\n if (hw > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw - radius,\n halfHeight: hh,\n canonicalLeafIndex,\n });\n if (hh > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw,\n halfHeight: hh - radius,\n canonicalLeafIndex,\n });\n if (radius > 0)\n for (const y of [-1, 1])\n for (const x of [-1, 1])\n parts.push({\n kind: \"circle\",\n center: new Float64Array([\n center[0]! + x * (hw - radius),\n center[1]! + y * (hh - radius),\n ]),\n radius,\n canonicalLeafIndex,\n });\n expanded = parts;\n this.expandedLeaves.set(leaf, expanded);\n }\n result.push(...expanded);\n }\n this.expandedShapes.set(leaves, result);\n return result;\n }\n private error: Error | undefined;\n private changed = false;\n private write(output: Float64Array, index: number, value: number): void {\n if (output[index] !== value) {\n output[index] = value;\n this.changed = true;\n }\n }\n read(): PhysicsObstacleBatch2D {\n if (this.error) throw this.error;\n return this.batch;\n }\n publish(\n world: PhysicsWorld2DKernel,\n entries: readonly Readonly<{ id: number; bodyId: number }>[],\n revision: number,\n ): void {\n let boxes = 0,\n ellipses = 0,\n polygons = 0;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n for (const leaf of this.leaves(\n world.colliders.shapes[collider.index]!.leaves,\n )) {\n if (leaf.kind === \"box\") boxes += 10;\n else if (leaf.kind === \"ellipse\" || leaf.kind === \"circle\")\n ellipses += 10;\n else if (leaf.kind === \"polygon\") polygons += 6 + leaf.vertices.length;\n else {\n this.error = new TypeError(\n \"Unsupported flow obstacle collider: \" + leaf.kind,\n );\n return;\n }\n }\n }\n this.changed =\n this.error !== undefined ||\n this.batch.boxes.length !== boxes ||\n this.batch.ellipses.length !== ellipses ||\n this.batch.polygons.length !== polygons;\n this.error = undefined;\n if (this.batch.boxes.length !== boxes)\n this.batch.boxes = new Float64Array(boxes);\n if (this.batch.ellipses.length !== ellipses)\n this.batch.ellipses = new Float64Array(ellipses);\n if (this.batch.polygons.length !== polygons)\n this.batch.polygons = new Float64Array(polygons);\n let boxAt = 0,\n ellipseAt = 0,\n polygonAt = 0;\n const bodies = world.bodies;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const body = world.bodyIdentity(entry.bodyId)!.index;\n const shape = world.colliders.shapes[collider.index]!;\n const rotation = bodies.rotationRadians[body]!;\n const cosine = Math.cos(rotation),\n sine = Math.sin(rotation);\n const originX =\n bodies.positionX[body]! -\n cosine * bodies.localCenterX[body]! +\n sine * bodies.localCenterY[body]!;\n const originY =\n bodies.positionY[body]! -\n sine * bodies.localCenterX[body]! -\n cosine * bodies.localCenterY[body]!;\n const local = shape.localPose;\n const x = originX + cosine * local.x - sine * local.y;\n const y = originY + sine * local.x + cosine * local.y;\n const angle = rotation + local.rotationRadians,\n c = Math.cos(angle),\n s = Math.sin(angle);\n for (const leaf of this.leaves(shape.leaves)) {\n if (leaf.kind === \"polygon\") {\n const output = this.batch.polygons;\n this.write(output, polygonAt++, leaf.vertices.length / 2);\n this.write(output, polygonAt++, bodies.linearVelocityX[body]!);\n this.write(output, polygonAt++, bodies.linearVelocityY[body]!);\n this.write(output, polygonAt++, bodies.angularVelocity[body]!);\n this.write(output, polygonAt++, bodies.positionX[body]!);\n this.write(output, polygonAt++, bodies.positionY[body]!);\n for (let v = 0; v < leaf.vertices.length; v += 2) {\n this.write(\n output,\n polygonAt++,\n x + c * leaf.vertices[v]! - s * leaf.vertices[v + 1]!,\n );\n this.write(\n output,\n polygonAt++,\n y + s * leaf.vertices[v]! + c * leaf.vertices[v + 1]!,\n );\n }\n } else if (\n leaf.kind === \"box\" ||\n leaf.kind === \"ellipse\" ||\n leaf.kind === \"circle\"\n ) {\n const output =\n leaf.kind === \"box\" ? this.batch.boxes : this.batch.ellipses;\n let at = leaf.kind === \"box\" ? boxAt : ellipseAt;\n this.write(\n output,\n at++,\n x + c * leaf.center[0]! - s * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n y + s * leaf.center[0]! + c * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfWidth\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusX,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfHeight\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusY,\n );\n this.write(\n output,\n at++,\n angle + (leaf.kind === \"ellipse\" ? leaf.rotationRadians : 0),\n );\n this.write(output, at++, bodies.linearVelocityX[body]!);\n this.write(output, at++, bodies.linearVelocityY[body]!);\n this.write(output, at++, bodies.angularVelocity[body]!);\n this.write(output, at++, bodies.positionX[body]!);\n this.write(output, at++, bodies.positionY[body]!);\n if (leaf.kind === \"box\") boxAt = at;\n else ellipseAt = at;\n }\n }\n }\n if (this.changed) this.batch.revision = revision;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PhysicsWorld2DKernel } from \"../world/world.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nexport interface PhysicsObstacleBatch2D {\n readonly revision: number;\n readonly boxes: Float64Array;\n readonly ellipses: Float64Array;\n readonly polygons: Float64Array;\n}\n/** Published copies: no borrowed physics-engine memory or candidate state. */\nexport class CommittedObstacles2D {\n private batch = {\n revision: 0,\n boxes: new Float64Array(0),\n ellipses: new Float64Array(0),\n polygons: new Float64Array(0),\n };\n private readonly expandedShapes = new WeakMap<\n readonly ConvexLeaf2D[],\n readonly ConvexLeaf2D[]\n >();\n private readonly expandedLeaves = new WeakMap<\n ConvexLeaf2D,\n readonly ConvexLeaf2D[]\n >();\n private leaves(leaves: readonly ConvexLeaf2D[]): readonly ConvexLeaf2D[] {\n // A rounded rectangle with equal corner radii is exactly the union of two\n // central boxes and four disks. Cache the immutable geometry, not world poses.\n const cached = this.expandedShapes.get(leaves);\n if (cached) return cached;\n const result: ConvexLeaf2D[] = [];\n for (const leaf of leaves) {\n if (leaf.kind !== \"rounded-box\") {\n result.push(leaf);\n continue;\n }\n let expanded = this.expandedLeaves.get(leaf);\n if (!expanded) {\n const radius = leaf.radii[0]!;\n if (!leaf.radii.every((r) => r === radius)) {\n result.push(leaf);\n continue;\n }\n const {\n halfWidth: hw,\n halfHeight: hh,\n center,\n canonicalLeafIndex,\n } = leaf;\n const parts: ConvexLeaf2D[] = [];\n if (hw > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw - radius,\n halfHeight: hh,\n canonicalLeafIndex,\n });\n if (hh > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw,\n halfHeight: hh - radius,\n canonicalLeafIndex,\n });\n if (radius > 0)\n for (let y = -1; y <= 1; y += 2) for (let x = -1; x <= 1; x += 2) parts.push({\n kind: \"circle\",\n center: new Float64Array([\n center[0]! + x * (hw - radius),\n center[1]! + y * (hh - radius),\n ]),\n radius,\n canonicalLeafIndex,\n });\n expanded = parts;\n this.expandedLeaves.set(leaf, expanded);\n }\n result.push(...expanded);\n }\n this.expandedShapes.set(leaves, result);\n return result;\n }\n private error: Error | undefined;\n private changed = false;\n private write(output: Float64Array, index: number, value: number): void {\n if (output[index] !== value) {\n output[index] = value;\n this.changed = true;\n }\n }\n read(): PhysicsObstacleBatch2D {\n if (this.error) throw this.error;\n return this.batch;\n }\n publish(\n world: PhysicsWorld2DKernel,\n entries: readonly Readonly<{ id: number; bodyId: number }>[],\n revision: number,\n ): void {\n let boxes = 0,\n ellipses = 0,\n polygons = 0;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n for (const leaf of this.leaves(\n world.colliders.shapes[collider.index]!.leaves,\n )) {\n if (leaf.kind === \"box\") boxes += 10;\n else if (leaf.kind === \"ellipse\" || leaf.kind === \"circle\")\n ellipses += 10;\n else if (leaf.kind === \"polygon\") polygons += 6 + leaf.vertices.length;\n else {\n this.error = new TypeError(\n \"Unsupported flow obstacle collider: \" + leaf.kind,\n );\n return;\n }\n }\n }\n this.changed =\n this.error !== undefined ||\n this.batch.boxes.length !== boxes ||\n this.batch.ellipses.length !== ellipses ||\n this.batch.polygons.length !== polygons;\n this.error = undefined;\n if (this.batch.boxes.length !== boxes)\n this.batch.boxes = new Float64Array(boxes);\n if (this.batch.ellipses.length !== ellipses)\n this.batch.ellipses = new Float64Array(ellipses);\n if (this.batch.polygons.length !== polygons)\n this.batch.polygons = new Float64Array(polygons);\n let boxAt = 0,\n ellipseAt = 0,\n polygonAt = 0;\n const bodies = world.bodies;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const body = world.bodyIdentity(entry.bodyId)!.index;\n const shape = world.colliders.shapes[collider.index]!;\n const rotation = bodies.rotationRadians[body]!;\n const cosine = Math.cos(rotation),\n sine = Math.sin(rotation);\n const originX =\n bodies.positionX[body]! -\n cosine * bodies.localCenterX[body]! +\n sine * bodies.localCenterY[body]!;\n const originY =\n bodies.positionY[body]! -\n sine * bodies.localCenterX[body]! -\n cosine * bodies.localCenterY[body]!;\n const local = shape.localPose;\n const x = originX + cosine * local.x - sine * local.y;\n const y = originY + sine * local.x + cosine * local.y;\n const angle = rotation + local.rotationRadians,\n c = Math.cos(angle),\n s = Math.sin(angle);\n for (const leaf of this.leaves(shape.leaves)) {\n if (leaf.kind === \"polygon\") {\n const output = this.batch.polygons;\n this.write(output, polygonAt++, leaf.vertices.length / 2);\n this.write(output, polygonAt++, bodies.linearVelocityX[body]!);\n this.write(output, polygonAt++, bodies.linearVelocityY[body]!);\n this.write(output, polygonAt++, bodies.angularVelocity[body]!);\n this.write(output, polygonAt++, bodies.positionX[body]!);\n this.write(output, polygonAt++, bodies.positionY[body]!);\n for (let v = 0; v < leaf.vertices.length; v += 2) {\n this.write(\n output,\n polygonAt++,\n x + c * leaf.vertices[v]! - s * leaf.vertices[v + 1]!,\n );\n this.write(\n output,\n polygonAt++,\n y + s * leaf.vertices[v]! + c * leaf.vertices[v + 1]!,\n );\n }\n } else if (\n leaf.kind === \"box\" ||\n leaf.kind === \"ellipse\" ||\n leaf.kind === \"circle\"\n ) {\n const output =\n leaf.kind === \"box\" ? this.batch.boxes : this.batch.ellipses;\n let at = leaf.kind === \"box\" ? boxAt : ellipseAt;\n this.write(\n output,\n at++,\n x + c * leaf.center[0]! - s * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n y + s * leaf.center[0]! + c * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfWidth\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusX,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfHeight\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusY,\n );\n this.write(\n output,\n at++,\n angle + (leaf.kind === \"ellipse\" ? leaf.rotationRadians : 0),\n );\n this.write(output, at++, bodies.linearVelocityX[body]!);\n this.write(output, at++, bodies.linearVelocityY[body]!);\n this.write(output, at++, bodies.angularVelocity[body]!);\n this.write(output, at++, bodies.positionX[body]!);\n this.write(output, at++, bodies.positionY[body]!);\n if (leaf.kind === \"box\") boxAt = at;\n else ellipseAt = at;\n }\n }\n }\n if (this.changed) this.batch.revision = revision;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -353,8 +353,8 @@ function mutableBoundsForLeaves(leaves, pose) {
353
353
  return result;
354
354
  }
355
355
  function includeBoxCorners(center, halfWidth, halfHeight, pose, bounds, point) {
356
- for (const xSign of [-1, 1]) {
357
- for (const ySign of [-1, 1]) {
356
+ for (let xSign = -1; xSign <= 1; xSign += 2) {
357
+ for (let ySign = -1; ySign <= 1; ySign += 2) {
358
358
  transformPointInto(
359
359
  point,
360
360
  0,
@@ -466,13 +466,12 @@ function lineCentroid(points, closed) {
466
466
  }
467
467
  function roundedBoxContour(halfWidth, halfHeight, radii, center) {
468
468
  const points = [];
469
- const cornerData = [
470
- [halfWidth - radii[1], -halfHeight + radii[1], -Math.PI / 2, 0, radii[1]],
471
- [halfWidth - radii[2], halfHeight - radii[2], 0, Math.PI / 2, radii[2]],
472
- [-halfWidth + radii[3], halfHeight - radii[3], Math.PI / 2, Math.PI, radii[3]],
473
- [-halfWidth + radii[0], -halfHeight + radii[0], Math.PI, 3 * Math.PI / 2, radii[0]]
474
- ];
475
- for (const [x, y, start, end, radius] of cornerData) {
469
+ for (let corner = 0; corner < 4; corner++) {
470
+ const radius = radii[(corner + 1) % 4];
471
+ const x = corner < 2 ? halfWidth - radius : -halfWidth + radius;
472
+ const y = corner === 0 || corner === 3 ? -halfHeight + radius : halfHeight - radius;
473
+ const start = (corner - 1) * Math.PI / 2;
474
+ const end = corner * Math.PI / 2;
476
475
  const cornerPoints = radius === 0 ? [new Float64Array([center[0] + x, center[1] + y])] : flattenCircularSweep(center[0] + x, center[1] + y, radius, start, end, false);
477
476
  points.push(...cornerPoints);
478
477
  }