@cimplify/sdk 0.108.0 → 0.110.2

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 (608) hide show
  1. package/LICENSE +21 -0
  2. package/dist/advanced.d.mts +4 -3
  3. package/dist/advanced.d.ts +4 -3
  4. package/dist/advanced.js +24 -24
  5. package/dist/advanced.mjs +5 -5
  6. package/dist/animation-4EXBXRVX.js +27 -0
  7. package/dist/animation-6DICNWUP.mjs +6 -0
  8. package/dist/audio-DhvyjqdA.d.mts +249 -0
  9. package/dist/audio-m0w8cnxq.d.ts +249 -0
  10. package/dist/avatars.d.mts +110 -0
  11. package/dist/avatars.d.ts +110 -0
  12. package/dist/avatars.js +82 -0
  13. package/dist/avatars.mjs +5 -0
  14. package/dist/backend-gUCzs5Kg.d.mts +3866 -0
  15. package/dist/backend-gUCzs5Kg.d.ts +3866 -0
  16. package/dist/{catalogue-B4eLL8Mi.d.ts → catalogue-CPTMyBUz.d.mts} +109 -221
  17. package/dist/catalogue-DzrTXP3v.d.mts +541 -0
  18. package/dist/catalogue-DzrTXP3v.d.ts +541 -0
  19. package/dist/{catalogue-OT89_Ifs.d.mts → catalogue-OTuS5zp-.d.ts} +109 -221
  20. package/dist/chunk-22BD3RHN.mjs +1809 -0
  21. package/dist/chunk-25T4JHEA.mjs +21 -0
  22. package/dist/chunk-2AQ237Y4.js +508 -0
  23. package/dist/chunk-2IC4H6OV.mjs +48 -0
  24. package/dist/chunk-2LHLG4OB.mjs +71 -0
  25. package/dist/chunk-2O2CG465.js +1709 -0
  26. package/dist/chunk-2Q4DTHXK.js +316 -0
  27. package/dist/chunk-2QTQ6BUH.mjs +46 -0
  28. package/dist/chunk-2UN4SFLR.mjs +100 -0
  29. package/dist/chunk-2V75I7K3.js +454 -0
  30. package/dist/chunk-2V7IL4HC.js +10 -0
  31. package/dist/chunk-34XBXUMW.js +296 -0
  32. package/dist/chunk-3C4C654I.js +71 -0
  33. package/dist/chunk-3DAD2LDF.mjs +72 -0
  34. package/dist/chunk-3GXH2NFD.mjs +4 -0
  35. package/dist/chunk-3O47ZFW3.js +961 -0
  36. package/dist/chunk-3OY3VYNF.mjs +11 -0
  37. package/dist/chunk-3S6WPBZL.js +2936 -0
  38. package/dist/chunk-3TUOUP5T.js +399 -0
  39. package/dist/chunk-3VEH23I5.mjs +1380 -0
  40. package/dist/chunk-3ZYSAW2T.mjs +263 -0
  41. package/dist/chunk-4ANVF274.js +103 -0
  42. package/dist/chunk-4C7I3ELN.js +388 -0
  43. package/dist/chunk-4DYKAYFO.mjs +8 -0
  44. package/dist/chunk-4ZDR72SG.js +329 -0
  45. package/dist/chunk-52YS45RR.js +1066 -0
  46. package/dist/chunk-5325XSCH.js +107 -0
  47. package/dist/chunk-5AD5X6AV.js +13 -0
  48. package/dist/chunk-5BYDGGWO.mjs +197 -0
  49. package/dist/chunk-5C3C7VDM.mjs +55 -0
  50. package/dist/chunk-5HFMY3D7.js +660 -0
  51. package/dist/chunk-5LH2QN3T.js +1862 -0
  52. package/dist/chunk-5PJEXSOW.js +44 -0
  53. package/dist/chunk-5SXDH3Y7.js +90 -0
  54. package/dist/chunk-5YFBGGCK.mjs +502 -0
  55. package/dist/chunk-5YWN6H5Q.mjs +133 -0
  56. package/dist/chunk-66QP3SMN.js +402 -0
  57. package/dist/chunk-6DAEZKIG.mjs +385 -0
  58. package/dist/chunk-6DATW7TB.mjs +420 -0
  59. package/dist/{chunk-JRGK3NXR.mjs → chunk-6ETDAU62.mjs} +72 -212
  60. package/dist/chunk-6H254EVP.mjs +178 -0
  61. package/dist/chunk-6PFNJPBJ.mjs +820 -0
  62. package/dist/chunk-6PJWXIFX.mjs +357 -0
  63. package/dist/chunk-6SWKWCMS.js +80 -0
  64. package/dist/chunk-6VVXXX7S.js +808 -0
  65. package/dist/chunk-6WUBSMTX.js +1403 -0
  66. package/dist/chunk-73SGZLAQ.mjs +35 -0
  67. package/dist/chunk-76L2V6KD.mjs +4 -0
  68. package/dist/chunk-7AAIAVAA.js +1531 -0
  69. package/dist/chunk-7ARSJPV3.mjs +93 -0
  70. package/dist/chunk-7BHW5GTC.mjs +1234 -0
  71. package/dist/chunk-7DQSDKDU.js +6 -0
  72. package/dist/chunk-7IQQQENP.mjs +401 -0
  73. package/dist/chunk-7KFTYENS.js +11357 -0
  74. package/dist/chunk-7SM6XSPZ.js +3171 -0
  75. package/dist/chunk-7SXOHAIR.mjs +28 -0
  76. package/dist/chunk-A2MAX6S4.js +90 -0
  77. package/dist/chunk-A33OORT7.mjs +1530 -0
  78. package/dist/{chunk-U6ACF76H.mjs → chunk-A36JRXXH.mjs} +1075 -1845
  79. package/dist/chunk-A7BU3BK4.js +52 -0
  80. package/dist/chunk-A7MQSN2V.mjs +77 -0
  81. package/dist/chunk-A7V4L2IT.mjs +416 -0
  82. package/dist/chunk-AABEK6XU.js +226 -0
  83. package/dist/chunk-AGV33FWC.mjs +5005 -0
  84. package/dist/chunk-AHNR3BXI.js +108 -0
  85. package/dist/chunk-AQ5RLBU2.mjs +286 -0
  86. package/dist/chunk-AQOE6WCG.js +1270 -0
  87. package/dist/chunk-ATAWRACV.mjs +62 -0
  88. package/dist/chunk-ATCURNUV.js +14 -0
  89. package/dist/chunk-AWPV33OO.js +6 -0
  90. package/dist/chunk-AYJPHKYV.js +337 -0
  91. package/dist/chunk-AZ5BGWHB.js +162 -0
  92. package/dist/chunk-AZAXD44P.js +1373 -0
  93. package/dist/chunk-BBGKQIJJ.mjs +406 -0
  94. package/dist/chunk-BP4JLSUA.js +1453 -0
  95. package/dist/{chunk-SUCE7FWA.mjs → chunk-BTUSVHIE.mjs} +539 -978
  96. package/dist/chunk-BU6OK542.mjs +818 -0
  97. package/dist/chunk-CVSRWM6W.js +418 -0
  98. package/dist/chunk-CYBMFMJD.mjs +247 -0
  99. package/dist/chunk-DDJLDOUX.mjs +217 -0
  100. package/dist/{chunk-V32BCG7M.js → chunk-DFZWHNRG.js} +75 -215
  101. package/dist/chunk-DJ2C7AVG.js +644 -0
  102. package/dist/chunk-DS2VU4WW.mjs +102 -0
  103. package/dist/chunk-DSAG7T5P.js +7290 -0
  104. package/dist/chunk-E2QPPH7I.js +327 -0
  105. package/dist/chunk-E65WCTIG.mjs +1187 -0
  106. package/dist/{chunk-33VCYWVL.mjs → chunk-E6QQKDNE.mjs} +30 -42
  107. package/dist/chunk-ECDK6QBF.mjs +981 -0
  108. package/dist/chunk-EIB4OWVQ.mjs +620 -0
  109. package/dist/chunk-EQUZYCGO.js +250 -0
  110. package/dist/chunk-F3UJ6ZRM.mjs +313 -0
  111. package/dist/chunk-F63N2ZTQ.js +7023 -0
  112. package/dist/chunk-F6XRYEM3.mjs +26 -0
  113. package/dist/chunk-FE6VCE4K.js +5030 -0
  114. package/dist/chunk-FLWD6GRR.js +1372 -0
  115. package/dist/chunk-FQBFWJBS.mjs +110 -0
  116. package/dist/chunk-FXVJ2HFU.js +26 -0
  117. package/dist/chunk-FZMQMQBW.js +312 -0
  118. package/dist/chunk-G3EEC44R.js +53 -0
  119. package/dist/{chunk-KG3WT4PR.mjs → chunk-GCKWKLZF.mjs} +73 -104
  120. package/dist/chunk-GCX7TY4D.mjs +6826 -0
  121. package/dist/chunk-GDB6TCSD.js +450 -0
  122. package/dist/chunk-GDCV4IWO.mjs +21 -0
  123. package/dist/chunk-GDZT5LZ5.js +170 -0
  124. package/dist/chunk-GHPUYD4I.mjs +213 -0
  125. package/dist/chunk-GHS6MIL6.mjs +1432 -0
  126. package/dist/chunk-GPS2THCL.mjs +11 -0
  127. package/dist/{chunk-EV2EVOYS.js → chunk-GTJWQAGU.js} +31 -42
  128. package/dist/chunk-GVTI6UJQ.mjs +130 -0
  129. package/dist/chunk-GXKI64OT.mjs +1138 -0
  130. package/dist/chunk-GYDYF2WX.js +275 -0
  131. package/dist/chunk-GYLP6UG4.mjs +705 -0
  132. package/dist/chunk-H3OQKK6X.js +1158 -0
  133. package/dist/chunk-H5DFSCJ6.js +40 -0
  134. package/dist/chunk-HAGEIC2L.mjs +186 -0
  135. package/dist/chunk-HAJ4JRFO.js +293 -0
  136. package/dist/chunk-HDR72GB6.js +188 -0
  137. package/dist/chunk-HF5HPS4T.mjs +40 -0
  138. package/dist/chunk-HK6LOFDS.js +218 -0
  139. package/dist/chunk-HMWYTXCY.mjs +143 -0
  140. package/dist/chunk-HPCSRCMA.js +89 -0
  141. package/dist/chunk-HSEO6TPU.js +247 -0
  142. package/dist/chunk-I5FOHCLH.js +132 -0
  143. package/dist/chunk-IDLW4NWA.mjs +85 -0
  144. package/dist/chunk-IIDZ5WUX.js +61 -0
  145. package/dist/chunk-IR74FJHU.js +2332 -0
  146. package/dist/chunk-IRVFYAKP.mjs +100 -0
  147. package/dist/{chunk-XBL3TMPC.mjs → chunk-IZDWAL53.mjs} +1795 -3287
  148. package/dist/chunk-J2KZXIU3.js +51 -0
  149. package/dist/chunk-J2U6PJSO.js +91 -0
  150. package/dist/chunk-J5AJNY2N.js +283 -0
  151. package/dist/chunk-J6KQZ4FO.mjs +821 -0
  152. package/dist/{chunk-OWW5GUSB.js → chunk-JGBCIKJV.js} +7 -6
  153. package/dist/chunk-JKGTBMU7.mjs +25 -0
  154. package/dist/chunk-JR3TNEQC.js +422 -0
  155. package/dist/chunk-JURRXY2J.mjs +29 -0
  156. package/dist/chunk-K3HW5I2A.mjs +317 -0
  157. package/dist/chunk-K46SMZ66.mjs +103 -0
  158. package/dist/chunk-K4UDGE3Z.mjs +6 -0
  159. package/dist/chunk-KDQOR4QQ.mjs +350 -0
  160. package/dist/chunk-KDTVOLHI.mjs +288 -0
  161. package/dist/chunk-KGHJH5KJ.mjs +35 -0
  162. package/dist/chunk-KIZOA5LX.mjs +140 -0
  163. package/dist/chunk-KK6HYVBI.mjs +242 -0
  164. package/dist/chunk-KMKWGXMK.js +856 -0
  165. package/dist/chunk-KPA6K5IB.js +80 -0
  166. package/dist/chunk-KU7O4IXU.mjs +260 -0
  167. package/dist/chunk-KVFNRJOR.mjs +11142 -0
  168. package/dist/chunk-KZJRSXHK.js +2432 -0
  169. package/dist/chunk-LHWPRUJL.js +79 -0
  170. package/dist/chunk-LIV3KXJG.mjs +369 -0
  171. package/dist/chunk-LKV4LACG.js +21 -0
  172. package/dist/chunk-LUY45X3U.mjs +263 -0
  173. package/dist/chunk-LYEZZEEF.mjs +17 -0
  174. package/dist/chunk-M5EXQZYY.mjs +1519 -0
  175. package/dist/chunk-ME6HGG4I.mjs +1338 -0
  176. package/dist/chunk-MEXP6DA6.js +31 -0
  177. package/dist/chunk-MG52AW3H.js +902 -0
  178. package/dist/chunk-MIPO6F72.js +334 -0
  179. package/dist/{chunk-5QW7CQBA.js → chunk-MKIJQL5Q.js} +211 -321
  180. package/dist/chunk-MN3YETVN.mjs +17 -0
  181. package/dist/chunk-MOBSBXVE.mjs +2391 -0
  182. package/dist/chunk-MOMOZEUM.mjs +88 -0
  183. package/dist/chunk-MRFUNRAP.js +62 -0
  184. package/dist/chunk-MTIHEW2M.js +433 -0
  185. package/dist/chunk-N4RGGDEL.mjs +73 -0
  186. package/dist/chunk-NH654HAT.js +10 -0
  187. package/dist/chunk-NHJUGZUR.mjs +253 -0
  188. package/dist/chunk-NMQT4HG3.mjs +757 -0
  189. package/dist/chunk-NPSYB6DC.mjs +906 -0
  190. package/dist/chunk-NW2GPMSO.js +857 -0
  191. package/dist/chunk-NXKQOQ6L.js +76 -0
  192. package/dist/chunk-NXLAZIJZ.js +309 -0
  193. package/dist/chunk-NYWNA5CF.js +148 -0
  194. package/dist/chunk-NZTKLY2W.js +1442 -0
  195. package/dist/chunk-O2ICABUD.js +36 -0
  196. package/dist/chunk-OIVVQQ22.js +862 -0
  197. package/dist/chunk-OKC2B4O3.mjs +312 -0
  198. package/dist/chunk-OLWFPDBK.js +2220 -0
  199. package/dist/chunk-OMTVH334.js +3779 -0
  200. package/dist/chunk-OQRVEM56.mjs +362 -0
  201. package/dist/chunk-OXMIBOD4.js +337 -0
  202. package/dist/chunk-PBL6YL5L.mjs +288 -0
  203. package/dist/chunk-PDOELNNQ.js +97 -0
  204. package/dist/chunk-PDQJY2GZ.js +136 -0
  205. package/dist/chunk-PKOZXD2Q.js +1274 -0
  206. package/dist/chunk-PPF2BYFL.mjs +2191 -0
  207. package/dist/chunk-PQTQKNKD.js +539 -0
  208. package/dist/chunk-PRSR4FAV.mjs +81 -0
  209. package/dist/chunk-PTRNO5UD.js +95 -0
  210. package/dist/chunk-Q2Y3VMKH.js +2000 -0
  211. package/dist/chunk-QCZOE65N.js +96 -0
  212. package/dist/chunk-QDYFLATW.mjs +52 -0
  213. package/dist/chunk-QQABGCMM.js +22 -0
  214. package/dist/chunk-QS6TRHMR.js +345 -0
  215. package/dist/chunk-R56P64LB.mjs +208 -0
  216. package/dist/chunk-RCQ2MPBV.js +428 -0
  217. package/dist/chunk-RFVRPYR2.mjs +856 -0
  218. package/dist/chunk-RKBLPGPV.js +11521 -0
  219. package/dist/chunk-RM2V4IND.mjs +327 -0
  220. package/dist/chunk-RQXN5A34.mjs +613 -0
  221. package/dist/chunk-RUVGVNOF.mjs +2687 -0
  222. package/dist/chunk-SAFJIGYB.mjs +165 -0
  223. package/dist/chunk-SKQFLBDD.js +263 -0
  224. package/dist/chunk-SMK6JU2F.mjs +2092 -0
  225. package/dist/{chunk-UVRPC2P7.js → chunk-SNNEOS5Z.js} +1984 -3476
  226. package/dist/chunk-SPCRQ6NO.mjs +1246 -0
  227. package/dist/chunk-SWX4SALA.mjs +19 -0
  228. package/dist/{chunk-JVODCGFP.mjs → chunk-SYEO2WV4.mjs} +128 -238
  229. package/dist/chunk-T2QQMX2N.js +10 -0
  230. package/dist/chunk-T3AFF3L7.mjs +57 -0
  231. package/dist/chunk-T6Z2EXYL.js +712 -0
  232. package/dist/chunk-T7LOXGYX.js +118 -0
  233. package/dist/chunk-TJCAE7RC.mjs +1315 -0
  234. package/dist/chunk-TJI3K6RP.js +137 -0
  235. package/dist/chunk-TL2SVO4P.mjs +55 -0
  236. package/dist/chunk-TM63CYGN.mjs +399 -0
  237. package/dist/chunk-TU5RYTYU.mjs +13 -0
  238. package/dist/chunk-TVJZ4GPS.js +1553 -0
  239. package/dist/chunk-TWM6DLYF.js +371 -0
  240. package/dist/chunk-U63OC4TQ.js +30 -0
  241. package/dist/{chunk-L5GKVQVJ.js → chunk-U6BVSJZ6.js} +25 -57
  242. package/dist/chunk-U6UVWEAK.mjs +792 -0
  243. package/dist/chunk-UCEPNO6N.mjs +11048 -0
  244. package/dist/{chunk-ANT574FD.js → chunk-UCR5HRYM.js} +74 -105
  245. package/dist/chunk-UG5BTOTF.mjs +334 -0
  246. package/dist/chunk-UGH37BQW.mjs +157 -0
  247. package/dist/chunk-V7ZRH3PY.mjs +271 -0
  248. package/dist/chunk-VBGHBL3E.mjs +1394 -0
  249. package/dist/chunk-VRBDAS5I.js +920 -0
  250. package/dist/chunk-VVE3Y76O.js +230 -0
  251. package/dist/chunk-W65JIRI4.mjs +1182 -0
  252. package/dist/chunk-WHYKAT7G.js +62 -0
  253. package/dist/{chunk-YOIVZ6OA.mjs → chunk-WIZRUIZB.mjs} +25 -57
  254. package/dist/chunk-WKWTDZS7.js +385 -0
  255. package/dist/chunk-WLMINRC4.mjs +78 -0
  256. package/dist/chunk-WOF3AD3J.js +22 -0
  257. package/dist/chunk-WWKMOA76.js +1262 -0
  258. package/dist/chunk-X5A5FOWW.js +615 -0
  259. package/dist/chunk-X6CN6KQF.mjs +192 -0
  260. package/dist/chunk-XD2PMH46.mjs +517 -0
  261. package/dist/chunk-XJA2NGTI.mjs +88 -0
  262. package/dist/chunk-XJIHN3BY.mjs +8 -0
  263. package/dist/chunk-XK6UDWJS.js +203 -0
  264. package/dist/chunk-XPG3N5CF.mjs +415 -0
  265. package/dist/chunk-XVZ2NKSU.mjs +74 -0
  266. package/dist/chunk-XYP45OLE.js +117 -0
  267. package/dist/chunk-XZSDGZX6.mjs +301 -0
  268. package/dist/chunk-Y2EMGN4T.mjs +120 -0
  269. package/dist/chunk-Y3XWP5XW.mjs +298 -0
  270. package/dist/chunk-Y4K22JL6.js +228 -0
  271. package/dist/chunk-Y65LXQGA.mjs +3164 -0
  272. package/dist/chunk-Y66WVMO5.mjs +87 -0
  273. package/dist/chunk-Y7JWLB25.mjs +7280 -0
  274. package/dist/chunk-YCDXAJKU.js +175 -0
  275. package/dist/chunk-YRDQCCIS.js +152 -0
  276. package/dist/chunk-YV52DGSA.js +111 -0
  277. package/dist/chunk-YXGZQPUD.js +94 -0
  278. package/dist/chunk-Z3A3AFVU.mjs +102 -0
  279. package/dist/chunk-ZCY6YKKP.mjs +475 -0
  280. package/dist/chunk-ZEQHXVU5.js +215 -0
  281. package/dist/chunk-ZF7JCXCI.js +284 -0
  282. package/dist/chunk-ZJBRUH6V.js +29 -0
  283. package/dist/chunk-ZMIL4ZOA.js +365 -0
  284. package/dist/chunk-ZR5ULMN2.mjs +337 -0
  285. package/dist/chunk-ZXREOYOW.js +87 -0
  286. package/dist/{client-BSP9U1O1.d.mts → client-CX_WR0-J.d.mts} +2 -2
  287. package/dist/client-Dytx_ZTC.d.ts +230 -0
  288. package/dist/{client-B878xeAP.d.ts → client-dqOhP9Nc.d.ts} +2 -2
  289. package/dist/client-hTKbCuhG.d.mts +230 -0
  290. package/dist/clock-B-UAjkKa.d.mts +5 -0
  291. package/dist/clock-B-UAjkKa.d.ts +5 -0
  292. package/dist/config-BlXQluJR.d.mts +36 -0
  293. package/dist/config-BlXQluJR.d.ts +36 -0
  294. package/dist/courier-Cnn-edJ4.d.ts +95 -0
  295. package/dist/courier-FmGfkvIN.d.mts +95 -0
  296. package/dist/crowd-DdHFbqKK.d.ts +186 -0
  297. package/dist/crowd-hOVSAmA3.d.mts +186 -0
  298. package/dist/danfo-BEBapFlX.d.mts +146 -0
  299. package/dist/danfo-UQ_PTIIx.d.ts +146 -0
  300. package/dist/{elements-Bty6Qs_N.d.mts → elements-DdsRig-2.d.mts} +1548 -257
  301. package/dist/{elements-Bty6Qs_N.d.ts → elements-DdsRig-2.d.ts} +1548 -257
  302. package/dist/engines/godot.d.mts +56 -0
  303. package/dist/engines/godot.d.ts +56 -0
  304. package/dist/engines/godot.js +28 -0
  305. package/dist/engines/godot.mjs +3 -0
  306. package/dist/engines/wasm.d.mts +11 -0
  307. package/dist/engines/wasm.d.ts +11 -0
  308. package/dist/engines/wasm.js +178 -0
  309. package/dist/engines/wasm.mjs +176 -0
  310. package/dist/fallback-CrG_lTFk.d.mts +270 -0
  311. package/dist/fallback-CrG_lTFk.d.ts +270 -0
  312. package/dist/fallback-KDB4Y2CE.mjs +6 -0
  313. package/dist/fallback-Y26TQENE.js +19 -0
  314. package/dist/features-CZB4rmcD.d.mts +118 -0
  315. package/dist/features-CZB4rmcD.d.ts +118 -0
  316. package/dist/fit-BWiE7rgA.d.mts +44 -0
  317. package/dist/fit-DK0oT7zO.d.ts +44 -0
  318. package/dist/five-a-side-Bv1AOUy3.d.mts +115 -0
  319. package/dist/five-a-side-EC51SJY1.d.ts +115 -0
  320. package/dist/fluid-ARr0qUIL.d.ts +939 -0
  321. package/dist/fluid-DLlEj2cs.d.mts +939 -0
  322. package/dist/game/conformance.d.mts +84 -0
  323. package/dist/game/conformance.d.ts +84 -0
  324. package/dist/game/conformance.js +1025 -0
  325. package/dist/game/conformance.mjs +994 -0
  326. package/dist/game/heap.d.mts +40 -0
  327. package/dist/game/heap.d.ts +40 -0
  328. package/dist/game/heap.js +48 -0
  329. package/dist/game/heap.mjs +7 -0
  330. package/dist/game/kit/canvas.d.mts +240 -0
  331. package/dist/game/kit/canvas.d.ts +240 -0
  332. package/dist/game/kit/canvas.js +3566 -0
  333. package/dist/game/kit/canvas.mjs +1039 -0
  334. package/dist/game/kit/courier.d.mts +17 -0
  335. package/dist/game/kit/courier.d.ts +17 -0
  336. package/dist/game/kit/courier.js +66 -0
  337. package/dist/game/kit/courier.mjs +49 -0
  338. package/dist/game/kit/danfo.d.mts +11 -0
  339. package/dist/game/kit/danfo.d.ts +11 -0
  340. package/dist/game/kit/danfo.js +109 -0
  341. package/dist/game/kit/danfo.mjs +44 -0
  342. package/dist/game/kit/engine.d.mts +29 -0
  343. package/dist/game/kit/engine.d.ts +29 -0
  344. package/dist/game/kit/engine.js +183 -0
  345. package/dist/game/kit/engine.mjs +30 -0
  346. package/dist/game/kit/five-a-side.d.mts +11 -0
  347. package/dist/game/kit/five-a-side.d.ts +11 -0
  348. package/dist/game/kit/five-a-side.js +86 -0
  349. package/dist/game/kit/five-a-side.mjs +41 -0
  350. package/dist/game/kit/frontier.d.mts +344 -0
  351. package/dist/game/kit/frontier.d.ts +344 -0
  352. package/dist/game/kit/frontier.js +435 -0
  353. package/dist/game/kit/frontier.mjs +14 -0
  354. package/dist/game/kit/genesis.d.mts +752 -0
  355. package/dist/game/kit/genesis.d.ts +752 -0
  356. package/dist/game/kit/genesis.js +380 -0
  357. package/dist/game/kit/genesis.mjs +15 -0
  358. package/dist/game/kit/ludo.d.mts +15 -0
  359. package/dist/game/kit/ludo.d.ts +15 -0
  360. package/dist/game/kit/ludo.js +87 -0
  361. package/dist/game/kit/ludo.mjs +42 -0
  362. package/dist/game/kit/runner.d.mts +12 -0
  363. package/dist/game/kit/runner.d.ts +12 -0
  364. package/dist/game/kit/runner.js +83 -0
  365. package/dist/game/kit/runner.mjs +46 -0
  366. package/dist/game/kit/shootout.d.mts +13 -0
  367. package/dist/game/kit/shootout.d.ts +13 -0
  368. package/dist/game/kit/shootout.js +122 -0
  369. package/dist/game/kit/shootout.mjs +57 -0
  370. package/dist/game/kit/slots.d.mts +392 -0
  371. package/dist/game/kit/slots.d.ts +392 -0
  372. package/dist/game/kit/slots.js +215 -0
  373. package/dist/game/kit/slots.mjs +6 -0
  374. package/dist/game/kit/tycoon.d.mts +16 -0
  375. package/dist/game/kit/tycoon.d.ts +16 -0
  376. package/dist/game/kit/tycoon.js +145 -0
  377. package/dist/game/kit/tycoon.mjs +44 -0
  378. package/dist/game/kit/word.d.mts +11 -0
  379. package/dist/game/kit/word.d.ts +11 -0
  380. package/dist/game/kit/word.js +78 -0
  381. package/dist/game/kit/word.mjs +41 -0
  382. package/dist/game/kit/worlds.d.mts +18 -0
  383. package/dist/game/kit/worlds.d.ts +18 -0
  384. package/dist/game/kit/worlds.js +74 -0
  385. package/dist/game/kit/worlds.mjs +49 -0
  386. package/dist/game/kit.d.mts +53 -0
  387. package/dist/game/kit.d.ts +53 -0
  388. package/dist/game/kit.js +2610 -0
  389. package/dist/game/kit.mjs +101 -0
  390. package/dist/game/prepared.d.mts +14 -0
  391. package/dist/game/prepared.d.ts +14 -0
  392. package/dist/game/prepared.js +81 -0
  393. package/dist/game/prepared.mjs +32 -0
  394. package/dist/game-Bx8onkhX.d.mts +1451 -0
  395. package/dist/game-fgQy2YIm.d.ts +1451 -0
  396. package/dist/game-theme-CBTw1b_d.d.mts +35 -0
  397. package/dist/game-theme-Dg-ict5A.d.ts +35 -0
  398. package/dist/game.d.mts +3546 -0
  399. package/dist/game.d.ts +3546 -0
  400. package/dist/game.js +4455 -0
  401. package/dist/game.mjs +50 -0
  402. package/dist/graphics-C6YjWYvP.d.ts +5 -0
  403. package/dist/graphics-Dk2yQnYN.d.mts +5 -0
  404. package/dist/guest-DrsA00XD.d.mts +732 -0
  405. package/dist/guest-wIdfoT05.d.ts +732 -0
  406. package/dist/hit-stop-BKkVwTq7.d.mts +43 -0
  407. package/dist/hit-stop-D-8pPYnM.d.ts +43 -0
  408. package/dist/hot-Crn9XpHJ.d.ts +29 -0
  409. package/dist/hot-DH3nOhQD.d.mts +29 -0
  410. package/dist/{index-CQStGb3B.d.mts → index-6gkHMGAq.d.mts} +2 -2
  411. package/dist/index-B8ybCKJI.d.ts +41 -0
  412. package/dist/{index-DJwXmoaP.d.ts → index-B98Xac8e.d.ts} +2 -2
  413. package/dist/{index-B7oA_1XI.d.ts → index-B_ByTtIT.d.ts} +2 -2
  414. package/dist/index-DHjNHb1c.d.mts +41 -0
  415. package/dist/{index-DhUSTAhT.d.mts → index-DbAN_VQE.d.mts} +2 -2
  416. package/dist/index.d.mts +134 -24
  417. package/dist/index.d.ts +134 -24
  418. package/dist/index.js +407 -248
  419. package/dist/index.mjs +184 -58
  420. package/dist/interactives-authoring.d.mts +231 -0
  421. package/dist/interactives-authoring.d.ts +231 -0
  422. package/dist/interactives-authoring.js +1743 -0
  423. package/dist/interactives-authoring.mjs +1704 -0
  424. package/dist/interactives-canvas.global.js +148 -0
  425. package/dist/interactives-guest.d.mts +20 -0
  426. package/dist/interactives-guest.d.ts +20 -0
  427. package/dist/interactives-guest.js +63 -0
  428. package/dist/interactives-guest.json +1 -0
  429. package/dist/interactives-guest.mjs +61 -0
  430. package/dist/interactives-jsc.global.js +9357 -0
  431. package/dist/interactives-meters.d.mts +93 -0
  432. package/dist/interactives-meters.d.ts +93 -0
  433. package/dist/interactives-meters.js +252 -0
  434. package/dist/interactives-meters.mjs +68 -0
  435. package/dist/interactives-production.d.mts +430 -0
  436. package/dist/interactives-production.d.ts +430 -0
  437. package/dist/interactives-production.js +1231 -0
  438. package/dist/interactives-production.mjs +1170 -0
  439. package/dist/interactives-record.d.mts +112 -0
  440. package/dist/interactives-record.d.ts +112 -0
  441. package/dist/interactives-record.js +302 -0
  442. package/dist/interactives-record.mjs +295 -0
  443. package/dist/interactives-runtime.d.mts +61 -0
  444. package/dist/interactives-runtime.d.ts +61 -0
  445. package/dist/interactives-runtime.js +442 -0
  446. package/dist/interactives-runtime.mjs +25 -0
  447. package/dist/interactives-studio-kernel.global.js +1 -0
  448. package/dist/interactives-studio.d.mts +806 -0
  449. package/dist/interactives-studio.d.ts +806 -0
  450. package/dist/interactives-studio.js +5741 -0
  451. package/dist/interactives-studio.mjs +5651 -0
  452. package/dist/interactives-tick.d.mts +90 -0
  453. package/dist/interactives-tick.d.ts +90 -0
  454. package/dist/interactives-tick.js +203 -0
  455. package/dist/interactives-tick.mjs +6 -0
  456. package/dist/interactives-web.d.mts +762 -0
  457. package/dist/interactives-web.d.ts +762 -0
  458. package/dist/interactives-web.js +5000 -0
  459. package/dist/interactives-web.mjs +4628 -0
  460. package/dist/interactives.d.mts +2430 -0
  461. package/dist/interactives.d.ts +2430 -0
  462. package/dist/interactives.js +5723 -0
  463. package/dist/interactives.mjs +4333 -0
  464. package/dist/juice-CoHxlpKA.d.ts +42 -0
  465. package/dist/juice-DQztFS43.d.mts +42 -0
  466. package/dist/launch-T2f4_Di4.d.mts +151 -0
  467. package/dist/launch-d6oreMzR.d.ts +151 -0
  468. package/dist/library-DXYaMFhi.d.mts +69 -0
  469. package/dist/library-DXYaMFhi.d.ts +69 -0
  470. package/dist/link-BUTqGmyi.d.mts +38 -0
  471. package/dist/link-BUTqGmyi.d.ts +38 -0
  472. package/dist/lint.js +104 -204
  473. package/dist/lint.mjs +103 -203
  474. package/dist/local-D8_I6UeL.d.mts +6967 -0
  475. package/dist/local-VZkqsCzR.d.ts +6967 -0
  476. package/dist/lockstep-BLf6dglI.d.mts +321 -0
  477. package/dist/lockstep-D50Ia0JW.d.ts +321 -0
  478. package/dist/ludo-B8ClkDqr.d.ts +205 -0
  479. package/dist/ludo-BOuohQ-M.d.mts +205 -0
  480. package/dist/mock/cli.mjs +200 -56
  481. package/dist/mock/library.js +200 -56
  482. package/dist/mock/library.mjs +200 -56
  483. package/dist/mock/msw.js +200 -56
  484. package/dist/mock/msw.mjs +200 -56
  485. package/dist/native-BodxSh03.d.mts +16 -0
  486. package/dist/native-DUHMT8gA.d.ts +16 -0
  487. package/dist/network-ZXLD7l1b.d.mts +19 -0
  488. package/dist/network-ZXLD7l1b.d.ts +19 -0
  489. package/dist/online-XeymeM9s.d.ts +381 -0
  490. package/dist/online-d7W_Al9a.d.mts +381 -0
  491. package/dist/params-DxFb5G_U.d.mts +155 -0
  492. package/dist/params-DxFb5G_U.d.ts +155 -0
  493. package/dist/play-BRRlfLhX.d.ts +940 -0
  494. package/dist/play-ClrMd_e8.d.mts +940 -0
  495. package/dist/policy-CCw8tXLm.d.mts +3078 -0
  496. package/dist/policy-CMqOSQIu.d.ts +3078 -0
  497. package/dist/ports-B_0v_P3A.d.mts +13 -0
  498. package/dist/ports-CGU_3e_0.d.ts +13 -0
  499. package/dist/prefetch-BHnicOQj.d.ts +117 -0
  500. package/dist/prefetch-CBXgYacv.d.mts +117 -0
  501. package/dist/{price-CSztR02F.d.mts → price-BOzexBww.d.mts} +1 -1
  502. package/dist/{price-C_vasx9A.d.ts → price-C1h9sPxE.d.ts} +1 -1
  503. package/dist/protocol-C8qbpUbT.d.mts +242 -0
  504. package/dist/protocol-C8qbpUbT.d.ts +242 -0
  505. package/dist/rapier-AZHT4YI7.js +7886 -0
  506. package/dist/rapier-ODEPCQA6.mjs +7792 -0
  507. package/dist/react.d.mts +157 -15
  508. package/dist/react.d.ts +157 -15
  509. package/dist/react.js +5564 -5904
  510. package/dist/react.mjs +5451 -5808
  511. package/dist/runner-CQcLL7By.d.ts +189 -0
  512. package/dist/runner-D46Yj-wE.d.mts +189 -0
  513. package/dist/runtime-BRWfkf_q.d.mts +51 -0
  514. package/dist/runtime-DyuBMkKM.d.ts +51 -0
  515. package/dist/scheduling-D2ajXpMC.d.ts +224 -0
  516. package/dist/scheduling-DSRbbaZb.d.mts +224 -0
  517. package/dist/schema-BrWxzKp6.d.mts +63 -0
  518. package/dist/schema-BrWxzKp6.d.ts +63 -0
  519. package/dist/server/evict.js +34 -37
  520. package/dist/server/evict.mjs +34 -37
  521. package/dist/server/tanstack.d.mts +49 -3
  522. package/dist/server/tanstack.d.ts +49 -3
  523. package/dist/server/tanstack.js +169 -117
  524. package/dist/server/tanstack.mjs +166 -118
  525. package/dist/{server-Dckg4Vdr.d.ts → server-D29IIuDV.d.ts} +136 -130
  526. package/dist/{server-B6dW7-Lj.d.mts → server-DQMWPnc8.d.mts} +136 -130
  527. package/dist/server.d.mts +45 -5
  528. package/dist/server.d.ts +45 -5
  529. package/dist/server.js +171 -227
  530. package/dist/server.mjs +165 -225
  531. package/dist/session-grant-CJ27DwrT.d.mts +19 -0
  532. package/dist/session-grant-CJ27DwrT.d.ts +19 -0
  533. package/dist/shootout-BJZeX6FG.d.ts +140 -0
  534. package/dist/shootout-tcZd1Rxt.d.mts +140 -0
  535. package/dist/state-replica-stMtdkVD.d.mts +42 -0
  536. package/dist/state-replica-stMtdkVD.d.ts +42 -0
  537. package/dist/studio-CowqWqez.d.mts +14 -0
  538. package/dist/studio-CowqWqez.d.ts +14 -0
  539. package/dist/styles.css +1 -1
  540. package/dist/template-AhCdB1kW.d.mts +190 -0
  541. package/dist/template-BkEGVTQj.d.ts +190 -0
  542. package/dist/terrain-BMxEc6Oc.d.ts +429 -0
  543. package/dist/terrain-C-XC1Oui.d.mts +429 -0
  544. package/dist/testing/msw.d.mts +28 -4
  545. package/dist/testing/msw.d.ts +28 -4
  546. package/dist/testing/msw.js +15 -21
  547. package/dist/testing/msw.mjs +15 -21
  548. package/dist/testing/suite.d.mts +6 -5
  549. package/dist/testing/suite.d.ts +6 -5
  550. package/dist/testing/suite.js +89 -124
  551. package/dist/testing/suite.mjs +81 -116
  552. package/dist/testing.d.mts +27 -1227
  553. package/dist/testing.d.ts +27 -1227
  554. package/dist/testing.js +127 -131
  555. package/dist/testing.mjs +19 -23
  556. package/dist/tick-transport-C8QEh8Uw.d.mts +50 -0
  557. package/dist/tick-transport-UjHY3xK1.d.ts +50 -0
  558. package/dist/timeline-protocol-hp6e8zFB.d.mts +47 -0
  559. package/dist/timeline-protocol-hp6e8zFB.d.ts +47 -0
  560. package/dist/tokens-DhanQRQS.d.mts +21 -0
  561. package/dist/tokens-K8yxwd6G.d.ts +21 -0
  562. package/dist/tree-C-Io2Hbx.d.mts +35 -0
  563. package/dist/tree-CP_qSW4H.d.ts +35 -0
  564. package/dist/tycoon-B5KHk2Xx.d.mts +255 -0
  565. package/dist/tycoon-hmHo-3HX.d.ts +255 -0
  566. package/dist/types-BQkxPwZP.d.mts +219 -0
  567. package/dist/types-D_f6UUxM.d.ts +219 -0
  568. package/dist/ui-DwHicuFv.d.mts +563 -0
  569. package/dist/ui-hi7S2YcH.d.ts +563 -0
  570. package/dist/{sign-in-DQlIdqsi.d.mts → url-52ndUruG.d.mts} +15 -1
  571. package/dist/{sign-in-DQlIdqsi.d.ts → url-52ndUruG.d.ts} +15 -1
  572. package/dist/utils.d.mts +3 -3
  573. package/dist/utils.d.ts +3 -3
  574. package/dist/utils.js +37 -37
  575. package/dist/utils.mjs +4 -4
  576. package/dist/vars-Dc_PrhBK.d.mts +511 -0
  577. package/dist/vars-Dc_PrhBK.d.ts +511 -0
  578. package/dist/vm-IUARFFAI.mjs +63 -0
  579. package/dist/vm-N7L6MGGH.js +65 -0
  580. package/dist/weave-delivery-CW-Kstut.d.mts +360 -0
  581. package/dist/weave-delivery-CW-Kstut.d.ts +360 -0
  582. package/dist/web-Dss74a7v.d.ts +883 -0
  583. package/dist/web-f9ZQPoyw.d.mts +883 -0
  584. package/dist/web-transport-C7MkBL0a.d.ts +19 -0
  585. package/dist/web-transport-aYEqXMd9.d.mts +19 -0
  586. package/dist/weight-CPGjsgjV.d.ts +92 -0
  587. package/dist/weight-tF1ODR1p.d.mts +92 -0
  588. package/dist/word-BcX9Jcmv.d.mts +70 -0
  589. package/dist/word-C7sVPLHm.d.ts +70 -0
  590. package/dist/world-PvILHDR1.d.ts +2285 -0
  591. package/dist/world-qekkXjJv.d.mts +2285 -0
  592. package/dist/worlds-Br2Pb0Cs.d.ts +109 -0
  593. package/dist/worlds-D5ydYr7d.d.mts +109 -0
  594. package/engines/c/cimplify.h +108 -0
  595. package/engines/c/cimplify.lib.js +11 -0
  596. package/engines/godot/addons/cimplify/cimplify.gd +97 -0
  597. package/engines/rust/interactives-ctx/Cargo.toml +9 -0
  598. package/engines/rust/interactives-ctx/src/lib.rs +189 -0
  599. package/package.json +189 -3
  600. package/vendor/rapier3d-compat/LICENSE +201 -0
  601. package/vendor/rapier3d-compat/PATCHES.md +61 -0
  602. package/dist/chunk-2P4KXFB6.js +0 -274
  603. package/dist/chunk-3G6RQLXK.mjs +0 -21
  604. package/dist/chunk-3V4DVXV3.mjs +0 -254
  605. package/dist/chunk-EDK3LNM6.js +0 -2436
  606. package/dist/chunk-F7J3HK27.js +0 -4549
  607. package/dist/chunk-U4MW6PYU.mjs +0 -23
  608. package/dist/chunk-XREIZ56K.js +0 -26
@@ -0,0 +1,2687 @@
1
+ import { events, setEmitRow, setPoolEngine, COMPUTE_SPACE_CPU, listPoolAddress, writeWideArg, hasData, COMPUTE_DEFERRED, routeEvents, readDataReport, dataTables, COMPUTE_STOPPED } from './chunk-E65WCTIG.mjs';
2
+ import { noise3, noise2, parseProgram, STORAGE_F32, STORAGE_I32, STORAGE_U32, STORAGE_U8, isSimd, SIMD_TEMPS, CellGrid, QuerySearch, simdScalarize } from './chunk-MOBSBXVE.mjs';
3
+ import { FMATH_CONSTANTS, Op, evalLane, KERNEL_EXPORT_NAMES, KERNEL_DATA_EXPORT_NAMES, ATTACH_SPAWN_TABLE, SPAWN_STATS_WORDS, ATTACH_UI, ATTACH_AUDIO, ATTACH_VOXELS, ATTACH_CHEMISTRY_GRID, DATA_REPORT_HEADER, RING_HEADER_WORDS, DEFAULT_EVENT_CAPACITY, crossRow, stageEndingOp, f32From, f32Bits, RING_COUNT, RING_DROPPED, XOP, xopRange, XOP_RANGE, laneSignature, XOP_GATHER, XOP_FIELD, XOP_QUERY, XOP_QSHAPE, XOP_QFILTER, XOP_QSTOP, CROSS_OP, DATA_LIST, DATA_KEYOF, DATA_ROWOF, DATA_FLOAD, DATA_ROWS, DATA_PGET, DATA_PSET, DATA_TALLY, DATA_SEND, DATA_PICK, QUERY_FILTERED, QUERY_SHAPE, recurSub, XOP_COMPONENTS_EDGES, LOOP_COUNT_F32, QUERY_SPHERE } from './chunk-SMK6JU2F.mjs';
4
+ import { instantiateApproved } from './chunk-N4RGGDEL.mjs';
5
+ import { GameError } from './chunk-XJIHN3BY.mjs';
6
+
7
+ // src/game/kernel/spawns.ts
8
+ var WIDTHS = { vec2: 2, vec3: 3, vec4: 4 }, AXES = ["x", "y", "z", "w"], NO_ROW = 4294967295, spawnOverflow = events("kernel.spawnOverflow", { dropped: "u32", capacity: "u32", table: "u32" });
9
+ function storageOf(values) {
10
+ return values instanceof Float32Array ? STORAGE_F32 : values instanceof Int32Array ? STORAGE_I32 : values instanceof Uint32Array ? STORAGE_U32 : STORAGE_U8;
11
+ }
12
+ function tableColumns(table) {
13
+ let out = [];
14
+ for (let field of Object.keys(table.schema)) {
15
+ let width = WIDTHS[table.schema[field]] ?? 1;
16
+ for (let k = 0; k < width; k++) out.push(table.values(field, k));
17
+ }
18
+ return out;
19
+ }
20
+ var TableSpawns = class {
21
+ constructor(table, meta) {
22
+ this.table = table;
23
+ this.bySlot = /* @__PURE__ */ new Map();
24
+ this.columns = tableColumns(table), meta !== null && meta.slots.forEach((slot, k) => {
25
+ if (slot.spawn !== true) return;
26
+ if (!(slot.field in table.schema)) throw new GameError("invalid_argument", `kernel ${meta.name} spawns ${slot.field}, which the spawn table does not have`);
27
+ let values = table.values(slot.field, slot.component);
28
+ this.bySlot.set(k, { values, storage: storageOf(values) });
29
+ });
30
+ }
31
+ get capacity() {
32
+ return this.table.capacity;
33
+ }
34
+ get count() {
35
+ return this.table.count;
36
+ }
37
+ set count(value) {
38
+ this.table.count = value;
39
+ }
40
+ column(slot) {
41
+ let column = this.bySlot.get(slot);
42
+ if (column === void 0) throw new GameError("invalid_argument", "the spawn table has no column for this kernel field");
43
+ return column;
44
+ }
45
+ };
46
+ function reportSpawns(stats, into, out) {
47
+ return out.spawned = stats.spawned, out.dropped = stats.dropped, out.killed = stats.killed, stats.dropped > 0 && (setEmitRow((4294967295)), spawnOverflow.emit({ dropped: stats.dropped, capacity: into.capacity, table: into.id >>> 0 })), out;
48
+ }
49
+ function flatten(prefix, value, out) {
50
+ if (typeof value == "number") out.push([prefix, 0, value]);
51
+ else if (typeof value == "boolean") out.push([prefix, 0, value ? 1 : 0]);
52
+ else if (value !== null && typeof value == "object") {
53
+ let record = value, keys = Object.keys(record);
54
+ if (keys.length >= 2 && keys.length <= 4 && keys.every((k, i) => k === AXES[i]) && keys.every((k) => typeof record[k] == "number")) {
55
+ keys.forEach((k, i) => out.push([prefix, i, record[k]]));
56
+ return;
57
+ }
58
+ if (Array.isArray(value)) {
59
+ value.forEach((inner, i) => flatten(`${prefix}.${i}`, inner, out));
60
+ return;
61
+ }
62
+ for (let key of keys) flatten(prefix.length === 0 ? key : `${prefix}.${key}`, record[key], out);
63
+ }
64
+ }
65
+ var PlainSpawns = class {
66
+ constructor() {
67
+ this.pending = [];
68
+ this.kills = /* @__PURE__ */ new Set();
69
+ this.sequence = 0;
70
+ }
71
+ spawn(row, values) {
72
+ let fields = [];
73
+ flatten("", values, fields), this.pending.push({ row, order: this.sequence++, fields });
74
+ }
75
+ kill(row) {
76
+ this.kills.add(row);
77
+ }
78
+ get used() {
79
+ return this.pending.length > 0 || this.kills.size > 0;
80
+ }
81
+ finish(own, into, out) {
82
+ if (out.spawned = 0, out.dropped = 0, out.killed = 0, this.kills.size > 0) {
83
+ let columns2 = tableColumns(own), total = own.count, kept = 0;
84
+ for (let row = 0; row < total; row++)
85
+ if (!this.kills.has(row)) {
86
+ if (kept !== row) for (let column of columns2) column[kept] = column[row];
87
+ kept++;
88
+ }
89
+ out.killed = total - kept, own.count = kept;
90
+ }
91
+ let target = into ?? own, pending = this.pending.sort((a, b) => a.row - b.row || a.order - b.order), columns = tableColumns(target);
92
+ for (let p of pending) {
93
+ let at = target.count;
94
+ if (at >= target.capacity) {
95
+ out.dropped++;
96
+ continue;
97
+ }
98
+ for (let column of columns) column[at] = 0;
99
+ for (let [field, component, value] of p.fields) {
100
+ if (!(field in target.schema)) throw new GameError("invalid_argument", `spawn() sets ${field}, which the spawn table does not have`);
101
+ let column = target.values(field, component);
102
+ column[at] = column instanceof Float32Array ? value : Math.trunc(value);
103
+ }
104
+ target.count = at + 1, out.spawned++;
105
+ }
106
+ return this.pending = [], this.kills.clear(), this.sequence = 0, out;
107
+ }
108
+ };
109
+
110
+ // src/game/kernel/wasm-fmath.ts
111
+ var WASM_FMATH = ["sin", "cos", "tan", "asin", "acos", "atan", "exp", "log", "log2", "pow", "atan2"], WASM_FMATH_BINARY = /* @__PURE__ */ new Set(["pow", "atan2"]), I32 = 127, I64 = 126, F32 = 125, F64 = 124, VOID = 64, BLOCK = 2, IF = 4, ELSE = 5, END = 11, BR = 12, BR_TABLE = 14, RETURN = 15, SELECT = 27, LOCAL_GET = 32, LOCAL_SET = 33, LOCAL_TEE = 34, I32_CONST = 65, I64_CONST = 66, F32_CONST = 67, F64_CONST = 68, I32_EQZ = 69, I32_EQ = 70, I32_NE = 71, I32_LT_U = 73, I32_GT_U = 75, I32_GE_U = 79, I64_LT_S = 83, F32_NE = 92, F64_EQ = 97, F64_NE = 98;
112
+ var F64_GT = 100, F64_LE = 101, I32_ADD = 106, I32_SUB = 107, I32_AND = 113, I32_OR = 114, I32_SHL = 116, I32_SHR_S = 117, I32_SHR_U = 118, I64_ADD = 124, I64_SUB = 125, I64_MUL = 126, I64_AND = 131, I64_OR = 132, I64_SHL = 134, I64_SHR_U = 136, F64_ABS = 153, F64_NEG = 154, F64_SQRT = 159, F64_ADD = 160, F64_SUB = 161, F64_MUL = 162, F64_DIV = 163, F64_MIN = 164, F64_MAX = 165, I32_WRAP_I64 = 167, I32_TRUNC_F64_S = 170, I64_EXTEND_I32_U = 173, F32_DEMOTE_F64 = 182, F64_CONVERT_I32_S = 183, F64_CONVERT_I64_S = 185, F64_PROMOTE_F32 = 187, I32_REINTERPRET_F32 = 188, I64_REINTERPRET_F64 = 189, F32_REINTERPRET_I32 = 190, F64_REINTERPRET_I64 = 191, CANONICAL_NAN = 2143289344, SIGN = 2147483648, ABS = 2147483647, EXPONENT_MASK = 4286578688, INFINITY_SHIFTED = 4278190080, ZERO_INF_NAN = 4278190079, LOW_WORD = 4294967295, EXP_TABLE_SIZE = 32, LOG_TABLE_SIZE = 16, ATAN_TERMS = FMATH_CONSTANTS.ATAN_COEFFS.length;
113
+ function uleb(out, value) {
114
+ let v = value >>> 0;
115
+ do {
116
+ let byte = v & 127;
117
+ v >>>= 7, v !== 0 && (byte |= 128), out.push(byte);
118
+ } while (v !== 0);
119
+ }
120
+ function slebBig(out, value) {
121
+ let v = value;
122
+ for (; ; ) {
123
+ let byte = Number(v & 0x7fn);
124
+ v >>= 7n;
125
+ let done = v === 0n && (byte & 64) === 0 || v === -1n && (byte & 64) !== 0;
126
+ if (out.push(done ? byte : byte | 128), done) return;
127
+ }
128
+ }
129
+ var Fn = class {
130
+ constructor(params) {
131
+ this.params = params;
132
+ this.code = [];
133
+ this.kinds = [];
134
+ }
135
+ local(kind) {
136
+ return this.kinds.push(kind), this.params + this.kinds.length - 1;
137
+ }
138
+ op(...bytes) {
139
+ for (let b of bytes) this.code.push(b);
140
+ return this;
141
+ }
142
+ get(l) {
143
+ return this.code.push((32)), uleb(this.code, l), this;
144
+ }
145
+ set(l) {
146
+ return this.code.push((33)), uleb(this.code, l), this;
147
+ }
148
+ tee(l) {
149
+ return this.code.push((34)), uleb(this.code, l), this;
150
+ }
151
+ i32(v) {
152
+ return this.code.push((65)), slebBig(this.code, BigInt(v | 0)), this;
153
+ }
154
+ i64(v) {
155
+ return this.code.push((66)), slebBig(this.code, BigInt.asIntN(64, v)), this;
156
+ }
157
+ f32bits(bits) {
158
+ this.code.push((67));
159
+ let word = bits >>> 0;
160
+ return this.code.push(word & 255, word >>> 8 & 255, word >>> 16 & 255, word >>> 24), this;
161
+ }
162
+ f64(v) {
163
+ this.code.push((68));
164
+ for (let b of new Uint8Array(new Float64Array([v]).buffer)) this.code.push(b);
165
+ return this;
166
+ }
167
+ when(kind, then, otherwise) {
168
+ return this.code.push((4), kind), then(), otherwise !== void 0 && (this.code.push((5)), otherwise()), this.code.push((11)), this;
169
+ }
170
+ returnNan() {
171
+ return this.f32bits((2143289344)).op((15));
172
+ }
173
+ table(index, kind, entries) {
174
+ let n = entries.length;
175
+ this.code.push((2), kind);
176
+ for (let k = 0; k < n; k++) this.code.push((2), (64));
177
+ this.get(index).op((14)), uleb(this.code, n - 1);
178
+ for (let k = 0; k < n; k++) uleb(this.code, k);
179
+ this.code.push((11));
180
+ for (let k = 0; k < n; k++)
181
+ entries[k](), k < n - 1 && (this.code.push((12)), uleb(this.code, n - 1 - k)), this.code.push((11));
182
+ return this;
183
+ }
184
+ f64Table(index, values) {
185
+ return this.table(
186
+ index,
187
+ (124),
188
+ values.map((v) => () => this.f64(v))
189
+ );
190
+ }
191
+ i64Table(index, values) {
192
+ return this.table(
193
+ index,
194
+ (126),
195
+ values.map((v) => () => this.i64(v))
196
+ );
197
+ }
198
+ finish() {
199
+ let out = [], groups = [];
200
+ for (let kind of this.kinds) {
201
+ let last = groups[groups.length - 1];
202
+ last !== void 0 && last[1] === kind ? last[0]++ : groups.push([1, kind]);
203
+ }
204
+ uleb(out, groups.length);
205
+ for (let [count, kind] of groups)
206
+ uleb(out, count), out.push(kind);
207
+ for (let b of this.code) out.push(b);
208
+ return out.push((11)), out;
209
+ }
210
+ }, EXP2_BITS = FMATH_CONSTANTS.EXP2_HI.map((hi, i) => BigInt(hi >>> 0) << 32n | BigInt(FMATH_CONSTANTS.EXP2_LO[i] >>> 0)), PIO4 = FMATH_CONSTANTS.INV_PIO4.map((w) => BigInt(w >>> 0));
211
+ function canonicalReturn(f3, result) {
212
+ f3.f32bits((2143289344)).get(result).get(result).get(result).op((92)).op((27));
213
+ }
214
+ function clamp(f3, value, low, high) {
215
+ value(), f3.f64(low).op((165)).f64(high).op((164));
216
+ }
217
+ function exp2Table(f3, xd, shift, poly, signBias) {
218
+ let shifted = f3.local((124)), ki = f3.local((127)), r = f3.local((124)), s = f3.local((124)), i = f3.local((127));
219
+ f3.get(xd).f64(shift).op((160)).set(shifted), f3.get(shifted).op((189), (167)).set(ki), f3.get(xd).get(shifted).f64(shift).op((161)).op((161)).set(r), f3.get(ki).i32((32) - 1).op((113)).set(i), f3.i64Table(i, EXP2_BITS), f3.get(ki), signBias(), f3.op((106)).i32(15).op((116)).op((173)).i64(32n).op((134)).op((124)).op((191)).set(s), f3.f64(poly[0]).get(r).op((162)).f64(poly[1]).op((160)), f3.get(r).get(r).op((162)).op((162)), f3.f64(poly[2]).get(r).op((162)).f64(1).op((160)), f3.op((160)).get(s).op((162));
220
+ }
221
+ function normalized(f3, ix, out) {
222
+ f3.get(ix).i32((2147483647)).op((113)).set(out), f3.get(out).i32(FMATH_CONSTANTS.MIN_NORMAL).op((73)), f3.when((64), () => {
223
+ f3.get(out).op((190), (187)).f64(FMATH_CONSTANTS.SUBNORMAL_SCALE).op((162)).op((182), (188)), f3.i32(FMATH_CONSTANTS.SUBNORMAL_BIAS).op((107)).set(out);
224
+ });
225
+ }
226
+ function split(f3, ix) {
227
+ let tmp = f3.local((127)), i = f3.local((127)), top = f3.local((127)), k = f3.local((127)), r = f3.local((124));
228
+ return f3.get(ix).i32(FMATH_CONSTANTS.LOG_OFF).op((107)).set(tmp), f3.get(tmp).i32(19).op((118)).i32((16) - 1).op((113)).set(i), f3.get(tmp).i32((4286578688)).op((113)).set(top), f3.get(top).i32(23).op((117)).set(k), f3.get(ix).get(top).op((107)).op((190), (187)), f3.f64Table(i, FMATH_CONSTANTS.INV_C).op((162)).f64(1).op((161)).set(r), { i, k, r };
229
+ }
230
+ function logSpecial(f3, y) {
231
+ let ix = f3.local((127));
232
+ f3.get(0).op((188)).set(ix), f3.get(ix).i32(1).op((116)).op((69)).when((64), () => f3.f32bits(4286578688).op((15))), f3.get(ix).i32(FMATH_CONSTANTS.INFINITY_BITS).op((70)).when((64), () => f3.get(0).op((15))), f3.get(ix).i32((2147483648)).op((113)).i32(0).op((71)), f3.get(ix).i32(1).op((116)).i32((4278190080)).op((79)).op((114)), f3.when((64), () => f3.returnNan()), f3.get(y);
233
+ }
234
+ function logFn(two) {
235
+ let f3 = new Fn(1), ix = f3.local((127)), y = f3.local((124)), r2 = f3.local((124)), out = f3.local((125));
236
+ f3.get(0).op((188)).set(ix), normalized(f3, ix, ix);
237
+ let { i, k, r } = split(f3, ix), y0 = f3.local((124));
238
+ if (two) {
239
+ f3.f64Table(i, FMATH_CONSTANTS.LOG2_C).get(k).op((183)).op((160)).set(y0), f3.get(r).get(r).op((162)).set(r2), f3.f64(FMATH_CONSTANTS.LOG2_POLY[1]).get(r).op((162)).f64(FMATH_CONSTANTS.LOG2_POLY[2]).op((160)).set(y), f3.f64(FMATH_CONSTANTS.LOG2_POLY[0]).get(r2).op((162)).get(y).op((160)).set(y);
240
+ let p = f3.local((124));
241
+ f3.f64(FMATH_CONSTANTS.LOG2_POLY[3]).get(r).op((162)).get(y0).op((160)).set(p), f3.get(y).get(r2).op((162)).get(p).op((160)).set(y);
242
+ } else
243
+ f3.f64Table(i, FMATH_CONSTANTS.LOG_C).get(k).op((183)).f64(FMATH_CONSTANTS.LN2).op((162)).op((160)).set(y0), f3.get(r).get(r).op((162)).set(r2), f3.f64(FMATH_CONSTANTS.LOG_POLY[1]).get(r).op((162)).f64(FMATH_CONSTANTS.LOG_POLY[2]).op((160)).set(y), f3.f64(FMATH_CONSTANTS.LOG_POLY[0]).get(r2).op((162)).get(y).op((160)).set(y), f3.get(y).get(r2).op((162)).get(y0).get(r).op((160)).op((160)).set(y);
244
+ return f3.get(y).op((182)).set(out), logSpecial(f3, out), f3.set(out), canonicalReturn(f3, out), f3.finish();
245
+ }
246
+ function expFn() {
247
+ let f3 = new Fn(1), xd = f3.local((124)), out = f3.local((125));
248
+ return f3.get(0).get(0).op((92)).when((64), () => f3.returnNan()), f3.f64(FMATH_CONSTANTS.INV_LN2_N), clamp(f3, () => f3.get(0).op((187)), FMATH_CONSTANTS.EXP_LOW, FMATH_CONSTANTS.EXP_HIGH), f3.op((162)).set(xd), exp2Table(f3, xd, FMATH_CONSTANTS.SHIFT, FMATH_CONSTANTS.EXP_POLY, () => f3.i32(0)), f3.op((182)).set(out), canonicalReturn(f3, out), f3.finish();
249
+ }
250
+ function zeroInfNan(f3, bits) {
251
+ f3.get(bits).i32(1).op((116)).i32(1).op((107)).i32((4278190079)).op((79));
252
+ }
253
+ function powFn() {
254
+ let f3 = new Fn(2), ix = f3.local((127)), iy = f3.local((127)), ax = f3.local((127)), yint = f3.local((127)), odd = f3.local((127)), e = f3.local((127)), shift = f3.local((127)), x2 = f3.local((124)), ylogx = f3.local((124)), norm = f3.local((127)), out = f3.local((125)), xf = () => f3.get(0).op((187)), yf = () => f3.get(1).op((187));
255
+ f3.get(0).op((188)).set(ix), f3.get(1).op((188)).set(iy), f3.get(ix).i32((2147483647)).op((113)).set(ax), zeroInfNan(f3, iy), f3.when((64), () => {
256
+ f3.get(iy).i32(1).op((116)).op((69)).get(ix).i32(FMATH_CONSTANTS.ONE_BITS).op((70)).op((114)), f3.when((64), () => f3.f32bits(FMATH_CONSTANTS.ONE_BITS).op((15))), f3.get(ix).i32(1).op((116)).i32((4278190080)).op((75)), f3.get(iy).i32(1).op((116)).i32((4278190080)).op((75)).op((114)), f3.when((64), () => f3.returnNan()), f3.get(ax).i32(FMATH_CONSTANTS.ONE_BITS).op((70)).when((64), () => f3.f32bits(FMATH_CONSTANTS.ONE_BITS).op((15))), f3.get(ax).i32(FMATH_CONSTANTS.ONE_BITS).op((73)).get(iy).i32((2147483648)).op((113)).op((69)).op((70)), f3.when((64), () => f3.f32bits(0).op((15))), yf().get(1).op((187)).op((162)).op((182)).op((15));
257
+ }), f3.get(iy).i32(23).op((118)).i32(255).op((113)).set(e), f3.get(e).i32(127).op((73)), f3.when(
258
+ (64),
259
+ () => f3.i32(0).set(yint),
260
+ () => {
261
+ f3.get(e).i32(150).op((75)), f3.when(
262
+ (64),
263
+ () => f3.i32(2).set(yint),
264
+ () => {
265
+ f3.i32(150).get(e).op((107)).set(shift), f3.get(iy).i32(1).get(shift).op((116)).i32(1).op((107)).op((113)).i32(0).op((71)), f3.when(
266
+ (64),
267
+ () => f3.i32(0).set(yint),
268
+ () => {
269
+ f3.i32(1).i32(2).get(iy).i32(1).get(shift).op((116)).op((113)).op((27)).set(yint);
270
+ }
271
+ );
272
+ }
273
+ );
274
+ }
275
+ ), f3.get(ix).i32((2147483648)).op((113)).i32(0).op((71)).get(yint).i32(1).op((70)).op((113)).set(odd), zeroInfNan(f3, ix), f3.when((64), () => {
276
+ f3.get(0).get(0).op((92)).when((64), () => f3.returnNan()), xf().get(0).op((187)).op((162)).op((182), (187)).set(x2), f3.get(odd).when((64), () => f3.get(x2).op((154)).set(x2)), f3.get(iy).i32((2147483648)).op((113)), f3.when((125), () => f3.f64(1).get(x2).op((163)).op((182)), () => f3.get(x2).op((182))), f3.op((15));
277
+ }), f3.get(ix).i32((2147483648)).op((113)).i32(0).op((71)).get(yint).op((69)).op((113)).when((64), () => f3.returnNan()), normalized(f3, ix, norm);
278
+ let { i, k, r } = split(f3, norm), y0 = f3.local((124)), r2 = f3.local((124)), q = f3.local((124));
279
+ f3.f64Table(i, FMATH_CONSTANTS.LOG2_C).get(k).op((183)).op((160)).set(y0), f3.get(r).get(r).op((162)).set(r2), yf(), f3.f64(FMATH_CONSTANTS.POW_POLY[0]).get(r).op((162)).f64(FMATH_CONSTANTS.POW_POLY[1]).op((160)), f3.get(r2).get(r2).op((162)).op((162)), f3.f64(FMATH_CONSTANTS.POW_POLY[4]).get(r).op((162)).get(y0).op((160)).set(q), f3.f64(FMATH_CONSTANTS.POW_POLY[2]).get(r).op((162)).f64(FMATH_CONSTANTS.POW_POLY[3]).op((160)).get(r2).op((162)).get(q).op((160)), f3.op((160)).op((162)).set(ylogx);
280
+ let signed = (bits) => {
281
+ f3.f32bits(bits | (2147483648)).f32bits(bits).get(odd).op((27)).op((15));
282
+ };
283
+ f3.get(ylogx).f64(FMATH_CONSTANTS.POW_OVERFLOW).op((100)).when((64), () => signed(FMATH_CONSTANTS.INFINITY_BITS)), f3.get(ylogx).f64(FMATH_CONSTANTS.POW_SATURATE).op((100)).when((64), () => signed(2139095039)), f3.get(ylogx).f64(FMATH_CONSTANTS.POW_UNDERFLOW).op((101)).when((64), () => signed(0));
284
+ let xd = f3.local((124));
285
+ return clamp(f3, () => f3.get(ylogx), FMATH_CONSTANTS.EXP2_LOW, FMATH_CONSTANTS.EXP2_HIGH), f3.set(xd), exp2Table(f3, xd, FMATH_CONSTANTS.SHIFT_SCALED, FMATH_CONSTANTS.EXP2_POLY, () => f3.i32(FMATH_CONSTANTS.POW_SIGN_BIAS).i32(0).get(odd).op((27))), f3.op((182)).set(out), canonicalReturn(f3, out), f3.finish();
286
+ }
287
+ function signFlip(f3, n, mask) {
288
+ f3.f64(-1).f64(1).get(n), mask === 1 && f3.i32(1).op((106)), f3.i32(2).op((113)).op((27));
289
+ }
290
+ function sincos(f3, first, second, which) {
291
+ let bits = f3.local((127)), x = f3.local((124)), n = f3.local((127)), q = f3.local((127)), flip = f3.local((124)), s = f3.local((124));
292
+ f3.get(0).op((188)).set(bits), f3.get(bits).i32(20).op((118)).i32(2047).op((113)).i32(FMATH_CONSTANTS.LARGE_TOP).op((73)), f3.when(
293
+ (64),
294
+ () => {
295
+ f3.get(0).op((187)).f64(FMATH_CONSTANTS.HPI_INV).op((162)).op((170)).i32(FMATH_CONSTANTS.QUADRANT_ROUND).op((106)).i32(24).op((117)).tee(n).set(q), f3.get(0).op((187)).get(n).op((183)).f64(FMATH_CONSTANTS.HPI).op((162)).op((161)).set(x);
296
+ },
297
+ () => {
298
+ f3.get(bits).i32(FMATH_CONSTANTS.INFINITY_BITS).op((113)).i32(FMATH_CONSTANTS.INFINITY_BITS).op((70)).when((64), () => f3.returnNan());
299
+ let at = f3.local((127)), m = f3.local((126)), res0 = f3.local((126)), res = f3.local((126)), t = f3.local((127)), n64 = f3.local((126));
300
+ f3.get(bits).i32(26).op((118)).i32(15).op((113)).set(at), f3.get(bits).i32(16777215).op((113)).i32(8388608).op((114)).get(bits).i32(23).op((118)).i32(7).op((113)).op((116)).op((173)).set(m), f3.get(m).get(at).set(t).i64Table(t, PIO4).op((126)).i64(BigInt((4294967295))).op((131)).set(res0), f3.get(at).i32(8).op((106)).set(t), f3.get(m).i64Table(t, PIO4).op((126)).i64(32n).op((136)).get(res0).i64(32n).op((134)).op((132)).set(res), f3.get(at).i32(4).op((106)).set(t), f3.get(res).get(m).i64Table(t, PIO4).op((126)).op((124)).set(res), f3.get(res).i64(1n << 61n).op((124)).i64(62n).op((136)).set(n64), f3.get(res).get(n64).i64(62n).op((134)).op((125)).set(res), f3.get(res).op((185)).f64(FMATH_CONSTANTS.PI63).op((162)).set(x), f3.get(n64).op((167)).tee(n).get(bits).i32(31).op((118)).op((106)).set(q);
301
+ }
302
+ ), signFlip(f3, q, 2), f3.set(flip), signFlip(f3, q, 1), f3.set(s);
303
+ let xs = f3.local((124)), x2 = f3.local((124)), x3 = f3.local((124)), x4 = f3.local((124));
304
+ f3.get(x).get(s).op((162)).set(xs), f3.get(x).get(x).op((162)).set(x2), f3.get(x2).get(xs).op((162)).set(x3), f3.get(x2).get(x2).op((162)).set(x4);
305
+ let sinePoly = () => {
306
+ f3.get(xs).get(x3).f64(FMATH_CONSTANTS.SIN_S1).op((162)).op((160)), f3.get(x3).get(x2).op((162)), f3.f64(FMATH_CONSTANTS.SIN_S2).get(x2).f64(FMATH_CONSTANTS.SIN_S3).op((162)).op((160)), f3.op((162)).op((160));
307
+ }, cosinePoly = () => {
308
+ f3.get(flip).get(x2).f64(FMATH_CONSTANTS.COS_C1).get(flip).op((162)).op((162)).op((160)), f3.get(x4).f64(FMATH_CONSTANTS.COS_C2).get(flip).op((162)).op((162)).op((160)), f3.get(x4).get(x2).op((162)), f3.f64(FMATH_CONSTANTS.COS_C3).get(flip).op((162)).get(x2).f64(FMATH_CONSTANTS.COS_C4).get(flip).op((162)).op((162)).op((160)), f3.op((162)).op((160));
309
+ }, odd = () => f3.get(n).i32(1).op((113));
310
+ which !== "cos" && (odd().when((124), cosinePoly, sinePoly), f3.set(first)), which !== "sin" && (odd().when((124), sinePoly, cosinePoly), f3.set(second));
311
+ }
312
+ function trigFn(which) {
313
+ let f3 = new Fn(1), first = f3.local((124)), second = f3.local((124)), out = f3.local((125));
314
+ return sincos(f3, first, second, which), which === "sin" ? f3.get(first) : which === "cos" ? f3.get(second) : f3.get(first).get(second).op((163)), f3.op((182)).set(out), canonicalReturn(f3, out), f3.finish();
315
+ }
316
+ function signBit(f3, value) {
317
+ f3.get(value).op((189)).i64(0n).op((83));
318
+ }
319
+ function atan2Wide(f3, y, x, v) {
320
+ f3.get(x).get(x).op((98)).get(y).get(y).op((98)).op((114)).when((64), () => f3.returnNan());
321
+ let ax = f3.local((124)), ay = f3.local((124)), high = f3.local((124)), low = f3.local((124)), t = f3.local((124)), u = f3.local((124)), u2 = f3.local((124)), p = f3.local((124)), big = f3.local((127));
322
+ f3.get(x).op((153)).set(ax), f3.get(y).op((153)).set(ay), f3.get(ax).get(ay).op((165)).set(high), f3.get(ax).get(ay).op((164)).set(low), f3.get(high).f64(0).op((97)), f3.when(
323
+ (124),
324
+ () => f3.f64(0),
325
+ () => {
326
+ f3.get(low).f64(Number.POSITIVE_INFINITY).op((97)), f3.when((124), () => f3.f64(1), () => f3.get(low).get(high).op((163)));
327
+ }
328
+ ), f3.set(t), f3.get(t).f64(FMATH_CONSTANTS.TAN_PI_8).op((100)).set(big), f3.get(big), f3.when((124), () => f3.get(t).f64(1).op((161)).get(t).f64(1).op((160)).op((163)), () => f3.get(t)), f3.set(u), f3.get(u).get(u).op((162)).set(u2), f3.f64(0).set(p);
329
+ for (let k = ATAN_TERMS - 1; k >= 0; k--) f3.f64(FMATH_CONSTANTS.ATAN_COEFFS[k]).get(u2).get(p).op((162)).op((160)).set(p);
330
+ f3.f64(FMATH_CONSTANTS.QUARTER_PI).f64(0).get(big).op((27)).get(u).get(p).op((162)).op((160)).set(v), f3.get(ay).get(ax).op((100)).when((64), () => f3.f64(FMATH_CONSTANTS.HALF_PI).get(v).op((161)).set(v)), signBit(f3, x), f3.when((64), () => f3.f64(Math.PI).get(v).op((161)).set(v)), signBit(f3, y), f3.when((64), () => f3.get(v).op((154)).set(v));
331
+ }
332
+ function atanFamily(which) {
333
+ let f3 = new Fn(which === "atan2" ? 2 : 1), y = f3.local((124)), x = f3.local((124)), v = f3.local((124)), out = f3.local((125));
334
+ if (which === "atan2")
335
+ f3.get(0).op((187)).set(y), f3.get(1).op((187)).set(x);
336
+ else if (which === "atan")
337
+ f3.get(0).op((187)).set(y), f3.f64(1).set(x);
338
+ else {
339
+ let a = f3.local((124));
340
+ f3.get(0).op((187)).set(a), f3.get(a).op((153)).f64(1).op((100)).when((64), () => f3.returnNan()), f3.f64(1).get(a).op((161)).f64(1).get(a).op((160)).op((162)).op((159)), which === "asin" ? f3.set(x).get(a).set(y) : f3.set(y).get(a).set(x);
341
+ }
342
+ return atan2Wide(f3, y, x, v), f3.get(v).op((182)).set(out), canonicalReturn(f3, out), f3.finish();
343
+ }
344
+ function build(name2) {
345
+ switch (name2) {
346
+ case "sin":
347
+ case "cos":
348
+ case "tan":
349
+ return trigFn(name2);
350
+ case "exp":
351
+ return expFn();
352
+ case "log":
353
+ return logFn(false);
354
+ case "log2":
355
+ return logFn(true);
356
+ case "pow":
357
+ return powFn();
358
+ default:
359
+ return atanFamily(name2);
360
+ }
361
+ }
362
+ var V128 = 123, SIMD = 253, CALL = 16, LANES = 4, V = {
363
+ shuffle: 13,
364
+ i32splat: 17,
365
+ f64splat: 20,
366
+ f32extract: 31,
367
+ f32replace: 32,
368
+ i32ne: 56,
369
+ i32ltU: 58,
370
+ and: 78,
371
+ bitselect: 82,
372
+ demoteZero: 94,
373
+ promoteLow: 95,
374
+ i32allTrue: 163,
375
+ i32shrS: 172,
376
+ i32shrU: 173,
377
+ i32add: 174,
378
+ i64extendLowS: 199,
379
+ f64add: 240,
380
+ f64sub: 241,
381
+ f64mul: 242,
382
+ truncSatZero: 252,
383
+ convertLow: 254
384
+ }, HIGH_HALF = [8, 9, 10, 11, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 15], JOIN_HALVES = [0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23];
385
+ function simd(f3, op) {
386
+ return f3.code.push((253)), uleb(f3.code, op), f3;
387
+ }
388
+ function splatF64(f3, value) {
389
+ return simd(f3.f64(value), V.f64splat);
390
+ }
391
+ function splatI32(f3, value) {
392
+ return simd(f3.i32(value), V.i32splat);
393
+ }
394
+ function laneMask(f3, n, add, bit) {
395
+ f3.get(n), add !== 0 && simd(splatI32(f3, add), V.i32add), simd(splatI32(f3, bit), V.and), simd(splatI32(f3, 0), V.i32ne), simd(f3, V.i64extendLowS);
396
+ }
397
+ function sincosHalf(f3, half, which, out) {
398
+ let n = f3.local((123)), x = f3.local((123)), flip = f3.local((123)), s = f3.local((123)), xs = f3.local((123)), x2 = f3.local((123)), x3 = f3.local((123)), x4 = f3.local((123)), mul = () => simd(f3, V.f64mul), add = () => simd(f3, V.f64add);
399
+ f3.get(half), simd(splatF64(f3, FMATH_CONSTANTS.HPI_INV), V.f64mul), simd(f3, V.truncSatZero), simd(splatI32(f3, FMATH_CONSTANTS.QUADRANT_ROUND), V.i32add), f3.i32(24), simd(f3, V.i32shrS).set(n), f3.get(half).get(n), simd(f3, V.convertLow), splatF64(f3, FMATH_CONSTANTS.HPI), mul(), simd(f3, V.f64sub).set(x), splatF64(f3, -1), splatF64(f3, 1), laneMask(f3, n, 0, 2), simd(f3, V.bitselect).set(flip), splatF64(f3, -1), splatF64(f3, 1), laneMask(f3, n, 1, 2), simd(f3, V.bitselect).set(s), f3.get(x).get(s), mul().set(xs), f3.get(x).get(x), mul().set(x2), f3.get(x2).get(xs), mul().set(x3), f3.get(x2).get(x2), mul().set(x4);
400
+ let sine = () => {
401
+ f3.get(xs).get(x3), splatF64(f3, FMATH_CONSTANTS.SIN_S1), mul(), add(), f3.get(x3).get(x2), mul(), splatF64(f3, FMATH_CONSTANTS.SIN_S2).get(x2), splatF64(f3, FMATH_CONSTANTS.SIN_S3), mul(), add(), mul(), add();
402
+ }, cosine = () => {
403
+ f3.get(flip).get(x2), splatF64(f3, FMATH_CONSTANTS.COS_C1).get(flip), mul(), mul(), add(), f3.get(x4), splatF64(f3, FMATH_CONSTANTS.COS_C2).get(flip), mul(), mul(), add(), f3.get(x4).get(x2), mul(), splatF64(f3, FMATH_CONSTANTS.COS_C3).get(flip), mul(), f3.get(x2), splatF64(f3, FMATH_CONSTANTS.COS_C4).get(flip), mul(), mul(), add(), mul(), add();
404
+ };
405
+ which === "sin" ? (cosine(), sine()) : (sine(), cosine()), laneMask(f3, n, 0, 1), simd(f3, V.bitselect), simd(f3, V.demoteZero).set(out);
406
+ }
407
+ function sincos4(which, scalar) {
408
+ let f3 = new Fn(1), lo = f3.local((123)), hi = f3.local((123)), rl = f3.local((123)), rh = f3.local((123)), fallback = f3.local((123));
409
+ f3.get(0).i32(20), simd(f3, V.i32shrU), simd(splatI32(f3, 2047), V.and), simd(splatI32(f3, FMATH_CONSTANTS.LARGE_TOP), V.i32ltU), simd(f3, V.i32allTrue).op((69)), f3.when((64), () => {
410
+ f3.get(0).set(fallback);
411
+ for (let lane = 0; lane < (4); lane++)
412
+ f3.get(fallback).get(0), simd(f3, V.f32extract).op(lane), f3.op((16)), uleb(f3.code, scalar), simd(f3, V.f32replace).op(lane).set(fallback);
413
+ f3.get(fallback).op((15));
414
+ }), f3.get(0), simd(f3, V.promoteLow).set(lo), f3.get(0).get(0), simd(f3, V.shuffle);
415
+ for (let b of HIGH_HALF) f3.code.push(b);
416
+ simd(f3, V.promoteLow).set(hi), sincosHalf(f3, lo, which, rl), sincosHalf(f3, hi, which, rh), f3.get(rl).get(rh), simd(f3, V.shuffle);
417
+ for (let b of JOIN_HALVES) f3.code.push(b);
418
+ return f3.finish();
419
+ }
420
+ var WASM_FMATH_SIMD = ["sin", "cos"];
421
+ function wasmFmathSimdBodies(scalarBase) {
422
+ return WASM_FMATH_SIMD.map((name2) => sincos4(name2, scalarBase + WASM_FMATH.indexOf(name2)));
423
+ }
424
+ var cached = null;
425
+ function wasmFmathBodies() {
426
+ return cached === null && (cached = WASM_FMATH.map(build)), cached;
427
+ }
428
+
429
+ // src/game/kernel/wasm-noise.ts
430
+ var WASM_NOISE = ["fmod", "noise2", "noise3"], I322 = 127, F322 = 125, F642 = 124, VOID2 = 64, LOOP = 3, IF2 = 4, ELSE2 = 5, END2 = 11, BR2 = 12, RETURN2 = 15, I32_EQZ2 = 69, I32_XOR = 115, I32_OR2 = 114, I32_AND2 = 113, I32_ADD2 = 106, I32_MUL = 108, I32_SHR_U2 = 118, F32_EQ = 91, F32_NE2 = 92, F32_LT = 93, F32_GE = 96, F64_LT = 99, F64_LE2 = 101, F64_GE = 102, F32_ABS = 139, F32_FLOOR = 142, F32_ADD = 146, F32_SUB = 147, F32_MUL = 148, F64_SUB2 = 161, F64_MUL2 = 162, F64_COPYSIGN = 166, I32_WRAP_I642 = 167, F32_CONVERT_I32_U = 179, F32_DEMOTE_F642 = 182, F64_PROMOTE_F322 = 187, MISC = 252, I64_TRUNC_SAT_F32_S = 4, CANONICAL_NAN2 = 2143289344, INFINITY_BITS = 2139095040, ZERO_BITS = 0, ONE_BITS = 1065353216, TWO_BITS = 1073741824, THREE_BITS = 1077936128, TWO_POW_63_BITS = 1593835520, TWO_POW_MINUS_24_BITS = 864026624, DOUBLE = 2, HALF = 0.5, LATTICE_X = 2376512323, LATTICE_Y = 3625334849, LATTICE_Z = 3407524639, MIX_A = 2146121005, MIX_B = 2221713035, SHIFT_16 = 16, SHIFT_15 = 15, SHIFT_8 = 8;
431
+ function fmodFn() {
432
+ let f3 = new Fn(2), x = 0, y = 1, ax = f3.local((124)), ay = f3.local((124)), r = f3.local((124)), t = f3.local((124));
433
+ return f3.get(x).get(x).op((92)), f3.get(y).get(y).op((92)).op((114)), f3.get(x).op((139)).f32bits((2139095040)).op((91)).op((114)), f3.get(y).f32bits((0)).op((91)).op((114)), f3.when((64), () => f3.f32bits((2143289344)).op((15))), f3.get(y).op((139)).f32bits((2139095040)).op((91)), f3.when((64), () => f3.get(x).op((15))), f3.get(x).op((139), (187)).set(ax), f3.get(y).op((139), (187)).set(ay), f3.get(ax).get(ay).op((99)), f3.when((64), () => f3.get(x).op((15))), f3.get(ay).set(t), f3.op((3), (64)), f3.get(t).f64((2)).op((162)).get(ax).op((101)), f3.when((64), () => {
434
+ f3.get(t).f64((2)).op((162)).set(t), f3.op((12), 1);
435
+ }), f3.op((11)), f3.get(ax).set(r), f3.op((3), (64)), f3.get(t).get(ay).op((102)), f3.when((64), () => {
436
+ f3.get(r).get(t).op((102)), f3.when((64), () => f3.get(r).get(t).op((161)).set(r)), f3.get(t).f64((0.5)).op((162)).set(t), f3.op((12), 1);
437
+ }), f3.op((11)), f3.get(r).get(x).op((187), (166), (182)), f3.finish();
438
+ }
439
+ function toInt32(f3, floor, out) {
440
+ f3.get(floor).op((139)).f32bits((1593835520)).op((96)), f3.op((4), (127)), f3.i32(0), f3.op((5)), f3.get(floor).op((252), (4), (167)), f3.op((11)), f3.set(out);
441
+ }
442
+ function cell(f3, value, index, fraction, floor) {
443
+ f3.get(value).op((142)).set(floor), f3.get(value).get(floor).op((147)).set(fraction), toInt32(f3, floor, index);
444
+ }
445
+ function smooth(f3, t, out) {
446
+ f3.get(t).get(t).op((148)), f3.f32bits((1077936128)).f32bits((1073741824)).get(t).op((148)).op((147)), f3.op((148)).set(out);
447
+ }
448
+ function lattice(f3, h, x, y, z) {
449
+ x(), f3.i32((2376512323)).op((108)), y(), f3.i32((3625334849)).op((108)).op((115)), z(), f3.i32((3407524639)).op((108)).op((115)).set(h), f3.get(h).get(h).i32((16)).op((118)).op((115)).set(h), f3.get(h).i32((2146121005)).op((108)).set(h), f3.get(h).get(h).i32((15)).op((118)).op((115)).set(h), f3.get(h).i32((2221713035)).op((108)).set(h), f3.get(h).get(h).i32((16)).op((118)).op((115)).set(h), f3.get(h).i32((8)).op((118)).op((179)).f32bits((864026624)).op((148));
450
+ }
451
+ function mixf(f3, a, b, t, out) {
452
+ f3.get(a).get(b).get(a).op((147)).get(t).op((148)).op((146)).set(out);
453
+ }
454
+ function noiseFn(dims) {
455
+ let f3 = new Fn(dims), finite = (p) => {
456
+ f3.get(p).op((139)).f32bits((2139095040)).op((93));
457
+ };
458
+ finite(0), finite(1), f3.op((113)), dims === 3 && (finite(2), f3.op((113))), f3.op((69)), f3.when((64), () => f3.f32bits((0)).op((15)));
459
+ let floor = f3.local((125)), ix = f3.local((127)), iy = f3.local((127)), iz = f3.local((127)), h = f3.local((127)), fx = f3.local((125)), fy = f3.local((125)), fz = f3.local((125)), u = f3.local((125)), v = f3.local((125)), w = f3.local((125)), la = f3.local((125)), lb = f3.local((125)), a = f3.local((125)), b = f3.local((125)), c = f3.local((125)), d = f3.local((125));
460
+ cell(f3, 0, ix, fx, floor), cell(f3, 1, iy, fy, floor), dims === 3 ? cell(f3, 2, iz, fz, floor) : f3.i32(0).set(iz), smooth(f3, fx, u), smooth(f3, fy, v), dims === 3 && smooth(f3, fz, w);
461
+ let at = (base, plus) => () => {
462
+ f3.get(base), plus !== 0 && f3.i32(plus).op((106));
463
+ }, pair = (dy, dz, out) => {
464
+ lattice(f3, h, at(ix, 0), at(iy, dy), at(iz, dz)), f3.set(la), lattice(f3, h, at(ix, 1), at(iy, dy), at(iz, dz)), f3.set(lb), mixf(f3, la, lb, u, out);
465
+ };
466
+ return pair(0, 0, a), pair(1, 0, b), dims === 2 ? mixf(f3, a, b, v, a) : (pair(0, 1, c), pair(1, 1, d), mixf(f3, a, b, v, a), mixf(f3, c, d, v, c), mixf(f3, a, c, w, a)), f3.get(a).f32bits((1073741824)).op((148)).f32bits((1065353216)).op((147)), f3.finish();
467
+ }
468
+ var cached2 = null;
469
+ function wasmNoiseBodies() {
470
+ return cached2 === null && (cached2 = [fmodFn(), noiseFn(2), noiseFn(3)]), cached2;
471
+ }
472
+
473
+ // src/game/kernel/wasm.ts
474
+ var Op2 = Op, I323 = 127, F323 = 125, V1282 = 123, VOID_BLOCK = 64, BLOCK2 = 2, LOOP2 = 3, IF3 = 4, ELSE3 = 5, END3 = 11, BR3 = 12, BR_IF = 13, CALL2 = 16, SELECT2 = 27, LOCAL_GET2 = 32, LOCAL_SET2 = 33, LOCAL_TEE2 = 34, I32_LOAD = 40, F32_LOAD = 42, I32_LOAD8_U = 45, I32_STORE = 54, I32_STORE8 = 58, F32_REINTERPRET = 190, I32_CONST2 = 65, F32_CONST2 = 67, I32_EQZ3 = 69, I32_EQ2 = 70, I32_NE2 = 71, I32_LT_S = 72, I32_LT_U2 = 73, I32_GT_U2 = 75, I32_GE_U2 = 79, F32_NE3 = 92, F32_LT2 = 93, F32_GT = 94, F32_LE = 95, I32_ADD3 = 106, I32_SUB2 = 107, I32_MUL2 = 108, I32_REM_S = 111, I32_REM_U = 112, I32_AND3 = 113, I32_OR3 = 114, I32_SHL2 = 116, I32_SHR_S2 = 117, I32_SHR_U3 = 118, I64_CONST2 = 66, I64_LT_U = 84, I64_ADD2 = 124, I64_MUL2 = 126, I64_SHR_U2 = 136, I32_WRAP_I643 = 167, I64_EXTEND_I32_U2 = 173, HALF_BITS = 32, F32_CEIL = 141, F32_FLOOR2 = 142, F32_ADD2 = 146, F32_SUB2 = 147, F32_MUL2 = 148, PREFIX_FC = 252, TRUNC_SAT_F32_S = 0, TRUNC_SAT_F32_U = 1, SIMD2 = 253, S = {
475
+ load: 0,
476
+ store: 11,
477
+ const: 12,
478
+ i32splat: 17,
479
+ i32extract: 27,
480
+ i32replace: 28,
481
+ f32extract: 31,
482
+ f32replace: 32,
483
+ i32eq: 55,
484
+ i32ne: 56,
485
+ i32lt_s: 57,
486
+ i32lt_u: 58,
487
+ i32le_s: 61,
488
+ i32le_u: 62,
489
+ f32eq: 65,
490
+ f32ne: 66,
491
+ f32lt: 67,
492
+ f32le: 69,
493
+ f32ge: 70,
494
+ not: 77,
495
+ and: 78,
496
+ andnot: 79,
497
+ or: 80,
498
+ xor: 81,
499
+ bitselect: 82,
500
+ anyTrue: 83,
501
+ load32lane: 86,
502
+ store32lane: 90,
503
+ f32ceil: 103,
504
+ f32floor: 104,
505
+ f32trunc: 105,
506
+ i32abs: 160,
507
+ i32neg: 161,
508
+ i32shl: 171,
509
+ i32shr_s: 172,
510
+ i32shr_u: 173,
511
+ i32add: 174,
512
+ i32sub: 177,
513
+ i32mul: 181,
514
+ i32min_s: 182,
515
+ i32min_u: 183,
516
+ i32max_s: 184,
517
+ i32max_u: 185,
518
+ f32abs: 224,
519
+ f32neg: 225,
520
+ f32sqrt: 227,
521
+ f32add: 228,
522
+ f32sub: 229,
523
+ f32mul: 230,
524
+ f32div: 231,
525
+ truncSatS: 248,
526
+ convertS: 250,
527
+ convertU: 251
528
+ }, TWO_POW_31 = 2147483648, MIX_A2 = 2146121005, MIX_B2 = 2221713035, GOLDEN = 2654435769, UNIT_SCALE = 1 / 16777216, LANES2 = 4, STRIDE_X = 1021, STRIDE_Z = 65539, MIN_TABLE = 1024, TABLE_LOAD = 2, KEY_WORDS = 8, KEY_LOOPS = 3, STAGE_WORDS = 2 + (8) + 10, STAGE_HEADROOM = 2, WORD = 4, BYTE_MASK = 255, SHIFT_MASK = 31, INT_MIN = -2147483648, CTX_SNAPSHOT = 0, CTX_CAPACITY = 4, CTX_STARTS = 8, CTX_CELLS = 12, CTX_XS = 16, CTX_YS = 20, CTX_ZS = 24, CTX_ROWS = 28, CTX_MASK = 32, CTX_INVERSE = 36, CTX_RADIUS = 40, CTX_R2 = 44, CTX_LEN = 48, CTX_FLAT = 52, CTX_QUERY_LANES = 56, CTX_QUERY_ROWS = 60, CTX_STAGE = 64, CTX_STAGE_CAPACITY = 68, CTX_STAGED = 72, CTX_QUERY_PARAMS = 76, CTX_ENTITY_ROWS = 80, CTX_ENTITY_MASK = 96, CTX_OUTER = 112, CTX_PAIR_LANE = 128, CTX_PAIR_ROW = 144, CTX_ACC = 160, CTX_LANES = 192, CTX_BYTES = 208;
529
+ var IMPORTS = ["toInt32", "fmod", "noise2", "noise3", "lanes", "data", "query", "queryKeep"], FN = Object.fromEntries(IMPORTS.map((n, k) => [n, k])), UNARY_TYPE = 2, BINARY_TYPE = 3, TERNARY_TYPE = 4, VECTOR_TYPE = 8, UNARY_FMATH = {
530
+ [Op2.FLOG2]: "log2",
531
+ [Op2.FSIN]: "sin",
532
+ [Op2.FCOS]: "cos",
533
+ [Op2.FTAN]: "tan",
534
+ [Op2.FASIN]: "asin",
535
+ [Op2.FACOS]: "acos",
536
+ [Op2.FATAN]: "atan",
537
+ [Op2.FEXP]: "exp",
538
+ [Op2.FLOG]: "log"
539
+ }, FMATH_OPS = /* @__PURE__ */ new Set([...Object.keys(UNARY_FMATH).map(Number), Op2.FPOW, Op2.FATAN2]), NOISE_OPS = /* @__PURE__ */ new Set([Op2.FMOD, Op2.NOISE2, Op2.NOISE3]), IMPORT_TYPE = {
540
+ toInt32: 0,
541
+ fmod: 3,
542
+ noise2: 3,
543
+ noise3: 4,
544
+ lanes: 5,
545
+ data: 5,
546
+ query: 6,
547
+ queryKeep: 7
548
+ }, DATA_HOOKS = /* @__PURE__ */ new Map(), QUERY_HOSTS = /* @__PURE__ */ new Map();
549
+ function setWasmDataHook(ctx, hook) {
550
+ hook === null ? DATA_HOOKS.delete(ctx) : DATA_HOOKS.set(ctx, hook);
551
+ }
552
+ function wasmKernelImports(memory) {
553
+ let v = new Uint32Array((5)), r = new Uint32Array((3)), words = new Uint32Array(memory.buffer);
554
+ return {
555
+ env: {
556
+ memory,
557
+ toInt32: (x) => x | 0,
558
+ fmod: (x, y) => x % y,
559
+ noise2,
560
+ noise3,
561
+ lanes: (sub, input, output) => {
562
+ words.buffer !== memory.buffer && (words = new Uint32Array(memory.buffer));
563
+ for (let lane = 0; lane < (4); lane++) {
564
+ for (let k = 0; k < (5); k++) v[k] = words[(input >>> 2) + k * (4) + lane];
565
+ evalLane(sub, v, r);
566
+ for (let k = 0; k < (3); k++) words[(output >>> 2) + k * (4) + lane] = r[k];
567
+ }
568
+ },
569
+ data: (ctx, pc, chunk) => {
570
+ let hook = DATA_HOOKS.get(ctx >>> 0);
571
+ if (hook === void 0) throw new Error("a compiled kernel ran a data op without an engine data binding");
572
+ hook(pc, chunk);
573
+ },
574
+ query: (ctx, params, rows, kind, filter, mode) => QUERY_HOSTS.get(ctx >>> 0).query(params, rows, kind, filter | 0, mode),
575
+ queryKeep: (ctx, stops, p, out) => QUERY_HOSTS.get(ctx >>> 0).keep(stops, p, out)
576
+ }
577
+ };
578
+ }
579
+ var QUERY_PARAMS = 11, QUERY_SCRATCH_BYTES = ((11) + 3) * 16, LANE_INPUTS = 5, LANE_OUTPUTS = 3;
580
+ function laneScratchOffset(program) {
581
+ return Math.ceil(Math.max(program.cross.length, 1) * (4) / (16)) * (16);
582
+ }
583
+ var LANE_SCRATCH_BYTES = ((5) + (3)) * 16, VECTOR_BYTES = 16;
584
+ function uleb2(out, value) {
585
+ let v = value >>> 0;
586
+ do {
587
+ let byte = v & 127;
588
+ v >>>= 7, v !== 0 && (byte |= 128), out.push(byte);
589
+ } while (v !== 0);
590
+ }
591
+ function sleb(out, value) {
592
+ let v = value | 0;
593
+ for (; ; ) {
594
+ let byte = v & 127;
595
+ if (v >>= 7, v === 0 && (byte & 64) === 0 || v === -1 && (byte & 64) !== 0) {
596
+ out.push(byte);
597
+ return;
598
+ }
599
+ out.push(byte | 128);
600
+ }
601
+ }
602
+ function section(out, id, body) {
603
+ out.push(id), uleb2(out, body.length);
604
+ for (let b of body) out.push(b);
605
+ }
606
+ function name(out, text) {
607
+ uleb2(out, text.length);
608
+ for (let k = 0; k < text.length; k++) out.push(text.charCodeAt(k));
609
+ }
610
+ var KNOWN = new Set(Object.values(Op2)), UNROLL = 2, RECORD_SHIFT = 4;
611
+ function known(op) {
612
+ return KNOWN.has(op) && op !== Op2.CALL;
613
+ }
614
+ function wasmStageName(stage) {
615
+ return `stage${stage}`;
616
+ }
617
+ function exactStorage(kind, storage) {
618
+ return kind === 0 ? storage === 0 : (kind === 1 || kind === 2) && (storage === 1 || storage === 2);
619
+ }
620
+ function narrowXop(op, sub) {
621
+ return op === XOP && xopRange(sub) === XOP_RANGE.NARROW && laneSignature(sub) !== null;
622
+ }
623
+ var DATA_SUBS = /* @__PURE__ */ new Set([DATA_LIST, DATA_KEYOF, DATA_ROWOF, DATA_FLOAD, DATA_ROWS, DATA_PGET, DATA_PSET, DATA_TALLY, DATA_SEND, DATA_PICK]);
624
+ function dataXop(op, sub) {
625
+ return op === XOP && DATA_SUBS.has(sub);
626
+ }
627
+ function gatherXop(op, sub) {
628
+ return op === XOP && (sub === XOP_GATHER || sub === XOP_FIELD);
629
+ }
630
+ function queryXop(program, op, sub) {
631
+ return op === XOP && program.position !== null && (sub === XOP_QUERY || sub === XOP_QSHAPE || sub === XOP_QFILTER || sub === XOP_QSTOP);
632
+ }
633
+ function laneOps(program) {
634
+ return program.code.some((i) => narrowXop(i.op, i.dst) || dataXop(i.op, i.dst));
635
+ }
636
+ function hostState(program) {
637
+ return program.position !== null || program.channels.length > 0 || program.state >= 0;
638
+ }
639
+ function staged(program) {
640
+ return program.calls.length > 0 || program.cross.length > 0 || laneOps(program) && !hostState(program);
641
+ }
642
+ function wasmStaged(program) {
643
+ return staged(program);
644
+ }
645
+ function wasmNeedsHost(program) {
646
+ return program.position !== null || program.channels.length > 0 || !staged(program) && laneOps(program);
647
+ }
648
+ function wasmDataOps(program) {
649
+ return program.code.some((i) => dataXop(i.op, i.dst));
650
+ }
651
+ function wasmQueries(program) {
652
+ return program.code.some((i) => i.op === XOP && i.dst === XOP_QUERY);
653
+ }
654
+ function wasmStages(program) {
655
+ let out = [], width = (pc) => program.code[pc].op === CROSS_OP.SCATTER || program.code[pc].op === XOP ? 2 : 1, start = 0, nextCall = 0, nextCross = 0;
656
+ for (; nextCall < program.calls.length || nextCross < program.cross.length; ) {
657
+ let callPc = nextCall < program.calls.length ? program.calls[nextCall] : 1 / 0, crossPc = nextCross < program.cross.length ? program.cross[nextCross] : 1 / 0;
658
+ if (crossPc < callPc) {
659
+ let pcs = [], end = crossPc;
660
+ for (; nextCross < program.cross.length && program.cross[nextCross] === end; )
661
+ pcs.push(end), end += width(end), nextCross++;
662
+ out.push({ start, end, stage: { barrier: "cross", pcs } }), start = end;
663
+ } else
664
+ out.push({ start, end: callPc, stage: { barrier: "call", pcs: [callPc] } }), start = callPc + 1, nextCall++;
665
+ }
666
+ return out.push({ start, end: program.code.length, stage: { barrier: "end", pcs: [] } }), out;
667
+ }
668
+ function wasmSupports(program, storages) {
669
+ if (!(!staged(program) || program.position === null && program.channels.length === 0 && program.state < 0) || !staged(program) && program.slots.some((s) => s.scratch) || storages.length !== program.slots.length || storages.some((s) => s > 3)) return false;
670
+ if (program.state >= 0) {
671
+ let slot = program.slots[program.state];
672
+ if (slot === void 0 || !exactStorage(slot.kind, storages[program.state])) return false;
673
+ }
674
+ return program.code.every((i, pc) => known(i.op) || isSimd(i) || crossRow(i.op) || stageEndingOp(i.op, i.dst) || narrowXop(i.op, i.dst) || dataXop(i.op, i.dst) || gatherXop(i.op, i.dst) || !staged(program) && queryXop(program, i.op, i.dst) || i.op === Op2.CALL && program.calls.includes(pc));
675
+ }
676
+ var Body = class {
677
+ constructor() {
678
+ this.code = [];
679
+ this.mapper = (word) => word;
680
+ }
681
+ reg(word) {
682
+ return this.get(this.mapper(word));
683
+ }
684
+ op(...bytes) {
685
+ for (let b of bytes) this.code.push(b);
686
+ return this;
687
+ }
688
+ simd(opcode) {
689
+ return this.code.push((253)), uleb2(this.code, opcode), this;
690
+ }
691
+ get(local) {
692
+ return this.code.push((32)), uleb2(this.code, local), this;
693
+ }
694
+ set(local) {
695
+ return this.code.push((33)), uleb2(this.code, local), this;
696
+ }
697
+ tee(local) {
698
+ return this.code.push((34)), uleb2(this.code, local), this;
699
+ }
700
+ i32(value) {
701
+ return this.code.push((65)), sleb(this.code, value), this;
702
+ }
703
+ f32(value) {
704
+ this.code.push((67));
705
+ let bytes = new Uint8Array(new Float32Array([value]).buffer);
706
+ for (let b of bytes) this.code.push(b);
707
+ return this;
708
+ }
709
+ v128i(lanes) {
710
+ this.simd(S.const);
711
+ let bytes = new Uint8Array(new Uint32Array(lanes.map((x) => x >>> 0)).buffer);
712
+ for (let b of bytes) this.code.push(b);
713
+ return this;
714
+ }
715
+ v128f(value) {
716
+ this.simd(S.const);
717
+ let bytes = new Uint8Array(new Float32Array([value, value, value, value]).buffer);
718
+ for (let b of bytes) this.code.push(b);
719
+ return this;
720
+ }
721
+ mem(align, offset) {
722
+ return uleb2(this.code, align), uleb2(this.code, offset), this;
723
+ }
724
+ call(fn) {
725
+ return this.code.push((16)), uleb2(this.code, fn), this;
726
+ }
727
+ load(ctx, offset) {
728
+ return this.get(ctx).op((40)).mem(2, offset);
729
+ }
730
+ };
731
+ function functionBody(program, storages, start, end, fmathBase, noiseBase) {
732
+ let noise = (fn) => noiseBase + WASM_NOISE.indexOf(fn), fmath = (fn) => fmathBase + WASM_FMATH.indexOf(fn), fmathSimd = (fn) => fmathBase + WASM_FMATH.length + WASM_FMATH_SIMD.indexOf(fn), slotCount = program.slots.length, uniforms = program.uniforms.length, args = program.args, loopBase = program.uniforms.length - program.loops, P_COLS = 0, P_N = 1, P_ROWS = 2, P_ARGS = 3, P_CTX = 4, next = 5, L_I = next++, L_TMP = next++, L_COUNTERS = next;
733
+ next += uniforms;
734
+ let L_USCALAR = next;
735
+ next += uniforms;
736
+ let L_SLOT = next;
737
+ next += slotCount;
738
+ let L_LANE = next++, L_ROW = next++, L_GX = next++, L_GY = next++, L_GZ = next++, L_LY = next++, L_LZ = next++, L_HX = next++, L_HY = next++, L_HZ = next++, L_SLOT_AT = next++, L_END = next++, L_PCOUNT = next++, L_PN = next++, L_NROW = next++, L_IDX = next++, L_BASE = next++, L_A = next++, L_B = next++, L_QP = next++, L_QN = next++, HOISTED = [(0), (4), (8), (12), (16), (20), (24), (28), (32), (36), (40), (44)], L_FIELD = next;
739
+ next += HOISTED.length;
740
+ let i32Locals = next - 5, F_CX = next++, F_CY = next++, F_CZ = next++, F_DX = next++, F_DY = next++, F_DZ = next++, F_A = next++, F_B = next++, f32Locals = next - F_CX, V_REG = next, simdTemp = Math.max(program.registers, 1);
741
+ next += simdTemp + (program.code.some(isSimd) ? SIMD_TEMPS : 0);
742
+ let V_UNIFORM = next;
743
+ next += uniforms;
744
+ let V_TEMP = next;
745
+ next += 8;
746
+ let V_ROW = next++, V_VALID = next++, V_PLANE = next++, V_PROW = next++, V_STOP = next++, V_KEEP = next++, v128Locals = next - V_REG, snapshotIndex = [], snapshots = 0;
747
+ for (let slot of program.slots) snapshotIndex.push(slot.neighbour ? snapshots++ : -1);
748
+ let b = new Body();
749
+ for (let s = 0; s < slotCount; s++) b.get(P_COLS).op((40)).mem(2, s * 4).set(L_SLOT + s);
750
+ for (let u = 0; u < uniforms; u++)
751
+ u < args || u >= loopBase ? b.get(P_ARGS).op((40)).mem(2, u * 4) : b.i32(program.uniforms[u] | 0), b.tee(L_USCALAR + u).simd(S.i32splat).set(V_UNIFORM + u);
752
+ program.position !== null && HOISTED.forEach((offset, k) => b.load(P_CTX, offset).set(L_FIELD + k));
753
+ let field = (offset) => b.get(L_FIELD + HOISTED.indexOf(offset)), reg = (word) => (word & 2147483648) !== 0 ? V_UNIFORM + (word & 2147483647) : V_REG + word;
754
+ b.mapper = reg;
755
+ let get = (word) => b.reg(word), temp = (k) => V_TEMP + k, mode = "list", chunkRows = (next2) => {
756
+ if (mode = next2, b.get(L_I).simd(S.i32splat).v128i([0, 1, 2, 3]).simd(S.i32add).set(V_ROW), next2 === "full" ? b.v128i([-1, -1, -1, -1]).set(V_VALID) : b.get(V_ROW).get(P_N).simd(S.i32splat).simd(S.i32lt_u).set(V_VALID), next2 === "list")
757
+ for (let lane = 0; lane < (4); lane++)
758
+ b.get(V_ROW), b.get(L_I).i32(lane).op((106)).get(P_N).op((73)).op((4), (127)), b.get(P_ROWS).get(L_I).i32(lane).op((106)).i32(2).op((116)).op((106)).op((40)).mem(2, 0), b.op((5)).get(P_ROWS).get(L_I).i32(2).op((116)).op((106)).op((40)).mem(2, 0).op((11)), b.simd(S.i32replace).op(lane).set(V_ROW);
759
+ }, advance = () => {
760
+ b.get(L_I).i32((4)).op((106)).set(L_I);
761
+ }, laneInside = (lane) => {
762
+ b.get(L_I).i32(lane).op((106)).get(P_N).op((73));
763
+ }, byteSlot = (slot) => storages[slot] === 3, loadRaw = (slot) => {
764
+ if (byteSlot(slot)) {
765
+ b.v128i([0, 0, 0, 0]);
766
+ for (let lane = 0; lane < (4); lane++)
767
+ b.set(temp(7)), b.get(temp(7)), b.get(L_SLOT + slot).get(V_ROW).simd(S.i32extract).op(lane).op((106)).op((45)).mem(0, 0), b.simd(S.i32replace).op(lane);
768
+ return;
769
+ }
770
+ if (mode !== "list") {
771
+ b.get(L_SLOT + slot).get(L_I).i32(2).op((116)).op((106)).simd(S.load).mem(2, 0);
772
+ return;
773
+ }
774
+ b.v128i([0, 0, 0, 0]);
775
+ for (let lane = 0; lane < (4); lane++)
776
+ b.set(temp(7)), b.get(L_SLOT + slot).get(V_ROW).simd(S.i32extract).op(lane).i32(2).op((116)).op((106)), b.get(temp(7)).simd(S.load32lane).mem(2, 0).op(lane);
777
+ }, toInt = (source, out) => {
778
+ b.get(source).simd(S.truncSatS).set(out), b.get(source).simd(S.f32abs).v128f((2147483648)).simd(S.f32ge).simd(S.anyTrue).op((4), (64));
779
+ for (let lane = 0; lane < (4); lane++)
780
+ b.get(out).get(source).simd(S.f32extract).op(lane).call(FN.toInt32).simd(S.i32replace).op(lane).set(out);
781
+ b.op((11));
782
+ }, readAs = (kind, storage, raw, out) => {
783
+ if (kind === 0) {
784
+ storage === 0 ? b.get(raw).set(out) : storage === 1 ? b.get(raw).simd(S.convertS).set(out) : storage === 2 ? b.get(raw).simd(S.convertU).set(out) : b.get(raw).v128i([(255), (255), (255), (255)]).simd(S.and).simd(S.convertU).set(out);
785
+ return;
786
+ }
787
+ if (kind === 3) {
788
+ storage === 0 ? (b.get(raw).v128f(0).simd(S.f32ne), b.get(raw).get(raw).simd(S.f32eq).simd(S.and).set(out)) : storage === 3 ? b.get(raw).v128i([(255), (255), (255), (255)]).simd(S.and).v128i([0, 0, 0, 0]).simd(S.i32ne).set(out) : b.get(raw).v128i([0, 0, 0, 0]).simd(S.i32ne).set(out);
789
+ return;
790
+ }
791
+ storage === 0 ? toInt(raw, out) : storage === 3 ? b.get(raw).v128i([(255), (255), (255), (255)]).simd(S.and).set(out) : b.get(raw).set(out);
792
+ }, writeAs = (kind, storage, value, out) => {
793
+ if (kind === 0) {
794
+ storage === 0 ? b.get(value).set(out) : toInt(value, out);
795
+ return;
796
+ }
797
+ if (kind === 3) {
798
+ storage === 0 ? b.v128f(1).v128f(0) : b.v128i([1, 1, 1, 1]).v128i([0, 0, 0, 0]), b.get(value).v128i([0, 0, 0, 0]).simd(S.i32ne).simd(S.bitselect).set(out);
799
+ return;
800
+ }
801
+ storage === 0 ? b.get(value).simd(kind === 1 ? S.convertS : S.convertU).set(out) : b.get(value).set(out);
802
+ }, loadSlot = (slot, out) => {
803
+ loadRaw(slot), b.set(temp(6)), readAs(program.slots[slot].kind, storages[slot], temp(6), out);
804
+ }, writeLanes = (slot, value) => {
805
+ for (let lane = 0; lane < (4); lane++)
806
+ laneInside(lane), b.op((4), (64)), byteSlot(slot) ? (b.get(L_SLOT + slot).get(V_ROW).simd(S.i32extract).op(lane).op((106)), b.get(value).simd(S.i32extract).op(lane).op((58)).mem(0, 0)) : (b.get(L_SLOT + slot).get(V_ROW).simd(S.i32extract).op(lane).i32(2).op((116)).op((106)), b.get(value).simd(S.store32lane).mem(2, 0).op(lane)), b.op((11));
807
+ }, storeSlot = (slot, word) => {
808
+ let kind = program.slots[slot].kind, storage = storages[slot], value = temp(5);
809
+ if (exactStorage(kind, storage) ? get(word).set(value) : (loadRaw(slot), b.set(temp(6)), readAs(kind, storage, temp(6), temp(4)), get(word).set(temp(3)), writeAs(kind, storage, temp(3), temp(2)), b.get(temp(6)).get(temp(2)).get(temp(4)).get(temp(3)).simd(S.i32eq).simd(S.bitselect).set(value)), byteSlot(slot)) {
810
+ writeLanes(slot, value);
811
+ return;
812
+ }
813
+ if (mode === "list") {
814
+ writeLanes(slot, value);
815
+ return;
816
+ }
817
+ b.get(L_SLOT + slot).get(L_I).i32(2).op((116)).op((106)), mode === "full" ? b.get(value) : b.get(value).get(L_SLOT + slot).get(L_I).i32(2).op((116)).op((106)).simd(S.load).mem(2, 0).get(V_VALID).simd(S.bitselect), b.simd(S.store).mem(2, 0);
818
+ }, jsMin = (a, c, out, max) => {
819
+ a(), b.set(temp(0)), c(), b.set(temp(1)), b.get(temp(0)).get(temp(1)).get(temp(0)).get(temp(0)).simd(S.f32ne).simd(S.bitselect).set(temp(2)), b.get(temp(1)).get(temp(2)), max ? b.get(temp(0)).get(temp(1)).simd(S.f32lt) : b.get(temp(1)).get(temp(0)).simd(S.f32lt), b.simd(S.bitselect).set(temp(2)), b.get(temp(0)).get(temp(2)), max ? b.get(temp(1)).get(temp(0)).simd(S.f32lt) : b.get(temp(0)).get(temp(1)).simd(S.f32lt), b.simd(S.bitselect).set(out);
820
+ }, jsMinScalar = (max) => {
821
+ b.set(F_B).set(F_A), b.get(F_A), b.get(F_B), b.get(F_A).get(F_B).get(F_A).get(F_A).op((92)).op((27)), max ? b.get(F_B).get(F_A).op((94)) : b.get(F_B).get(F_A).op((93)), b.op((27)), max ? b.get(F_A).get(F_B).op((94)) : b.get(F_A).get(F_B).op((93)), b.op((27));
822
+ }, lanes = (fn, operands, out) => {
823
+ for (let k = 0; k < operands.length; k++) get(operands[k]).set(temp(k));
824
+ b.v128f(0).set(temp(4));
825
+ for (let lane = 0; lane < (4); lane++) {
826
+ b.get(temp(4));
827
+ for (let k = 0; k < operands.length; k++) b.get(temp(k)).simd(S.f32extract).op(lane);
828
+ b.call(fn).simd(S.f32replace).op(lane).set(temp(4));
829
+ }
830
+ b.get(temp(4)).set(out);
831
+ }, perLane = (a, c, out, op) => {
832
+ get(a).set(temp(0)), get(c).set(temp(1)), b.v128i([0, 0, 0, 0]).set(temp(2));
833
+ for (let lane = 0; lane < (4); lane++)
834
+ b.get(temp(2)), b.get(temp(0)).simd(S.i32extract).op(lane).set(L_A), b.get(temp(1)).simd(S.i32extract).op(lane).set(L_B), op(), b.simd(S.i32replace).op(lane).set(temp(2));
835
+ b.get(temp(2)).set(out);
836
+ }, mix2 = () => {
837
+ for (let [shift, mul] of [
838
+ [16, (2146121005)],
839
+ [15, (2221713035)],
840
+ [16, 0]
841
+ ])
842
+ b.tee(temp(5)).get(temp(5)).i32(shift).simd(S.i32shr_u).simd(S.xor), mul !== 0 && b.v128i([mul, mul, mul, mul]).simd(S.i32mul);
843
+ }, hashInto = (i) => {
844
+ get(i.b).v128i([(2654435769), (2654435769), (2654435769), (2654435769)]).simd(S.i32add), mix2(), get(i.a).simd(S.xor), mix2();
845
+ }, code = program.code, loopUniforms = new Set(code.filter((i) => i.op === Op2.LOOP_INIT).map((i) => i.a)), scalarLocal = (word) => {
846
+ let index = word & 2147483647;
847
+ return loopUniforms.has(index) ? L_COUNTERS + (index - args) : L_USCALAR + index;
848
+ }, loopsOf = (open) => open.filter((o) => o.kind === "loop"), emitEvent = (pc, open) => {
849
+ let i = code[pc], words = program.channels[i.dst], loops = loopsOf(open);
850
+ if (loops.length > (3)) return false;
851
+ let key = [];
852
+ for (let l of loops)
853
+ key.push(() => b.i32(l.pc)), key.push(() => b.get(L_COUNTERS + (l.counter - args)));
854
+ for (key.push(() => b.i32(pc)); key.length < (8); ) key.push(() => b.i32(0));
855
+ for (let lane = 0; lane < (4); lane++) {
856
+ laneInside(lane), i.a !== 4294967295 && get(i.a).simd(S.i32extract).op(lane).i32(0).op((71)).op((113)), b.op((4), (64)), b.load(P_CTX, (72)).tee(L_IDX), b.get(P_CTX).get(L_IDX).i32(1).op((106)).op((54)).mem(2, (72)), b.load(P_CTX, (68)).op((73)).op((4), (64)), b.load(P_CTX, (64)).get(L_IDX).i32(STAGE_WORDS * (4)).op((108)).op((106)).set(L_BASE);
857
+ let put = (at, value) => {
858
+ b.get(L_BASE), value(), b.op((54)).mem(2, at * (4));
859
+ };
860
+ put(0, () => b.get(L_I).i32(lane).op((106))), key.forEach((k, w) => put(1 + w, k)), put(1 + (8), () => b.i32(0)), put(2 + (8), () => b.i32(i.dst)), put(3 + (8), () => b.get(V_ROW).simd(S.i32extract).op(lane));
861
+ for (let w = 0; w < 8; w++)
862
+ if (w < words) {
863
+ let ext = code[pc + 1 + Math.floor(w / 3)], word = [ext.a, ext.b, ext.c][w % 3];
864
+ put(4 + (8) + w, () => get(word).simd(S.i32extract).op(lane));
865
+ } else put(4 + (8) + w, () => b.i32(0));
866
+ b.op((11)).op((11));
867
+ }
868
+ return true;
869
+ }, dry = false, keeping = false, accumulate = (i) => {
870
+ if (!dry) {
871
+ b.get(P_CTX).get(reg(i.a)).simd(S.store).mem(2, (160));
872
+ for (let lane = 0; lane < (4); lane++)
873
+ b.i32(lane).get(L_PN).op((73)), i.c !== 4294967295 && get(i.c).simd(S.i32extract).op(lane).i32(0).op((71)).op((113)), keeping && b.get(V_KEEP).simd(S.i32extract).op(lane).i32(0).op((71)).op((113)), b.op((4), (64)), b.get(P_CTX).get(V_PLANE).simd(S.i32extract).op(lane).i32(2).op((116)).op((106)).set(L_IDX), i.op === Op2.ACC_IADD ? (b.get(L_IDX), b.get(L_IDX).op((40)).mem(2, (160)), get(i.b).simd(S.i32extract).op(lane).op((106)), b.op((54)).mem(2, (160))) : (b.get(L_IDX), b.get(L_IDX).op((42)).mem(2, (160)), get(i.b).simd(S.f32extract).op(lane), i.op === Op2.ACC_FADD ? b.op((146)) : jsMinScalar(i.op === Op2.ACC_FMAX), b.op(56).mem(2, (160))), b.op((11));
874
+ b.get(P_CTX).simd(S.load).mem(2, (160)).set(reg(i.a));
875
+ }
876
+ }, wideCarry = (i) => {
877
+ let wide = (word, lane, low) => {
878
+ get(word).simd(S.i32extract).op(lane), low && b.i32(1).op((113)), b.op((173));
879
+ };
880
+ for (let lane = 0; lane < (4); lane++)
881
+ b.get(V_REG + i.dst), wide(i.a, lane, false), wide(i.b, lane, false), i.op === Op2.UMULHI ? b.op((126)).op((66), (32)).op((136)).op((167)) : i.op === Op2.UADDC ? (b.op((124)), wide(i.c, lane, true), b.op((124)).op((66), (32)).op((136)).op((167))) : (wide(i.c, lane, true), b.op((124)).op((84))), b.simd(S.i32replace).op(lane).set(V_REG + i.dst);
882
+ }, stagedBody = staged(program), laneBase = () => stagedBody ? b.get(P_CTX).i32(laneScratchOffset(program)).op((106)) : b.load(P_CTX, (192)), laneOp = (pc) => {
883
+ let i = code[pc], ext = code[pc + 1], [inputs, outputs] = laneSignature(i.dst);
884
+ [i.a, i.b, i.c, ext.a, ext.b].forEach((word, k) => {
885
+ laneBase(), (inputs & 1 << k) !== 0 ? get(word) : b.v128i([0, 0, 0, 0]), b.simd(S.store).mem(0, k * 16);
886
+ }), b.i32(i.dst), laneBase(), laneBase().i32((5) * 16).op((106)).call(FN.lanes);
887
+ let targets = [ext.dst, ext.c, ext.b];
888
+ for (let k = 0; k < outputs; k++) laneBase().simd(S.load).mem(0, ((5) + k) * 16).set(V_REG + targets[k]);
889
+ }, dataOp = (pc) => {
890
+ let i = code[pc], ext = code[pc + 1];
891
+ if (i.dst === DATA_LIST) return;
892
+ let N = 4294967295, plan = {
893
+ [DATA_KEYOF]: [[i.a, N, N, N], [false, false, false, false], true],
894
+ [DATA_ROWOF]: [[i.a, N, N, N], [false, false, false, false], true],
895
+ [DATA_FLOAD]: [[N, i.b, N, N], [false, false, false, false], true],
896
+ [DATA_ROWS]: [[N, N, N, N], [false, false, false, false], true],
897
+ [DATA_PGET]: [[N, i.b, i.c, N], [false, false, true, false], true],
898
+ [DATA_PICK]: [[N, i.b, i.c, N], [false, false, true, false], false],
899
+ [DATA_PSET]: [[N, i.b, i.c, ext.a], [false, false, false, true], false],
900
+ [DATA_SEND]: [[N, i.b, i.c, ext.a], [false, false, false, true], false],
901
+ [DATA_TALLY]: [[N, i.b, N, N], [false, true, false, false], false]
902
+ }, [inputs, masks, result] = plan[i.dst];
903
+ laneBase().get(V_ROW).simd(S.store).mem(0, 0), laneBase().get(V_VALID).simd(S.store).mem(0, 16), inputs.forEach((word, k) => {
904
+ laneBase(), word !== N ? get(word) : b.v128i(masks[k] ? [-1, -1, -1, -1] : [0, 0, 0, 0]), b.simd(S.store).mem(0, (2 + k) * 16);
905
+ }), b.get(P_CTX).i32(pc), laneBase().call(FN.data), result && laneBase().simd(S.load).mem(0, 96).set(V_REG + ext.dst);
906
+ }, query = (pc) => {
907
+ let i = code[pc], ext = code[pc + 1], from = pc + 2, to = ext.a, filtered = (ext.c & QUERY_FILTERED) !== 0, kind = ext.c & QUERY_SHAPE, filterAt = filtered ? pc - 2 : -1, shapeAt = kind === QUERY_SPHERE ? -1 : filtered ? pc - 4 : pc - 2, optional = (word, fallback) => {
908
+ word === 4294967295 ? b.v128i([fallback, fallback, fallback, fallback]) : get(word);
909
+ }, params = [
910
+ () => ext.b === 4294967295 ? b.get(V_VALID) : get(ext.b).get(V_VALID).simd(S.and),
911
+ () => get(i.b),
912
+ () => optional(i.c, -1)
913
+ ], shape = shapeAt < 0 ? null : [code[shapeAt].a, code[shapeAt].b, code[shapeAt].c, code[shapeAt + 1].a, code[shapeAt + 1].b, code[shapeAt + 1].c];
914
+ for (let k = 0; k < 6; k++) params.push(() => optional(shape === null ? 4294967295 : shape[k], 0));
915
+ params.push(() => optional(filterAt < 0 ? 4294967295 : code[filterAt].b, 0)), params.push(() => optional(filterAt < 0 ? 4294967295 : code[filterAt].c, 0)), params.forEach((emit, k) => {
916
+ b.load(P_CTX, (76)), emit(), b.simd(S.store).mem(0, k * 16);
917
+ }), b.load(P_CTX, (76)).get(V_ROW).simd(S.store).mem(0, (11) * 16), b.get(P_CTX).load(P_CTX, (76)).load(P_CTX, (76)).i32((11) * 16).op((106)), b.i32(kind).i32(filterAt < 0 ? -1 : code[filterAt].a).i32(filterAt < 0 ? 0 : code[filterAt + 1].a).call(FN.query).set(L_QN);
918
+ let stops = false;
919
+ for (let at = from; at < to; at++) code[at].op === XOP && code[at].dst === XOP_QSTOP && (stops = true);
920
+ if (b.i32(0).set(L_QP), b.op((2), (64)).op((3), (64)), b.get(L_QP).get(L_QN).op((79)).op((13), 1), b.get(L_QN).get(L_QP).op((107)).tee(L_PN).i32((4)).get(L_PN).i32((4)).op((73)).op((27)).set(L_PN), b.load(P_CTX, (56)).get(L_QP).i32(2).op((116)).op((106)).simd(S.load).mem(2, 0).set(V_PLANE), b.load(P_CTX, (60)).get(L_QP).i32(2).op((116)).op((106)).simd(S.load).mem(2, 0).set(V_PROW), stops) {
921
+ b.v128i([0, 0, 0, 0]).set(V_STOP), dry = true;
922
+ let ok2 = emitRange(from, to, true);
923
+ if (dry = false, !ok2) return false;
924
+ b.load(P_CTX, (76)).get(V_STOP).simd(S.store).mem(0, ((11) + 1) * 16), b.get(P_CTX).load(P_CTX, (76)).i32(((11) + 1) * 16).op((106)).get(L_QP).load(P_CTX, (76)).i32(((11) + 2) * 16).op((106)).call(FN.queryKeep), b.load(P_CTX, (76)).simd(S.load).mem(0, ((11) + 2) * 16).set(V_KEEP), keeping = true;
925
+ }
926
+ let ok = emitRange(from, to, true);
927
+ return keeping = false, ok ? (b.get(L_QP).i32((4)).op((106)).set(L_QP).op((12), 0).op((11)).op((11)), true) : false;
928
+ }, recordOp = (pc) => {
929
+ let i = code[pc], k = program.cross.indexOf(pc);
930
+ if (k < 0) return false;
931
+ let ext = i.op === CROSS_OP.SCATTER || i.op === XOP ? code[pc + 1] : i, recur = i.op === XOP && recurSub(i.dst), value = i.op === CROSS_OP.COMPACT ? 4294967295 : i.a, aux = i.op === CROSS_OP.SCATTER || recur ? i.b : i.op === XOP && i.dst === XOP_COMPONENTS_EDGES ? i.c : 4294967295, mask = i.op === CROSS_OP.SCATTER ? ext.b : i.op === CROSS_OP.COMPACT ? i.a : recur ? i.c : i.b;
932
+ b.get(P_CTX).op((40)).mem(2, k * (4)).set(L_BASE);
933
+ for (let lane = 0; lane < (4); lane++) {
934
+ laneInside(lane), b.op((4), (64)), b.get(L_BASE).get(L_I).i32(lane).op((106)).i32((4)).op((116)).op((106)).set(L_IDX);
935
+ let put = (at, word) => {
936
+ b.get(L_IDX), word(), b.op((54)).mem(2, at * (4));
937
+ };
938
+ put(0, () => value === 4294967295 ? b.i32(0) : get(value).simd(S.i32extract).op(lane)), put(1, () => aux === 4294967295 ? b.i32(0) : get(aux).simd(S.i32extract).op(lane)), put(2, () => mask === 4294967295 ? b.i32(1) : get(mask).simd(S.i32extract).op(lane).i32(0).op((71))), put(3, () => b.get(V_ROW).simd(S.i32extract).op(lane)), b.op((11));
939
+ }
940
+ return true;
941
+ }, emitRange = (from, to, pair) => {
942
+ let open = [], depthOf = (index) => open.length - 1 - index;
943
+ for (let pc = from; pc <= to; pc++) {
944
+ for (; open.length > 0 && open[open.length - 1].end === pc; )
945
+ open.pop(), b.op((11));
946
+ if (pc === to) break;
947
+ let i = code[pc]; V_REG + i.dst;
948
+ if (narrowXop(i.op, i.dst)) {
949
+ if (pair) return false;
950
+ laneOp(pc), pc++;
951
+ continue;
952
+ }
953
+ if (dataXop(i.op, i.dst)) {
954
+ if (pair) return false;
955
+ dataOp(pc), pc++;
956
+ continue;
957
+ }
958
+ if (gatherXop(i.op, i.dst)) {
959
+ let ext = code[pc + 1], field2 = i.dst === XOP_FIELD, span = field2 ? i.c : 1;
960
+ if (field2 && pair || span < 1 || i.a + span > slotCount) return false;
961
+ for (let s = i.a; s < i.a + span; s++) if (!exactStorage(program.slots[s].kind, storages[s])) return false;
962
+ b.v128i([0, 0, 0, 0]).set(temp(7));
963
+ for (let lane = 0; lane < (4); lane++)
964
+ get(i.b).simd(S.i32extract).op(lane).set(L_A), b.get(L_A), field2 ? b.i32(i.c) : get(i.c).simd(S.i32extract).op(lane), b.op((73)).op((4), (64)), b.get(temp(7)), field2 ? (b.get(P_COLS).get(L_A).i32(i.a).op((106)).i32(2).op((116)).op((106)).op((40)).mem(2, 0), b.get(V_ROW).simd(S.i32extract).op(lane).i32(2).op((116)).op((106))) : b.get(L_SLOT + i.a).get(L_A).i32(2).op((116)).op((106)), b.op((40)).mem(2, 0).simd(S.i32replace).op(lane).set(temp(7)), b.op((11));
965
+ ext.a !== 4294967295 ? b.get(temp(7)).reg(ext.a).simd(S.and).set(V_REG + ext.dst) : b.get(temp(7)).set(V_REG + ext.dst), pc++;
966
+ continue;
967
+ }
968
+ if (i.op === XOP && i.dst === XOP_QUERY) {
969
+ if (pair || !query(pc)) return false;
970
+ pc = code[pc + 1].a - 1;
971
+ continue;
972
+ }
973
+ if (i.op === XOP && (i.dst === XOP_QSHAPE || i.dst === XOP_QFILTER)) {
974
+ pc++;
975
+ continue;
976
+ }
977
+ if (i.op === XOP && i.dst === XOP_QSTOP) {
978
+ if (!pair) return false;
979
+ dry && get(i.a).get(V_STOP).simd(S.or).set(V_STOP), pc++;
980
+ continue;
981
+ }
982
+ if (crossRow(i.op) || stageEndingOp(i.op, i.dst)) {
983
+ if (pair || !recordOp(pc)) return false;
984
+ (i.op === CROSS_OP.SCATTER || i.op === XOP) && pc++;
985
+ continue;
986
+ }
987
+ let vector = isSimd(i), batch = vector ? simdScalarize(i, code[pc + 1], simdTemp) : [i];
988
+ if (batch === null) return false;
989
+ vector && pc++;
990
+ for (let one of batch) {
991
+ let i2 = one, d2 = V_REG + i2.dst;
992
+ switch (i2.op) {
993
+ case Op2.NOP:
994
+ case Op2.EXT:
995
+ break;
996
+ case Op2.MOV:
997
+ get(i2.a).set(d2);
998
+ break;
999
+ case Op2.LOAD:
1000
+ loadSlot(i2.a, d2);
1001
+ break;
1002
+ case Op2.STORE:
1003
+ storeSlot(i2.a, i2.b);
1004
+ break;
1005
+ case Op2.ROW:
1006
+ b.get(V_ROW).set(d2);
1007
+ break;
1008
+ case Op2.SEL:
1009
+ get(i2.b).reg(i2.c).reg(i2.a).simd(S.bitselect).set(d2);
1010
+ break;
1011
+ case Op2.JNONE: {
1012
+ let known2 = open.findIndex((o) => o.kind === "block" && o.end === i2.b);
1013
+ if (known2 >= 0)
1014
+ get(i2.a).simd(S.anyTrue).op((69)).op((13)), uleb2(b.code, depthOf(known2));
1015
+ else {
1016
+ if (open.length > 0 && open[open.length - 1].end < i2.b || i2.b > to) return false;
1017
+ b.op((2), (64)), open.push({ kind: "block", end: i2.b, pc, counter: -1 }), get(i2.a).simd(S.anyTrue).op((69)).op((13), 0);
1018
+ }
1019
+ break;
1020
+ }
1021
+ case Op2.LOOP_INIT: {
1022
+ let counter = L_COUNTERS + (i2.a - args), nextPc = code.findIndex((c, k) => k > pc && c.op === Op2.LOOP_NEXT && c.a === i2.a && c.c === pc + 1);
1023
+ if (nextPc < 0 || i2.c > to || open.length > 0 && open[open.length - 1].end < i2.c) return false;
1024
+ b.i32(0).set(counter), b.op((2), (64)), open.push({ kind: "block", end: i2.c, pc, counter: i2.a }), trips(b, scalarLocal(i2.b), i2.dst, L_TMP), b.op((69)).op((13), 0), b.op((3), (64)), open.push({ kind: "loop", end: nextPc + 1, pc, counter: i2.a }), b.get(counter).simd(S.i32splat).set(V_UNIFORM + i2.a);
1025
+ break;
1026
+ }
1027
+ case Op2.LOOP_NEXT: {
1028
+ let counter = L_COUNTERS + (i2.a - args);
1029
+ b.get(counter).i32(1).op((106)).tee(counter), b.simd(S.i32splat).set(V_UNIFORM + i2.a), b.get(counter), trips(b, scalarLocal(i2.b), i2.dst, L_TMP), b.op((72)).op((13), 0);
1030
+ break;
1031
+ }
1032
+ case Op2.NEIGHBOURS: {
1033
+ if (pair || !neighbours(pc + 1, i2.b, i2.c)) return false;
1034
+ pc = i2.b - 1;
1035
+ break;
1036
+ }
1037
+ case Op2.NLOAD: {
1038
+ let index = snapshotIndex[i2.a];
1039
+ b.v128i([0, 0, 0, 0]).set(d2);
1040
+ for (let lane = 0; lane < (4); lane++)
1041
+ b.get(d2), field((0)), field((4)).i32(index).op((108)).get(V_PROW).simd(S.i32extract).op(lane).op((106)).i32(2).op((116)).op((106)), b.op((40)).mem(2, 0).simd(S.i32replace).op(lane).set(d2);
1042
+ break;
1043
+ }
1044
+ case Op2.OUTER: {
1045
+ b.get(P_CTX).get(reg(i2.a)).simd(S.store).mem(2, (112)), b.v128i([0, 0, 0, 0]).set(temp(7));
1046
+ for (let lane = 0; lane < (4); lane++)
1047
+ b.get(temp(7)), b.get(P_CTX).get(V_PLANE).simd(S.i32extract).op(lane).i32(2).op((116)).op((106)).op((40)).mem(2, (112)), b.simd(S.i32replace).op(lane).set(temp(7));
1048
+ b.get(temp(7)).set(d2);
1049
+ break;
1050
+ }
1051
+ case Op2.NROW:
1052
+ b.get(V_PROW).set(d2);
1053
+ break;
1054
+ case Op2.ACC_FADD:
1055
+ case Op2.ACC_FMIN:
1056
+ case Op2.ACC_FMAX:
1057
+ case Op2.ACC_IADD:
1058
+ accumulate(i2);
1059
+ break;
1060
+ case Op2.EMIT: {
1061
+ if (pair || !emitEvent(pc, open)) return false;
1062
+ pc += Math.ceil(program.channels[i2.dst] / 3);
1063
+ break;
1064
+ }
1065
+ case Op2.FADD:
1066
+ case Op2.FSUB:
1067
+ case Op2.FMUL:
1068
+ case Op2.FDIV:
1069
+ get(i2.a).reg(i2.b).simd(i2.op === Op2.FADD ? S.f32add : i2.op === Op2.FSUB ? S.f32sub : i2.op === Op2.FMUL ? S.f32mul : S.f32div).set(d2);
1070
+ break;
1071
+ case Op2.FMIN:
1072
+ case Op2.FMAX:
1073
+ jsMin(() => get(i2.a), () => get(i2.b), d2, i2.op === Op2.FMAX);
1074
+ break;
1075
+ case Op2.FMOD:
1076
+ lanes(noise("fmod"), [i2.a, i2.b], d2);
1077
+ break;
1078
+ case Op2.FPOW:
1079
+ lanes(fmath("pow"), [i2.a, i2.b], d2);
1080
+ break;
1081
+ case Op2.FATAN2:
1082
+ lanes(fmath("atan2"), [i2.a, i2.b], d2);
1083
+ break;
1084
+ case Op2.NOISE2:
1085
+ lanes(noise("noise2"), [i2.a, i2.b], d2);
1086
+ break;
1087
+ case Op2.NOISE3:
1088
+ lanes(noise("noise3"), [i2.a, i2.b, i2.c], d2);
1089
+ break;
1090
+ case Op2.FLOG2:
1091
+ case Op2.FSIN:
1092
+ case Op2.FCOS:
1093
+ case Op2.FTAN:
1094
+ case Op2.FASIN:
1095
+ case Op2.FACOS:
1096
+ case Op2.FATAN:
1097
+ case Op2.FEXP:
1098
+ case Op2.FLOG: {
1099
+ i2.op === Op2.FSIN || i2.op === Op2.FCOS ? get(i2.a).call(fmathSimd(i2.op === Op2.FSIN ? "sin" : "cos")).set(d2) : lanes(fmath(UNARY_FMATH[i2.op]), [i2.a], d2);
1100
+ break;
1101
+ }
1102
+ case Op2.FMULADD:
1103
+ get(i2.a).reg(i2.b).simd(S.f32mul).reg(i2.c).simd(S.f32add).set(d2);
1104
+ break;
1105
+ case Op2.FMULSUB:
1106
+ get(i2.a).reg(i2.b).simd(S.f32mul).reg(i2.c).simd(S.f32sub).set(d2);
1107
+ break;
1108
+ case Op2.FSUBMUL:
1109
+ get(i2.a).reg(i2.b).simd(S.f32sub).reg(i2.c).simd(S.f32mul).set(d2);
1110
+ break;
1111
+ case Op2.FADDMUL:
1112
+ get(i2.a).reg(i2.b).simd(S.f32add).reg(i2.c).simd(S.f32mul).set(d2);
1113
+ break;
1114
+ case Op2.FCLAMP:
1115
+ jsMin(() => get(i2.a), () => get(i2.b), temp(3), true), jsMin(() => b.get(temp(3)), () => get(i2.c), d2, false);
1116
+ break;
1117
+ case Op2.FLERP:
1118
+ get(i2.a).reg(i2.b).reg(i2.a).simd(S.f32sub).reg(i2.c).simd(S.f32mul).simd(S.f32add).set(d2);
1119
+ break;
1120
+ case Op2.FNEG:
1121
+ get(i2.a).simd(S.f32neg).set(d2);
1122
+ break;
1123
+ case Op2.FABS:
1124
+ get(i2.a).simd(S.f32abs).set(d2);
1125
+ break;
1126
+ case Op2.FSQRT:
1127
+ get(i2.a).simd(S.f32sqrt).set(d2);
1128
+ break;
1129
+ case Op2.FFLOOR:
1130
+ get(i2.a).simd(S.f32floor).set(d2);
1131
+ break;
1132
+ case Op2.FCEIL:
1133
+ get(i2.a).simd(S.f32ceil).set(d2);
1134
+ break;
1135
+ case Op2.FTRUNC:
1136
+ get(i2.a).simd(S.f32trunc).set(d2);
1137
+ break;
1138
+ case Op2.FROUND:
1139
+ get(i2.a).simd(S.f32floor).set(temp(0)), b.get(temp(0)).v128f(1).simd(S.f32add).get(temp(0)), get(i2.a).get(temp(0)).simd(S.f32sub).v128f(0.5).simd(S.f32ge).simd(S.bitselect).set(d2);
1140
+ break;
1141
+ case Op2.FSIGN:
1142
+ get(i2.a).set(temp(0)), b.v128f(1).v128f(-1).get(temp(0)).get(temp(0)).v128f(0).simd(S.f32lt).simd(S.bitselect), b.v128f(0).get(temp(0)).simd(S.f32lt).simd(S.bitselect).set(d2);
1143
+ break;
1144
+ case Op2.FLEN2:
1145
+ get(i2.a).reg(i2.a).simd(S.f32mul).reg(i2.b).reg(i2.b).simd(S.f32mul).simd(S.f32add).simd(S.f32sqrt).set(d2);
1146
+ break;
1147
+ case Op2.FLEN3:
1148
+ get(i2.a).reg(i2.a).simd(S.f32mul).reg(i2.b).reg(i2.b).simd(S.f32mul).simd(S.f32add).reg(i2.c).reg(i2.c).simd(S.f32mul).simd(S.f32add).simd(S.f32sqrt).set(d2);
1149
+ break;
1150
+ case Op2.FDOT2: {
1151
+ let e = code[pc + 1];
1152
+ get(i2.a).reg(i2.b).simd(S.f32mul).reg(i2.c).reg(e.a).simd(S.f32mul).simd(S.f32add).set(d2), pc++;
1153
+ break;
1154
+ }
1155
+ case Op2.FDOT3: {
1156
+ let e = code[pc + 1];
1157
+ get(i2.a).reg(i2.b).simd(S.f32mul).reg(i2.c).reg(e.a).simd(S.f32mul).simd(S.f32add).reg(e.b).reg(e.c).simd(S.f32mul).simd(S.f32add).set(d2), pc++;
1158
+ break;
1159
+ }
1160
+ case Op2.FLT:
1161
+ get(i2.a).reg(i2.b).simd(S.f32lt).set(d2);
1162
+ break;
1163
+ case Op2.FLE:
1164
+ get(i2.a).reg(i2.b).simd(S.f32le).set(d2);
1165
+ break;
1166
+ case Op2.FEQ:
1167
+ get(i2.a).reg(i2.b).simd(S.f32eq).set(d2);
1168
+ break;
1169
+ case Op2.FNE:
1170
+ get(i2.a).reg(i2.b).simd(S.f32ne).set(d2);
1171
+ break;
1172
+ case Op2.IADD:
1173
+ case Op2.ISUB:
1174
+ case Op2.IMUL:
1175
+ case Op2.IAND:
1176
+ case Op2.IOR:
1177
+ case Op2.IXOR:
1178
+ case Op2.IMIN:
1179
+ case Op2.IMAX:
1180
+ case Op2.UMIN:
1181
+ case Op2.UMAX:
1182
+ case Op2.ILT:
1183
+ case Op2.ILE:
1184
+ case Op2.IEQ:
1185
+ case Op2.INE:
1186
+ case Op2.ULT:
1187
+ case Op2.ULE:
1188
+ case Op2.MAND:
1189
+ case Op2.MOR:
1190
+ case Op2.MANDN: {
1191
+ let table = {
1192
+ [Op2.IADD]: S.i32add,
1193
+ [Op2.ISUB]: S.i32sub,
1194
+ [Op2.IMUL]: S.i32mul,
1195
+ [Op2.IAND]: S.and,
1196
+ [Op2.IOR]: S.or,
1197
+ [Op2.IXOR]: S.xor,
1198
+ [Op2.IMIN]: S.i32min_s,
1199
+ [Op2.IMAX]: S.i32max_s,
1200
+ [Op2.UMIN]: S.i32min_u,
1201
+ [Op2.UMAX]: S.i32max_u,
1202
+ [Op2.ILT]: S.i32lt_s,
1203
+ [Op2.ILE]: S.i32le_s,
1204
+ [Op2.IEQ]: S.i32eq,
1205
+ [Op2.INE]: S.i32ne,
1206
+ [Op2.ULT]: S.i32lt_u,
1207
+ [Op2.ULE]: S.i32le_u,
1208
+ [Op2.MAND]: S.and,
1209
+ [Op2.MOR]: S.or,
1210
+ [Op2.MANDN]: S.andnot
1211
+ };
1212
+ get(i2.a).reg(i2.b).simd(table[i2.op]).set(d2);
1213
+ break;
1214
+ }
1215
+ case Op2.IREM:
1216
+ case Op2.UREM: {
1217
+ let signed = i2.op === Op2.IREM;
1218
+ perLane(i2.a, i2.b, d2, () => {
1219
+ b.i32(0), b.get(L_A), b.get(L_B).op((69)), signed && b.get(L_A).i32((-2147483648)).op((70)).get(L_B).i32(-1).op((70)).op((113)).op((114)), b.op((4), (127)).i32(1).op((5)).get(L_B).op((11)), b.op(signed ? (111) : (112)), b.get(L_B).op((69)), signed && b.get(L_A).i32((-2147483648)).op((70)).get(L_B).i32(-1).op((70)).op((113)).op((114)), b.op((27));
1220
+ });
1221
+ break;
1222
+ }
1223
+ case Op2.ISHL:
1224
+ case Op2.ISHR:
1225
+ case Op2.IUSHR: {
1226
+ let vector2 = i2.op === Op2.ISHL ? S.i32shl : i2.op === Op2.ISHR ? S.i32shr_s : S.i32shr_u;
1227
+ if ((i2.b & 2147483648) !== 0 && i2.b !== 4294967295)
1228
+ get(i2.a).get(scalarLocal(i2.b)).i32((31)).op((113)).simd(vector2).set(d2);
1229
+ else {
1230
+ let scalar = i2.op === Op2.ISHL ? (116) : i2.op === Op2.ISHR ? (117) : (118);
1231
+ perLane(i2.a, i2.b, d2, () => {
1232
+ b.get(L_A).get(L_B).i32((31)).op((113)).op(scalar);
1233
+ });
1234
+ }
1235
+ break;
1236
+ }
1237
+ case Op2.INEG:
1238
+ get(i2.a).simd(S.i32neg).set(d2);
1239
+ break;
1240
+ case Op2.IABS:
1241
+ get(i2.a).simd(S.i32abs).set(d2);
1242
+ break;
1243
+ case Op2.INOT:
1244
+ case Op2.MNOT:
1245
+ get(i2.a).simd(S.not).set(d2);
1246
+ break;
1247
+ case Op2.ITOF:
1248
+ get(i2.a).simd(S.convertS).set(d2);
1249
+ break;
1250
+ case Op2.UTOF:
1251
+ get(i2.a).simd(S.convertU).set(d2);
1252
+ break;
1253
+ case Op2.FTOI:
1254
+ get(i2.a).set(temp(0)), toInt(temp(0), d2);
1255
+ break;
1256
+ case Op2.BTOF:
1257
+ b.v128f(1).v128f(0), get(i2.a).v128i([0, 0, 0, 0]).simd(S.i32ne).simd(S.bitselect).set(d2);
1258
+ break;
1259
+ case Op2.BTOI:
1260
+ b.v128i([1, 1, 1, 1]).v128i([0, 0, 0, 0]), get(i2.a).v128i([0, 0, 0, 0]).simd(S.i32ne).simd(S.bitselect).set(d2);
1261
+ break;
1262
+ case Op2.FTOB:
1263
+ get(i2.a).v128f(0).simd(S.f32ne), get(i2.a).reg(i2.a).simd(S.f32eq).simd(S.and).set(d2);
1264
+ break;
1265
+ case Op2.ITOB:
1266
+ get(i2.a).v128i([0, 0, 0, 0]).simd(S.i32ne).set(d2);
1267
+ break;
1268
+ case Op2.UADDC:
1269
+ case Op2.USUBB:
1270
+ case Op2.UMULHI:
1271
+ wideCarry(i2);
1272
+ break;
1273
+ case Op2.HASH:
1274
+ hashInto(i2), b.set(d2);
1275
+ break;
1276
+ case Op2.RAND:
1277
+ hashInto(i2), b.i32(8).simd(S.i32shr_u).simd(S.convertU).v128f(UNIT_SCALE).simd(S.f32mul).set(d2);
1278
+ break;
1279
+ default:
1280
+ return false;
1281
+ }
1282
+ }
1283
+ }
1284
+ return open.length === 0;
1285
+ }, axis = (value) => {
1286
+ value(), field((36)).op((190)).op((148)).op((142)).op((252)), uleb2(b.code, (0));
1287
+ }, chunk = (from, to, count) => (count(), b.set(L_PN), b.get(P_CTX).simd(S.load).mem(2, (128)).set(V_PLANE), b.get(P_CTX).simd(S.load).mem(2, (144)).set(V_PROW), emitRange(from, to, true)), snapshotAt = (slot, row) => {
1288
+ field((0)), field((4)).i32(snapshotIndex[slot]).op((108)).get(row).op((106)).i32(2).op((116)).op((106)).op((42)).mem(2, 0);
1289
+ }, neighbours = (from, to, active) => {
1290
+ let position = program.position;
1291
+ if (position === null) return false;
1292
+ let [px, py, pz] = position;
1293
+ return b.get(P_CTX).get(V_ROW).simd(S.store).mem(2, (80)), b.get(P_CTX), active === 4294967295 ? b.get(V_VALID) : get(active).get(V_VALID).simd(S.and), b.simd(S.store).mem(2, (96)), b.i32(0).set(L_PCOUNT), b.op((2), (64)), b.load(P_CTX, (48)).op((69)).op((13), 0), b.i32(0).set(L_LANE), b.op((2), (64)).op((3), (64)), b.get(L_LANE).i32((4)).op((79)).op((13), 1), b.get(P_CTX).get(L_LANE).i32(2).op((116)).op((106)).op((40)).mem(2, (96)).op((4), (64)), b.get(P_CTX).get(L_LANE).i32(2).op((116)).op((106)).op((40)).mem(2, (80)).set(L_ROW), snapshotAt(px, L_ROW), b.set(F_CX), snapshotAt(py, L_ROW), b.set(F_CY), pz === 4294967295 ? b.f32(0).set(F_CZ) : (snapshotAt(pz, L_ROW), b.set(F_CZ)), walkCells(from, to, () => field((40)).op((190)), pz);
1294
+ }, walkCells = (from, to, radius, pz) => {
1295
+ let low = (center) => axis(() => {
1296
+ b.get(center), radius(), b.op((147));
1297
+ }), high = (center) => axis(() => {
1298
+ b.get(center), radius(), b.op((146));
1299
+ });
1300
+ low(F_CX), b.set(L_GX), high(F_CX), b.set(L_HX), low(F_CY), b.set(L_LY), high(F_CY), b.set(L_HY), pz === 4294967295 ? (b.i32(0).set(L_LZ), b.i32(0).set(L_HZ)) : (low(F_CZ), b.set(L_LZ), high(F_CZ), b.set(L_HZ)), b.op((2), (64)).op((3), (64)), b.get(L_LY).set(L_GY), b.op((2), (64)).op((3), (64)), b.get(L_LZ).set(L_GZ), b.op((2), (64)).op((3), (64)), b.get(L_GY).get(L_GX).i32((1021)).op((108)).op((106)).get(L_GZ).i32((65539)).op((108)).op((106)), field((32)).op((113)).set(L_IDX), field((8)).get(L_IDX).i32(2).op((116)).op((106)).tee(L_BASE).op((40)).mem(2, 0).set(L_SLOT_AT), b.get(L_BASE).op((40)).mem(2, 4).set(L_END), b.op((2), (64)).op((3), (64)), b.get(L_SLOT_AT).get(L_END).op((79)).op((13), 1), field((12)).get(L_SLOT_AT).i32(12).op((108)).op((106)).set(L_BASE), b.get(L_BASE).op((40)).mem(2, 0).get(L_GX).op((70)), b.get(L_BASE).op((40)).mem(2, 4).get(L_GY).op((70)).op((113)), b.get(L_BASE).op((40)).mem(2, 8).get(L_GZ).op((70)).op((113)), b.op((4), (64));
1301
+ let coordinate = (ctxOffset, center, out) => {
1302
+ field(ctxOffset).get(L_SLOT_AT).i32(2).op((116)).op((106)).op((42)).mem(2, 0).get(center).op((147)).set(out);
1303
+ };
1304
+ return coordinate((16), F_CX, F_DX), coordinate((20), F_CY, F_DY), coordinate((24), F_CZ, F_DZ), field((28)).get(L_SLOT_AT).i32(2).op((116)).op((106)).op((40)).mem(2, 0).set(L_NROW), b.get(F_DX).get(F_DX).op((148)).get(F_DY).get(F_DY).op((148)).op((146)).get(F_DZ).get(F_DZ).op((148)).op((146)), field((44)).op((190)).op((95)), b.get(L_NROW).get(L_ROW).op((71)).op((113)), b.op((4), (64)), b.get(P_CTX).get(L_PCOUNT).i32(2).op((116)).op((106)).get(L_LANE).op((54)).mem(2, (128)), b.get(P_CTX).get(L_PCOUNT).i32(2).op((116)).op((106)).get(L_NROW).op((54)).mem(2, (144)), b.get(L_PCOUNT).i32(1).op((106)).tee(L_PCOUNT).i32((4)).op((70)).op((4), (64)), !chunk(from, to, () => b.i32((4))) || (b.i32(0).set(L_PCOUNT), b.op((11)), b.op((11)), b.op((11)), b.get(L_SLOT_AT).i32(1).op((106)).set(L_SLOT_AT).op((12), 0).op((11)).op((11)), b.get(L_GZ).get(L_HZ).op((70)).op((13), 1), b.get(L_GZ).i32(1).op((106)).set(L_GZ).op((12), 0).op((11)).op((11)), b.get(L_GY).get(L_HY).op((70)).op((13), 1), b.get(L_GY).i32(1).op((106)).set(L_GY).op((12), 0).op((11)).op((11)), b.get(L_GX).get(L_HX).op((70)).op((13), 1), b.get(L_GX).i32(1).op((106)).set(L_GX).op((12), 0).op((11)).op((11)), b.op((11)), b.get(L_LANE).i32(1).op((106)).set(L_LANE).op((12), 0).op((11)).op((11)), b.get(L_PCOUNT).op((4), (64)), !chunk(from, to, () => b.get(L_PCOUNT))) ? false : (b.op((11)), b.op((11)), true);
1305
+ };
1306
+ b.get(P_ROWS).op((69)).op((4), (64)), b.op((2), (64)).op((3), (64)), b.get(L_I).i32((4) * (2)).op((106)).get(P_N).op((75)).op((13), 1);
1307
+ for (let copy = 0; copy < (2); copy++) {
1308
+ if (chunkRows("full"), !emitRange(start, end, false)) return null;
1309
+ advance();
1310
+ }
1311
+ if (b.op((12), 0).op((11)).op((11)), b.op((2), (64)).op((3), (64)), b.get(L_I).i32((4)).op((106)).get(P_N).op((75)).op((13), 1), chunkRows("full"), !emitRange(start, end, false) || (advance(), b.op((12), 0).op((11)).op((11)), b.get(L_I).get(P_N).op((73)).op((4), (64)), chunkRows("tail"), !emitRange(start, end, false)) || (b.op((11)), b.op((5)), b.op((2), (64)).op((3), (64)), b.get(L_I).get(P_N).op((73)).op((69)).op((13), 1), chunkRows("list"), !emitRange(start, end, false))) return null;
1312
+ advance(), b.op((12), 0).op((11)).op((11)), b.op((11)).op((11));
1313
+ let body = [];
1314
+ uleb2(body, 3), uleb2(body, i32Locals), body.push((127)), uleb2(body, f32Locals), body.push((125)), uleb2(body, v128Locals), body.push((123));
1315
+ for (let x of b.code) body.push(x);
1316
+ return body;
1317
+ }
1318
+ var GROUP_VALUE = new Float32Array(1), GROUP_BITS = new Uint32Array(GROUP_VALUE.buffer), groupCursor = new Uint32Array(0);
1319
+ function groupOf(groups, isFloat, fallback, raw) {
1320
+ for (let g = 0; g < groups.length; g++)
1321
+ if (!groups[g].isDefault) {
1322
+ if (isFloat) {
1323
+ if (GROUP_BITS[0] = groups[g].value, raw === GROUP_VALUE[0]) return g;
1324
+ } else if (raw >>> 0 === groups[g].value >>> 0) return g;
1325
+ }
1326
+ return fallback;
1327
+ }
1328
+ function bucketGroups(program, state, count, rows, offsets) {
1329
+ let groups = program.groups, isFloat = program.slots[program.state].kind === 0, fallback = -1;
1330
+ for (let g = 0; g < groups.length; g++)
1331
+ if (groups[g].isDefault) {
1332
+ fallback = g;
1333
+ break;
1334
+ }
1335
+ offsets.fill(0);
1336
+ for (let row = 0; row < count; row++) {
1337
+ let g = groupOf(groups, isFloat, fallback, state[row]);
1338
+ g >= 0 && offsets[g + 1]++;
1339
+ }
1340
+ for (let g = 1; g <= groups.length; g++) offsets[g] += offsets[g - 1];
1341
+ groupCursor.length < groups.length && (groupCursor = new Uint32Array(groups.length));
1342
+ let cursor = groupCursor;
1343
+ for (let g = 0; g < groups.length; g++) cursor[g] = offsets[g];
1344
+ for (let row = 0; row < count; row++) {
1345
+ let g = groupOf(groups, isFloat, fallback, state[row]);
1346
+ g >= 0 && (rows[cursor[g]++] = row);
1347
+ }
1348
+ }
1349
+ function wasmExportName(group) {
1350
+ return group < 0 ? "run" : `g${group}`;
1351
+ }
1352
+ function compileWasmKernel(program, storages, sharedMaxPages = null) {
1353
+ if (!wasmSupports(program, storages)) return null;
1354
+ let plan = staged(program) ? wasmStages(program) : null, ranges = plan !== null ? plan.map((p) => [p.start, p.end]) : program.state >= 0 ? program.groups.map((g) => [g.start, g.end]) : [[0, program.code.length]], bodies = [], fmathBase = IMPORTS.length + ranges.length, usesFmath = program.code.some((i) => FMATH_OPS.has(i.op)), usesNoise = program.code.some((i) => NOISE_OPS.has(i.op)), fmathCount = usesFmath ? WASM_FMATH.length + WASM_FMATH_SIMD.length : 0, noiseBase = fmathBase + fmathCount;
1355
+ for (let [start, end] of ranges) {
1356
+ let body = functionBody(program, storages, start, end, fmathBase, noiseBase);
1357
+ if (body === null) return null;
1358
+ bodies.push(body);
1359
+ }
1360
+ let internal = [...usesFmath ? [...wasmFmathBodies(), ...wasmFmathSimdBodies(fmathBase)] : [], ...usesNoise ? wasmNoiseBodies() : []], internalType = (k) => k >= fmathCount ? WASM_NOISE[k - fmathCount] === "noise3" ? (4) : (3) : k >= WASM_FMATH.length ? (8) : WASM_FMATH_BINARY.has(WASM_FMATH[k]) ? (3) : (2), out = [0, 97, 115, 109, 1, 0, 0, 0], types = [];
1361
+ uleb2(types, 9), types.push(96, 1, (125), 1, (127)), types.push(96, 5, (127), (127), (127), (127), (127), 0), types.push(96, 1, (125), 1, (125)), types.push(96, 2, (125), (125), 1, (125)), types.push(96, 3, (125), (125), (125), 1, (125)), types.push(96, 3, (127), (127), (127), 0), types.push(96, 6, (127), (127), (127), (127), (127), (127), 1, (127)), types.push(96, 4, (127), (127), (127), (127), 0), types.push(96, 1, (123), 1, (123)), section(out, 1, types);
1362
+ let imports = [];
1363
+ uleb2(imports, IMPORTS.length + 1);
1364
+ for (let fn of IMPORTS)
1365
+ name(imports, "env"), name(imports, fn), imports.push(0), uleb2(imports, IMPORT_TYPE[fn]);
1366
+ name(imports, "env"), name(imports, "memory"), sharedMaxPages === null ? imports.push(2, 0, 1) : (imports.push(2, 3, 1), uleb2(imports, sharedMaxPages)), section(out, 2, imports);
1367
+ let functions = [];
1368
+ uleb2(functions, bodies.length + internal.length);
1369
+ for (let k = 0; k < bodies.length; k++) uleb2(functions, 1);
1370
+ for (let k = 0; k < internal.length; k++) uleb2(functions, internalType(k));
1371
+ section(out, 3, functions);
1372
+ let exports = [];
1373
+ uleb2(exports, bodies.length), bodies.forEach((_, k) => {
1374
+ name(exports, plan !== null ? wasmStageName(k) : wasmExportName(program.state >= 0 ? k : -1)), exports.push(0), uleb2(exports, k + IMPORTS.length);
1375
+ }), section(out, 7, exports);
1376
+ let codeSection = [];
1377
+ uleb2(codeSection, bodies.length + internal.length);
1378
+ for (let body of [...bodies, ...internal]) {
1379
+ uleb2(codeSection, body.length);
1380
+ for (let x of body) codeSection.push(x);
1381
+ }
1382
+ return section(out, 10, codeSection), { bytes: new Uint8Array(out), slots: program.slots.length, groups: plan === null && program.state >= 0 ? bodies.length : 0, stages: plan === null ? [] : plan.map((p) => p.stage) };
1383
+ }
1384
+ function trips(b, local, flags, tmp) {
1385
+ let get = () => b.get(local);
1386
+ (flags & LOOP_COUNT_F32) !== 0 ? (get().op((190)).op((141)).op((252)), uleb2(b.code, (1)), b.i32(0), get().op((190)).f32(0).op((94)), b.op((27))) : b.i32(0).get(local).get(local).i32(0).op((72)).op((27)), b.tee(tmp).i32(65536).get(tmp).i32(65536).op((72)).op((27));
1387
+ }
1388
+ function readAsBits(kind, storage, raw) {
1389
+ if (kind === 0)
1390
+ return storage === 0 ? raw >>> 0 : storage === 1 ? f32Bits(Math.fround(raw | 0)) : storage === 2 ? f32Bits(Math.fround(raw >>> 0)) : f32Bits(raw & (255));
1391
+ if (kind === 3) {
1392
+ if (storage === 0) {
1393
+ let f3 = f32From(raw);
1394
+ return f3 !== 0 && !Number.isNaN(f3) ? 4294967295 : 0;
1395
+ }
1396
+ return (storage === 3 ? raw & (255) : raw) !== 0 ? 4294967295 : 0;
1397
+ }
1398
+ return storage === 0 ? f32From(raw) | 0 : (storage === 3 ? raw & (255) : raw) >>> 0;
1399
+ }
1400
+ var WasmKernelHost = class {
1401
+ constructor(program, capacity, memory, alloc, eventCapacity = DEFAULT_EVENT_CAPACITY) {
1402
+ this.program = program;
1403
+ this.capacity = capacity;
1404
+ this.memory = memory;
1405
+ this.shape = { kind: 0, vx: 0, vy: 0, vz: 0, p0: 0, p1: 0, p2: 0, reach: 0 };
1406
+ this.stopped = new Uint8Array((4));
1407
+ this.pairs = 0;
1408
+ this.heapBuffer = null;
1409
+ this.u32 = new Uint32Array(0);
1410
+ this.f32 = new Float32Array(0);
1411
+ this.i32 = new Int32Array(0);
1412
+ this.u8 = new Uint8Array(0);
1413
+ this.ctxWords = new Uint32Array(0);
1414
+ this.stageView = new Uint32Array(0);
1415
+ this.snapshotColumns = [];
1416
+ this.snapshotAxes = [];
1417
+ this.neighbourIndex = null;
1418
+ this.rowCells = new Int32Array(0);
1419
+ this.eventOrder = new Uint32Array(0);
1420
+ this.eventScratch = new Uint32Array(0);
1421
+ let table = (1024);
1422
+ for (; table < capacity * (2); ) table *= 2;
1423
+ this.table = table, this.snapshots = program.slots.filter((s) => s.neighbour).length, this.stageCapacity = program.channels.length > 0 ? eventCapacity * (2) : 0, this.bucket = new Uint32Array(program.position === null ? 0 : capacity), this.ring = new Uint32Array(RING_HEADER_WORDS + (program.channels.length > 0 ? eventCapacity * 10 : 0));
1424
+ let grid = program.position === null ? 0 : (table + 1 + capacity * 3 + capacity * 4) * (4), queries = program.position !== null && wasmQueries(program);
1425
+ this.pairCapacity = queries ? (4) * capacity + (4) : 0, this.grid = queries ? new CellGrid(capacity) : null, this.search = queries ? new QuerySearch(capacity) : null;
1426
+ let queryBytes = queries ? QUERY_SCRATCH_BYTES + 2 * this.pairCapacity * (4) : 0, lanes = !staged(program) && laneOps(program), bytes = (208) + this.snapshots * capacity * (4) + grid + this.stageCapacity * STAGE_WORDS * (4) + queryBytes + (lanes ? LANE_SCRATCH_BYTES : 0);
1427
+ this.ctx = alloc(bytes);
1428
+ let words = new Uint32Array(memory.buffer, this.ctx, (208) / (4));
1429
+ words.fill(0);
1430
+ let at = this.ctx + (208), take = (n) => {
1431
+ let here = at;
1432
+ return at += n * (4), here;
1433
+ };
1434
+ words[(0) / (4)] = take(this.snapshots * capacity), words[(4) / (4)] = capacity, program.position !== null && (words[(8) / (4)] = take(table + 1), words[(12) / (4)] = take(capacity * 3), words[(16) / (4)] = take(capacity), words[(20) / (4)] = take(capacity), words[(24) / (4)] = take(capacity), words[(28) / (4)] = take(capacity), words[(32) / (4)] = table - 1, words[(52) / (4)] = program.position[2] === 4294967295 ? 1 : 0), words[(64) / (4)] = take(this.stageCapacity * STAGE_WORDS), words[(68) / (4)] = this.stageCapacity, lanes && (words[(192) / (4)] = take(LANE_SCRATCH_BYTES / (4))), queries && (words[(76) / (4)] = take(QUERY_SCRATCH_BYTES / (4)), words[(56) / (4)] = take(this.pairCapacity), words[(60) / (4)] = take(this.pairCapacity), QUERY_HOSTS.set(this.ctx >>> 0, this));
1435
+ }
1436
+ dispose() {
1437
+ QUERY_HOSTS.delete(this.ctx >>> 0);
1438
+ }
1439
+ heap() {
1440
+ let buffer = this.memory.buffer;
1441
+ if (buffer === this.heapBuffer) return;
1442
+ this.heapBuffer = buffer, this.u32 = new Uint32Array(buffer), this.f32 = new Float32Array(buffer), this.i32 = new Int32Array(buffer), this.u8 = new Uint8Array(buffer);
1443
+ let words = new Uint32Array(buffer, this.ctx, (208) / (4));
1444
+ this.ctxWords = words;
1445
+ let snapshot = words[(0) / (4)], columns = [], axes = [];
1446
+ for (let k = 0; k < this.snapshots; k++) {
1447
+ let at = snapshot + k * this.capacity * (4);
1448
+ columns.push(new Uint32Array(buffer, at, this.capacity)), axes.push(new Float32Array(buffer, at, this.capacity));
1449
+ }
1450
+ this.snapshotColumns = columns, this.snapshotAxes = axes, this.stageView = this.stageCapacity === 0 ? new Uint32Array(0) : new Uint32Array(buffer, words[(64) / (4)], this.stageCapacity * STAGE_WORDS);
1451
+ }
1452
+ neighbourOf(slot) {
1453
+ let index = this.neighbourIndex;
1454
+ if (index === null) {
1455
+ let slots = this.program.slots;
1456
+ index = new Int32Array(slots.length + 1);
1457
+ let k = 0;
1458
+ for (let s = 0; s <= slots.length; s++)
1459
+ index[s] = k, s < slots.length && slots[s].neighbour && k++;
1460
+ this.neighbourIndex = index;
1461
+ }
1462
+ return index[slot];
1463
+ }
1464
+ snapshotColumn(slot) {
1465
+ return this.heap(), this.snapshotColumns[this.neighbourOf(slot)];
1466
+ }
1467
+ axis(slot) {
1468
+ return this.heap(), this.snapshotAxes[this.neighbourOf(slot)];
1469
+ }
1470
+ query(params, rows, kind, filter, mode) {
1471
+ let grid = this.grid, search = this.search, position = this.program.position;
1472
+ this.heap();
1473
+ let u32 = this.u32, f32 = this.f32, at = params >>> 2, xs = this.axis(position[0]), ys = this.axis(position[1]), zs = position[2] === 4294967295 ? null : this.axis(position[2]), filterColumn = filter >>> 0 === 4294967295 ? null : this.snapshotColumn(filter >>> 0), words = this.words(), lanes = words[(56) / (4)] >>> 2, out = words[(60) / (4)] >>> 2, s = this.shape;
1474
+ s.kind = kind, this.stopped.fill(0);
1475
+ let pairs = 0;
1476
+ for (let lane = 0; lane < (4); lane++) {
1477
+ if (u32[at + lane] === 0) continue;
1478
+ let row = u32[(rows >>> 2) + lane];
1479
+ s.reach = f32[at + (4) + lane], s.vx = f32[at + 3 * (4) + lane], s.vy = f32[at + 4 * (4) + lane], s.vz = f32[at + 5 * (4) + lane], s.p0 = f32[at + 6 * (4) + lane], s.p1 = f32[at + 7 * (4) + lane], s.p2 = f32[at + 8 * (4) + lane];
1480
+ let found = search.runFrom(grid, s, mode, u32, at + 9 * (4) + lane, at + 10 * (4) + lane, at + 2 * (4) + lane, filterColumn, xs, ys, zs, row);
1481
+ for (let k = 0; k < found; k++)
1482
+ u32[lanes + pairs] = lane, u32[out + pairs] = search.rows[k], pairs++;
1483
+ }
1484
+ if (this.pairs = pairs, pairs > 0)
1485
+ for (let pad = pairs; pad % (4) !== 0; pad++)
1486
+ u32[lanes + pad] = u32[lanes + pairs - 1], u32[out + pad] = u32[out + pairs - 1];
1487
+ return pairs;
1488
+ }
1489
+ keep(stops, p, out) {
1490
+ this.heap();
1491
+ let u32 = this.u32, lanes = this.words()[(56) / (4)] >>> 2;
1492
+ for (let q = 0; q < (4); q++) {
1493
+ let at = p + q, keep = 0;
1494
+ if (at < this.pairs) {
1495
+ let lane = u32[lanes + at];
1496
+ this.stopped[lane] === 0 && (keep = 4294967295, u32[(stops >>> 2) + q] !== 0 && (this.stopped[lane] = 1));
1497
+ }
1498
+ u32[(out >>> 2) + q] = keep;
1499
+ }
1500
+ }
1501
+ words() {
1502
+ return this.heap(), this.ctxWords;
1503
+ }
1504
+ prepare(columns, count, uniforms) {
1505
+ let p = this.program, words = this.words();
1506
+ if (words[(72) / (4)] = 0, p.position === null) return 0;
1507
+ let u32 = this.u32, u8 = this.u8, snapshot = words[(0) / (4)] / (4), k = 0, slots = p.slots;
1508
+ for (let index = 0; index < slots.length; index++) {
1509
+ let slot = slots[index];
1510
+ if (!slot.neighbour) continue;
1511
+ let column = columns[index], base = snapshot + k * this.capacity;
1512
+ for (let row = 0; row < count; row++) {
1513
+ let raw = column.storage === 3 ? u8[column.at + row] : u32[column.at / (4) + row];
1514
+ u32[base + row] = readAsBits(slot.kind, column.storage, raw);
1515
+ }
1516
+ k++;
1517
+ }
1518
+ let f32 = this.f32, radius = f32From(uniforms[p.radius & 2147483647]), position = p.position, x = position[0], y = position[1], z = position[2];
1519
+ if (this.grid !== null && this.grid.rebuild(radius, this.axis(x), this.axis(y), z === 4294967295 ? null : this.axis(z), count), words[(48) / (4)] = 0, words[(40) / (4)] = f32Bits(radius), !(radius > 0) || !Number.isFinite(radius)) return 0;
1520
+ let inverse = Math.fround(1 / radius);
1521
+ words[(36) / (4)] = f32Bits(inverse), words[(44) / (4)] = f32Bits(Math.fround(radius * radius));
1522
+ let xs = snapshot + this.neighbourOf(x) * this.capacity, ys = snapshot + this.neighbourOf(y) * this.capacity, zs = z === 4294967295 ? -1 : snapshot + this.neighbourOf(z) * this.capacity, mask = this.table - 1, starts = words[(8) / (4)] / (4), cells = words[(12) / (4)] / (4), gx = words[(16) / (4)] / (4), gy = words[(20) / (4)] / (4), gz = words[(24) / (4)] / (4), rows = words[(28) / (4)] / (4), i32 = this.i32;
1523
+ u32.fill(0, starts, starts + this.table + 1), this.rowCells.length < count * 3 && (this.rowCells = new Int32Array(this.capacity * 3));
1524
+ let rowCells = this.rowCells;
1525
+ for (let row = 0; row < count; row++) {
1526
+ let fx = Math.floor(Math.fround(f32[xs + row] * inverse)), fy = Math.floor(Math.fround(f32[ys + row] * inverse)), fz = Math.floor(Math.fround((zs < 0 ? 0 : f32[zs + row]) * inverse)), cx = fx !== fx ? 0 : fx >= (2147483648) ? (2147483648) - 1 : fx < -(2147483648) ? -(2147483648) : fx | 0, cy = fy !== fy ? 0 : fy >= (2147483648) ? (2147483648) - 1 : fy < -(2147483648) ? -(2147483648) : fy | 0, cz = fz !== fz ? 0 : fz >= (2147483648) ? (2147483648) - 1 : fz < -(2147483648) ? -(2147483648) : fz | 0;
1527
+ rowCells[3 * row] = cx, rowCells[3 * row + 1] = cy, rowCells[3 * row + 2] = cz;
1528
+ let bucket = cy + Math.imul(cx, (1021)) + Math.imul(cz, (65539)) & mask;
1529
+ this.bucket[row] = bucket >>> 0, u32[starts + bucket + 1]++;
1530
+ }
1531
+ for (let at = 1; at <= this.table; at++) u32[starts + at] += u32[starts + at - 1];
1532
+ for (let row = 0; row < count; row++) {
1533
+ let bucket = this.bucket[row], slot = u32[starts + bucket]++, zv = zs < 0 ? 0 : f32[zs + row];
1534
+ u32[rows + slot] = row, f32[gx + slot] = f32[xs + row], f32[gy + slot] = f32[ys + row], f32[gz + slot] = zv, i32[cells + 3 * slot] = rowCells[3 * row], i32[cells + 3 * slot + 1] = rowCells[3 * row + 1], i32[cells + 3 * slot + 2] = rowCells[3 * row + 2];
1535
+ }
1536
+ for (let at = this.table; at > 0; at--) u32[starts + at] = u32[starts + at - 1];
1537
+ return u32[starts] = 0, words[(48) / (4)] = count, words[(28) / (4)];
1538
+ }
1539
+ flush() {
1540
+ if (this.stageCapacity === 0) return;
1541
+ let words = this.words(), attempted = words[(72) / (4)], stored = Math.min(attempted, this.stageCapacity), stage = this.stageView, order = this.sortedEvents(stage, stored), ring = this.ring, capacity = (ring.length - RING_HEADER_WORDS) / 10, count = ring[RING_COUNT], dropped = ring[RING_DROPPED] + (attempted - stored), payload = STAGE_WORDS - 2 - (8);
1542
+ for (let i = 0; i < stored; i++) {
1543
+ if (count >= capacity) {
1544
+ dropped++;
1545
+ continue;
1546
+ }
1547
+ let from = order[i] * STAGE_WORDS + 2 + (8), to = RING_HEADER_WORDS + count * 10;
1548
+ for (let w = 0; w < payload; w++) ring[to + w] = stage[from + w];
1549
+ count++;
1550
+ }
1551
+ ring[RING_COUNT] = count, ring[RING_DROPPED] = dropped, words[(72) / (4)] = 0;
1552
+ }
1553
+ eventBefore(stage, a, b) {
1554
+ let pa = a * STAGE_WORDS, pb = b * STAGE_WORDS;
1555
+ for (let w = 0; w < 2 + (8); w++) {
1556
+ let d = stage[pa + w] - stage[pb + w];
1557
+ if (d !== 0) return d < 0;
1558
+ }
1559
+ return false;
1560
+ }
1561
+ sortedEvents(stage, stored) {
1562
+ this.eventOrder.length < stored && (this.eventOrder = new Uint32Array(this.stageCapacity), this.eventScratch = new Uint32Array(this.stageCapacity));
1563
+ let from = this.eventOrder, into = this.eventScratch;
1564
+ for (let k = 0; k < stored; k++) from[k] = k;
1565
+ for (let width = 1; width < stored; width *= 2) {
1566
+ for (let lo = 0; lo < stored; lo += 2 * width) {
1567
+ let mid = Math.min(lo + width, stored), hi = Math.min(lo + 2 * width, stored), i = lo, j = mid, out = lo;
1568
+ for (; i < mid && j < hi; ) into[out++] = this.eventBefore(stage, from[j], from[i]) ? from[j++] : from[i++];
1569
+ for (; i < mid; ) into[out++] = from[i++];
1570
+ for (; j < hi; ) into[out++] = from[j++];
1571
+ }
1572
+ let swap = from;
1573
+ from = into, into = swap;
1574
+ }
1575
+ return from;
1576
+ }
1577
+ clearEvents() {
1578
+ this.ring[RING_COUNT] = 0, this.ring[RING_DROPPED] = 0;
1579
+ }
1580
+ };
1581
+
1582
+ // src/game/kernel/native.ts
1583
+ var FEATURE_NAME_BYTES = 64, ADVERTISED = /* @__PURE__ */ new WeakMap();
1584
+ function kernelEngineFeatures(engine) {
1585
+ let known2 = ADVERTISED.get(engine.exports);
1586
+ if (known2 !== void 0) return known2;
1587
+ let exports = engine.exports, count = exports.engine_feature_count, name2 = exports.engine_feature_name, found = /* @__PURE__ */ new Set();
1588
+ if (typeof count == "function" && typeof name2 == "function") {
1589
+ let scratch2 = engine.exports.engine_alloc((64), 1);
1590
+ if (scratch2 !== 0) {
1591
+ let decoder = new TextDecoder();
1592
+ for (let i = 0; i < count(); i++) {
1593
+ let length = name2(i, scratch2, (64));
1594
+ length > 0 && length <= (64) && found.add(decoder.decode(new Uint8Array(engine.memory.buffer, scratch2, length).slice()));
1595
+ }
1596
+ engine.exports.engine_free(scratch2, (64), 1);
1597
+ }
1598
+ }
1599
+ return ADVERTISED.set(engine.exports, found), found;
1600
+ }
1601
+ var NO_LIST = 255, WORD2 = 4, MAX_ARG_WORDS = 64, TRUE_BITS = 4294967295, AXES2 = ["x", "y", "z", "w"];
1602
+ function bindKernelEngine(symbols, memory) {
1603
+ for (let name2 of KERNEL_EXPORT_NAMES) if (typeof symbols[name2] != "function") return null;
1604
+ if (typeof symbols.engine_alloc != "function" || typeof symbols.engine_free != "function") return null;
1605
+ let exports = symbols, isa = typeof symbols.engine_kernel_isa_max == "function" ? symbols.engine_kernel_isa_max() : exports.engine_kernel_isa();
1606
+ if (isa < 1) return null;
1607
+ let attach = typeof symbols.engine_kernel_attach == "function" ? symbols.engine_kernel_attach : null, attachHandle = typeof symbols.engine_kernel_attach_handle == "function" ? symbols.engine_kernel_attach_handle : null, spawns = typeof symbols.engine_kernel_spawns == "function" ? symbols.engine_kernel_spawns : null, data = KERNEL_DATA_EXPORT_NAMES.every((name2) => typeof symbols[name2] == "function") ? {
1608
+ bindTable: symbols.engine_kernel_bind_table,
1609
+ bindPool: symbols.engine_kernel_bind_pool,
1610
+ report: symbols.engine_kernel_data
1611
+ } : null, runRegion = typeof symbols.engine_kernel_run_region == "function" ? symbols.engine_kernel_run_region : null;
1612
+ return { exports, memory, isa, attach, attachHandle, spawns, data, runRegion };
1613
+ }
1614
+ function check(code, what) {
1615
+ if (code >= 0) return code;
1616
+ throw code === -1 ? new GameError("capacity_exceeded", `${what}: the engine is out of kernel slots`) : code === -3 ? new GameError("unknown_resource", `${what}: the kernel or table is gone`) : code === -5 ? new GameError("unsupported_feature", `${what}: the engine does not run this kernel instruction set`) : code === COMPUTE_STOPPED ? new GameError("capacity_exceeded", `${what}: the kernel ran too long and was stopped so the game stays responsive; split the work across frames or lower its row count`) : new GameError("invalid_argument", `${what}: the engine refused the kernel (${code})`);
1617
+ }
1618
+ var H_COLUMN_TABLE = 32, MAX_SLOTS = 256, MAX_SHARED_PAGES = 65536, VECTOR_ALIGN = 16;
1619
+ function sharedBuffer(buffer) {
1620
+ return Object.prototype.toString.call(buffer) === "[object SharedArrayBuffer]";
1621
+ }
1622
+ function sameTables(a, b) {
1623
+ if (a === null || b === null) return a === b;
1624
+ if (a.length !== b.length) return false;
1625
+ for (let k = 0; k < a.length; k++) if (a[k] !== b[k] || !a[k].valid) return false;
1626
+ return true;
1627
+ }
1628
+ function isEntityTable(value) {
1629
+ return typeof value == "object" && value !== null && "schema" in value && "capacity" in value && "values" in value;
1630
+ }
1631
+ function allNative(tables) {
1632
+ for (let k = 0; k < tables.length; k++) if (!tables[k].native) return false;
1633
+ return true;
1634
+ }
1635
+ function slotsSpawnOrScratch(program) {
1636
+ let slots = program.slots;
1637
+ for (let k = 0; k < slots.length; k++) if (slots[k].spawn || slots[k].scratch) return true;
1638
+ return false;
1639
+ }
1640
+ function sameStorages(known2, fresh) {
1641
+ if (known2.length !== fresh.length) return false;
1642
+ for (let k = 0; k < fresh.length; k++) if (known2[k] !== fresh[k]) return false;
1643
+ return true;
1644
+ }
1645
+ var NativeKernels = class {
1646
+ constructor(engine) {
1647
+ this.engine = engine;
1648
+ this.programs = /* @__PURE__ */ new Map();
1649
+ this.bindings = /* @__PURE__ */ new Map();
1650
+ this.argsAt = 0;
1651
+ this.argsBuffer = null;
1652
+ this.words = new Uint32Array(0);
1653
+ this.floats = new Float32Array(0);
1654
+ this.world = null;
1655
+ this.into = null;
1656
+ this.priority = 0;
1657
+ this.compute = null;
1658
+ this.report = { spawned: 0, dropped: 0, killed: 0 };
1659
+ this.spawnStats = new Uint32Array(0);
1660
+ this.spawnCounts = { spawned: 0, dropped: 0, killed: 0 };
1661
+ this.columnsView = new Uint32Array(0);
1662
+ this.recordsView = new Uint32Array(0);
1663
+ this.hookBinding = 0;
1664
+ this.hookDispatched = 0;
1665
+ this.hookStage = null;
1666
+ this.hookCtxs = /* @__PURE__ */ new Set();
1667
+ this.dataHook = (pc, chunk) => {
1668
+ let code = this.hookData(this.hookBinding, pc, this.hookDispatched, chunk);
1669
+ code < 0 && check(code, "running a data op from a kernel");
1670
+ };
1671
+ this.hookData = null;
1672
+ this.reportCopies = /* @__PURE__ */ new Map();
1673
+ this.heapView = new Uint32Array(0);
1674
+ this.joinedTables = /* @__PURE__ */ new Map();
1675
+ this.scalarMaps = /* @__PURE__ */ new Map();
1676
+ this.staged = /* @__PURE__ */ new Map();
1677
+ this.stagedRuns = 0;
1678
+ this.compiledRuns = 0;
1679
+ this.recordsAt = 0;
1680
+ this.recordsCapacity = 0;
1681
+ this.compiled = /* @__PURE__ */ new Map();
1682
+ this.columnsAt = 0;
1683
+ this.compiling = /* @__PURE__ */ new Set();
1684
+ this.groupRowsAt = 0;
1685
+ this.groupRowsCapacity = 0;
1686
+ this.groupRowsView = new Uint32Array(0);
1687
+ this.rings = /* @__PURE__ */ new Map();
1688
+ engine.data !== null && engine.data !== void 0 && setPoolEngine({ alloc: (bytes) => engine.exports.engine_alloc(bytes, (4)), memory: engine.memory });
1689
+ }
1690
+ acceptsData() {
1691
+ return this.engine.data !== null && this.engine.data !== void 0;
1692
+ }
1693
+ accepts(program) {
1694
+ let version = program.byteLength >= 8 ? program[4] : 0;
1695
+ return version < 2 ? true : version >= 3 && (typeof this.engine.attachHandle != "function" || typeof this.engine.spawns != "function") ? false : (this.engine.isa ?? 1) >= version && typeof this.engine.attach == "function";
1696
+ }
1697
+ attach(world) {
1698
+ this.world = world;
1699
+ }
1700
+ copyIn(bytes) {
1701
+ let at = this.engine.exports.engine_alloc(Math.max(bytes.byteLength, (4)), (4));
1702
+ if (at === 0) throw new GameError("capacity_exceeded", "engine memory cannot hold a kernel program");
1703
+ return new Uint8Array(this.engine.memory.buffer, at, bytes.byteLength).set(bytes), at;
1704
+ }
1705
+ program(meta, bytes) {
1706
+ let known2 = this.programs.get(bytes);
1707
+ if (known2 !== void 0) return known2;
1708
+ let exports = this.engine.exports, at = this.copyIn(bytes), id = exports.engine_kernel_load(at, bytes.byteLength);
1709
+ return exports.engine_free(at, Math.max(bytes.byteLength, (4)), (4)), check(id, `loading kernel ${meta.name}`), this.programs.set(bytes, id), id;
1710
+ }
1711
+ binding(meta, bytes, program, table, joined) {
1712
+ let bound = this.bindings.get(bytes);
1713
+ bound === void 0 && (bound = [], this.bindings.set(bytes, bound));
1714
+ let into = this.into !== null && this.into !== table ? this.into : null;
1715
+ for (let k = 0; k < bound.length; k++) {
1716
+ let entry = bound[k];
1717
+ if (entry.table === table && entry.into === into && sameTables(entry.joined, joined) && table.valid && (into === null || into.valid)) return entry.binding;
1718
+ }
1719
+ return this.bindNew(meta, program, table, joined, into, bound);
1720
+ }
1721
+ bindNew(meta, program, table, joined, into, bound) {
1722
+ let exports = this.engine.exports;
1723
+ for (let k = bound.length - 1; k >= 0; k--)
1724
+ bound[k].table.valid && (bound[k].into === null || bound[k].into.valid) || (exports.engine_kernel_unbind(bound[k].binding), this.compute?.unbound(COMPUTE_SPACE_CPU, bound[k].binding), bound.splice(k, 1));
1725
+ let spawnTable = into ?? table, columns = new Uint32Array(meta.slots.length);
1726
+ for (let k = 0; k < meta.slots.length; k++) {
1727
+ let slot = meta.slots[k];
1728
+ if (slot.scratch === true || slot.pool !== void 0) {
1729
+ columns[k] = 4294967295;
1730
+ continue;
1731
+ }
1732
+ let source = slot.spawn === true ? spawnTable : slot.table !== void 0 && slot.table > 0 && joined !== null ? joined[slot.table] : table;
1733
+ if (!(slot.field in source.schema)) throw new GameError("invalid_argument", `kernel ${meta.name} ${slot.spawn === true ? "spawns" : "reads"} ${slot.field}, which the ${slot.spawn === true ? "spawn " : ""}table does not have`);
1734
+ columns[k] = source.column(slot.field, slot.component);
1735
+ }
1736
+ let at = this.copyIn(new Uint8Array(columns.buffer)), binding = exports.engine_kernel_bind(program, table.id, at, columns.length);
1737
+ if (exports.engine_free(at, Math.max(columns.byteLength, (4)), (4)), check(binding, `binding kernel ${meta.name}`), this.compute?.bound(COMPUTE_SPACE_CPU, binding, meta.name, this.priority), into !== null) {
1738
+ let attach = this.engine.attachHandle;
1739
+ if (attach == null) throw new GameError("unsupported_feature", `kernel ${meta.name} spawns into another table; this engine predates kernel_isa_3`);
1740
+ check(attach(binding, ATTACH_SPAWN_TABLE, into.id), `attaching the spawn table to kernel ${meta.name}`);
1741
+ }
1742
+ if (joined !== null) {
1743
+ let data = this.engine.data;
1744
+ for (let t of meta.data?.tables ?? []) check(data.bindTable(binding, t.table, joined[t.table].id), `binding table ${t.name} to kernel ${meta.name}`);
1745
+ meta.slots.forEach((slot, k) => {
1746
+ if (slot.pool === void 0) return;
1747
+ let owner = joined[slot.table ?? 0], pool = listPoolAddress(owner, slot.field, slot.pool, slot.kind, slot.component);
1748
+ if (pool.at === 0) throw new GameError("unsupported_feature", `kernel ${meta.name} keeps the ${slot.field} list outside engine memory`);
1749
+ check(data.bindPool(binding, k, pool.at, pool.words), `binding the ${slot.field} list to kernel ${meta.name}`);
1750
+ });
1751
+ }
1752
+ return bound.push({ table, into, joined: joined === null ? null : joined.slice(), binding }), binding;
1753
+ }
1754
+ spawned(binding, table) {
1755
+ let read = this.engine.spawns;
1756
+ if (read == null) return;
1757
+ let at = read(binding);
1758
+ if (at === 0) return;
1759
+ let buffer = this.engine.memory.buffer, stats = this.spawnStats;
1760
+ (stats.length === 0 || stats.byteOffset !== at || stats.buffer !== buffer) && (stats = new Uint32Array(buffer, at, SPAWN_STATS_WORDS), this.spawnStats = stats);
1761
+ let counts = this.spawnCounts;
1762
+ counts.spawned = stats[0], counts.dropped = stats[1], counts.killed = stats[2];
1763
+ let into = this.into !== null && this.into !== table ? this.into : table;
1764
+ reportSpawns(counts, into, this.report);
1765
+ }
1766
+ columnPointers() {
1767
+ let buffer = this.engine.memory.buffer, view = this.columnsView;
1768
+ return (view.length === 0 || view.byteOffset !== this.columnsAt || view.buffer !== buffer) && (view = new Uint32Array(buffer, this.columnsAt, (256)), this.columnsView = view), view;
1769
+ }
1770
+ recordWords() {
1771
+ let buffer = this.engine.memory.buffer, view = this.recordsView;
1772
+ return (view.length === 0 || view.byteOffset !== this.recordsAt || view.buffer !== buffer) && (view = new Uint32Array(buffer, this.recordsAt, this.recordsCapacity / (4)), this.recordsView = view), view;
1773
+ }
1774
+ armDataHook(ctx, stage, binding) {
1775
+ this.hookStage = stage, this.hookData = stage.engine_kernel_stage_data ?? null, this.hookBinding = binding, this.hookDispatched = 0, !this.hookCtxs.has(ctx) && (this.hookCtxs.add(ctx), setWasmDataHook(ctx, this.dataHook));
1776
+ }
1777
+ disarmDataHook(ctx) {
1778
+ this.hookCtxs.delete(ctx) && setWasmDataHook(ctx, null);
1779
+ }
1780
+ argViews() {
1781
+ let buffer = this.engine.memory.buffer;
1782
+ if (this.argsAt === 0 && (this.argsAt = this.engine.exports.engine_alloc((64) * (4), (4)), this.argsAt === 0))
1783
+ throw new GameError("capacity_exceeded", "engine memory cannot hold kernel arguments");
1784
+ this.argsBuffer !== buffer && (this.words = new Uint32Array(buffer, this.argsAt, (64)), this.floats = new Float32Array(buffer, this.argsAt, (64)), this.argsBuffer = buffer);
1785
+ }
1786
+ writeArg(at, arg, value) {
1787
+ if (arg.kind === "f64" || arg.kind === "u64") return writeWideArg(this.words, at, arg.kind, value);
1788
+ if (arg.width > 1 && (Array.isArray(value) || ArrayBuffer.isView(value))) {
1789
+ let items = value;
1790
+ for (let k = 0; k < arg.width; k++)
1791
+ arg.kind === "f32" ? this.floats[at + k] = items[k] : this.words[at + k] = items[k] >>> 0;
1792
+ return at + arg.width;
1793
+ }
1794
+ if (arg.width > 1) {
1795
+ let vector = value;
1796
+ for (let k = 0; k < arg.width; k++) this.floats[at + k] = vector[AXES2[k]];
1797
+ return at + arg.width;
1798
+ }
1799
+ switch (arg.kind) {
1800
+ case "f32":
1801
+ this.floats[at] = value;
1802
+ break;
1803
+ case "bool":
1804
+ this.words[at] = value ? (4294967295) : 0;
1805
+ break;
1806
+ default:
1807
+ this.words[at] = value >>> 0;
1808
+ }
1809
+ return at + 1;
1810
+ }
1811
+ run(meta, bytes, table, selection, args) {
1812
+ if (!table.native) throw new GameError("unsupported_feature", "native kernels run on engine tables");
1813
+ if (meta.argWords > (64)) throw new GameError("invalid_argument", `kernel ${meta.name} takes more than ${(64)} argument words`);
1814
+ let joined = hasData(meta) ? this.joinedOf(meta, table, args) : null;
1815
+ if (joined !== null && (!this.acceptsData() || !allNative(joined))) throw new GameError("unsupported_feature", `kernel ${meta.name} joins tables; this engine predates native data ops or a joined table is not an engine table`);
1816
+ let scalars = joined === null ? null : this.scalarMap(meta), program = this.program(meta, bytes), binding = this.binding(meta, bytes, program, table, joined);
1817
+ this.argViews();
1818
+ let at = 0, metaArgs = meta.args;
1819
+ for (let k = 0; k < metaArgs.length; k++) {
1820
+ let arg = metaArgs[k], from = scalars === null ? k : scalars[k];
1821
+ arg.width === 1 && arg.kind === "f32" ? this.floats[at++] = args[from] : arg.width === 1 && (arg.kind === "u32" || arg.kind === "i32") ? this.words[at++] = args[from] >>> 0 : at = this.writeArg(at, arg, args[from]);
1822
+ }
1823
+ let calls = bytes.byteLength >= 8 && bytes[4] >= 2, writes = bytes.byteLength >= 8 && bytes[4] >= 3;
1824
+ if (calls) {
1825
+ let h = this.world?.handles() ?? null;
1826
+ if (h === null && !writes) throw new GameError("unsupported_feature", `kernel ${meta.name} calls engine services; attach them with world.kernelServices({ physics, nav, flow, terrain, graphics })`);
1827
+ let attached = this.engine.attach(binding, h?.physics ?? 0, h?.nav ?? 0, h?.flow ?? 0, h?.render ?? 0);
1828
+ if (attached < 0 && check(attached, `attaching services to kernel ${meta.name}`), writes) {
1829
+ let attach = this.engine.attachHandle;
1830
+ attach(binding, ATTACH_UI, h?.ui ?? 0), attach(binding, ATTACH_AUDIO, h?.audio ?? 0), attach(binding, ATTACH_VOXELS, h?.voxels ?? 0), attach(binding, ATTACH_CHEMISTRY_GRID, h?.chemistry ?? 0);
1831
+ }
1832
+ }
1833
+ if (this.runStaged(bytes, table, binding, at, selection))
1834
+ return joined !== null && this.readReport(meta, bytes, binding), writes && this.spawned(binding, table), selection === null ? table.count : selection.length;
1835
+ if (selection === null && this.runCompiled(meta, bytes, table, binding, at))
1836
+ return joined !== null && this.readReport(meta, bytes, binding), table.count;
1837
+ let list = selection ? selection.index : (255);
1838
+ this.compute?.prioritise(COMPUTE_SPACE_CPU, binding, this.priority);
1839
+ let ran = this.engine.exports.engine_kernel_run(binding, list, this.argsAt, at);
1840
+ return ran === COMPUTE_DEFERRED && this.priority !== 0 ? 0 : (ran >= 0 || check(ran, `running kernel ${meta.name}`), joined !== null && this.readReport(meta, bytes, binding), meta.channels !== void 0 && meta.channels.length > 0 && (routeEvents(this.ring(binding), meta.channels), this.engine.exports.engine_kernel_clear_events(binding)), writes && this.spawned(binding, table), ran);
1841
+ }
1842
+ readReport(meta, bytes, binding) {
1843
+ let report = this.engine.data.report(binding);
1844
+ if (report === 0) return;
1845
+ let heap = this.heapWords(), base = report >>> 2, sites = heap[base + DATA_REPORT_HEADER - 1], words = DATA_REPORT_HEADER + sites;
1846
+ for (let s = 0; s < sites; s++) words += heap[base + DATA_REPORT_HEADER + s];
1847
+ let copy = this.reportCopies.get(bytes);
1848
+ copy === void 0 && (copy = { meta, words: new Uint32Array(words), length: 0, report: null }, this.reportCopies.set(bytes, copy)), copy.words.length < words && (copy.words = new Uint32Array(Math.max(words, copy.words.length * 2)));
1849
+ let into = copy.words;
1850
+ for (let k = 0; k < words; k++) into[k] = heap[base + k];
1851
+ copy.meta = meta, copy.length = words, copy.report = null;
1852
+ }
1853
+ dataReport(bytes) {
1854
+ let copy = this.reportCopies.get(bytes);
1855
+ return copy === void 0 ? null : (copy.report === null && (copy.report = readDataReport(copy.meta, copy.words.slice(0, copy.length))), copy.report);
1856
+ }
1857
+ heapWords() {
1858
+ let buffer = this.engine.memory.buffer;
1859
+ return (this.heapView.buffer !== buffer || this.heapView.length === 0) && (this.heapView = new Uint32Array(buffer)), this.heapView;
1860
+ }
1861
+ joinedOf(meta, own, args) {
1862
+ let known2 = this.joinedTables.get(meta), list = meta.data?.tables;
1863
+ if (known2 === void 0) {
1864
+ let fresh = dataTables(meta, own, args);
1865
+ return this.joinedTables.set(meta, fresh), fresh;
1866
+ }
1867
+ if (known2[0] = own, list === void 0) return known2;
1868
+ for (let k = 0; k < list.length; k++) {
1869
+ let t = list[k], value = args[t.position];
1870
+ if (!isEntityTable(value)) return dataTables(meta, own, args);
1871
+ known2[t.table] = value;
1872
+ }
1873
+ return known2;
1874
+ }
1875
+ scalarMap(meta) {
1876
+ let map = this.scalarMaps.get(meta);
1877
+ if (map === void 0) {
1878
+ let skip = meta.data?.tables, positions = [];
1879
+ for (let k = 0; positions.length < meta.args.length; k++) {
1880
+ let table = false;
1881
+ if (skip !== void 0) for (let s = 0; s < skip.length; s++) skip[s].position === k && (table = true);
1882
+ table || positions.push(k);
1883
+ }
1884
+ map = Int32Array.from(positions), this.scalarMaps.set(meta, map);
1885
+ }
1886
+ return map;
1887
+ }
1888
+ runStaged(bytes, table, binding, argWords, selection) {
1889
+ let memory = this.engine.memory, ex = this.engine.exports;
1890
+ if (typeof WebAssembly > "u" || !(memory instanceof WebAssembly.Memory) || typeof ex.engine_kernel_stage_begin != "function") return false;
1891
+ let stage = ex, entry = this.staged.get(bytes);
1892
+ if (entry === void 0) {
1893
+ let program2 = parseProgram(bytes);
1894
+ entry = wasmStaged(program2) ? { program: program2, data: wasmDataOps(program2), storages: "", planned: false, storageWords: new Float64Array(program2.slots.length), probe: new Array(program2.slots.length).fill(0), runs: null, stages: [] } : null, this.staged.set(bytes, entry);
1895
+ }
1896
+ if (entry === null) return false;
1897
+ let count = table.count, rowsAt = 0, n = count;
1898
+ if (selection !== null) {
1899
+ if (entry.program.calls.length > 0 || entry.program.cross.length > 0 || selection.rows.buffer !== memory.buffer) return false;
1900
+ n = selection.length;
1901
+ for (let k = 0; k < n; k++) if (selection.rows[k] >= count) return false;
1902
+ rowsAt = selection.rows.byteOffset;
1903
+ }
1904
+ let stageData = stage.engine_kernel_stage_data;
1905
+ if (entry.data && typeof stageData != "function") return false;
1906
+ let program = entry.program;
1907
+ check(stage.engine_kernel_stage_begin(binding, this.argsAt, argWords), "starting a staged kernel");
1908
+ let probe = entry.probe;
1909
+ for (let k = 0; k < probe.length; k++) probe[k] = stage.engine_kernel_stage_storage(binding, k);
1910
+ if (!entry.planned || !sameStorages(entry.storageWords, probe)) {
1911
+ let storages = probe.slice(), key = storages.join(",");
1912
+ entry.planned = true, entry.storages = key, entry.storageWords.set(storages), entry.runs = null;
1913
+ let plan = compileWasmKernel(program, storages, sharedBuffer(memory.buffer) ? (65536) : null);
1914
+ if (plan !== null) {
1915
+ let target = entry;
1916
+ this.track(
1917
+ instantiateApproved(plan.bytes, wasmKernelImports(memory)).then((instance) => {
1918
+ target.storages === key && (target.stages = plan.stages, target.runs = plan.stages.map((_, k) => instance.exports[wasmStageName(k)]));
1919
+ }).catch(() => {
1920
+ })
1921
+ );
1922
+ }
1923
+ }
1924
+ if (entry.runs === null || this.columnsAt === 0 && (this.columnsAt = this.engine.exports.engine_alloc((256) * (4), (4)), this.columnsAt === 0))
1925
+ return false;
1926
+ let ctxBytes = laneScratchOffset(program) + LANE_SCRATCH_BYTES;
1927
+ if (this.recordsCapacity < ctxBytes && (this.recordsAt !== 0 && (this.disarmDataHook(this.recordsAt), this.engine.exports.engine_free(this.recordsAt, this.recordsCapacity, (16))), this.recordsAt = this.engine.exports.engine_alloc(ctxBytes, (16)), this.recordsCapacity = this.recordsAt === 0 ? 0 : ctxBytes, this.recordsAt === 0))
1928
+ return false;
1929
+ let pointers = this.columnPointers();
1930
+ for (let k = 0; k < program.slots.length; k++) pointers[k] = stage.engine_kernel_stage_column(binding, k);
1931
+ let records = this.recordWords(), cross = program.cross;
1932
+ for (let k = 0; k < cross.length; k++) records[k] = stage.engine_kernel_stage_records(binding, cross[k]);
1933
+ let uniformsAt = stage.engine_kernel_stage_uniforms(binding);
1934
+ entry.data && stageData !== void 0 && this.armDataHook(this.recordsAt, stage, binding);
1935
+ let runs = entry.runs, stages = entry.stages;
1936
+ for (let k = 0; k < stages.length; k++) {
1937
+ let s = stages[k];
1938
+ if (runs[k](this.columnsAt, n, rowsAt, uniformsAt, this.recordsAt), n > 0 && this.hookDispatched++, s.barrier === "call") check(stage.engine_kernel_stage_call(binding, s.pcs[0]), "calling the engine from a kernel");
1939
+ else if (s.barrier === "cross") for (let p = 0; p < s.pcs.length; p++) check(stage.engine_kernel_stage_finish(binding, s.pcs[p]), "finishing a cross-row stage");
1940
+ }
1941
+ return check(stage.engine_kernel_stage_end(binding), "ending a staged kernel"), this.stagedRuns++, true;
1942
+ }
1943
+ compiledEntry(meta, bytes, stage) {
1944
+ let known2 = this.compiled.get(bytes);
1945
+ if (known2 !== void 0) return known2;
1946
+ let program = parseProgram(bytes), data = wasmDataOps(program), usable = !wasmStaged(program) && !slotsSpawnOrScratch(program) && (!data || typeof stage.engine_kernel_stage_data == "function" && typeof stage.engine_kernel_stage_begin == "function"), slots = meta.slots.length, entry = usable ? {
1947
+ runs: null,
1948
+ storages: "",
1949
+ planned: false,
1950
+ program,
1951
+ data,
1952
+ needsHost: wasmNeedsHost(program),
1953
+ offsets: new Uint32Array(program.groups.length + 1),
1954
+ columns: new Int32Array(slots),
1955
+ probe: new Array(slots).fill(0),
1956
+ storageWords: new Float64Array(slots),
1957
+ hostColumns: Array.from({ length: slots }, () => ({ at: 0, storage: 0 })),
1958
+ uniforms: null,
1959
+ host: null,
1960
+ state: null
1961
+ } : null;
1962
+ return this.compiled.set(bytes, entry), entry;
1963
+ }
1964
+ planCompiled(entry, memory) {
1965
+ entry.planned = true;
1966
+ let storages = entry.probe.slice();
1967
+ entry.storageWords.set(storages), entry.storages = storages.join(",");
1968
+ let plan = compileWasmKernel(entry.program, storages, sharedBuffer(memory.buffer) ? (65536) : null);
1969
+ plan !== null && this.track(
1970
+ instantiateApproved(plan.bytes, wasmKernelImports(memory)).then((instance) => {
1971
+ let names = plan.groups > 0 ? Array.from({ length: plan.groups }, (_, g) => wasmExportName(g)) : [wasmExportName(-1)];
1972
+ entry.runs = names.map((name2) => instance.exports[name2]);
1973
+ }).catch(() => {
1974
+ })
1975
+ );
1976
+ }
1977
+ track(job) {
1978
+ this.compiling.add(job), job.finally(() => this.compiling.delete(job));
1979
+ }
1980
+ async settled() {
1981
+ for (; this.compiling.size > 0; ) await Promise.all([...this.compiling]);
1982
+ }
1983
+ finishCompiled(entry, meta, exports, binding) {
1984
+ let host = entry.host;
1985
+ return entry.data && check(exports.engine_kernel_stage_end(binding), "ending a data kernel"), host !== null && meta.channels !== void 0 && meta.channels.length > 0 && (host.flush(), routeEvents(host.ring, meta.channels), host.clearEvents()), true;
1986
+ }
1987
+ stateView(entry, at, storage, capacity) {
1988
+ let buffer = this.engine.memory.buffer, known2 = entry.state, float = storage === 0;
1989
+ if (known2 !== null && known2.buffer === buffer && known2.byteOffset === at && known2.length === capacity && known2 instanceof Float32Array === float) return known2;
1990
+ let view = float ? new Float32Array(buffer, at, capacity) : new Uint32Array(buffer, at, capacity);
1991
+ return entry.state = view, view;
1992
+ }
1993
+ groupRows(capacity) {
1994
+ let buffer = this.engine.memory.buffer, view = this.groupRowsView;
1995
+ return (view.length !== capacity || view.byteOffset !== this.groupRowsAt || view.buffer !== buffer) && (view = new Uint32Array(buffer, this.groupRowsAt, capacity), this.groupRowsView = view), view;
1996
+ }
1997
+ runCompiled(meta, bytes, table, binding, argWords) {
1998
+ let memory = this.engine.memory;
1999
+ if (typeof WebAssembly > "u" || !(memory instanceof WebAssembly.Memory)) return false;
2000
+ let stage = this.engine.exports, entry = this.compiledEntry(meta, bytes, stage);
2001
+ if (entry === null) return false;
2002
+ let exports = stage, data = entry.data;
2003
+ data && check(exports.engine_kernel_stage_begin(binding, this.argsAt, argWords), "starting a data kernel");
2004
+ let slots = meta.slots, columns = entry.columns, probe = entry.probe;
2005
+ if (data) for (let k = 0; k < slots.length; k++) probe[k] = exports.engine_kernel_stage_storage(binding, k);
2006
+ else
2007
+ for (let k = 0; k < slots.length; k++) {
2008
+ let c = table.column(slots[k].field, slots[k].component);
2009
+ columns[k] = c, probe[k] = table.header[(32) + 2 * c + 1];
2010
+ }
2011
+ if (entry.planned || this.planCompiled(entry, memory), entry.runs === null || !sameStorages(entry.storageWords, probe) || this.columnsAt === 0 && (this.columnsAt = this.engine.exports.engine_alloc((256) * (4), (4)), this.columnsAt === 0))
2012
+ return false;
2013
+ let pointers = this.columnPointers();
2014
+ for (let k = 0; k < slots.length; k++) pointers[k] = data ? exports.engine_kernel_stage_column(binding, k) : table.header[(32) + 2 * columns[k]];
2015
+ let count = table.count, program = entry.program, ctx = 0, sorted = 0;
2016
+ if (entry.needsHost) {
2017
+ if (entry.host === null || entry.host.capacity !== table.capacity) {
2018
+ entry.host !== null && (this.disarmDataHook(entry.host.ctx), entry.host.dispose());
2019
+ let alloc = this.engine.exports;
2020
+ entry.host = new WasmKernelHost(program, table.capacity, this.engine.memory, (bytes2) => alloc.engine_alloc(bytes2, (4)));
2021
+ }
2022
+ ctx = entry.host.ctx;
2023
+ let uniforms = entry.uniforms;
2024
+ uniforms === null && (uniforms = program.uniforms.slice(), entry.uniforms = uniforms);
2025
+ let words = this.words;
2026
+ for (let k = 0; k < program.args; k++) uniforms[k] = words[k];
2027
+ let hostColumns = entry.hostColumns;
2028
+ for (let k = 0; k < slots.length; k++)
2029
+ hostColumns[k].at = pointers[k], hostColumns[k].storage = probe[k];
2030
+ sorted = entry.host.prepare(hostColumns, count, uniforms);
2031
+ }
2032
+ this.compiledRuns++, data && this.armDataHook(ctx, exports, binding);
2033
+ let runs = entry.runs;
2034
+ if (program.state < 0)
2035
+ return runs[0](this.columnsAt, count, sorted, this.argsAt, ctx), this.finishCompiled(entry, meta, exports, binding);
2036
+ if (this.groupRowsCapacity < table.capacity && (this.groupRowsAt !== 0 && this.engine.exports.engine_free(this.groupRowsAt, this.groupRowsCapacity * (4), (4)), this.groupRowsAt = this.engine.exports.engine_alloc(table.capacity * (4), (4)), this.groupRowsCapacity = this.groupRowsAt === 0 ? 0 : table.capacity, this.groupRowsAt === 0))
2037
+ return false;
2038
+ let state = this.stateView(entry, pointers[program.state], probe[program.state], table.capacity);
2039
+ bucketGroups(program, state, count, this.groupRows(table.capacity), entry.offsets);
2040
+ let offsets = entry.offsets, flushes = entry.host !== null && meta.channels !== void 0 && meta.channels.length > 0;
2041
+ for (let g = 0; g < runs.length; g++) {
2042
+ let n = offsets[g + 1] - offsets[g];
2043
+ n > 0 && (runs[g](this.columnsAt, n, this.groupRowsAt + offsets[g] * (4), this.argsAt, ctx), this.hookDispatched++, flushes && entry.host.flush());
2044
+ }
2045
+ return this.finishCompiled(entry, meta, exports, binding);
2046
+ }
2047
+ ring(binding) {
2048
+ let known2 = this.rings.get(binding);
2049
+ if (known2 !== void 0 && known2.buffer === this.engine.memory.buffer) return known2;
2050
+ let at = this.engine.exports.engine_kernel_events(binding), view = new Uint32Array(this.engine.memory.buffer, at, RING_HEADER_WORDS + DEFAULT_EVENT_CAPACITY * 10);
2051
+ return this.rings.set(binding, view), view;
2052
+ }
2053
+ dispose() {
2054
+ let exports = this.engine.exports;
2055
+ for (let bound of this.bindings.values()) for (let entry of bound) exports.engine_kernel_unbind(entry.binding);
2056
+ for (let id of this.programs.values()) exports.engine_kernel_unload(id);
2057
+ this.argsAt !== 0 && exports.engine_free(this.argsAt, (64) * (4), (4)), this.bindings.clear(), this.programs.clear(), this.argsAt = 0;
2058
+ }
2059
+ };
2060
+
2061
+ // src/game/nav/types.ts
2062
+ var AGENT_X = 0;
2063
+ var AGENT_STRIDE = 8, AGENT_IDLE = 0, AGENT_REQUESTING = 1, AGENT_MOVING = 2, AGENT_ARRIVED = 3, AGENT_LOST = 4, AGENT_ON_LINK = 5, NO_LINK = -1, POSE_X = 0;
2064
+ var POSE_Z = 2, POSE_DIR_X = 3, POSE_DIR_Z = 4, POSE_SPEED = 5, POSE_LANE = 6, POSE_STRIDE = 8, SIGNAL_GREEN = 0, SIGNAL_AMBER = 1, SIGNAL_RED = 2;
2065
+ var DEFAULT_EXTENTS = [2, 4, 2], MAX_CORNERS = 16;
2066
+
2067
+ // src/game/physics/rules.ts
2068
+ var MAX_COLLIDER_CLASSES = 16, DEFAULT_COLLIDER_CLASS = 0;
2069
+ var RULE_IGNORE = 1, RULE_FRICTION = 2, RULE_RESTITUTION = 4, RULE_ONE_WAY = 8, RULE_CLASS_BITS = 8, RULE_FLAGS_SHIFT = 16, RULE_PAYLOAD_FRICTION = 0, RULE_PAYLOAD_RESTITUTION = 1, RULE_PAYLOAD_ONE_WAY = 2, NO_CONTACT_RULE = {};
2070
+ function checkColliderClass(value) {
2071
+ if (!Number.isInteger(value) || value < 0 || value >= (16))
2072
+ throw new GameError("invalid_argument", `collider classes are integers from 0 to ${(16) - 1}`);
2073
+ return value;
2074
+ }
2075
+ function contactRuleFlags(rule) {
2076
+ return (rule.ignore ? (1) : 0) | (rule.friction !== void 0 ? (2) : 0) | (rule.restitution !== void 0 ? (4) : 0) | (rule.oneWay !== void 0 ? (8) : 0);
2077
+ }
2078
+ function packContactRuleHeader(platform, other, rule) {
2079
+ return (checkColliderClass(platform) | checkColliderClass(other) << (8) | contactRuleFlags(rule) << (16)) >>> 0;
2080
+ }
2081
+ function writeContactRulePayload(rule, floats, offset) {
2082
+ floats[offset + (0)] = rule.friction ?? 0, floats[offset + (1)] = rule.restitution ?? 0;
2083
+ let n = rule.oneWay;
2084
+ if (n === void 0) {
2085
+ floats[offset + (2)] = 0, floats[offset + (2) + 1] = 0, floats[offset + (2) + 2] = 0;
2086
+ return;
2087
+ }
2088
+ let length = Math.hypot(n[0], n[1], n[2]);
2089
+ if (!(length > 0)) throw new GameError("invalid_argument", "a one-way normal must be a non-zero vector");
2090
+ floats[offset + (2)] = n[0] / length, floats[offset + (2) + 1] = n[1] / length, floats[offset + (2) + 2] = n[2] / length;
2091
+ }
2092
+ var TABLE = (16) * (16), NO_VALUE = Number.NaN, ContactRuleTable = class {
2093
+ constructor() {
2094
+ this.flags = new Uint8Array(TABLE);
2095
+ this.friction = new Float32Array(TABLE).fill(NO_VALUE);
2096
+ this.restitution = new Float32Array(TABLE).fill(NO_VALUE);
2097
+ this.normal = new Float32Array(TABLE * 3);
2098
+ this.active = 0;
2099
+ }
2100
+ get count() {
2101
+ return this.active;
2102
+ }
2103
+ set(platform, other, rule) {
2104
+ let a = checkColliderClass(platform), b = checkColliderClass(other);
2105
+ this.write(a * (16) + b, rule, true), a !== b && this.write(b * (16) + a, rule, false);
2106
+ let active = 0;
2107
+ for (let i = 0; i < TABLE; i++) this.flags[i] !== 0 && active++;
2108
+ this.active = active;
2109
+ }
2110
+ index(a, b) {
2111
+ return a * (16) + b;
2112
+ }
2113
+ write(at, rule, oneWay) {
2114
+ let flags = contactRuleFlags(rule) & (oneWay ? 255 : ~(8));
2115
+ this.flags[at] = flags, this.friction[at] = rule.friction ?? NO_VALUE, this.restitution[at] = rule.restitution ?? NO_VALUE;
2116
+ let n = oneWay ? rule.oneWay : void 0, length = n ? Math.hypot(n[0], n[1], n[2]) : 0;
2117
+ this.normal[at * 3] = n && length > 0 ? n[0] / length : 0, this.normal[at * 3 + 1] = n && length > 0 ? n[1] / length : 0, this.normal[at * 3 + 2] = n && length > 0 ? n[2] / length : 0;
2118
+ }
2119
+ };
2120
+
2121
+ // src/game/physics/craft/types.ts
2122
+ var CRAFT_CHANNELS = 16, CRAFT_TELEMETRY_WORDS = 16;
2123
+ var NO_CHANNEL = 255, MAX_FOILS = 16, MAX_THRUSTERS = 8, MAX_ROTORS = 8, MAX_CRAFT_WHEELS = 8, MAX_HULL_POINTS = 512, MAX_HULL_RESOLUTION = 16, MAX_AERO_TABLE = 64, TELEMETRY_SPEED = 0, TELEMETRY_SUBMERGED = 1, TELEMETRY_PLANING = 2, TELEMETRY_BANK = 3, TELEMETRY_AIRSPEED = 4, TELEMETRY_ALPHA = 5, TELEMETRY_STALLED = 6, TELEMETRY_GROUND_EFFECT = 7, TELEMETRY_CONTACTS = 8, TELEMETRY_GEAR = 9, TELEMETRY_SPOOL = 10, TELEMETRY_ROTOR = 11, TELEMETRY_THRUST = 12, TELEMETRY_CLIMB = 13, TELEMETRY_APPARENT_WIND = 14, TELEMETRY_PITCH = 15, BOAT_THROTTLE = 0, BOAT_STEER = 1, BOAT_SHEET = 2, FLIGHT_PITCH = 0, FLIGHT_ROLL = 1, FLIGHT_YAW = 2, FLIGHT_THROTTLE = 3, FLIGHT_FLAPS = 4, FLIGHT_BRAKE = 5, FLIGHT_GEAR = 6, FLIGHT_TILT = 7, ROTOR_COLLECTIVE = 0, ROTOR_CYCLIC_PITCH = 1, ROTOR_CYCLIC_ROLL = 2, ROTOR_PEDAL = 3, ROTOR_ENGINE = 4, CRAFT_PRESETS = [
2124
+ "canoe",
2125
+ "speedboat",
2126
+ "ferry",
2127
+ "cargo_ship",
2128
+ "sailboat",
2129
+ "light_plane",
2130
+ "jet",
2131
+ "glider",
2132
+ "helicopter",
2133
+ "quadcopter",
2134
+ "tiltrotor",
2135
+ "blimp"
2136
+ ];
2137
+ function mix(channel, gain, bias = 0) {
2138
+ let gains = Array.from({ length: 16 }, (_, i) => i === channel ? gain : 0);
2139
+ return { bias, gains };
2140
+ }
2141
+ function mixWith(base, channel, gain) {
2142
+ let gains = Array.from({ length: 16 }, (_, i) => base.gains?.[i] ?? 0);
2143
+ return gains[channel] = gain, { bias: base.bias ?? 0, gains };
2144
+ }
2145
+ function constant(bias) {
2146
+ return { bias };
2147
+ }
2148
+
2149
+ // src/game/physics/craft/dmath.ts
2150
+ var f = Math.fround, PI = f(Math.PI), TAU = f(Math.PI * 2), FRAC_PI_2 = f(Math.PI / 2), INV_TAU = f(1 / TAU), FRAC_2_PI = f(2 / Math.PI), ROUND_MAGIC = 12582912, ROUND_LIMIT = 4194304, HALF_PI_A = f(1.5703125), HALF_PI_B = f(4837513e-10), HALF_PI_C = f(754979e-13), SIN_1 = f(-0.16666655), SIN_2 = f(8332161e-9), SIN_3 = f(-19515296e-11), COS_1 = f(0.041666646), COS_2 = f(-0.0013887316), COS_3 = f(24433157e-12), QUADRANT = 0.25, QUADRANT_LOW = 0.125, QUADRANT_HIGH = 0.375, ATAN_0 = f(0.99997726), ATAN_1 = f(-0.33262347), ATAN_2 = f(0.19354346), ATAN_3 = f(-0.11643287), ATAN_4 = f(0.05265332), ATAN_5 = f(-0.0117212), LOG2_E = f(Math.LOG2E), LN2_HI = f(0.69314575), LN2_LO = f(14286068e-13), EXP_2 = 0.5, EXP_3 = f(0.16666667), EXP_4 = f(0.041666668), EXP_5 = f(8333334e-9), EXP_6 = f(0.0013888889), EXP_LIMIT = 87, TANH_LIMIT = 9;
2151
+ function clamp2(x, low, high) {
2152
+ let lifted = x > low ? x : low;
2153
+ return lifted < high ? lifted : high;
2154
+ }
2155
+ function round(x) {
2156
+ return Math.abs(x) < (4194304) ? f(f(x + (12582912)) - (12582912)) : x;
2157
+ }
2158
+ function wrapAngle(x) {
2159
+ return f(x - f(round(f(x * INV_TAU)) * TAU));
2160
+ }
2161
+ function sinCos(x, out) {
2162
+ let n = round(f(x * FRAC_2_PI)), r = f(f(f(x - f(n * HALF_PI_A)) - f(n * HALF_PI_B)) - f(n * HALF_PI_C)), z = f(r * r), s = f(f(f(f(f(f(f(SIN_3 * z) + SIN_2) * z) + SIN_1) * z) * r) + r), c = f(f(1 - f(0.5 * z)) + f(f(z * z) * f(f(f(f(COS_3 * z) + COS_2) * z) + COS_1))), quarter = f(n * (0.25)), q = f(quarter - round(quarter)), aq = Math.abs(q), swap = aq > (0.125) && aq < (0.375), sinNegative = q < -(0.125) || q > (0.375), cosNegative = q > (0.125) || q < -(0.375), sin2 = swap ? c : s, cos = swap ? s : c;
2163
+ return out.sin = sinNegative ? -sin2 : sin2, out.cos = cosNegative ? -cos : cos, out;
2164
+ }
2165
+ var scratch = { sin: 0, cos: 0 };
2166
+ function sin(x) {
2167
+ return sinCos(x, scratch).sin;
2168
+ }
2169
+ function atan2(y, x) {
2170
+ let ax = Math.abs(x), ay = Math.abs(y), big = ax > ay ? ax : ay, small = ax < ay ? ax : ay, a = big > 0 ? f(small / big) : 0, s = f(a * a), r = f(
2171
+ f(f(f(f(f(f(f(f(f(f(ATAN_5 * s) + ATAN_4) * s) + ATAN_3) * s) + ATAN_2) * s) + ATAN_1) * s) + ATAN_0) * a
2172
+ );
2173
+ return ay > ax && (r = f(FRAC_PI_2 - r)), x < 0 && (r = f(PI - r)), y < 0 ? -r : r;
2174
+ }
2175
+ var exponentView = new DataView(new ArrayBuffer(4));
2176
+ function exp(input) {
2177
+ let x = clamp2(f(input), -(87), (87)), n = round(f(x * LOG2_E)), r = f(f(x - f(n * LN2_HI)) - f(n * LN2_LO)), p = f(
2178
+ f(f(f(f(f(f(f(f(f(f(f(EXP_6 * r) + EXP_5) * r) + EXP_4) * r) + EXP_3) * r) + (0.5)) * r) * r) + r) + 1
2179
+ );
2180
+ return exponentView.setUint32(0, n + 127 << 23 >>> 0), f(p * exponentView.getFloat32(0));
2181
+ }
2182
+ function tanh(x) {
2183
+ if (x > (9)) return 1;
2184
+ if (x < -(9)) return -1;
2185
+ let e = exp(f(x + x));
2186
+ return f(f(e - 1) / f(e + 1));
2187
+ }
2188
+ var Basis = class {
2189
+ constructor() {
2190
+ this.rx = 1;
2191
+ this.ry = 0;
2192
+ this.rz = 0;
2193
+ this.ux = 0;
2194
+ this.uy = 1;
2195
+ this.uz = 0;
2196
+ this.bx = 0;
2197
+ this.by = 0;
2198
+ this.bz = 1;
2199
+ }
2200
+ fromQuaternion(x, y, z, w) {
2201
+ let x2 = x + x, y2 = y + y, z2 = z + z, xx = x * x2, xy = x * y2, xz = x * z2, yy = y * y2, yz = y * z2, zz = z * z2, wx = w * x2, wy = w * y2, wz = w * z2;
2202
+ return this.rx = 1 - (yy + zz), this.ry = xy + wz, this.rz = xz - wy, this.ux = xy - wz, this.uy = 1 - (xx + zz), this.uz = yz + wx, this.bx = xz + wy, this.by = yz - wx, this.bz = 1 - (xx + yy), this;
2203
+ }
2204
+ toWorld(x, y, z, out, at = 0) {
2205
+ return out[at] = this.rx * x + this.ux * y + this.bx * z, out[at + 1] = this.ry * x + this.uy * y + this.by * z, out[at + 2] = this.rz * x + this.uz * y + this.bz * z, out;
2206
+ }
2207
+ toLocal(x, y, z, out, at = 0) {
2208
+ return out[at] = this.rx * x + this.ry * y + this.rz * z, out[at + 1] = this.ux * x + this.uy * y + this.uz * z, out[at + 2] = this.bx * x + this.by * y + this.bz * z, out;
2209
+ }
2210
+ };
2211
+
2212
+ // src/game/physics/water.ts
2213
+ var f2 = Math.fround, MAX_WAVES = 16, SEA_WATER_DENSITY = 1025, FRESH_WATER_DENSITY = 1e3, AIR_DENSITY = f2(1.225), DEFAULT_WATER_GRAVITY = f2(9.81), DEFAULT_WATER_ITERATIONS = 2, MAX_WATER_ITERATIONS = 8, WATER_SAMPLE_WORDS = 7, MIN_WAVELENGTH = f2(0.05), MIN_DIRECTION = f2(1e-6), PEAK_FACTOR = f2(0.877), SIGNIFICANT_HEIGHT = f2(0.21), WAVES_PER_SEA = 8, SPREAD_RADIANS = f2(0.7), SHORTEST = f2(0.35), LONGEST = f2(1.6), LAKE_FETCH_CAP = 6, LAKE_DEPTH = 8, UNIT_SHIFT = 40n, UNIT_SCALE2 = 16777216, MASK_64 = (1n << 64n) - 1n, SPLITMIX_INCREMENT = 0x9e3779b97f4a7c15n, SPLITMIX_MUL_A = 0xbf58476d1ce4e5b9n, SPLITMIX_MUL_B = 0x94d049bb133111ebn, SEA_STATES = ["mirror", "lake", "calm", "moderate", "rough", "storm"], SEA_WIND = { mirror: 0, lake: 4, calm: 5, moderate: 9, rough: 14, storm: 22 }, SEA_STEEPNESS = {
2214
+ mirror: 0,
2215
+ lake: f2(0.25),
2216
+ calm: f2(0.3),
2217
+ moderate: f2(0.45),
2218
+ rough: f2(0.6),
2219
+ storm: f2(0.75)
2220
+ }, WaterSample = class {
2221
+ constructor() {
2222
+ this.height = 0;
2223
+ this.normalX = 0;
2224
+ this.normalY = 1;
2225
+ this.normalZ = 0;
2226
+ this.velocityX = 0;
2227
+ this.velocityY = 0;
2228
+ this.velocityZ = 0;
2229
+ }
2230
+ }, SplitMix64 = class {
2231
+ constructor(seed) {
2232
+ this.state = BigInt(seed) & MASK_64;
2233
+ }
2234
+ next() {
2235
+ this.state = this.state + SPLITMIX_INCREMENT & MASK_64;
2236
+ let z = this.state;
2237
+ return z = (z ^ z >> 30n) * SPLITMIX_MUL_A & MASK_64, z = (z ^ z >> 27n) * SPLITMIX_MUL_B & MASK_64, z ^ z >> 31n;
2238
+ }
2239
+ unit() {
2240
+ return f2(Number(this.next() >> UNIT_SHIFT) / (16777216));
2241
+ }
2242
+ range(low, high) {
2243
+ return f2(low + f2(f2(high - low) * this.unit()));
2244
+ }
2245
+ };
2246
+ function seaDesc(state, windRadians, seed) {
2247
+ let speed = SEA_WIND[state], angle = f2(windRadians), sc = { sin: 0, cos: 0 };
2248
+ sinCos(angle, sc);
2249
+ let wind = [f2(sc.cos * speed), f2(sc.sin * speed)];
2250
+ if (state === "mirror") return { wind };
2251
+ let g = DEFAULT_WATER_GRAVITY, omegaPeak = f2(f2(PEAK_FACTOR * g) / speed), peak = f2(f2(TAU * g) / f2(omegaPeak * omegaPeak)), depth = Number.POSITIVE_INFINITY, density = (1025);
2252
+ state === "lake" && (depth = (8), density = (1e3), peak = clamp2(peak, 0, (6)));
2253
+ let height = f2(f2(f2(SIGNIFICANT_HEIGHT * speed) * speed) / g), random = new SplitMix64(seed), count = Math.min((8), (16)), share = f2(1 / f2(Math.sqrt(count))), waves = [];
2254
+ for (let i = 0; i < count; i++) {
2255
+ let t = f2(f2(i + random.unit()) / count), wavelength = f2(peak * f2(SHORTEST + f2(f2(LONGEST - SHORTEST) * t))), direction = f2(angle + random.range(-SPREAD_RADIANS, SPREAD_RADIANS));
2256
+ sinCos(direction, sc);
2257
+ let amplitude = f2(f2(f2(f2(0.5 * height) * share)) * f2(wavelength / peak));
2258
+ waves.push({
2259
+ direction: [sc.cos, sc.sin],
2260
+ wavelength,
2261
+ amplitude,
2262
+ steepness: f2(f2(f2(SEA_STEEPNESS[state] / count)) * 2),
2263
+ phase: random.range(0, TAU)
2264
+ });
2265
+ }
2266
+ return { wind, depth, density, waves };
2267
+ }
2268
+ var Water = class {
2269
+ constructor(desc = {}) {
2270
+ this.kx = new Float32Array((16));
2271
+ this.kz = new Float32Array((16));
2272
+ this.phase = new Float32Array((16));
2273
+ this.amplitude = new Float32Array((16));
2274
+ this.qax = new Float32Array((16));
2275
+ this.qaz = new Float32Array((16));
2276
+ this.kax = new Float32Array((16));
2277
+ this.kaz = new Float32Array((16));
2278
+ this.kqa = new Float32Array((16));
2279
+ this.wqax = new Float32Array((16));
2280
+ this.wqaz = new Float32Array((16));
2281
+ this.wa = new Float32Array((16));
2282
+ this.omega = new Float32Array((16));
2283
+ this.sc = { sin: 0, cos: 0 };
2284
+ this.seconds = new Float64Array(1);
2285
+ this.count = 0;
2286
+ this.iterations = (2);
2287
+ this.currentX = 0;
2288
+ this.currentZ = 0;
2289
+ this.windX = 0;
2290
+ this.windZ = 0;
2291
+ this.gust = 0;
2292
+ this.gustOmega = 0;
2293
+ this.gustPhase = 0;
2294
+ this.time = 0;
2295
+ this.level = 0;
2296
+ this.density = (1025);
2297
+ this.gravity = DEFAULT_WATER_GRAVITY;
2298
+ this.batchSample = new WaterSample();
2299
+ this.px = 0;
2300
+ this.pz = 0;
2301
+ this.configure(desc);
2302
+ }
2303
+ configure(desc) {
2304
+ let waves = desc.waves ?? [], gravity = f2(desc.gravity ?? DEFAULT_WATER_GRAVITY), density = f2(desc.density ?? (1025)), depth = desc.depth ?? Number.POSITIVE_INFINITY, iterations = desc.iterations ?? (2);
2305
+ if (waves.length > (16) || iterations > (8) || !(gravity > 0) || !(density > 0) || Number.isNaN(depth) || depth <= 0)
2306
+ throw new GameError("invalid_argument", "water description is out of range");
2307
+ let total = 0;
2308
+ for (let wave of waves) {
2309
+ let length = f2(Math.sqrt(f2(f2(f2(wave.direction[0]) * f2(wave.direction[0])) + f2(f2(wave.direction[1]) * f2(wave.direction[1])))));
2310
+ if (!(f2(wave.wavelength) >= MIN_WAVELENGTH) || !(wave.amplitude >= 0) || !(length > MIN_DIRECTION))
2311
+ throw new GameError("invalid_argument", "wave description is out of range");
2312
+ total = f2(total + clamp2(f2(wave.steepness), 0, 1));
2313
+ }
2314
+ let normalizer = total > 1 ? f2(1 / total) : 1;
2315
+ for (let i = 0; i < (16); i++) {
2316
+ let wave = waves[i];
2317
+ if (!wave) {
2318
+ this.kx[i] = this.kz[i] = this.phase[i] = this.amplitude[i] = 0, this.qax[i] = this.qaz[i] = this.kax[i] = this.kaz[i] = this.kqa[i] = 0, this.wqax[i] = this.wqaz[i] = this.wa[i] = this.omega[i] = 0;
2319
+ continue;
2320
+ }
2321
+ let x = f2(wave.direction[0]), z = f2(wave.direction[1]), length = f2(Math.sqrt(f2(f2(x * x) + f2(z * z)))), dx = f2(x / length), dz = f2(z / length), k = f2(TAU / f2(wave.wavelength)), deep = f2(gravity * k), omega = Number.isFinite(depth) ? f2(Math.sqrt(f2(deep * tanh(f2(k * f2(depth)))))) : f2(Math.sqrt(deep)), a = f2(wave.amplitude), ka = f2(k * a), q = ka > 0 ? f2(f2(clamp2(f2(wave.steepness), 0, 1) * normalizer) / ka) : 0, qa = f2(q * a);
2322
+ this.kx[i] = f2(k * dx), this.kz[i] = f2(k * dz), this.phase[i] = wrapAngle(f2(wave.phase)), this.amplitude[i] = a, this.qax[i] = f2(dx * qa), this.qaz[i] = f2(dz * qa), this.kax[i] = f2(dx * ka), this.kaz[i] = f2(dz * ka), this.kqa[i] = f2(k * qa), this.wqax[i] = f2(omega * f2(dx * qa)), this.wqaz[i] = f2(omega * f2(dz * qa)), this.wa[i] = f2(omega * a), this.omega[i] = omega;
2323
+ }
2324
+ this.count = waves.length, this.iterations = iterations, this.level = f2(desc.level ?? 0), this.density = density, this.gravity = gravity, this.currentX = f2(desc.current?.[0] ?? 0), this.currentZ = f2(desc.current?.[1] ?? 0), this.setWind(desc.wind?.[0] ?? 0, desc.wind?.[1] ?? 0, desc.gust ?? 0, desc.gustPeriod ?? 0), this.gustPhase = 0, this.time = 0;
2325
+ }
2326
+ setWind(x, z, gust = 0, gustPeriod = 0) {
2327
+ this.windX = f2(x), this.windZ = f2(z), this.gust = f2(gust), this.gustOmega = gustPeriod > 0 ? f2(TAU / f2(gustPeriod)) : 0;
2328
+ }
2329
+ setCurrent(x, z) {
2330
+ this.currentX = f2(x), this.currentZ = f2(z);
2331
+ }
2332
+ crest() {
2333
+ let swell = 0;
2334
+ for (let i = 0; i < this.count; i++) swell += this.amplitude[i];
2335
+ return this.level + swell;
2336
+ }
2337
+ get elapsed() {
2338
+ return this.time;
2339
+ }
2340
+ advance(dt) {
2341
+ this.seconds[0] = dt, this.advanceFrom(this.seconds, 0);
2342
+ }
2343
+ advanceFrom(values, at) {
2344
+ let step = f2(values[at]);
2345
+ for (let i = 0; i < this.count; i++) this.phase[i] = wrapAngle(f2(this.phase[i] - f2(this.omega[i] * step)));
2346
+ this.gustPhase = wrapAngle(f2(this.gustPhase + f2(this.gustOmega * step))), this.time += step;
2347
+ }
2348
+ windInto(out, at = 0) {
2349
+ let gain = f2(1 + f2(this.gust * sin(this.gustPhase)));
2350
+ return out[at] = f2(this.windX * gain), out[at + 1] = 0, out[at + 2] = f2(this.windZ * gain), out;
2351
+ }
2352
+ height(x, z) {
2353
+ this.undisplace(f2(x), f2(z));
2354
+ let height = 0;
2355
+ for (let i = 0; i < this.count; i++)
2356
+ sinCos(this.theta(i), this.sc), height = f2(height + f2(this.amplitude[i] * this.sc.sin));
2357
+ return f2(this.level + height);
2358
+ }
2359
+ sample(x, z, out) {
2360
+ this.undisplace(f2(x), f2(z));
2361
+ let height = 0, nx = 0, ny = 0, nz = 0, vx = 0, vy = 0, vz = 0;
2362
+ for (let i = 0; i < this.count; i++) {
2363
+ sinCos(this.theta(i), this.sc);
2364
+ let s = this.sc.sin, c = this.sc.cos;
2365
+ height = f2(height + f2(this.amplitude[i] * s)), nx = f2(nx + f2(this.kax[i] * c)), ny = f2(ny + f2(this.kqa[i] * s)), nz = f2(nz + f2(this.kaz[i] * c)), vx = f2(vx + f2(this.wqax[i] * s)), vy = f2(vy + f2(this.wa[i] * c)), vz = f2(vz + f2(this.wqaz[i] * s));
2366
+ }
2367
+ let gx = -nx, gy = f2(1 - ny), gz = -nz, inverse = f2(1 / f2(Math.sqrt(f2(f2(f2(gx * gx) + f2(gy * gy)) + f2(gz * gz)))));
2368
+ return out.height = f2(this.level + height), out.normalX = f2(gx * inverse), out.normalY = f2(gy * inverse), out.normalZ = f2(gz * inverse), out.velocityX = f2(vx + this.currentX), out.velocityY = -vy, out.velocityZ = f2(vz + this.currentZ), out;
2369
+ }
2370
+ sampleBatch(points, count, out) {
2371
+ let sample = this.batchSample;
2372
+ for (let i = 0; i < count; i++) {
2373
+ this.sample(points[i * 2], points[i * 2 + 1], sample);
2374
+ let o = i * (7);
2375
+ out[o] = sample.height, out[o + 1] = sample.normalX, out[o + 2] = sample.normalY, out[o + 3] = sample.normalZ, out[o + 4] = sample.velocityX, out[o + 5] = sample.velocityY, out[o + 6] = sample.velocityZ;
2376
+ }
2377
+ }
2378
+ theta(i) {
2379
+ return f2(f2(f2(this.kx[i] * this.px) + f2(this.kz[i] * this.pz)) + this.phase[i]);
2380
+ }
2381
+ undisplace(x, z) {
2382
+ this.px = x, this.pz = z;
2383
+ for (let n = 0; n < this.iterations; n++) {
2384
+ let dx = 0, dz = 0;
2385
+ for (let i = 0; i < this.count; i++)
2386
+ sinCos(this.theta(i), this.sc), dx = f2(dx + f2(this.qax[i] * this.sc.cos)), dz = f2(dz + f2(this.qaz[i] * this.sc.cos));
2387
+ this.px = f2(x - dx), this.pz = f2(z - dz);
2388
+ }
2389
+ }
2390
+ };
2391
+
2392
+ // src/game/physics/curves.ts
2393
+ function validateCurve(curve, maxPoints, what) {
2394
+ let n = curve.x.length;
2395
+ if (n < 1 || n > maxPoints || curve.y.length !== n)
2396
+ throw new GameError("invalid_argument", `${what} needs 1 to ${maxPoints} matching x and y points`);
2397
+ for (let k = 0; k < n; k++) {
2398
+ if (!Number.isFinite(curve.x[k]) || !Number.isFinite(curve.y[k])) throw new GameError("invalid_argument", `${what} has a non-finite point`);
2399
+ if (k > 0 && !(curve.x[k] > curve.x[k - 1])) throw new GameError("invalid_argument", `${what} x values must increase`);
2400
+ }
2401
+ }
2402
+ function sampleCurve(curve, x) {
2403
+ let n = curve.x.length;
2404
+ if (x <= curve.x[0]) return curve.y[0];
2405
+ for (let k = 1; k < n; k++)
2406
+ if (x < curve.x[k]) {
2407
+ let t = (x - curve.x[k - 1]) / (curve.x[k] - curve.x[k - 1]);
2408
+ return curve.y[k - 1] + (curve.y[k] - curve.y[k - 1]) * t;
2409
+ }
2410
+ return curve.y[n - 1];
2411
+ }
2412
+ function peakCurve(peakSlip, peakValue, slideSlip, slideValue) {
2413
+ return { x: [0, peakSlip, slideSlip], y: [0, peakValue, slideValue] };
2414
+ }
2415
+
2416
+ // src/game/physics/vehicle.ts
2417
+ var MAX_WHEELS = 16, MAX_GEARS = 8, MAX_TORQUE_POINTS = 8, MAX_CURVE_POINTS = 8, GEAR_AUTO = 100, GEAR_REVERSE = -1, GEAR_NEUTRAL = 0, NO_AXLE = -1, RAY_WHEEL = 0, STEER_LIMIT = 1.2, INPUT_THROTTLE = 0, INPUT_BRAKE = 1, INPUT_STEER = 2, INPUT_HANDBRAKE = 3, INPUT_GEAR = 4, INPUT_STRIDE = 8, STATE_SPEED = 0, STATE_RPM = 1, STATE_GEAR = 2, STATE_STEER = 3, STATE_GROUNDED = 4, STATE_SHIFTING = 5, STATE_HEADER = 8, WHEEL_CENTER = 0, WHEEL_SPIN = 3, WHEEL_STEER = 4, WHEEL_LENGTH = 5, WHEEL_GROUND = 6, WHEEL_POINT = 7, WHEEL_SLIP = 10, WHEEL_SLIP_ANGLE = 11, WHEEL_LOAD = 12, WHEEL_OMEGA = 13, WHEEL_FORCE_LONG = 14, WHEEL_FORCE_LAT = 15, WHEEL_STRIDE = 16, NO_GROUND = -1, STATE_STRIDE = (8) + (16) * (16), DESC_WHEEL_COUNT = 0, DESC_MAX_STEER = 1, DESC_STEER_RATE = 2, DESC_ANTI_ROLL = 3, DESC_DOWNFORCE = 4, DESC_DRAG = 5, DESC_ROLLING = 6, DESC_HANDBRAKE_GRIP = 7, DESC_IDLE_RPM = 8, DESC_MAX_RPM = 9, DESC_ENGINE_BRAKING = 10, DESC_TORQUE_POINTS = 11, DESC_TORQUE_RPM = 12, DESC_TORQUE = (12) + (8), DESC_GEAR_COUNT = DESC_TORQUE + (8), DESC_REVERSE = DESC_GEAR_COUNT + 1, DESC_FINAL_DRIVE = DESC_GEAR_COUNT + 2, DESC_EFFICIENCY = DESC_GEAR_COUNT + 3, DESC_SHIFT_UP = DESC_GEAR_COUNT + 4, DESC_SHIFT_DOWN = DESC_GEAR_COUNT + 5, DESC_SHIFT_SECONDS = DESC_GEAR_COUNT + 6, DESC_RATIOS = DESC_GEAR_COUNT + 7, DESC_ENGINE_INERTIA = DESC_RATIOS + (8), DESC_DIFFERENTIAL_LOCK = DESC_ENGINE_INERTIA + 1, DESC_CENTER_LOCK = DESC_ENGINE_INERTIA + 2, DESC_SKID_TORQUE = DESC_ENGINE_INERTIA + 3, DESC_LEAN_MAX = DESC_ENGINE_INERTIA + 4, DESC_LEAN_STIFFNESS = DESC_ENGINE_INERTIA + 5, DESC_LEAN_DAMPING = DESC_ENGINE_INERTIA + 6, DESC_LEAN_SPEED = DESC_ENGINE_INERTIA + 7, DESC_FORCE_HEIGHT = DESC_ENGINE_INERTIA + 8, DESC_ACKERMANN = DESC_ENGINE_INERTIA + 9, DESC_HEADER = 56, WHEEL_DESC_POSITION = 0, WHEEL_DESC_RADIUS = 3, WHEEL_DESC_INERTIA = 4, WHEEL_DESC_REST = 5, WHEEL_DESC_TRAVEL = 6, WHEEL_DESC_STIFFNESS = 7, WHEEL_DESC_COMPRESSION = 8, WHEEL_DESC_RELAXATION = 9, WHEEL_DESC_MAX_FORCE = 10, WHEEL_DESC_STEER = 11, WHEEL_DESC_DRIVE = 12, WHEEL_DESC_BRAKE = 13, WHEEL_DESC_HANDBRAKE = 14, WHEEL_DESC_GRIP = 15, WHEEL_DESC_AXLE = 16, WHEEL_DESC_SIDE = 17, CURVE_POINTS = 0, CURVE_SLIP = 1, CURVE_VALUE = (1) + (8), CURVE_WORDS = CURVE_VALUE + (8), WHEEL_DESC_LONGITUDINAL = 18, WHEEL_DESC_LATERAL = (18) + CURVE_WORDS, WHEEL_DESC_WIDTH = WHEEL_DESC_LATERAL + CURVE_WORDS, WHEEL_DESC_WORDS = 56, VEHICLE_DESC_WORDS = (56) + (16) * (56), DEFAULT_LONGITUDINAL = peakCurve(0.12, 1.1, 0.8, 0.85), DEFAULT_LATERAL = peakCurve(0.2, 1.05, 0.9, 0.8), DEFAULT_INERTIA = 1.2, DEFAULT_REST = 0.35, DEFAULT_TRAVEL = 0.15, DEFAULT_STIFFNESS = 35e3, DEFAULT_DAMPING = 3500, DEFAULT_MAX_FORCE = 4e4, DEFAULT_BRAKE = 1500, DEFAULT_ENGINE_BRAKING = 60, DEFAULT_ENGINE_INERTIA = 0.2, DEFAULT_EFFICIENCY = 0.9, DEFAULT_SHIFT_SECONDS = 0.18, DEFAULT_STEER_RATE = 3, DEFAULT_DRAG = 0.4, DEFAULT_ROLLING = 0.02, DEFAULT_HANDBRAKE_GRIP = 0.5, DEFAULT_LEAN_SPEED = 8;
2418
+ function writeCurve(out, at, curve, what) {
2419
+ validateCurve(curve, (8), what), out[at + (0)] = curve.x.length;
2420
+ for (let k = 0; k < curve.x.length; k++)
2421
+ out[at + (1) + k] = curve.x[k], out[at + CURVE_VALUE + k] = curve.y[k];
2422
+ }
2423
+ function encodeVehicleDesc(desc, out = new Float32Array(VEHICLE_DESC_WORDS)) {
2424
+ let wheels = desc.wheels.length;
2425
+ if (wheels < 1 || wheels > (16)) throw new GameError("invalid_argument", `vehicles take 1 to ${(16)} wheels`);
2426
+ validateCurve(desc.engine.torque, (8), "engine torque curve");
2427
+ let forceHeight = desc.forceHeight ?? 0;
2428
+ if (!(forceHeight >= 0 && forceHeight <= 1)) throw new GameError("invalid_argument", "forceHeight must be between 0 and 1");
2429
+ let ackermann = desc.ackermann ?? 0;
2430
+ if (!(ackermann >= 0 && ackermann <= 1)) throw new GameError("invalid_argument", "ackermann must be between 0 and 1");
2431
+ let gears = desc.gearbox.ratios.length;
2432
+ if (gears < 1 || gears > (8)) throw new GameError("invalid_argument", `gearboxes take 1 to ${(8)} ratios`);
2433
+ out.fill(0), out[(0)] = wheels, out[(1)] = desc.maxSteerRadians, out[(2)] = desc.steerRate ?? (3), out[(3)] = desc.antiRoll ?? 0, out[(4)] = desc.downforce ?? 0, out[(5)] = desc.drag ?? (0.4), out[(6)] = desc.rollingResistance ?? (0.02), out[(7)] = desc.handbrakeGrip ?? (0.5), out[(8)] = desc.engine.idleRpm, out[(9)] = desc.engine.maxRpm, out[(10)] = desc.engine.engineBraking ?? (60), out[DESC_ENGINE_INERTIA] = desc.engine.inertia ?? (0.2);
2434
+ let torque = desc.engine.torque;
2435
+ out[(11)] = torque.x.length;
2436
+ for (let k = 0; k < torque.x.length; k++)
2437
+ out[(12) + k] = torque.x[k], out[DESC_TORQUE + k] = torque.y[k];
2438
+ out[DESC_GEAR_COUNT] = gears, out[DESC_REVERSE] = desc.gearbox.reverse, out[DESC_FINAL_DRIVE] = desc.gearbox.finalDrive, out[DESC_EFFICIENCY] = desc.gearbox.efficiency ?? (0.9), out[DESC_SHIFT_UP] = desc.gearbox.shiftUpRpm, out[DESC_SHIFT_DOWN] = desc.gearbox.shiftDownRpm, out[DESC_SHIFT_SECONDS] = desc.gearbox.shiftSeconds ?? (0.18);
2439
+ for (let k = 0; k < gears; k++) out[DESC_RATIOS + k] = desc.gearbox.ratios[k];
2440
+ out[DESC_DIFFERENTIAL_LOCK] = desc.differentialLock ?? 0, out[DESC_CENTER_LOCK] = desc.centerLock ?? 0, out[DESC_SKID_TORQUE] = desc.skidTorque ?? 0, out[DESC_FORCE_HEIGHT] = desc.forceHeight ?? 0, out[DESC_ACKERMANN] = desc.ackermann ?? 0, out[DESC_LEAN_MAX] = desc.lean?.maxAngle ?? 0, out[DESC_LEAN_STIFFNESS] = desc.lean?.stiffness ?? 0, out[DESC_LEAN_DAMPING] = desc.lean?.damping ?? 0, out[DESC_LEAN_SPEED] = desc.lean?.fullSpeed ?? (8);
2441
+ for (let w = 0; w < wheels; w++) {
2442
+ let wheel = desc.wheels[w], at = (56) + w * (56);
2443
+ out[at + (0)] = wheel.position[0], out[at + (0) + 1] = wheel.position[1], out[at + (0) + 2] = wheel.position[2], out[at + (3)] = wheel.radius, out[at + (4)] = wheel.inertia ?? (1.2), out[at + (5)] = wheel.restLength ?? (0.35), out[at + (6)] = wheel.travel ?? (0.15), out[at + (7)] = wheel.stiffness ?? (35e3), out[at + (8)] = wheel.compressionDamping ?? (3500), out[at + (9)] = wheel.relaxationDamping ?? wheel.compressionDamping ?? (3500), out[at + (10)] = wheel.maxSuspensionForce ?? (4e4), out[at + (11)] = wheel.steer ?? 0, out[at + (12)] = wheel.drive ?? 0, out[at + (13)] = wheel.brakeTorque ?? (1500), out[at + (14)] = wheel.handbrakeTorque ?? 0, out[at + (15)] = wheel.grip ?? 1, out[at + (16)] = wheel.axle ?? (-1), out[at + (17)] = wheel.side ?? 0, out[at + WHEEL_DESC_WIDTH] = wheel.width ?? (0), writeCurve(out, at + (18), wheel.longitudinal ?? DEFAULT_LONGITUDINAL, "longitudinal tyre curve"), writeCurve(out, at + WHEEL_DESC_LATERAL, wheel.lateral ?? DEFAULT_LATERAL, "lateral tyre curve");
2444
+ }
2445
+ return out;
2446
+ }
2447
+ var Vehicle = class {
2448
+ constructor(port, id, entity, wheelCount) {
2449
+ this.port = port, this.id = id, this.entity = entity, this.wheelCount = wheelCount, this.inputs = port.vehicleInputs(), this.states = port.vehicleStates(), this.input = id * (8), this.state = id * STATE_STRIDE;
2450
+ }
2451
+ refresh() {
2452
+ this.inputs = this.port.vehicleInputs(), this.states = this.port.vehicleStates();
2453
+ }
2454
+ drive(throttle, brake, steer, handbrake = 0, gear = (100)) {
2455
+ let i = this.inputs, o = this.input;
2456
+ i[o + (0)] = throttle, i[o + (1)] = brake, i[o + (2)] = steer, i[o + (3)] = handbrake, i[o + (4)] = gear;
2457
+ }
2458
+ driveFrom(source, at) {
2459
+ let i = this.inputs, o = this.input;
2460
+ i[o + (0)] = source[at + (0)], i[o + (1)] = source[at + (1)], i[o + (2)] = source[at + (2)], i[o + (3)] = source[at + (3)], i[o + (4)] = source[at + (4)];
2461
+ }
2462
+ get speed() {
2463
+ return this.states[this.state + (0)];
2464
+ }
2465
+ get rpm() {
2466
+ return this.states[this.state + (1)];
2467
+ }
2468
+ get gear() {
2469
+ return this.states[this.state + (2)];
2470
+ }
2471
+ get steer() {
2472
+ return this.states[this.state + (3)];
2473
+ }
2474
+ get groundedWheels() {
2475
+ return this.states[this.state + (4)];
2476
+ }
2477
+ get shifting() {
2478
+ return this.states[this.state + (5)] !== 0;
2479
+ }
2480
+ wheel(index, field) {
2481
+ return this.states[this.state + (8) + index * (16) + field];
2482
+ }
2483
+ get stateView() {
2484
+ return this.states;
2485
+ }
2486
+ get stateOffset() {
2487
+ return this.state;
2488
+ }
2489
+ };
2490
+
2491
+ // src/game/ai/types.ts
2492
+ var AI_EVENT_WORDS = 5, AI_NONE = 4294967295;
2493
+ var AI_MAX_GAME_SLOTS = 16;
2494
+ var BUILTIN_INPUTS = [
2495
+ "focus_distance",
2496
+ "focus_visible",
2497
+ "focus_since_seen",
2498
+ "focus_confidence",
2499
+ "focus_threat",
2500
+ "hostiles_known",
2501
+ "allies_near",
2502
+ "attack_token_free",
2503
+ "action_seconds",
2504
+ "goal_distance",
2505
+ "lateness",
2506
+ "best_object"
2507
+ ];
2508
+ var PHASE_IDLE = 0, PHASE_WINDUP = 1, PHASE_STRIKE = 2, PHASE_RECOVER = 3, AiEventKind = {
2509
+ actionChanged: 1,
2510
+ focusAcquired: 2,
2511
+ focusLost: 3,
2512
+ heard: 4,
2513
+ arrived: 5,
2514
+ attackWindup: 6,
2515
+ attackStrike: 7,
2516
+ attackDone: 8,
2517
+ bark: 9,
2518
+ objectUsed: 10,
2519
+ coverTaken: 11
2520
+ }, ENGINE_AI_EXPORT_NAMES = [
2521
+ "engine_ai_create",
2522
+ "engine_ai_destroy",
2523
+ "engine_ai_registers",
2524
+ "engine_ai_view",
2525
+ "engine_ai_slots",
2526
+ "engine_ai_archetype",
2527
+ "engine_ai_spawn",
2528
+ "engine_ai_despawn",
2529
+ "engine_ai_target_add",
2530
+ "engine_ai_target_remove",
2531
+ "engine_ai_target_move",
2532
+ "engine_ai_target_threat",
2533
+ "engine_ai_agent_target",
2534
+ "engine_ai_noise",
2535
+ "engine_ai_goal",
2536
+ "engine_ai_focus",
2537
+ "engine_ai_skill",
2538
+ "engine_ai_need",
2539
+ "engine_ai_speed",
2540
+ "engine_ai_place",
2541
+ "engine_ai_step",
2542
+ "engine_ai_events",
2543
+ "engine_ai_doing",
2544
+ "engine_ai_aim",
2545
+ "engine_ai_digest",
2546
+ "engine_ai_squad",
2547
+ "engine_ai_join",
2548
+ "engine_ai_leave",
2549
+ "engine_ai_object_add",
2550
+ "engine_ai_object_remove",
2551
+ "engine_ai_cover_add",
2552
+ "engine_ai_cover_remove"
2553
+ ], ENGINE_AI_WORLD_STEP = "engine_ai_step_world";
2554
+
2555
+ // src/game/story/engine.ts
2556
+ var STORY_REGISTER_WORDS = 20, STORY_BEAT = 0, STORY_SCENE = 1, STORY_BEAT_TICK = 2, STORY_SCENE_TICK = 4, STORY_SCENE_LENGTH = 6, STORY_FLAGS = 8, STORY_EVENT_COUNT = 9, STORY_SAMPLE_COUNT = 10;
2557
+ var STORY_DIGEST = 12, STORY_VARIABLES = 14, STORY_TICK_RATE = 15, STORY_SAMPLE_CAPACITY = 16, STORY_MAX_EVENTS = 1024, STORY_STARTED = 1, STORY_FINISHED = 2, STORY_EVENT_WORDS = 4, STORY_INPUT_WORDS = 3, STORY_SAMPLE_WORDS = 8, STORY_MAX_INPUTS = 64, STORY_PERSIST_SHIFT = 8, STORY_TYPE_MASK = 255, STORY_NONE = 4294967295, STORY_EVENT_ENTERED = 1, STORY_EVENT_OFFERED = 2, STORY_EVENT_TAKEN = 3, STORY_EVENT_REFUSED = 4, STORY_EVENT_LOGIC = 5, STORY_EVENT_KEY = 6, STORY_EVENT_FINISHED = 7, STORY_EVENT_RULE = 8, STORY_INPUT_CHOOSE = 1, STORY_INPUT_INTERACT = 2, STORY_INPUT_GIFT = 3, ENGINE_STORY_EXPORT_NAMES = [
2558
+ "engine_story_create",
2559
+ "engine_story_destroy",
2560
+ "engine_story_registers",
2561
+ "engine_story_events",
2562
+ "engine_story_samples",
2563
+ "engine_story_start",
2564
+ "engine_story_step",
2565
+ "engine_story_seek",
2566
+ "engine_story_available",
2567
+ "engine_story_variable",
2568
+ "engine_story_get",
2569
+ "engine_story_set",
2570
+ "engine_story_set_text",
2571
+ "engine_story_variable_text",
2572
+ "engine_story_program_text",
2573
+ "engine_story_text_index",
2574
+ "engine_story_text_of",
2575
+ "engine_story_id_of"
2576
+ ], STORY_ID = 17, STORY_ID_TRACK = 4, STORY_TEXT_VARIABLE = 0, STORY_TEXT_CHOICE = 1, STORY_TEXT_BEAT = 2, STORY_TEXT_SCENE = 3, STORY_TEXT_KEY = 4, STORY_TEXT_ACTOR = 5, STORY_TEXT_RULE = 6, STORY_TEXT_ACTION = 7, NULL = 0, BYTE_ALIGN = 1, CAPACITY = -1, UNKNOWN = -3, INVALID = -4, DOUBLE_BYTES = 8, WORD_BYTES = 4, INPUT_SCRATCH_BYTES = (64) * (3) * (4), TEXT_SCRATCH_BYTES = 4096, WORD_BITS = 32n;
2577
+ function engineStoryExports(runtime) {
2578
+ let symbols = runtime.symbols;
2579
+ return ENGINE_STORY_EXPORT_NAMES.every((name2) => typeof symbols[name2] == "function") ? symbols : null;
2580
+ }
2581
+ function check2(code, what) {
2582
+ if (code >= 0) return code;
2583
+ throw code === (-1) ? new GameError("capacity_exceeded", `the story ${what} is too large`) : code === (-3) ? new GameError("unknown_resource", `the story ${what} names nothing in this story`) : code === (-4) ? new GameError("invalid_argument", `the engine refused the story ${what}`) : new GameError("invalid_argument", `the engine refused the story ${what} (${code})`);
2584
+ }
2585
+ var EngineStory = class {
2586
+ constructor(runtime, exports) {
2587
+ this.runtime = runtime;
2588
+ this.exports = exports;
2589
+ this.inputs = (0);
2590
+ this.text = (0);
2591
+ this.textBytes = 0;
2592
+ this.encoder = new TextEncoder();
2593
+ this.decoder = new TextDecoder();
2594
+ }
2595
+ alloc(bytes, align) {
2596
+ let at = this.runtime.exports.engine_alloc(bytes, align);
2597
+ if (at === (0)) throw new GameError("capacity_exceeded", "engine memory cannot hold the story's working space");
2598
+ return at;
2599
+ }
2600
+ textScratch(bytes) {
2601
+ return bytes > this.textBytes && (this.text !== (0) && this.runtime.exports.engine_free(this.text, this.textBytes, (1)), this.textBytes = Math.max(bytes, (4096)), this.text = this.alloc(this.textBytes, (1))), this.text;
2602
+ }
2603
+ bytes() {
2604
+ return new Uint8Array(this.runtime.memory.buffer);
2605
+ }
2606
+ create(program) {
2607
+ let at = this.alloc(Math.max(program.length, 1), (1));
2608
+ try {
2609
+ this.bytes().set(program, at);
2610
+ let story = this.exports.engine_story_create(at, program.length);
2611
+ if (story === (0)) throw new GameError("invalid_argument", "the engine refused the story program");
2612
+ return story;
2613
+ } finally {
2614
+ this.runtime.exports.engine_free(at, Math.max(program.length, 1), (1));
2615
+ }
2616
+ }
2617
+ destroy(story) {
2618
+ this.exports.engine_story_destroy(story);
2619
+ }
2620
+ start(story) {
2621
+ check2(this.exports.engine_story_start(story), "start");
2622
+ }
2623
+ step(story, inputs, count) {
2624
+ if (count > (64)) throw new GameError("capacity_exceeded", `a story step takes at most ${(64)} inputs`);
2625
+ this.inputs === (0) && (this.inputs = this.alloc(INPUT_SCRATCH_BYTES, (4))), count > 0 && new Uint32Array(this.runtime.memory.buffer, this.inputs, count * (3)).set(inputs.subarray(0, count * (3))), check2(this.exports.engine_story_step(story, this.inputs, count), "step");
2626
+ }
2627
+ seek(story, tick) {
2628
+ check2(this.exports.engine_story_seek(story, Math.round(tick)), "seek");
2629
+ }
2630
+ available(story, choice) {
2631
+ return check2(this.exports.engine_story_available(story, choice), "choice") === 1;
2632
+ }
2633
+ variable(story, variable) {
2634
+ return check2(this.exports.engine_story_variable(story, variable), "variable");
2635
+ }
2636
+ get(story, variable) {
2637
+ return this.exports.engine_story_get(story, variable);
2638
+ }
2639
+ set(story, variable, value) {
2640
+ check2(this.exports.engine_story_set(story, variable, value), "variable value");
2641
+ }
2642
+ setText(story, variable, text) {
2643
+ let encoded = this.encoder.encode(text), at = this.textScratch(encoded.length);
2644
+ this.bytes().set(encoded, at), check2(this.exports.engine_story_set_text(story, variable, at, encoded.length), "variable text");
2645
+ }
2646
+ readText(read, what) {
2647
+ let length = check2(read(this.textScratch((4096)), this.textBytes), what);
2648
+ return length > this.textBytes && (length = check2(read(this.textScratch(length), this.textBytes), what)), this.decoder.decode(this.bytes().subarray(this.text, this.text + length));
2649
+ }
2650
+ variableText(story, variable) {
2651
+ return this.readText((out, capacity) => this.exports.engine_story_variable_text(story, variable, out, capacity), "variable text");
2652
+ }
2653
+ programText(story, index) {
2654
+ return this.readText((out, capacity) => this.exports.engine_story_program_text(story, index, out, capacity), "text");
2655
+ }
2656
+ textIndex(story, text) {
2657
+ let encoded = this.encoder.encode(text), at = this.textScratch(encoded.length);
2658
+ this.bytes().set(encoded, at);
2659
+ let index = this.exports.engine_story_text_index(story, at, encoded.length);
2660
+ return index === (-3) ? (4294967295) : check2(index, "text");
2661
+ }
2662
+ textOf(story, what, index, key) {
2663
+ let at = this.exports.engine_story_text_of(story, what, index, key);
2664
+ return at === (-3) ? (4294967295) : check2(at, "text");
2665
+ }
2666
+ idOf(story, what, index) {
2667
+ let code = this.exports.engine_story_id_of(story, what, index);
2668
+ if (code === (-3)) return null;
2669
+ check2(code, "id");
2670
+ let registers = new Uint32Array(this.runtime.memory.buffer, this.exports.engine_story_registers(story), (20));
2671
+ return (BigInt(registers[(17) + 1]) << WORD_BITS | BigInt(registers[(17)])).toString();
2672
+ }
2673
+ buffer() {
2674
+ return this.runtime.memory.buffer;
2675
+ }
2676
+ views(story) {
2677
+ let buffer = this.runtime.memory.buffer, registers = new Uint32Array(buffer, this.exports.engine_story_registers(story), (20)), samples = this.exports.engine_story_samples(story);
2678
+ if (samples % (8) !== 0) throw new GameError("invalid_argument", "the engine's story samples are misaligned");
2679
+ return {
2680
+ registers,
2681
+ events: new Uint32Array(buffer, this.exports.engine_story_events(story), (1024) * (4)),
2682
+ samples: samples === (0) ? new Float64Array(0) : new Float64Array(buffer, samples, registers[(16)] * (8))
2683
+ };
2684
+ }
2685
+ };
2686
+
2687
+ export { AGENT_ARRIVED, AGENT_IDLE, AGENT_LOST, AGENT_MOVING, AGENT_ON_LINK, AGENT_REQUESTING, AGENT_STRIDE, AGENT_X, AIR_DENSITY, AI_EVENT_WORDS, AI_MAX_GAME_SLOTS, AI_NONE, AiEventKind, BOAT_SHEET, BOAT_STEER, BOAT_THROTTLE, BUILTIN_INPUTS, Basis, CRAFT_CHANNELS, CRAFT_PRESETS, CRAFT_TELEMETRY_WORDS, CURVE_POINTS, CURVE_SLIP, CURVE_VALUE, ContactRuleTable, DEFAULT_COLLIDER_CLASS, DEFAULT_EXTENTS, DESC_ACKERMANN, DESC_ANTI_ROLL, DESC_CENTER_LOCK, DESC_DIFFERENTIAL_LOCK, DESC_DOWNFORCE, DESC_DRAG, DESC_EFFICIENCY, DESC_ENGINE_BRAKING, DESC_ENGINE_INERTIA, DESC_FINAL_DRIVE, DESC_FORCE_HEIGHT, DESC_GEAR_COUNT, DESC_HANDBRAKE_GRIP, DESC_HEADER, DESC_IDLE_RPM, DESC_LEAN_DAMPING, DESC_LEAN_MAX, DESC_LEAN_SPEED, DESC_LEAN_STIFFNESS, DESC_MAX_RPM, DESC_MAX_STEER, DESC_RATIOS, DESC_REVERSE, DESC_ROLLING, DESC_SHIFT_DOWN, DESC_SHIFT_SECONDS, DESC_SHIFT_UP, DESC_SKID_TORQUE, DESC_STEER_RATE, DESC_TORQUE, DESC_TORQUE_POINTS, DESC_TORQUE_RPM, DESC_WHEEL_COUNT, ENGINE_AI_EXPORT_NAMES, ENGINE_AI_WORLD_STEP, EngineStory, FLIGHT_BRAKE, FLIGHT_FLAPS, FLIGHT_GEAR, FLIGHT_PITCH, FLIGHT_ROLL, FLIGHT_THROTTLE, FLIGHT_TILT, FLIGHT_YAW, GEAR_AUTO, GEAR_NEUTRAL, GEAR_REVERSE, INPUT_BRAKE, INPUT_GEAR, INPUT_HANDBRAKE, INPUT_STEER, INPUT_STRIDE, INPUT_THROTTLE, MAX_AERO_TABLE, MAX_COLLIDER_CLASSES, MAX_CORNERS, MAX_CRAFT_WHEELS, MAX_FOILS, MAX_HULL_POINTS, MAX_HULL_RESOLUTION, MAX_ROTORS, MAX_THRUSTERS, MAX_WAVES, MAX_WHEELS, NO_AXLE, NO_CHANNEL, NO_CONTACT_RULE, NO_GROUND, NO_LINK, NativeKernels, PHASE_IDLE, PHASE_RECOVER, PHASE_STRIKE, PHASE_WINDUP, PI, POSE_DIR_X, POSE_DIR_Z, POSE_LANE, POSE_SPEED, POSE_STRIDE, POSE_X, POSE_Z, PlainSpawns, ROTOR_COLLECTIVE, ROTOR_CYCLIC_PITCH, ROTOR_CYCLIC_ROLL, ROTOR_ENGINE, ROTOR_PEDAL, RULE_FRICTION, RULE_IGNORE, RULE_ONE_WAY, RULE_RESTITUTION, SEA_STATES, SIGNAL_AMBER, SIGNAL_GREEN, SIGNAL_RED, STATE_GEAR, STATE_GROUNDED, STATE_HEADER, STATE_RPM, STATE_SHIFTING, STATE_SPEED, STATE_STEER, STATE_STRIDE, STEER_LIMIT, STORY_BEAT, STORY_BEAT_TICK, STORY_DIGEST, STORY_EVENT_COUNT, STORY_EVENT_ENTERED, STORY_EVENT_FINISHED, STORY_EVENT_KEY, STORY_EVENT_LOGIC, STORY_EVENT_OFFERED, STORY_EVENT_REFUSED, STORY_EVENT_RULE, STORY_EVENT_TAKEN, STORY_EVENT_WORDS, STORY_FINISHED, STORY_FLAGS, STORY_ID_TRACK, STORY_INPUT_CHOOSE, STORY_INPUT_GIFT, STORY_INPUT_INTERACT, STORY_INPUT_WORDS, STORY_MAX_INPUTS, STORY_NONE, STORY_PERSIST_SHIFT, STORY_SAMPLE_COUNT, STORY_SAMPLE_WORDS, STORY_SCENE, STORY_SCENE_LENGTH, STORY_SCENE_TICK, STORY_STARTED, STORY_TEXT_ACTION, STORY_TEXT_ACTOR, STORY_TEXT_BEAT, STORY_TEXT_CHOICE, STORY_TEXT_KEY, STORY_TEXT_RULE, STORY_TEXT_SCENE, STORY_TEXT_VARIABLE, STORY_TICK_RATE, STORY_TYPE_MASK, STORY_VARIABLES, TAU, TELEMETRY_AIRSPEED, TELEMETRY_ALPHA, TELEMETRY_APPARENT_WIND, TELEMETRY_BANK, TELEMETRY_CLIMB, TELEMETRY_CONTACTS, TELEMETRY_GEAR, TELEMETRY_GROUND_EFFECT, TELEMETRY_PITCH, TELEMETRY_PLANING, TELEMETRY_ROTOR, TELEMETRY_SPEED, TELEMETRY_SPOOL, TELEMETRY_STALLED, TELEMETRY_SUBMERGED, TELEMETRY_THRUST, TableSpawns, VEHICLE_DESC_WORDS, Vehicle, WATER_SAMPLE_WORDS, WHEEL_CENTER, WHEEL_DESC_AXLE, WHEEL_DESC_BRAKE, WHEEL_DESC_COMPRESSION, WHEEL_DESC_DRIVE, WHEEL_DESC_GRIP, WHEEL_DESC_HANDBRAKE, WHEEL_DESC_INERTIA, WHEEL_DESC_LATERAL, WHEEL_DESC_LONGITUDINAL, WHEEL_DESC_MAX_FORCE, WHEEL_DESC_POSITION, WHEEL_DESC_RADIUS, WHEEL_DESC_RELAXATION, WHEEL_DESC_REST, WHEEL_DESC_SIDE, WHEEL_DESC_STEER, WHEEL_DESC_STIFFNESS, WHEEL_DESC_TRAVEL, WHEEL_DESC_WORDS, WHEEL_FORCE_LAT, WHEEL_FORCE_LONG, WHEEL_GROUND, WHEEL_LENGTH, WHEEL_LOAD, WHEEL_OMEGA, WHEEL_POINT, WHEEL_SLIP, WHEEL_SLIP_ANGLE, WHEEL_SPIN, WHEEL_STEER, WHEEL_STRIDE, Water, WaterSample, atan2, bindKernelEngine, checkColliderClass, compileWasmKernel, constant, encodeVehicleDesc, engineStoryExports, kernelEngineFeatures, mix, mixWith, packContactRuleHeader, peakCurve, reportSpawns, sampleCurve, seaDesc, sinCos, spawnOverflow, validateCurve, wasmKernelImports, wrapAngle, writeContactRulePayload };