@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,3171 @@
1
+ 'use strict';
2
+
3
+ var chunkYV52DGSA_js = require('./chunk-YV52DGSA.js');
4
+ var chunkPKOZXD2Q_js = require('./chunk-PKOZXD2Q.js');
5
+ var chunk3S6WPBZL_js = require('./chunk-3S6WPBZL.js');
6
+ var chunkRCQ2MPBV_js = require('./chunk-RCQ2MPBV.js');
7
+ var chunk3C4C654I_js = require('./chunk-3C4C654I.js');
8
+ var chunkYXGZQPUD_js = require('./chunk-YXGZQPUD.js');
9
+ var chunkH3OQKK6X_js = require('./chunk-H3OQKK6X.js');
10
+ var chunkSKQFLBDD_js = require('./chunk-SKQFLBDD.js');
11
+ var chunk7AAIAVAA_js = require('./chunk-7AAIAVAA.js');
12
+ var chunkX5A5FOWW_js = require('./chunk-X5A5FOWW.js');
13
+ var chunkNZTKLY2W_js = require('./chunk-NZTKLY2W.js');
14
+ var chunk2O2CG465_js = require('./chunk-2O2CG465.js');
15
+ var chunkPDOELNNQ_js = require('./chunk-PDOELNNQ.js');
16
+ var chunkPTRNO5UD_js = require('./chunk-PTRNO5UD.js');
17
+ var chunk2V7IL4HC_js = require('./chunk-2V7IL4HC.js');
18
+
19
+ // src/game/gpu/engine.ts
20
+ var WORD = 4, DEFAULT_WORKGROUP = 1, ENTRY_BYTES = 52 * (4), MAX_TARGETS = 4, PACK_SHIFT = 16, NUL = 0, DEPTH_UNSET = 0, USAGE = {
21
+ storage: 1,
22
+ uniform: 2,
23
+ vertex: 4,
24
+ index: 8,
25
+ indirect: 16,
26
+ copy_src: 32,
27
+ copy_dst: 64,
28
+ map_read: 128
29
+ }, TEXTURE_USAGE = {
30
+ sampled: 1,
31
+ storage: 2,
32
+ target: 4
33
+ }, FORMAT = {
34
+ rgba8: 0,
35
+ rgba16f: 2,
36
+ rgba32f: 1
37
+ }, TEXEL_BYTES = {
38
+ rgba8: 4,
39
+ rgba16f: 8,
40
+ rgba32f: 16
41
+ }, FACTOR = {
42
+ zero: chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("zero"),
43
+ one: chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("one"),
44
+ src: chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("srcColor"),
45
+ "one-minus-src": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("oneMinusSrcColor"),
46
+ "src-alpha": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("srcAlpha"),
47
+ "one-minus-src-alpha": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("oneMinusSrcAlpha"),
48
+ dst: chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("dstColor"),
49
+ "one-minus-dst": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("oneMinusDstColor"),
50
+ "dst-alpha": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("dstAlpha"),
51
+ "one-minus-dst-alpha": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("oneMinusDstAlpha"),
52
+ "src-alpha-saturated": chunk7AAIAVAA_js.BLEND_FACTORS.indexOf("srcAlphaSaturate")
53
+ }, TOPOLOGY = {
54
+ "triangle-list": 0,
55
+ "triangle-strip": 1,
56
+ "line-list": 2,
57
+ "point-list": 3
58
+ }, SCENE_COLOR_FORMAT = "rgba16f", HOOK_ORDER = ["beforeScene", "afterOpaque", "afterTransparent", "post", "afterPost"], SCENE = {
59
+ depth: 4294967280,
60
+ motion: 4294967281,
61
+ color: 4294967282,
62
+ instances: 4294967283,
63
+ particles: 4294967284
64
+ }, SCENE_TEXTURE = {
65
+ depth: 4294967280,
66
+ motion: 4294967281,
67
+ color: 4294967282
68
+ };
69
+ function failure(code, what) {
70
+ switch (code) {
71
+ case chunk2O2CG465_js.ERROR_CAPACITY_EXCEEDED:
72
+ return new chunk2V7IL4HC_js.GameError("capacity_exceeded", `${what}: capacity exceeded`);
73
+ case chunk2O2CG465_js.ERROR_DEAD_ENTITY:
74
+ case chunk2O2CG465_js.ERROR_UNKNOWN_RESOURCE:
75
+ return new chunk2V7IL4HC_js.GameError("unknown_resource", `${what}: unknown resource`);
76
+ case chunk2O2CG465_js.ERROR_UNSUPPORTED:
77
+ return new chunk2V7IL4HC_js.GameError("unsupported_feature", `${what}: unsupported`);
78
+ default:
79
+ return new chunk2V7IL4HC_js.GameError("invalid_argument", `${what}: invalid argument`);
80
+ }
81
+ }
82
+ function packBlend(blend) {
83
+ return blend ? (FACTOR[blend.color.src] << 0 | FACTOR[blend.color.dst] << 5 | FACTOR[blend.alpha.src] << 10 | FACTOR[blend.alpha.dst] << 15) >>> 0 : 0;
84
+ }
85
+ function pack(pair2) {
86
+ return (pair2[0] | pair2[1] << (16)) >>> 0;
87
+ }
88
+ var EngineRaw = class {
89
+ constructor(host) {
90
+ this.api = "wgsl";
91
+ this.shaders = [null];
92
+ this.sizes = /* @__PURE__ */ new Map();
93
+ this.textures = /* @__PURE__ */ new Map();
94
+ this.targetFormats = /* @__PURE__ */ new Map();
95
+ this.encoder = new TextEncoder();
96
+ this.reads = [];
97
+ this.host = host;
98
+ }
99
+ createBuffer(desc) {
100
+ if (desc.size <= 0 || desc.size % (4) !== 0)
101
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `gpu buffer size ${desc.size} must be a positive multiple of ${(4)}`);
102
+ let d = this.host.clearDesc();
103
+ d[0] = desc.size;
104
+ let usage = 0;
105
+ for (let u of desc.usage) usage |= USAGE[u];
106
+ d[1] = usage;
107
+ let id = this.check(this.host.call("engine_render_raw_buffer"), "create gpu buffer");
108
+ return this.sizes.set(id, desc.size), id;
109
+ }
110
+ writeBuffer(buffer, offset, data) {
111
+ let size = this.size(buffer);
112
+ if (offset < 0 || offset % (4) !== 0 || offset + data.byteLength > size)
113
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `write of ${data.byteLength} bytes at ${offset} overflows gpu buffer ${buffer}`);
114
+ this.host.flush(), this.host.bytes(10, buffer, 0).set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength), offset), this.host.command(chunk7AAIAVAA_js.OP_RAW_MARK_BUFFER, buffer);
115
+ }
116
+ createTexture(desc) {
117
+ let d = this.host.clearDesc();
118
+ d[0] = desc.width, d[1] = desc.height, d[2] = FORMAT[desc.format];
119
+ let usage = 0;
120
+ for (let u of desc.usage) usage |= TEXTURE_USAGE[u];
121
+ d[3] = usage, d[4] = desc.mipLevels ?? 1;
122
+ let id = this.check(this.host.call("engine_render_raw_texture"), "create gpu texture");
123
+ return this.textures.set(id, { width: desc.width, height: desc.height, format: desc.format }), id;
124
+ }
125
+ writeTexture(texture, data) {
126
+ let info = this.texture(texture), bytes = info.width * info.height * TEXEL_BYTES[info.format];
127
+ if (data.byteLength !== bytes)
128
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `texture ${texture} takes exactly ${bytes} bytes`);
129
+ this.host.flush(), this.host.bytes(11, texture, 0).set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength)), this.host.command(chunk7AAIAVAA_js.OP_RAW_MARK_TEXTURE, texture);
130
+ }
131
+ readTexture(texture, rect, out) {
132
+ let info = this.texture(texture), bytes = rect.width * rect.height * TEXEL_BYTES[info.format];
133
+ if (out.byteLength < bytes) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `readTexture needs ${bytes} bytes`);
134
+ this.host.flush();
135
+ let request = this.check(
136
+ this.host.call("engine_render_raw_read_texture", texture, rect.x, rect.y, rect.width, rect.height),
137
+ "read gpu texture"
138
+ );
139
+ return new Promise((resolve, reject) => {
140
+ this.reads.push({ request, buffer: null, texture, offset: 0, out: out.subarray(0, bytes), resolve, reject });
141
+ });
142
+ }
143
+ copyTexture(source, target, copy) {
144
+ let info = this.texture(source), a = this.host.command(chunk7AAIAVAA_js.OP_RAW_COPY_TEXTURE, source), w = this.host.commandWords;
145
+ w[a] = target, w[a + 1] = pack(copy?.from ?? [0, 0]), w[a + 2] = pack(copy?.to ?? [0, 0]), w[a + 3] = pack(copy?.size ?? [info.width, info.height]), w[a + 4] = HOOK_ORDER.indexOf(copy?.hook ?? "beforeScene");
146
+ }
147
+ destroyTexture(texture) {
148
+ this.host.command(chunk7AAIAVAA_js.OP_RAW_DESTROY_TEXTURE, texture), this.textures.delete(texture), this.reject((read) => read.texture === texture, `gpu texture ${texture} was destroyed`);
149
+ }
150
+ createSampler(desc) {
151
+ let d = this.host.clearDesc();
152
+ return d[0] = desc?.filter === "nearest" ? 1 : 0, d[1] = desc?.wrap === "clamp" ? 1 : desc?.wrap === "mirror" ? 2 : 0, this.check(this.host.call("engine_render_raw_sampler"), "create gpu sampler");
153
+ }
154
+ createShader(wgsl) {
155
+ return this.shaders.push(wgsl), this.shaders.length - 1;
156
+ }
157
+ createComputePipeline(desc) {
158
+ let size = desc.workgroupSize ?? [(1), (1), (1)];
159
+ return this.pipeline(desc.shader, this.encoder.encode(desc.entryPoint), (d) => {
160
+ d[4] = 0, d[1] = size[0], d[2] = size[1], d[3] = size[2];
161
+ });
162
+ }
163
+ createRenderPipeline(desc) {
164
+ if (desc.targets.length === 0 || desc.targets.length > (4))
165
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `render pipelines take 1 to ${(4)} targets`);
166
+ let vertex = this.encoder.encode(desc.vertexEntry), fragment = this.encoder.encode(desc.fragmentEntry), entry = new Uint8Array(vertex.byteLength + 1 + fragment.byteLength);
167
+ entry.set(vertex), entry[vertex.byteLength] = (0), entry.set(fragment, vertex.byteLength + 1);
168
+ let id = this.pipeline(desc.shader, entry, (d) => {
169
+ d[4] = 1, desc.targets.forEach((format, t) => {
170
+ d[5 + t] = FORMAT[format] + 1;
171
+ }), d[9] = packBlend(desc.blend), d[10] = (0), d[11] = TOPOLOGY[desc.topology ?? "triangle-list"];
172
+ });
173
+ return this.targetFormats.set(id, desc.targets[0]), id;
174
+ }
175
+ createBindGroup(pipeline, group, bindings) {
176
+ if (bindings.length > 11)
177
+ throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", `bind groups take at most ${11} bindings`);
178
+ this.host.flush();
179
+ let d = this.host.clearDesc();
180
+ return d[0] = pipeline, d[1] = group, d[2] = bindings.length, bindings.forEach((b, i) => {
181
+ let at = 3 + i * 5;
182
+ if (d[at + 0] = b.binding, "texture" in b) {
183
+ d[at + 4] = 1, d[at + 1] = typeof b.texture == "string" ? SCENE_TEXTURE[b.texture] : b.texture;
184
+ return;
185
+ }
186
+ if ("sampler" in b) {
187
+ d[at + 4] = 2, d[at + 1] = b.sampler;
188
+ return;
189
+ }
190
+ let scene = typeof b.buffer == "string";
191
+ d[at + 4] = 0, d[at + 1] = scene ? SCENE[b.buffer] : b.buffer, d[at + 2] = b.offset ?? 0, d[at + 3] = b.size ?? (scene ? 0 : this.size(b.buffer) - (b.offset ?? 0));
192
+ }), this.check(this.host.call("engine_render_raw_bindings"), "create bind group");
193
+ }
194
+ dispatch(pipeline, bindGroup, x, y = (1), z = (1), options) {
195
+ let a = this.host.command(chunk7AAIAVAA_js.OP_RAW_DISPATCH, pipeline), w = this.host.commandWords;
196
+ w[a + 0] = bindGroup, w[a + 1] = x, w[a + 1 + 1] = y, w[a + 1 + 2] = z, w[a + 4] = HOOK_ORDER.indexOf(options?.hook ?? "beforeScene"), w[a + 5] = options?.indirect ?? 0;
197
+ }
198
+ draw(pipeline, bindGroup, vertexCount, options) {
199
+ let target = options?.target ?? "color", hook = options?.hook ?? (target === "color" ? "post" : "afterTransparent");
200
+ if (target === "color") {
201
+ if (hook !== "post")
202
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", "draws into scene colour run on the post hook");
203
+ if (this.targetFormats.get(pipeline) !== SCENE_COLOR_FORMAT)
204
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `scene colour draws need a ${SCENE_COLOR_FORMAT} target`);
205
+ }
206
+ let a = this.host.command(chunk7AAIAVAA_js.OP_RAW_DRAW, pipeline), w = this.host.commandWords;
207
+ w[a + 0] = bindGroup, w[a + 1] = vertexCount, w[a + 2] = options?.instances ?? 1, w[a + 3] = target === "color" ? 4294967282 : target, w[a + 4] = HOOK_ORDER.indexOf(hook), w[a + 5] = 0;
208
+ }
209
+ copyBuffer(source, sourceOffset, target, targetOffset, size) {
210
+ let a = this.host.command(chunk7AAIAVAA_js.OP_RAW_COPY, source), w = this.host.commandWords;
211
+ w[a] = sourceOffset, w[a + 1] = target, w[a + 2] = targetOffset, w[a + 3] = size;
212
+ }
213
+ submit() {
214
+ this.host.flush(), this.poll();
215
+ }
216
+ readBuffer(buffer, offset, out) {
217
+ this.host.flush();
218
+ let request = this.check(
219
+ this.host.call("engine_render_raw_read", buffer, offset, out.byteLength),
220
+ "read gpu buffer"
221
+ );
222
+ return new Promise((resolve, reject) => {
223
+ this.reads.push({ request, buffer, texture: null, offset, out, resolve, reject });
224
+ });
225
+ }
226
+ destroyBuffer(buffer) {
227
+ this.host.command(chunk7AAIAVAA_js.OP_RAW_DESTROY_BUFFER, buffer), this.sizes.delete(buffer), this.reject((read) => read.buffer === buffer, `gpu buffer ${buffer} was destroyed`);
228
+ }
229
+ dispose() {
230
+ for (let id of this.sizes.keys()) this.host.command(chunk7AAIAVAA_js.OP_RAW_DESTROY_BUFFER, id);
231
+ for (let id of this.textures.keys()) this.host.command(chunk7AAIAVAA_js.OP_RAW_DESTROY_TEXTURE, id);
232
+ this.host.flush(), this.sizes.clear(), this.textures.clear(), this.reject(() => true, "gpu was disposed");
233
+ }
234
+ pipeline(shader, entry, configure) {
235
+ let source = this.shaders[shader];
236
+ if (!source) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `shader ${shader} does not exist`);
237
+ if (entry.byteLength === 0 || entry.byteLength > ENTRY_BYTES)
238
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `entry point names must fit ${ENTRY_BYTES} bytes`);
239
+ this.host.flush();
240
+ let bytes = this.encoder.encode(source), pointer = this.host.stage(bytes), d = this.host.clearDesc();
241
+ return d[0] = entry.byteLength, configure(d), new Uint8Array(d.buffer, d.byteOffset + 12 * (4), entry.byteLength).set(entry), this.check(
242
+ this.host.call("engine_render_raw_pipeline", pointer, bytes.byteLength),
243
+ "create gpu pipeline"
244
+ );
245
+ }
246
+ reject(matches, message) {
247
+ let kept = [];
248
+ for (let read of this.reads)
249
+ matches(read) ? read.reject(new chunk2V7IL4HC_js.GameError("unknown_resource", message)) : kept.push(read);
250
+ this.reads = kept;
251
+ }
252
+ poll() {
253
+ if (this.reads.length === 0) return;
254
+ let waiting = [];
255
+ for (let read of this.reads) {
256
+ let pointer = this.host.call("engine_render_raw_poll", read.request);
257
+ if (pointer === 0) {
258
+ waiting.push(read);
259
+ continue;
260
+ }
261
+ if (read.buffer !== null) {
262
+ let source = this.host.bytes(10, read.buffer, 0);
263
+ read.out.set(source.subarray(read.offset, read.offset + read.out.byteLength));
264
+ } else
265
+ read.out.set(this.host.view(pointer, read.out.byteLength));
266
+ read.resolve();
267
+ }
268
+ this.reads = waiting;
269
+ }
270
+ size(buffer) {
271
+ let size = this.sizes.get(buffer);
272
+ if (size === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `gpu buffer ${buffer} does not exist`);
273
+ return size;
274
+ }
275
+ texture(texture) {
276
+ let info = this.textures.get(texture);
277
+ if (!info) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `gpu texture ${texture} does not exist`);
278
+ return info;
279
+ }
280
+ check(code, what) {
281
+ if (code < 0) throw failure(code, what);
282
+ return code;
283
+ }
284
+ };
285
+ function createEngineGpu(host) {
286
+ return (host.capabilities & 8192) === 0 ? null : new EngineRaw(host);
287
+ }
288
+
289
+ // src/game/backends/engine/clips.ts
290
+ var NO_JOINT = 4294967295, IK_HEADER = 8, BLEND_MEMBER_WORDS = 3, CLIP_INFO_WORDS = 4, EXPLICIT_MAP = 1, RETARGET_HEADER = 2, BAKE_HEADER = 4, FULL_TURN = Math.PI * 2, ANIM_CREATE_PROPERTY_CLIP = 40, ANIM_PLAY_PROPERTY_CLIP = 41, ANIM_DESTROY_PROPERTY_CLIP = 42, ANIM_SET_PROPERTY_EVENTS = 43, BIND_COMMAND = 0, BIND_MATERIAL_UNIFORM = 1, PROPERTY_TEMPLATE = 8, PROPERTY_TEMPLATE_WORDS = 6, PROPERTY_TRACK_HEADER = (8) + (6), EngineClips = class {
291
+ constructor(host) {
292
+ this.host = host;
293
+ this.bits = new Float32Array(1);
294
+ this.bitWords = new Uint32Array(this.bits.buffer);
295
+ }
296
+ floatBits(value) {
297
+ return this.bits[0] = value, this.bitWords[0];
298
+ }
299
+ op(target, sub) {
300
+ let at = this.host.command(chunk7AAIAVAA_js.OP_ANIMATION, target);
301
+ return this.host.commandWords[at] = sub, at + 1;
302
+ }
303
+ joint(root, bone) {
304
+ let index = this.host.model(root).nodeNames.indexOf(bone);
305
+ if (index < 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `model has no bone ${bone}`);
306
+ return index;
307
+ }
308
+ clipIndex(root, clip) {
309
+ let index = this.host.model(root).clipNames.indexOf(clip);
310
+ if (index < 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `model has no clip ${clip}`);
311
+ return index;
312
+ }
313
+ createPropertyClip(desc) {
314
+ let sizes = desc.tracks.map(chunkYV52DGSA_js.propertySize), words = 2;
315
+ desc.tracks.forEach((track, i) => {
316
+ words += PROPERTY_TRACK_HEADER + sizes[i] + track.times.length + track.values.length;
317
+ });
318
+ let out = new Uint32Array(words);
319
+ out[0] = this.floatBits(desc.duration), out[1] = desc.tracks.length;
320
+ let at = 2;
321
+ return desc.tracks.forEach((track, i) => {
322
+ let size = sizes[i], header = out.subarray(at, at + PROPERTY_TRACK_HEADER);
323
+ this.bindTarget(track.target, size, header), header[4] = size, header[5] = chunkYV52DGSA_js.INTERPOLATION_CODES[track.interpolation ?? "linear"], header[6] = track.times.length, at += PROPERTY_TRACK_HEADER;
324
+ for (let k = 0; k < size; k++) out[at++] = this.floatBits(track.rest[k]);
325
+ for (let k = 0; k < track.times.length; k++) out[at++] = this.floatBits(track.times[k]);
326
+ for (let k = 0; k < track.values.length; k++) out[at++] = this.floatBits(track.values[k]);
327
+ }), this.host.animation((40), 0, out);
328
+ }
329
+ bindTarget(target, size, header) {
330
+ let template = header.subarray((8), (8) + (6));
331
+ switch (target.kind) {
332
+ case "uniform": {
333
+ let slot = this.host.uniformSlot(target.material, target.name);
334
+ if (size > slot.words) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `uniform ${target.name} holds ${slot.words} values`);
335
+ header[0] = (1), header[1] = 0, header[2] = target.material, header[3] = slot.offset;
336
+ return;
337
+ }
338
+ case "light":
339
+ header[0] = (0), header[1] = 12, header[2] = target.node, header[3] = 1, template[0] = target.color >>> 0;
340
+ return;
341
+ case "post":
342
+ header[0] = (0), header[1] = 24, header[2] = target.chain, header[3] = 2, template[0] = target.effect, template[1] = this.host.postParam(target.chain, target.effect, target.name);
343
+ return;
344
+ case "emitterRate":
345
+ header[0] = (0), header[1] = chunk7AAIAVAA_js.OP_SET_EMITTER_RATE, header[2] = target.emitter, header[3] = 0;
346
+ return;
347
+ }
348
+ }
349
+ playPropertyClip(clip, loop, fadeSeconds, speed) {
350
+ let words = Uint32Array.of(clip, loop ? 1 : 0, this.floatBits(fadeSeconds), this.floatBits(speed));
351
+ return this.host.animation((41), 0, words);
352
+ }
353
+ setPropertyClipEvents(clip, events) {
354
+ let words = new Uint32Array(1 + events.length * 2);
355
+ words[0] = clip, events.forEach((event, i) => {
356
+ words[1 + i * 2] = this.floatBits(event.time), words[2 + i * 2] = event.id >>> 0;
357
+ }), this.host.animation((43), 0, words);
358
+ }
359
+ destroyPropertyClip(clip) {
360
+ this.host.animation((42), 0, Uint32Array.of(clip));
361
+ }
362
+ setClipTime(action, seconds) {
363
+ this.host.commandFloats[this.op(action, chunk7AAIAVAA_js.ANIM_SET_TIME)] = seconds;
364
+ }
365
+ setClipSpeed(action, speed) {
366
+ this.host.commandFloats[this.op(action, chunk7AAIAVAA_js.ANIM_SET_SPEED)] = speed;
367
+ }
368
+ setClipLoop(action, loop, repetitions, clampWhenFinished) {
369
+ let at = this.op(action, chunk7AAIAVAA_js.ANIM_SET_LOOP), w = this.host.commandWords;
370
+ w[at] = chunkYV52DGSA_js.LOOP_CODES[loop], w[at + 1] = Number.isFinite(repetitions) ? Math.max(0, repetitions | 0) : 0, w[at + 2] = clampWhenFinished ? 1 : 0;
371
+ }
372
+ setClipPaused(action, paused) {
373
+ this.host.commandWords[this.op(action, chunk7AAIAVAA_js.ANIM_SET_PAUSED)] = paused ? 1 : 0;
374
+ }
375
+ setClipRange(action, start, end) {
376
+ let at = this.op(action, chunk7AAIAVAA_js.ANIM_SET_RANGE);
377
+ this.host.commandFloats[at] = start, this.host.commandFloats[at + 1] = end;
378
+ }
379
+ setClipSync(action, group) {
380
+ this.host.commandWords[this.op(action, chunk7AAIAVAA_js.ANIM_SET_SYNC)] = group === null ? 0 : (group & 2147483647) + 1;
381
+ }
382
+ setClipSyncMode(action, mode) {
383
+ this.host.commandWords[this.op(action, chunk7AAIAVAA_js.ANIM_SET_SYNC_MODE)] = chunkYV52DGSA_js.SYNC_MODE_CODES[mode];
384
+ }
385
+ setClipSyncMarkers(root, clip, markers) {
386
+ chunkYV52DGSA_js.checkSyncMarkers(markers, Number.POSITIVE_INFINITY);
387
+ let words = new Uint32Array(1 + markers.length * 2);
388
+ words[0] = this.clipIndex(root, clip), markers.forEach((marker, i) => {
389
+ words[1 + i * 2] = this.floatBits(marker.time), words[2 + i * 2] = marker.id >>> 0;
390
+ }), this.host.animation(chunk7AAIAVAA_js.ANIM_SET_SYNC_MARKERS, root, words);
391
+ }
392
+ inertialize(from, to, seconds) {
393
+ let at = this.op(from, chunk7AAIAVAA_js.ANIM_INERTIALIZE);
394
+ this.host.commandWords[at] = to, this.host.commandFloats[at + 1] = seconds;
395
+ }
396
+ bakeRetarget(target, source, clip, options) {
397
+ let maps = options?.maps, words = new Uint32Array((4) + (maps === void 0 ? 0 : chunkYV52DGSA_js.HUMAN_BONES.length * 2)).fill((4294967295));
398
+ words[0] = source, words[1] = this.clipIndex(source, clip), words[2] = this.floatBits(chunkYV52DGSA_js.bakeRate(options)), words[3] = maps === void 0 ? 0 : (1), maps !== void 0 && this.writeMaps(words, (4), target, source, maps);
399
+ let index = this.host.animation(chunk7AAIAVAA_js.ANIM_BAKE_RETARGET, target, words), name = this.host.refreshModel(target).clipNames[index];
400
+ if (name === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `baked clip ${index} is missing on the target model`);
401
+ return name;
402
+ }
403
+ writeMaps(words, at, target, source, maps) {
404
+ chunkYV52DGSA_js.HUMAN_BONES.forEach((bone, i) => {
405
+ let from = maps.source[bone], to = maps.target[bone];
406
+ from !== void 0 && (words[at + i] = this.joint(source, from)), to !== void 0 && (words[at + chunkYV52DGSA_js.HUMAN_BONES.length + i] = this.joint(target, to));
407
+ });
408
+ }
409
+ setClipEventsEnabled(action, enabled) {
410
+ this.host.commandWords[this.op(action, chunk7AAIAVAA_js.ANIM_SET_EVENTS)] = enabled ? 1 : 0;
411
+ }
412
+ setClipAdditive(action, referenceTime) {
413
+ this.host.commandFloats[this.host.command(chunk7AAIAVAA_js.OP_SET_CLIP_ADDITIVE, action)] = referenceTime ?? Number.POSITIVE_INFINITY;
414
+ }
415
+ crossFade(from, to, seconds, warp) {
416
+ let at = this.op(from, chunk7AAIAVAA_js.ANIM_CROSSFADE);
417
+ this.host.commandWords[at] = to, this.host.commandFloats[at + 1] = seconds, this.host.commandWords[at + 2] = warp ? 1 : 0;
418
+ }
419
+ fadeClip(action, weight, seconds) {
420
+ let at = this.op(action, chunk7AAIAVAA_js.ANIM_FADE);
421
+ this.host.commandFloats[at] = weight, this.host.commandFloats[at + 1] = seconds;
422
+ }
423
+ fadeClipFrom(action, values, offset) {
424
+ let at = this.op(action, chunk7AAIAVAA_js.ANIM_FADE), f = this.host.commandFloats;
425
+ f[at] = values[offset], f[at + 1] = values[offset + 1];
426
+ }
427
+ createClipMask(root, weights) {
428
+ let names = this.host.model(root).nodeNames, words = new Uint32Array(names.length);
429
+ for (let [bone, weight] of Object.entries(weights)) words[this.joint(root, bone)] = this.floatBits(weight);
430
+ return this.host.animation(chunk7AAIAVAA_js.ANIM_CREATE_MASK, root, words);
431
+ }
432
+ setClipMask(action, mask) {
433
+ this.host.commandWords[this.host.command(chunk7AAIAVAA_js.OP_SET_CLIP_MASK, action)] = mask ?? 0;
434
+ }
435
+ destroyClipMask(root, mask) {
436
+ this.host.animation(chunk7AAIAVAA_js.ANIM_DESTROY, root, Uint32Array.of(chunk7AAIAVAA_js.ANIM_KIND_MASK, mask));
437
+ }
438
+ setClipEvents(root, clip, events) {
439
+ let words = new Uint32Array(1 + events.length * 2);
440
+ words[0] = this.clipIndex(root, clip), events.forEach((event, i) => {
441
+ words[1 + i * 2] = this.floatBits(event.time), words[2 + i * 2] = event.id >>> 0;
442
+ }), this.host.animation(chunk7AAIAVAA_js.ANIM_SET_CLIP_EVENTS, root, words);
443
+ }
444
+ clipInfo(root, clip) {
445
+ let words = new Uint32Array((4));
446
+ return words[0] = this.clipIndex(root, clip), this.host.animation(chunk7AAIAVAA_js.ANIM_CLIP_INFO, root, words), this.bitWords[0] = words[0], { duration: this.bits[0], tracks: words[1], morphWeights: words[2], events: words[3] };
447
+ }
448
+ createBlendSpace(root, desc) {
449
+ let words = new Uint32Array(2 + desc.members.length * (3));
450
+ return words[0] = chunkYV52DGSA_js.BLEND_SPACE_CODES[desc.kind], words[1] = desc.members.length, desc.members.forEach((member, i) => {
451
+ let at = 2 + i * (3);
452
+ words[at] = member.action, words[at + 1] = this.floatBits(member.x), words[at + 2] = this.floatBits(member.y ?? 0);
453
+ }), this.host.animation(chunk7AAIAVAA_js.ANIM_CREATE_BLEND, root, words);
454
+ }
455
+ setBlendParameter(space, x, y, weight) {
456
+ let at = this.op(space, chunk7AAIAVAA_js.ANIM_SET_BLEND);
457
+ this.host.commandFloats[at] = x, this.host.commandFloats[at + 1] = y, this.host.commandFloats[at + 2] = weight;
458
+ }
459
+ setBlendParameterFrom(space, values, offset) {
460
+ let at = this.op(space, chunk7AAIAVAA_js.ANIM_SET_BLEND), f = this.host.commandFloats;
461
+ f[at] = values[offset], f[at + 1] = values[offset + 1], f[at + 2] = values[offset + 2];
462
+ }
463
+ destroyBlendSpace(root, space) {
464
+ this.host.animation(chunk7AAIAVAA_js.ANIM_DESTROY, root, Uint32Array.of(chunk7AAIAVAA_js.ANIM_KIND_BLEND, space));
465
+ }
466
+ createIk(root, desc) {
467
+ let words = new Uint32Array((8) + desc.bones.length), forward = desc.forward ?? [0, 0, 1];
468
+ return words[0] = chunkYV52DGSA_js.IK_CODES[desc.solver], words[1] = desc.iterations ?? chunkYV52DGSA_js.DEFAULT_IK_ITERATIONS, words[2] = this.floatBits(desc.tolerance ?? chunkYV52DGSA_js.DEFAULT_IK_TOLERANCE), words[3] = this.floatBits(desc.maxAngle ?? FULL_TURN), words[4] = this.floatBits(forward[0]), words[5] = this.floatBits(forward[1]), words[6] = this.floatBits(forward[2]), words[7] = desc.bones.length, desc.bones.forEach((bone, i) => {
469
+ words[(8) + i] = this.joint(root, bone);
470
+ }), this.host.animation(chunk7AAIAVAA_js.ANIM_CREATE_IK, root, words);
471
+ }
472
+ setIkTarget(chain, x, y, z, weight) {
473
+ let at = this.op(chain, chunk7AAIAVAA_js.ANIM_SET_IK_TARGET), f = this.host.commandFloats;
474
+ f[at] = x, f[at + 1] = y, f[at + 2] = z, f[at + 3] = weight;
475
+ }
476
+ setIkTargetFrom(chain, values, offset) {
477
+ let at = this.op(chain, chunk7AAIAVAA_js.ANIM_SET_IK_TARGET), f = this.host.commandFloats;
478
+ f[at] = values[offset], f[at + 1] = values[offset + 1], f[at + 2] = values[offset + 2], f[at + 3] = values[offset + 3];
479
+ }
480
+ setIkPole(chain, x, y, z) {
481
+ let at = this.op(chain, chunk7AAIAVAA_js.ANIM_SET_IK_POLE), f = this.host.commandFloats;
482
+ f[at] = x, f[at + 1] = y, f[at + 2] = z;
483
+ }
484
+ destroyIk(root, chain) {
485
+ this.host.animation(chunk7AAIAVAA_js.ANIM_DESTROY, root, Uint32Array.of(chunk7AAIAVAA_js.ANIM_KIND_IK, chain));
486
+ }
487
+ humanoid(root) {
488
+ let words = new Uint32Array(chunkYV52DGSA_js.HUMAN_BONES.length);
489
+ this.host.animation(chunk7AAIAVAA_js.ANIM_HUMANOID, root, words);
490
+ let names = this.host.model(root).nodeNames, map = {};
491
+ return chunkYV52DGSA_js.HUMAN_BONES.forEach((bone, i) => {
492
+ words[i] !== (4294967295) && (map[bone] = names[words[i]]);
493
+ }), map;
494
+ }
495
+ retarget(target, source, maps) {
496
+ if (maps === void 0) {
497
+ this.host.animation(chunk7AAIAVAA_js.ANIM_RETARGET, target, Uint32Array.of(source, 0));
498
+ return;
499
+ }
500
+ let words = new Uint32Array((2) + chunkYV52DGSA_js.HUMAN_BONES.length * 2).fill((4294967295));
501
+ words[0] = source, words[1] = (1), this.writeMaps(words, (2), target, source, maps), this.host.animation(chunk7AAIAVAA_js.ANIM_RETARGET, target, words);
502
+ }
503
+ stopRetarget(target) {
504
+ this.host.animation(chunk7AAIAVAA_js.ANIM_DESTROY, target, Uint32Array.of(chunk7AAIAVAA_js.ANIM_KIND_RETARGET, 0));
505
+ }
506
+ createBoneSet(root, bones) {
507
+ let nodes = new Uint32Array(bones.length);
508
+ return bones.forEach((bone, i) => {
509
+ let node = this.host.findNode(root, bone);
510
+ if (node === null) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `model has no bone ${bone}`);
511
+ nodes[i] = node;
512
+ }), this.host.createPoseReader(nodes);
513
+ }
514
+ readBonePoses(set, out, offset) {
515
+ this.host.readPoses(set, out, offset);
516
+ }
517
+ destroyBoneSet(set) {
518
+ this.host.destroyPoseReader(set);
519
+ }
520
+ setAnimationLod(root, interval) {
521
+ this.host.animation(chunk7AAIAVAA_js.ANIM_SET_LOD, root, Uint32Array.of(chunkYV52DGSA_js.animationLodInterval(interval)));
522
+ }
523
+ enableRootMotion(root, desc) {
524
+ let flags = (desc.horizontal ?? true ? chunk7AAIAVAA_js.ROOT_MOTION_XZ : 0) | (desc.vertical ? chunk7AAIAVAA_js.ROOT_MOTION_Y : 0) | (desc.yaw ? chunk7AAIAVAA_js.ROOT_MOTION_YAW : 0) | (desc.apply ? chunk7AAIAVAA_js.ROOT_MOTION_APPLY : 0);
525
+ if (flags === 0 || flags === chunk7AAIAVAA_js.ROOT_MOTION_APPLY)
526
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", "root motion needs at least one extracted axis");
527
+ return this.host.animation(chunk7AAIAVAA_js.ANIM_ROOT_MOTION, root, Uint32Array.of(flags, this.joint(root, desc.bone)));
528
+ }
529
+ disableRootMotion(root) {
530
+ this.host.animation(chunk7AAIAVAA_js.ANIM_DESTROY, root, Uint32Array.of(chunk7AAIAVAA_js.ANIM_KIND_ROOT_MOTION, 0));
531
+ }
532
+ readRootMotion(motion, out, offset) {
533
+ let words = this.host.floats(chunk7AAIAVAA_js.ANIMATION_BUFFER_ROOT_MOTION);
534
+ out.set(words.subarray(motion * chunkYV52DGSA_js.ROOT_MOTION_WORDS, (motion + 1) * chunkYV52DGSA_js.ROOT_MOTION_WORDS), offset);
535
+ }
536
+ readClipState(action, out) {
537
+ let floats = this.host.floats(chunk7AAIAVAA_js.ANIMATION_BUFFER_ACTIONS), at = action * chunk7AAIAVAA_js.ANIM_ACTION_WORDS;
538
+ this.bits[0] = floats[at + 3];
539
+ let flags = this.bitWords[0];
540
+ out.time = floats[at], out.weight = floats[at + 1], out.speed = floats[at + 2], out.running = (flags & chunk7AAIAVAA_js.ANIM_ACTION_RUNNING) !== 0, out.paused = (flags & chunk7AAIAVAA_js.ANIM_ACTION_PAUSED) !== 0, out.finished = (flags & chunk7AAIAVAA_js.ANIM_ACTION_FINISHED) !== 0;
541
+ }
542
+ readClipEvents(out) {
543
+ let words = this.host.words(chunk7AAIAVAA_js.ANIMATION_BUFFER_EVENTS), count = Math.min(words[0], chunk7AAIAVAA_js.ANIM_MAX_EVENTS);
544
+ for (let i = 0; i < count; i++) {
545
+ let at = 1 + i * chunk7AAIAVAA_js.ANIM_EVENT_WORDS, event = out[i] ?? chunkYV52DGSA_js.emptyClipEvent();
546
+ event.action = words[at], event.kind = chunkYV52DGSA_js.CLIP_EVENT_KINDS[words[at + 1]] ?? "event", event.id = words[at + 2], this.bitWords[0] = words[at + 3], event.time = this.bits[0], out[i] = event;
547
+ }
548
+ return count;
549
+ }
550
+ };
551
+
552
+ // src/game/backends/engine/emitters.ts
553
+ var CURVE_CHANNELS = 4, DEFAULT_LIFETIME = 1, DEFAULT_SPEED = 1, DEFAULT_SIZE = 0.1, WHITE = 16777215;
554
+ function pair(d, at, value, fallback) {
555
+ d[at] = value?.[0] ?? fallback, d[at + 1] = value?.[1] ?? fallback;
556
+ }
557
+ function writeEmitterDesc(d, f, desc) {
558
+ d[0] = desc.capacity, f[1] = desc.rate ?? 0, d[2] = desc.burst ?? 0, pair(f, 3, desc.lifetime, (1)), pair(f, 5, desc.speed, (1)), pair(f, 7, desc.size, (0.1)), d[9] = desc.color?.[0] ?? (16777215), d[10] = desc.color?.[1] ?? desc.color?.[0] ?? (16777215), f[11] = desc.alpha?.[0] ?? 1, f[12] = desc.alpha?.[1] ?? 1, f.set(desc.gravity ?? [0, 0, 0], 13), f[16] = desc.drag ?? 0, f[17] = desc.noise?.strength ?? 0, f[18] = desc.noise?.scale ?? 1;
559
+ let shape = desc.shape ?? { kind: "point" };
560
+ switch (d[19] = chunk7AAIAVAA_js.EMITTER_SHAPES.indexOf(shape.kind), shape.kind) {
561
+ case "sphere":
562
+ case "disc":
563
+ f[20] = shape.radius;
564
+ break;
565
+ case "cone":
566
+ f[20] = shape.angle, f[21] = shape.radius ?? 0;
567
+ break;
568
+ case "box":
569
+ f.set(shape.size, 20);
570
+ break;
571
+ }
572
+ let collision = desc.collision ?? { kind: "none" };
573
+ d[24] = chunk7AAIAVAA_js.EMITTER_COLLISIONS.indexOf(collision.kind), collision.kind === "plane" && f.set(collision.plane, 25), collision.kind !== "none" && (f[29] = collision.bounce ?? 0), d[30] = desc.material ?? 0, d[31] = (desc.soft ? 1 : 0) | (desc.sorted ? 2 : 0) | (desc.localSpace ? 4 : 0) | (desc.deterministic ? 8 : 0) | (desc.additive ? 16 : 0) | (desc.stretch ? 32 : 0) | (desc.oit ? 64 : 0) | (desc.velocityAligned ? 128 : 0), d[32] = desc.seed ?? 0, f[33] = desc.spread ?? 0, f[34] = desc.spin ?? 0, d[36] = desc.sizeCurve || desc.colorCurve ? 32 : 0;
574
+ }
575
+ function channel(point, c) {
576
+ return typeof point.value == "number" ? point.value : point.value[c];
577
+ }
578
+ function sampleCurve(points, out) {
579
+ if (points.length === 0) return;
580
+ let segment = 0;
581
+ for (let i = 0; i < 32; i++) {
582
+ let t = i / 31;
583
+ for (; segment < points.length - 1 && points[segment + 1].t < t; ) segment++;
584
+ let a = points[segment], b = points[Math.min(segment + 1, points.length - 1)], span = b.t - a.t, k = span > 0 ? Math.min(1, Math.max(0, (t - a.t) / span)) : 0;
585
+ for (let c = 0; c < (4); c++) {
586
+ let from = channel(a, c);
587
+ out[i * (4) + c] = from + (channel(b, c) - from) * k;
588
+ }
589
+ }
590
+ }
591
+
592
+ // src/game/render/environment.ts
593
+ var channel2 = (hex, shift) => (hex >> shift & 255) / 255;
594
+ function volumetricChunks(words) {
595
+ let chunks = [];
596
+ for (let at = 0; at < words.length; at += 5)
597
+ chunks.push([at, words.subarray(at, Math.min(at + 5, words.length))]);
598
+ return chunks;
599
+ }
600
+ function volumetricWords(desc) {
601
+ let words = new Float32Array(24).fill(Number.NaN), flags = desc.enabled === false ? 1 : 0, fog = desc.fog;
602
+ if (fog) {
603
+ flags |= 2;
604
+ let albedo = fog.albedo ?? 15132390;
605
+ words.set(
606
+ [
607
+ fog.density ?? UNSET,
608
+ fog.height ?? UNSET,
609
+ fog.falloff ?? UNSET,
610
+ fog.anisotropy ?? UNSET,
611
+ channel2(albedo, 16),
612
+ channel2(albedo, 8),
613
+ channel2(albedo, 0),
614
+ fog.noise ?? UNSET,
615
+ fog.range ?? UNSET,
616
+ fog.ambient ?? UNSET
617
+ ],
618
+ 1
619
+ );
620
+ }
621
+ let clouds = desc.clouds;
622
+ clouds && (flags |= 4, words.set(
623
+ [
624
+ clouds.coverage ?? UNSET,
625
+ clouds.density ?? UNSET,
626
+ clouds.altitude ?? UNSET,
627
+ clouds.thickness ?? UNSET,
628
+ clouds.type ?? UNSET,
629
+ clouds.shadow ?? UNSET,
630
+ clouds.detail ?? UNSET
631
+ ],
632
+ 11
633
+ ));
634
+ let atmosphere = desc.atmosphere;
635
+ return atmosphere && (flags |= 8, words.set(
636
+ [
637
+ atmosphere.rayleigh ?? UNSET,
638
+ atmosphere.mie ?? UNSET,
639
+ atmosphere.mieAnisotropy ?? UNSET,
640
+ atmosphere.ozone ?? UNSET,
641
+ atmosphere.groundAlbedo ?? UNSET,
642
+ atmosphere.sunDiscDegrees ?? UNSET
643
+ ],
644
+ 18
645
+ )), words[0] = flags, words;
646
+ }
647
+ var UNSET_WETNESS = -1, UNSET = Number.NaN, unit = (value) => Math.min(Math.max(value ?? 0, 0), 1);
648
+ function weatherWords(state) {
649
+ return {
650
+ cloudCover: unit(state.cloudCover),
651
+ haze: unit(state.haze),
652
+ precipitation: unit(state.precipitation),
653
+ snow: state.snow ?? false,
654
+ wetness: state.wetness === void 0 ? (-1) : unit(state.wetness),
655
+ windX: state.wind?.[0] ?? 0,
656
+ windZ: state.wind?.[1] ?? 0
657
+ };
658
+ }
659
+
660
+ // src/game/backends/engine/advertised.ts
661
+ function engineAdvertises(runtime, feature) {
662
+ let count = runtime.symbols.engine_feature_count, name = runtime.symbols.engine_feature_name;
663
+ if (typeof count != "function" || typeof name != "function") return false;
664
+ let scratch = runtime.exports.engine_alloc(64, 1);
665
+ if (scratch === 0) return false;
666
+ let found = false;
667
+ for (let i = 0; i < count() && !found; i++) {
668
+ let length = name(i, scratch, 64);
669
+ if (length !== feature.length) continue;
670
+ let bytes = new Uint8Array(runtime.memory.buffer, scratch, length);
671
+ found = true;
672
+ for (let k = 0; k < length && found; k++) found = bytes[k] === feature.charCodeAt(k);
673
+ }
674
+ return runtime.exports.engine_free(scratch, 64, 1), found;
675
+ }
676
+
677
+ // src/game/backends/engine/graphics.ts
678
+ var ENGINE_GRAPHICS_NAME = "cimplify-render", NO_HANDLE = 0, GOVERNOR_TIER_MASK = 255, AUTO_QUALITY_TIER = -1, QUALITY_TIER_FULL = 0, GOVERNOR_PRESSURE_SHIFT = 28, GOVERNOR_PRESSURE_MASK = 15, MIN_REFRESH_INTERVAL_MS = 1, MAX_REFRESH_INTERVAL_MS = 100, REFRESH_WINDOW_FRAMES = 64, MICROS_PER_MS = 1e3, BUDGET_TOLERANCE = 50, NO_PRESENT_YET = -1, REFRESH_PRESENTED = 0, REFRESH_SHORTEST = 1, NO_NODE = 0, SRGB_KNEE = 0.04045, SRGB_SLOPE = 12.92, SRGB_OFFSET = 0.055, SRGB_SCALE = 1.055, SRGB_GAMMA = 2.4, BYTE_MAX = 255, DEFAULT_GROUND = 4473924, DEFAULT_SPOT_ANGLE = Math.PI / 3, DEFAULT_DECAY = 2, DEFAULT_IOR = 1.5, DEFAULT_ROUGHNESS = 1, DEFAULT_POINT_SIZE = 1, POSE_STRIDE2 = 10, NODE_BUFFER_SLOTS = 4, UTF8 = new TextEncoder(), UTF8_BYTES_PER_UNIT = 3, DEFAULT_TEXT_CAPACITY = 128, DEFAULT_TEXT3D_SIZE = 1, DEFAULT_TEXT2D_SIZE = 16, DEFAULT_TEXT_COLOR = 16777215, LINEAR = 0, SRGB = 1, TEXT_ALIGNS = {
679
+ start: 0,
680
+ end: 1,
681
+ left: 2,
682
+ center: 3,
683
+ right: 4
684
+ }, TEXT_DIRECTIONS = {
685
+ auto: 0,
686
+ ltr: 1,
687
+ rtl: 2
688
+ }, PICK_HIT = 1, NAMES = new TextDecoder(), NAME_SEPARATOR = 0, SEMANTICS = {
689
+ position: 0,
690
+ normal: 1,
691
+ uv: 2,
692
+ uv1: 3,
693
+ uv2: 3,
694
+ color: 4,
695
+ tangent: 5,
696
+ skinIndex: 6,
697
+ skinWeight: 7
698
+ }, EFFECT_PARAMETERS = {
699
+ bloom: ["strength", "radius", "threshold", "physical"],
700
+ fxaa: [],
701
+ vignette: ["offset", "darkness"],
702
+ color_grade: ["exposure", "contrast", "saturation"],
703
+ shader: [],
704
+ ao: ["radius", "intensity", "thickness", "quality"],
705
+ smaa: ["threshold", "temporal"],
706
+ taa: ["feedback", "sharpness"],
707
+ outline: ["thickness", "depthThreshold", "normalThreshold", "color"],
708
+ ssr: ["intensity", "maxDistance", "thickness", "fade"],
709
+ dof: ["focus", "aperture", "maxBlur"],
710
+ motion_blur: ["intensity", "samples"],
711
+ lut: ["texture", "intensity", "size"],
712
+ grain: ["intensity"],
713
+ god_rays: ["intensity", "decay", "density", "weight"],
714
+ lens_dirt: ["texture", "intensity"],
715
+ sharpen: ["sharpness"],
716
+ chromatic: ["amount"],
717
+ mask: ["texture", "outline", "bloom", "hidden"],
718
+ weather: ["rain", "snow", "wetness", "night"],
719
+ lens_flare: ["intensity", "ghosts", "halo", "dispersal"]
720
+ }, TEXEL_FORMATS = {
721
+ rgba8: [0, 4],
722
+ rgba16f: [2, 8],
723
+ rgba32f: [1, 16],
724
+ r8: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R8, 1],
725
+ rg8: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RG8, 2],
726
+ r16f: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R16F, 2],
727
+ rg16f: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RG16F, 4],
728
+ r32f: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R32F, 4],
729
+ rg32f: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RG32F, 8],
730
+ r8ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R8UI, 1],
731
+ r16ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R16UI, 2],
732
+ r32ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R32UI, 4],
733
+ rg32ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RG32UI, 8],
734
+ rgba8ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RGBA8UI, 4],
735
+ rgba16ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RGBA16UI, 8],
736
+ rgba32ui: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RGBA32UI, 16],
737
+ r32i: [chunk7AAIAVAA_js.TEXTURE_FORMAT_R32I, 4],
738
+ rgba32i: [chunk7AAIAVAA_js.TEXTURE_FORMAT_RGBA32I, 16]
739
+ }, EFFECT_KINDS = {
740
+ bloom: 0,
741
+ fxaa: 1,
742
+ vignette: 2,
743
+ color_grade: 3,
744
+ shader: 4,
745
+ ao: 5,
746
+ smaa: 6,
747
+ taa: 7,
748
+ outline: 8,
749
+ ssr: 9,
750
+ dof: 10,
751
+ motion_blur: 11,
752
+ lut: 12,
753
+ grain: 13,
754
+ god_rays: 14,
755
+ lens_dirt: 15,
756
+ sharpen: 16,
757
+ chromatic: 17,
758
+ mask: 18,
759
+ weather: 19,
760
+ lens_flare: chunk7AAIAVAA_js.EFFECT_LENS_FLARE
761
+ }, SCALAR_PARAMS = {
762
+ opacity: 3,
763
+ emissiveIntensity: 7,
764
+ metalness: 8,
765
+ roughness: 9,
766
+ alphaTest: 10,
767
+ size: 11,
768
+ clearcoat: 12,
769
+ clearcoatRoughness: 13,
770
+ transmission: 14,
771
+ ior: 15
772
+ }, POST_PARAM_SLOTS = 4, LANE_NAMES = ["x", "y", "z", "w"], POST_UNIFORM_LANES = {
773
+ f32: 1,
774
+ vec2: 2,
775
+ vec3: 3,
776
+ vec4: 4
777
+ }, UNIFORM_WORDS = {
778
+ f32: 1,
779
+ i32: 1,
780
+ vec2: 2,
781
+ vec3: 3,
782
+ vec4: 4,
783
+ mat4: 16,
784
+ texture: 1
785
+ }, SHADOW_WORDS = {
786
+ cascades: 23,
787
+ split: 24,
788
+ maxFar: 25,
789
+ fade: 26,
790
+ bias: 27,
791
+ normalBias: 28,
792
+ radius: 29,
793
+ blurSamples: 30,
794
+ type: 50
795
+ }, SHADOW_INTEGERS = /* @__PURE__ */ new Set(["cascades", "blurSamples"]);
796
+ function shadowWord(key, value) {
797
+ return typeof value == "string" ? chunkPKOZXD2Q_js.SHADOW_TYPES[value] : SHADOW_INTEGERS.has(key) ? value >>> 0 : chunkPKOZXD2Q_js.floatBits(value);
798
+ }
799
+ function linear(channel3) {
800
+ return channel3 <= (0.04045) ? channel3 / (12.92) : ((channel3 + (0.055)) / (1.055)) ** (2.4);
801
+ }
802
+ function scalarOf(data) {
803
+ return data instanceof Float32Array ? 0 : data instanceof Uint32Array ? 1 : data instanceof Uint16Array ? 2 : data instanceof Uint8Array ? 3 : data instanceof Int16Array ? 4 : 5;
804
+ }
805
+ function failure2(code, what) {
806
+ switch (code) {
807
+ case chunk2O2CG465_js.ERROR_CAPACITY_EXCEEDED:
808
+ return new chunk2V7IL4HC_js.GameError("capacity_exceeded", `${what}: capacity exceeded`);
809
+ case chunk2O2CG465_js.ERROR_DEAD_ENTITY:
810
+ case chunk2O2CG465_js.ERROR_UNKNOWN_RESOURCE:
811
+ return new chunk2V7IL4HC_js.GameError("unknown_resource", `${what}: unknown resource`);
812
+ case chunk2O2CG465_js.ERROR_UNSUPPORTED:
813
+ return new chunk2V7IL4HC_js.GameError("unsupported_feature", `${what}: unsupported`);
814
+ default:
815
+ return new chunk2V7IL4HC_js.GameError("invalid_argument", `${what}: invalid argument`);
816
+ }
817
+ }
818
+ function bindRenderExports(symbols) {
819
+ let bound = {};
820
+ for (let name of chunk7AAIAVAA_js.RENDER_CORE_EXPORTS) {
821
+ let value = symbols[name];
822
+ if (typeof value != "function") throw new chunk2V7IL4HC_js.GameError("not_initialized", `engine module is missing ${name}`);
823
+ bound[name] = value;
824
+ }
825
+ for (let name of Object.keys(chunk7AAIAVAA_js.RENDER_FEATURE_EXPORTS)) {
826
+ let value = symbols[name];
827
+ typeof value == "function" && (bound[name] = value);
828
+ }
829
+ return bound;
830
+ }
831
+ function featureAvailable(exports, caps, name) {
832
+ return exports[name] !== void 0 && (caps & chunk7AAIAVAA_js.RENDER_FEATURE_EXPORTS[name]) !== 0;
833
+ }
834
+ function graphicsCapabilities(render, caps) {
835
+ return {
836
+ backend: ENGINE_GRAPHICS_NAME,
837
+ dimensions: "3d",
838
+ rendering: (caps & 1) !== 0,
839
+ webgpu: false,
840
+ compute: false,
841
+ shaderLanguages: ["wgsl"],
842
+ instancing: (caps & 4) !== 0,
843
+ skinning: (caps & 8) !== 0,
844
+ morphTargets: (caps & 16) !== 0,
845
+ renderTargets: (caps & 32) !== 0,
846
+ postProcessing: (caps & 64) !== 0,
847
+ models: (caps & 128) !== 0,
848
+ particles: featuresAvailable(render, caps, 1024),
849
+ orderIndependentTransparency: (caps & 2048) !== 0,
850
+ imageBasedLighting: (caps & 4096) !== 0,
851
+ cascadedShadows: (caps & 16384) !== 0,
852
+ renderState: (caps & 32768) !== 0,
853
+ rawRender: featuresAvailable(render, caps, 131072),
854
+ decals: (caps & 65536) !== 0,
855
+ lod: (caps & 262144) !== 0,
856
+ fatLines: (caps & 524288) !== 0,
857
+ text: featuresAvailable(render, caps, 1048576),
858
+ picking: featuresAvailable(render, caps, 2097152),
859
+ pointShadows: (caps & chunkPKOZXD2Q_js.CAP_POINT_SHADOWS) !== 0,
860
+ sky: (caps & 4096) !== 0,
861
+ customProjection: (caps & chunkPKOZXD2Q_js.CAP_CUSTOM_PROJECTION) !== 0,
862
+ gpuTiming: (caps & 8388608) !== 0,
863
+ globalIllumination: (caps & 33554432) !== 0,
864
+ rayTracing: (caps & 67108864) !== 0
865
+ };
866
+ }
867
+ function featuresAvailable(exports, caps, cap) {
868
+ return (caps & cap) === 0 ? false : Object.keys(chunk7AAIAVAA_js.RENDER_FEATURE_EXPORTS).filter((name) => chunk7AAIAVAA_js.RENDER_FEATURE_EXPORTS[name] === cap).every((name) => exports[name] !== void 0);
869
+ }
870
+ function concat(a, b) {
871
+ let out = new Uint8Array(a.byteLength + b.byteLength);
872
+ return out.set(a, 0), out.set(b, a.byteLength), out;
873
+ }
874
+ function postShader(effect) {
875
+ let params = [], values = [], accessors = "";
876
+ for (let [name, uniform] of Object.entries(effect.uniforms ?? {})) {
877
+ let lanes = POST_UNIFORM_LANES[uniform.type];
878
+ if (lanes === void 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `post shader uniform ${name} must be f32, vec2, vec3 or vec4`);
879
+ if (params.length + lanes > (4))
880
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `post shader uniforms hold ${(4)} floats`);
881
+ let first = params.length, reads = [];
882
+ for (let lane = 0; lane < lanes; lane++) {
883
+ params.push(lanes === 1 ? name : `${name}.${LANE_NAMES[lane]}`);
884
+ let value = uniform.value;
885
+ values.push(typeof value == "number" ? value : value instanceof Float32Array ? value[lane] ?? 0 : 0), reads.push(`pass_info.params[${first + lane}]`);
886
+ }
887
+ let type = lanes === 1 ? "f32" : `vec${lanes}f`, body = lanes === 1 ? reads[0] : `${type}(${reads.join(", ")})`;
888
+ accessors += `fn ${name}() -> ${type} { return ${body}; }
889
+ `;
890
+ }
891
+ return { source: UTF8.encode(accessors + effect.shader.wgsl.fragment), params, values };
892
+ }
893
+ var EngineGraphics = class {
894
+ constructor(runtime, render = bindRenderExports(runtime.symbols), attacher = null, options = {}) {
895
+ this.attacher = attacher;
896
+ this.nativeSurface = null;
897
+ this.stopResize = null;
898
+ this.raw = null;
899
+ this.refresh = Float64Array.of((-1), (100));
900
+ this.observed = 0;
901
+ this.budgetMicros = 0;
902
+ this.pending = 0;
903
+ this.scratch = 0;
904
+ this.scratchBytes = 0;
905
+ this.attributes = /* @__PURE__ */ new Map();
906
+ this.textures = /* @__PURE__ */ new Map();
907
+ this.targetDepths = /* @__PURE__ */ new Map();
908
+ this.targetFormats = /* @__PURE__ */ new Map();
909
+ this.targetAttachments = /* @__PURE__ */ new Map();
910
+ this.targetReads = [];
911
+ this.uniforms = /* @__PURE__ */ new Map();
912
+ this.chains = /* @__PURE__ */ new Map();
913
+ this.models = /* @__PURE__ */ new Map();
914
+ this.roots = /* @__PURE__ */ new Map();
915
+ this.clipPort = null;
916
+ this.nodeViews = /* @__PURE__ */ new Map();
917
+ this.targetTextures = /* @__PURE__ */ new Map();
918
+ this.matrixScratch = null;
919
+ this.poseReaders = [];
920
+ this.fontFamilies = /* @__PURE__ */ new Map();
921
+ this.textNodes = /* @__PURE__ */ new Map();
922
+ this.defaultFont = null;
923
+ this.textPointer = 0;
924
+ this.textBytes = 0;
925
+ this.pickPointer = 0;
926
+ this.disposed = false;
927
+ this.feedSupport = null;
928
+ this.poseSupport = null;
929
+ this.mediaSupport = null;
930
+ this.mediaLive = new Array(17).fill(false);
931
+ this.mediaViews = new Array(17).fill(null);
932
+ this.mediumWords = new Float32Array(14);
933
+ this.passScratch = new Uint32Array(10);
934
+ this.batchViews = /* @__PURE__ */ new Map();
935
+ this.runtime = runtime, this.abi = render;
936
+ let budget = runtime.symbols.engine_render_set_frame_budget;
937
+ this.frameBudget = typeof budget == "function" ? budget : null;
938
+ let force = runtime.symbols.engine_render_force_tier;
939
+ this.forceTierCall = typeof force == "function" ? force : null;
940
+ let quality = runtime.symbols.engine_render_quality_tier;
941
+ if (this.qualityTierCall = typeof quality == "function" ? quality : null, this.handle = chunkPKOZXD2Q_js.createWithDescriptor(runtime, options, (desc2) => render.engine_render_create(desc2 === 0 ? (0) : desc2)), this.handle === (0)) throw chunkNZTKLY2W_js.engineSessionFailure(runtime.symbols) ?? new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine renderer could not be created");
942
+ let buffer = this.buffer, desc = render.engine_render_desc(this.handle);
943
+ this.desc = new Uint32Array(buffer, desc, 64), this.descFloats = new Float32Array(buffer, desc, 64);
944
+ let registers = render.engine_render_registers(this.handle);
945
+ this.registers = new Uint32Array(buffer, registers, 34), this.registerFloats = new Float32Array(buffer, registers, 34);
946
+ let commands = render.engine_render_commands(this.handle);
947
+ this.commandWords = new Uint32Array(buffer, commands, 1024 * 8), this.commandFloats = new Float32Array(buffer, commands, 1024 * 8), this.sync = this.u32(5, 0, 0), this.params = this.f32(3, 0, 0);
948
+ let caps = render.engine_render_capabilities(this.handle), surfaces = chunkH3OQKK6X_js.engineVectorSurfaceExports(runtime.symbols);
949
+ this.vectorSurfaces = surfaces === null ? null : new chunkH3OQKK6X_js.EngineVectorSurfaces(surfaces, {
950
+ handle: this.handle,
951
+ buffer: () => this.buffer,
952
+ stage: (bytes) => this.stage(bytes),
953
+ flush: () => this.flush()
954
+ }), this.capabilities = { ...graphicsCapabilities(render, caps), vectorSurfaces: this.vectorSurfaces?.cap ?? 0 }, this.caps = caps, this.features = new chunkPKOZXD2Q_js.EngineFeatures({
955
+ caps: () => this.caps,
956
+ command: (op, target) => this.command(op, target),
957
+ words: this.commandWords,
958
+ floats: this.commandFloats,
959
+ flush: () => this.flush(),
960
+ buffer: (owner, id, slot) => this.f32(owner, id, slot),
961
+ registers: this.registers
962
+ });
963
+ }
964
+ get gpu() {
965
+ return this.raw === null && (this.raw = createEngineGpu(this.rawHost())), this.raw;
966
+ }
967
+ rawCapabilities() {
968
+ let caps = this.caps, rawCompute = featuresAvailable(this.abi, caps, 8192), rawRender = featuresAvailable(this.abi, caps, 131072);
969
+ return caps & -139265 | (rawCompute ? 8192 : 0) | (rawRender ? 131072 : 0);
970
+ }
971
+ get clips() {
972
+ if (featureAvailable(this.abi, this.caps, "engine_render_animation"))
973
+ return this.clipPort ?? (this.clipPort = new EngineClips(this.clipHost())), this.clipPort;
974
+ }
975
+ clipHost() {
976
+ let views = { words: [], floats: [] }, fresh = (cached) => cached !== void 0 && cached.buffer === this.buffer;
977
+ return {
978
+ command: (op, target) => this.command(op, target),
979
+ commandWords: this.commandWords,
980
+ commandFloats: this.commandFloats,
981
+ animation: (op, target, words) => {
982
+ this.flush();
983
+ let pointer = words.length === 0 ? 0 : this.stage(new Uint8Array(words.buffer, words.byteOffset, words.byteLength)), result = this.check(this.feature("engine_render_animation")(this.handle, op, target, pointer, words.length), "animation");
984
+ return pointer !== 0 && words.set(new Uint32Array(this.buffer, pointer, words.length)), result;
985
+ },
986
+ words: (slot) => {
987
+ let cached = views.words[slot];
988
+ if (fresh(cached)) return cached;
989
+ let view = this.u32(14, 0, slot);
990
+ return views.words[slot] = view, view;
991
+ },
992
+ floats: (slot) => {
993
+ let cached = views.floats[slot];
994
+ if (fresh(cached)) return cached;
995
+ let view = this.f32(14, 0, slot);
996
+ return views.floats[slot] = view, view;
997
+ },
998
+ model: (root) => {
999
+ let model = this.roots.get(root), info = model === void 0 ? void 0 : this.models.get(model);
1000
+ if (info === void 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `node ${root} is not a model instance`);
1001
+ return info;
1002
+ },
1003
+ refreshModel: (root) => this.refreshModel(root),
1004
+ findNode: (root, name) => this.findNode(root, name),
1005
+ createPoseReader: (nodes) => this.createPoseReader(nodes),
1006
+ readPoses: (reader, out, offset) => this.readPoses(reader, out, offset),
1007
+ destroyPoseReader: (reader) => this.destroyPoseReader(reader),
1008
+ uniformSlot: (material, name) => {
1009
+ let slot = this.uniform(material, name);
1010
+ if (slot === null) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `material ${material} has no shader uniform ${name}`);
1011
+ return slot;
1012
+ },
1013
+ postParam: (chain, effect, name) => {
1014
+ let param = this.chains.get(chain)?.params[effect]?.indexOf(name) ?? -1;
1015
+ if (param < 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `post chain ${chain} effect ${effect} has no parameter ${name}`);
1016
+ return param;
1017
+ }
1018
+ };
1019
+ }
1020
+ rawHost() {
1021
+ let graphics = this;
1022
+ return {
1023
+ get capabilities() {
1024
+ return graphics.rawCapabilities();
1025
+ },
1026
+ clearDesc: () => this.clearDesc(),
1027
+ command: (op, target) => this.command(op, target),
1028
+ commandWords: this.commandWords,
1029
+ stage: (bytes) => this.stage(bytes),
1030
+ call: (name, ...args) => this.feature(name)(this.handle, ...args),
1031
+ bytes: (owner, id, slot) => {
1032
+ let [pointer, length] = this.view(owner, id, slot);
1033
+ return new Uint8Array(this.buffer, pointer, length);
1034
+ },
1035
+ flush: () => this.flush(),
1036
+ view: (pointer, length) => new Uint8Array(this.buffer, pointer, length)
1037
+ };
1038
+ }
1039
+ get buffer() {
1040
+ return this.runtime.memory.buffer;
1041
+ }
1042
+ feature(name) {
1043
+ let found = this.abi[name];
1044
+ if (found === void 0 || !featureAvailable(this.abi, this.caps, name))
1045
+ throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `this engine build does not provide ${name}; update the app to use this feature`);
1046
+ return found;
1047
+ }
1048
+ check(code, what) {
1049
+ if (code < 0) throw failure2(code, what);
1050
+ return code;
1051
+ }
1052
+ owns(owner) {
1053
+ let required = chunk7AAIAVAA_js.BUFFER_OWNER_CAPABILITIES[owner];
1054
+ return required === void 0 || (this.caps & required) !== 0;
1055
+ }
1056
+ view(owner, id, slot) {
1057
+ if (!this.owns(owner)) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `this engine build has no buffer owner ${owner}`);
1058
+ let pointer = this.abi.engine_render_buffer(this.handle, owner, id, slot);
1059
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `engine buffer ${owner}:${id}:${slot} does not exist`);
1060
+ return [pointer, this.registers[31]];
1061
+ }
1062
+ f32(owner, id, slot) {
1063
+ let [pointer, length] = this.view(owner, id, slot);
1064
+ return new Float32Array(this.buffer, pointer, length);
1065
+ }
1066
+ u32(owner, id, slot) {
1067
+ let [pointer, length] = this.view(owner, id, slot);
1068
+ return new Uint32Array(this.buffer, pointer, length);
1069
+ }
1070
+ clearDesc() {
1071
+ return this.desc.fill(0), this.desc;
1072
+ }
1073
+ stage(bytes) {
1074
+ if (bytes.byteLength > this.scratchBytes && (this.scratch !== 0 && this.runtime.exports.engine_free(this.scratch, this.scratchBytes, chunk2O2CG465_js.COLUMN_ALIGN), this.scratchBytes = Math.max(bytes.byteLength, chunk2O2CG465_js.COLUMN_ALIGN), this.scratch = this.runtime.exports.engine_alloc(this.scratchBytes, chunk2O2CG465_js.COLUMN_ALIGN), this.scratch === 0))
1075
+ throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot stage asset bytes");
1076
+ return new Uint8Array(this.buffer, this.scratch, bytes.byteLength).set(bytes), this.scratch;
1077
+ }
1078
+ command(op, target) {
1079
+ this.pending === 1024 && this.flush();
1080
+ let o = this.pending * 8;
1081
+ return this.commandWords[o + 0] = op, this.commandWords[o + 1] = target, this.pending++, o + 2;
1082
+ }
1083
+ flush() {
1084
+ if (this.pending === 0) return;
1085
+ let count = this.pending;
1086
+ this.pending = 0, this.check(this.abi.engine_render_flush(this.handle, count), "graphics command");
1087
+ }
1088
+ get renderHandle() {
1089
+ return this.handle;
1090
+ }
1091
+ passTimings(out) {
1092
+ if (!this.owns(13)) return false;
1093
+ let pointer = this.abi.engine_render_buffer(this.handle, 13, 0, 0);
1094
+ return pointer === 0 ? false : (out.set(new Uint32Array(this.buffer, pointer, Math.min(10, out.length))), true);
1095
+ }
1096
+ get native() {
1097
+ return this.nativeSurface;
1098
+ }
1099
+ async attach(surface) {
1100
+ if (surface !== null || this.attacher === null || this.nativeSurface !== null) return;
1101
+ let native = await this.attacher(this.handle, {});
1102
+ this.nativeSurface = native, this.caps = this.abi.engine_render_capabilities(this.handle), this.capabilities = { ...graphicsCapabilities(this.abi, this.caps), vectorSurfaces: this.vectorSurfaces?.cap ?? 0 }, this.resize(native.width, native.height, native.pixel_ratio), this.stopResize = native.on_resize((width, height, pixelRatio) => this.resize(width, height, pixelRatio));
1103
+ }
1104
+ resize(width, height, pixelRatio) {
1105
+ let a = this.command(30, 0);
1106
+ this.commandWords[a] = Math.max(1, Math.round(width * pixelRatio)), this.commandWords[a + 1] = Math.max(1, Math.round(height * pixelRatio)), this.commandFloats[a + 2] = pixelRatio, this.features.resize(width, height);
1107
+ }
1108
+ createGeometry(desc) {
1109
+ let names = Object.keys(desc.attributes);
1110
+ if (names.length > 8) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `geometry has more than ${8} attributes`);
1111
+ let position = desc.attributes.position;
1112
+ if (!position) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "geometry needs a position attribute");
1113
+ let vertices = position.data.length / position.itemSize, morphs = desc.morphTargets ?? [], d = this.clearDesc();
1114
+ d[0] = names.length, d[1] = vertices, d[2] = desc.index?.length ?? 0, d[3] = desc.index instanceof Uint32Array ? 1 : 0, d[4] = morphs.length, d[5] = morphs.length > 0 && morphs.every((m) => m.normal !== void 0) ? 1 : 0, d[6] = desc.morphRelative === false ? 0 : 1, names.forEach((name, i) => {
1115
+ let attribute = desc.attributes[name], at = 8 + i * 4;
1116
+ d[at + 0] = SEMANTICS[name] ?? 8 + i, d[at + 1] = scalarOf(attribute.data), d[at + 2] = attribute.itemSize, d[at + 3] = (attribute.normalized ? 1 : 0) | (attribute.dynamic ? 2 : 0);
1117
+ });
1118
+ let id = this.check(this.abi.engine_render_create_geometry(this.handle), "create geometry"), mirrors = /* @__PURE__ */ new Map();
1119
+ if (names.forEach((name, i) => {
1120
+ let source = desc.attributes[name].data, [pointer] = this.view(0, id, i), Constructor = source.constructor, target = new Constructor(this.buffer, pointer, source.length);
1121
+ target.set(source), mirrors.set(name, { source, target, slot: i });
1122
+ }), this.attributes.set(id, mirrors), desc.index) {
1123
+ let [pointer] = this.view(0, id, 65535);
1124
+ (desc.index instanceof Uint32Array ? new Uint32Array(this.buffer, pointer, desc.index.length) : new Uint16Array(this.buffer, pointer, desc.index.length)).set(desc.index);
1125
+ }
1126
+ if (morphs.length > 0) {
1127
+ let positions = this.f32(0, id, 65534), stride = vertices * 3;
1128
+ if (morphs.forEach((m, t) => positions.set(m.position, t * stride)), d[5] === 1) {
1129
+ let normals = this.f32(0, id, 65533);
1130
+ morphs.forEach((m, t) => {
1131
+ m.normal && normals.set(m.normal, t * stride);
1132
+ });
1133
+ }
1134
+ }
1135
+ return this.check(this.abi.engine_render_commit_geometry(this.handle, id), "commit geometry"), id;
1136
+ }
1137
+ geometryAttribute(geometry, name) {
1138
+ let mirror = this.attributes.get(geometry)?.get(name);
1139
+ if (!mirror) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `geometry ${geometry} has no attribute ${name}`);
1140
+ return mirror.source;
1141
+ }
1142
+ markGeometryDirty(geometry, name, start, count) {
1143
+ let mirrors = this.attributes.get(geometry), mirror = mirrors?.get(name);
1144
+ if (!mirrors || !mirror) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `geometry ${geometry} has no attribute ${name}`);
1145
+ let end = count < 0 ? mirror.source.length : Math.min(mirror.source.length, start + count);
1146
+ for (let i = start; i < end; i++) mirror.target[i] = mirror.source[i];
1147
+ this.commandWords[this.command(16, geometry)] = mirror.slot;
1148
+ }
1149
+ setDrawRange(geometry, start, count) {
1150
+ let a = this.command(17, geometry);
1151
+ this.commandWords[a] = start, this.commandWords[a + 1] = count;
1152
+ }
1153
+ destroyGeometry(geometry) {
1154
+ this.command(18, geometry), this.attributes.delete(geometry);
1155
+ }
1156
+ createTexture(desc) {
1157
+ if (desc.source.kind === "video") {
1158
+ let d2 = this.clearDesc();
1159
+ return d2[0] = desc.source.width, d2[1] = desc.source.height, d2[8] = chunk7AAIAVAA_js.TEXTURE_KIND_EXTERNAL, this.check(this.abi.engine_render_create_texture(this.handle), "create video texture");
1160
+ }
1161
+ if (desc.source.kind !== "pixels")
1162
+ throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "the Cimplify renderer takes pixel or encoded textures; decode images with loadTexture");
1163
+ let { width, height, data } = desc.source, format = desc.source.format ?? (data instanceof Float32Array ? "rgba32f" : data instanceof Uint16Array ? "rgba16f" : "rgba8"), [formatWord, texelBytes] = TEXEL_FORMATS[format], layered = desc.kind === "2d-array" || desc.kind === "3d", depth = desc.kind === "cube" ? 6 : layered ? desc.source.depth ?? 1 : 1;
1164
+ if (desc.kind === "cube" && (width !== height || data.byteLength !== width * height * 6 * texelBytes))
1165
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", "cube textures take six square faces packed +X, -X, +Y, -Y, +Z, -Z");
1166
+ if (data.byteLength !== width * height * depth * texelBytes)
1167
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `a ${format} texture of ${width}x${height}x${depth} takes ${width * height * depth * texelBytes} bytes`);
1168
+ let d = this.clearDesc();
1169
+ d[0] = width, d[1] = height, d[2] = formatWord, d[8] = desc.kind === "cube" ? 1 : desc.kind === "equirect" ? 2 : desc.kind === "2d-array" ? chunk7AAIAVAA_js.TEXTURE_KIND_2D_ARRAY : desc.kind === "3d" ? chunk7AAIAVAA_js.TEXTURE_KIND_3D : 0, d[9] = depth, d[3] = desc.colorSpace === "linear" ? 1 : 0, d[4] = desc.wrap === "clamp" ? 1 : desc.wrap === "mirror" ? 2 : 0, d[5] = desc.filter === "nearest" ? 1 : 0, d[6] = desc.mipmaps === false ? 0 : 1, d[7] = desc.flipY ? 1 : 0;
1170
+ let id = this.check(this.abi.engine_render_create_texture(this.handle), "create texture");
1171
+ return this.textures.set(id, { data, width, height, depth, texelBytes }), this.copyTexture(id, data), this.requestEncode(id, desc.encode), id;
1172
+ }
1173
+ requestEncode(id, encode) {
1174
+ if (encode === void 0 || encode === "none" || !featureAvailable(this.abi, this.caps, "engine_render_encode_texture")) return;
1175
+ let encodeTexture = this.abi.engine_render_encode_texture;
1176
+ if (!encodeTexture) return;
1177
+ let mode = encode === "astc" ? chunk7AAIAVAA_js.TEXTURE_ENCODE_ASTC_4X4 : encode === "bc7" ? chunk7AAIAVAA_js.TEXTURE_ENCODE_BC7 : chunk7AAIAVAA_js.TEXTURE_ENCODE_AUTO;
1178
+ encodeTexture(this.handle, id, mode);
1179
+ }
1180
+ copyTexture(id, data) {
1181
+ let [pointer] = this.view(1, id, 0);
1182
+ new Uint8Array(this.buffer, pointer, data.byteLength).set(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
1183
+ }
1184
+ copyRegion(id, mirror, region) {
1185
+ let [pointer] = this.view(1, id, 0), source = new Uint8Array(mirror.data.buffer, mirror.data.byteOffset, mirror.data.byteLength), target = new Uint8Array(this.buffer, pointer, mirror.data.byteLength), row = mirror.width * mirror.texelBytes, span = region.width * mirror.texelBytes, z0 = region.z ?? 0;
1186
+ for (let z = z0; z < z0 + (region.depth ?? 1); z++)
1187
+ for (let y = region.y; y < region.y + region.height; y++) {
1188
+ let at = (z * mirror.height + y) * row + region.x * mirror.texelBytes;
1189
+ target.set(source.subarray(at, at + span), at);
1190
+ }
1191
+ }
1192
+ async loadTexture(source) {
1193
+ let bytes = await this.bytes(source, "texture"), pointer = this.stage(bytes);
1194
+ return this.check(this.abi.engine_render_decode_texture(this.handle, pointer, bytes.byteLength, (1)), "decode texture");
1195
+ }
1196
+ async upgradeTexture(texture, source) {
1197
+ let bytes = await this.bytes(source, "texture"), reload = this.reloadExport("engine_render_reload_texture");
1198
+ if (reload !== null) {
1199
+ this.flush();
1200
+ let code = reload(this.handle, texture, this.stage(bytes), bytes.byteLength, (1));
1201
+ if (code >= 0) return { texture, inPlace: true };
1202
+ if (code !== chunk2O2CG465_js.ERROR_INVALID_ARGUMENT) throw failure2(code, "reload texture");
1203
+ }
1204
+ let pointer = this.stage(bytes);
1205
+ return { texture: this.check(this.abi.engine_render_decode_texture(this.handle, pointer, bytes.byteLength, (1)), "decode texture"), inPlace: false };
1206
+ }
1207
+ reloadExport(name) {
1208
+ return featureAvailable(this.abi, this.caps, name) ? this.abi[name] ?? null : null;
1209
+ }
1210
+ markTextureDirty(texture, region) {
1211
+ let mirror = this.textures.get(texture);
1212
+ if (region === void 0) {
1213
+ mirror && this.copyTexture(texture, mirror.data), this.command(19, texture);
1214
+ return;
1215
+ }
1216
+ mirror && this.copyRegion(texture, mirror, region);
1217
+ let a = this.command(chunk7AAIAVAA_js.OP_MARK_TEXTURE_REGION, texture), w = this.commandWords;
1218
+ w[a] = region.x, w[a + 1] = region.y, w[a + 2] = region.z ?? 0, w[a + 3] = region.width, w[a + 4] = region.height, w[a + 5] = region.depth ?? 1;
1219
+ }
1220
+ destroyTexture(texture) {
1221
+ this.command(20, texture), this.textures.delete(texture);
1222
+ }
1223
+ createMaterial(desc) {
1224
+ chunkPKOZXD2Q_js.refuseUndrawnPhysicalFields(desc);
1225
+ let d = this.clearDesc(), f = this.descFloats;
1226
+ d[0] = chunkPKOZXD2Q_js.MATERIAL_KINDS[desc.kind];
1227
+ let color = "color" in desc && desc.color !== void 0 ? desc.color : 16777215;
1228
+ this.writeHex(f, 1, color), f[4] = desc.opacity ?? 1, f[11] = desc.alphaTest ?? 0, f[25] = (1.5), f[6] = (1), f[21] = (1);
1229
+ let flags = 0;
1230
+ desc.transparent && (flags |= 1), desc.depthTest !== false && (flags |= 2), (desc.depthWrite ?? !desc.transparent) && (flags |= 4), desc.vertexColors && (flags |= 8), desc.wireframe && (flags |= 16), d[13] = desc.side === "back" ? 1 : desc.side === "double" ? 2 : 0, d[14] = desc.blending === "additive" ? 1 : desc.blending === "multiply" ? 2 : desc.blending === "none" ? 3 : desc.blending === "custom" ? 4 : 0;
1231
+ let write = (word, value) => {
1232
+ d[word] = value;
1233
+ };
1234
+ chunkPKOZXD2Q_js.writeMaterialExtension(desc, write);
1235
+ let extras = chunkPKOZXD2Q_js.extraTextures(desc);
1236
+ for (let i = 0; i < 8; i++) d[51 + i] = extras[i] ?? 0;
1237
+ chunkPKOZXD2Q_js.writeMaterialFeatures(desc, d, f), flags |= chunkPKOZXD2Q_js.materialFeatureFlags(desc), flags |= chunkPKOZXD2Q_js.writeMaterialTint(desc, d);
1238
+ let fragment = null, uniforms = null;
1239
+ switch (desc.kind) {
1240
+ case "standard":
1241
+ case "physical": {
1242
+ flags |= 64, desc.flatShading && (flags |= 32), f[5] = desc.metalness ?? 0, f[6] = desc.roughness ?? (1), this.writeHex(f, 7, desc.emissive ?? 0), f[10] = desc.emissiveIntensity ?? 1, [desc.map, desc.normalMap, desc.roughnessMap, desc.metalnessMap, desc.emissiveMap, desc.aoMap].forEach((texture, i) => {
1243
+ d[15 + i] = texture ?? 0;
1244
+ }), desc.kind === "physical" && (f[22] = desc.clearcoat ?? 0, f[23] = desc.clearcoatRoughness ?? 0, f[24] = desc.transmission ?? 0, f[25] = desc.ior ?? (1.5), f[26] = desc.sheen ?? 0);
1245
+ break;
1246
+ }
1247
+ case "skin":
1248
+ case "eye":
1249
+ case "hair": {
1250
+ flags |= 64, desc.flatShading && (flags |= 32), f[6] = desc.roughness ?? (1), this.writeHex(f, 7, desc.emissive ?? 0), f[10] = desc.emissiveIntensity ?? 1, [desc.map, desc.normalMap, desc.roughnessMap, void 0, desc.emissiveMap, desc.aoMap].forEach((texture, i) => {
1251
+ d[15 + i] = texture ?? 0;
1252
+ }), chunkPKOZXD2Q_js.writeCharacterWords(desc, write);
1253
+ break;
1254
+ }
1255
+ case "unlit":
1256
+ case "sprite":
1257
+ d[15] = desc.map ?? 0, desc.kind === "sprite" && desc.sizeAttenuation !== false && (flags |= 128);
1258
+ break;
1259
+ case "points":
1260
+ d[15] = desc.map ?? 0, f[21] = desc.size ?? (1), desc.sizeAttenuation !== false && (flags |= 128);
1261
+ break;
1262
+ case "lines":
1263
+ break;
1264
+ case "shader": {
1265
+ desc.lights && (flags |= 64), fragment = UTF8.encode(desc.shader.wgsl.fragment), uniforms = /* @__PURE__ */ new Map();
1266
+ let offset = 0;
1267
+ for (let [name, uniform] of Object.entries(desc.uniforms ?? {})) {
1268
+ let words = UNIFORM_WORDS[uniform.type];
1269
+ uniforms.set(name, { offset, words }), offset += words;
1270
+ }
1271
+ d[27] = offset;
1272
+ break;
1273
+ }
1274
+ }
1275
+ d[12] = flags;
1276
+ let transforms = desc.textureTransforms ? new Float32Array(chunk7AAIAVAA_js.MATERIAL_SLOTS.length * 8) : null, transformed = transforms !== null && chunkPKOZXD2Q_js.writeTextureTransforms(desc, transforms, write), vertex = desc.kind === "shader" && desc.shader.wgsl.vertex ? UTF8.encode(desc.shader.wgsl.vertex) : null, staged = fragment && vertex ? concat(fragment, vertex) : fragment, pointer = staged ? this.stage(staged) : 0, fragmentBytes = fragment?.byteLength ?? 0, id = this.check(
1277
+ this.abi.engine_render_create_material(
1278
+ this.handle,
1279
+ pointer,
1280
+ fragmentBytes,
1281
+ vertex ? pointer + fragmentBytes : 0,
1282
+ vertex?.byteLength ?? 0
1283
+ ),
1284
+ "create material"
1285
+ ), clipped = (desc.clippingPlanes?.length ?? 0) > 0 && chunkPKOZXD2Q_js.writePlanes(desc, this.f32(7, id, 0));
1286
+ if (transforms && transformed && this.f32(8, id, 0).set(transforms), (clipped || transformed) && this.command(13, id), uniforms && desc.kind === "shader") {
1287
+ this.uniforms.set(id, uniforms);
1288
+ for (let [name, uniform] of Object.entries(desc.uniforms ?? {}))
1289
+ typeof uniform.value == "number" ? this.setMaterialScalar(id, name, uniform.value) : uniform.value instanceof Float32Array && this.setMaterialVector(id, name, uniform.value);
1290
+ }
1291
+ return this.features.material(id, desc), id;
1292
+ }
1293
+ writeHex(target, at, hex) {
1294
+ target[at] = linear((hex >> 16 & (255)) / (255)), target[at + 1] = linear((hex >> 8 & (255)) / (255)), target[at + 2] = linear((hex & (255)) / (255));
1295
+ }
1296
+ setMaterialColor(material, r, g, b) {
1297
+ let at = material * 20 + 0;
1298
+ this.params[at] = r, this.params[at + 1] = g, this.params[at + 2] = b, this.command(13, material);
1299
+ }
1300
+ setMaterialOpacity(material, opacity) {
1301
+ this.params[material * 20 + 3] = opacity, this.command(13, material);
1302
+ }
1303
+ setMaterialTexture(material, slot, texture) {
1304
+ let a = this.command(14, material);
1305
+ this.commandWords[a] = chunkPKOZXD2Q_js.materialSlotIndex(slot), this.commandWords[a + 1] = texture ?? 0;
1306
+ }
1307
+ uniform(material, name) {
1308
+ let slots = this.uniforms.get(material);
1309
+ if (!slots) return null;
1310
+ let slot = slots.get(name);
1311
+ if (!slot) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `material ${material} has no uniform ${name}`);
1312
+ return slot;
1313
+ }
1314
+ setMaterialScalar(material, uniform, value) {
1315
+ let slot = this.uniform(material, uniform);
1316
+ if (slot)
1317
+ this.f32(2, material, 0)[slot.offset] = value;
1318
+ else {
1319
+ let param = SCALAR_PARAMS[uniform];
1320
+ if (param === void 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `material ${material} has no scalar ${uniform}`);
1321
+ this.params[material * 20 + param] = value;
1322
+ }
1323
+ this.command(13, material);
1324
+ }
1325
+ setMaterialVector(material, uniform, value) {
1326
+ let slot = this.uniform(material, uniform);
1327
+ if (!slot) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "vector uniforms belong to shader materials");
1328
+ if (value.length > slot.words) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `uniform ${uniform} holds ${slot.words} values`);
1329
+ this.f32(2, material, 0).set(value, slot.offset), this.command(13, material);
1330
+ }
1331
+ setMaterialUniformTexture(material, uniform, texture) {
1332
+ let slot = this.uniform(material, uniform);
1333
+ if (!slot) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "texture uniforms belong to shader materials");
1334
+ this.u32(2, material, 0)[slot.offset] = texture, this.command(13, material);
1335
+ }
1336
+ setMaterialState(material, state) {
1337
+ chunkPKOZXD2Q_js.writeMaterialState(state, (word, value) => {
1338
+ let a = this.command(chunk7AAIAVAA_js.OP_SET_MATERIAL_WORD, material);
1339
+ this.commandWords[a] = word, this.commandWords[a + 1] = value;
1340
+ }), (state.clippingPlanes?.length ?? 0) > 0 && chunkPKOZXD2Q_js.writePlanes(state, this.f32(7, material, 0)) && this.command(13, material);
1341
+ }
1342
+ destroyMaterial(material) {
1343
+ this.command(15, material), this.uniforms.delete(material), this.features.forgetMaterial(material);
1344
+ }
1345
+ createEmitter(desc) {
1346
+ if (!this.capabilities.particles) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no particles");
1347
+ this.flush(), writeEmitterDesc(this.clearDesc(), this.descFloats, desc);
1348
+ let id = this.check(this.feature("engine_render_create_emitter")(this.handle), "create emitter");
1349
+ return desc.sizeCurve && sampleCurve(desc.sizeCurve, this.f32(9, id, 0)), desc.colorCurve && sampleCurve(desc.colorCurve, this.f32(9, id, 1)), (desc.sizeCurve || desc.colorCurve) && this.command(chunk7AAIAVAA_js.OP_MARK_EMITTER, id), id;
1350
+ }
1351
+ emit(emitter, count) {
1352
+ this.commandWords[this.command(chunk7AAIAVAA_js.OP_EMIT, emitter)] = count;
1353
+ }
1354
+ setEmitterRate(emitter, rate) {
1355
+ this.commandFloats[this.command(chunk7AAIAVAA_js.OP_SET_EMITTER_RATE, emitter)] = rate;
1356
+ }
1357
+ clearEmitter(emitter) {
1358
+ this.command(chunk7AAIAVAA_js.OP_CLEAR_EMITTER, emitter);
1359
+ }
1360
+ destroyEmitter(emitter) {
1361
+ this.command(chunk7AAIAVAA_js.OP_DESTROY_EMITTER, emitter);
1362
+ }
1363
+ setRenderOrder(node, order) {
1364
+ this.commandWords[this.command(chunk7AAIAVAA_js.OP_SET_RENDER_ORDER, node)] = order | 0;
1365
+ }
1366
+ setShadow(light, shadow) {
1367
+ let room = 6, a = 0, used = room;
1368
+ for (let key of Object.keys(shadow)) {
1369
+ let value = shadow[key];
1370
+ value !== void 0 && (used === room && (a = this.command(chunk7AAIAVAA_js.OP_SET_SHADOW, light), used = 0), this.commandWords[a + used] = SHADOW_WORDS[key], this.commandWords[a + used + 1] = shadowWord(key, value), used += 2);
1371
+ }
1372
+ used < room && (this.commandWords[a + used] = 0);
1373
+ }
1374
+ writeShadow(d, shadow) {
1375
+ if (shadow)
1376
+ for (let key of Object.keys(shadow)) {
1377
+ let value = shadow[key];
1378
+ value !== void 0 && (d[SHADOW_WORDS[key]] = shadowWord(key, value));
1379
+ }
1380
+ }
1381
+ createNode(desc) {
1382
+ let d = this.clearDesc(), f = this.descFloats;
1383
+ switch (d[22] = desc.renderOrder ?? 0, desc.kind) {
1384
+ case "mesh":
1385
+ d[0] = 0, d[1] = desc.geometry, d[2] = Array.isArray(desc.material) ? desc.material[0] ?? 0 : desc.material, d[3] = this.shadowFlags(desc.castShadow, desc.receiveShadow, desc.giExclude);
1386
+ break;
1387
+ case "instanced":
1388
+ d[0] = 1, d[1] = desc.geometry, d[2] = desc.material, d[4] = desc.capacity, d[3] = this.shadowFlags(desc.castShadow, desc.receiveShadow, desc.giExclude) | (desc.colors ? 4 : 0) | (desc.batchSlots ? 64 : 0), d[18] = desc.batchSlots ?? 0;
1389
+ break;
1390
+ case "skinned": {
1391
+ d[0] = 2, d[1] = desc.geometry, d[2] = desc.material, d[3] = this.shadowFlags(desc.castShadow, desc.receiveShadow, desc.giExclude);
1392
+ let { parents, bindPose, inverseBindMatrices } = desc.skeleton;
1393
+ if (bindPose.length !== parents.length * (10)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "bind pose needs ten floats per bone");
1394
+ let parentBytes = Math.ceil(parents.byteLength / chunk2O2CG465_js.COLUMN_ALIGN) * chunk2O2CG465_js.COLUMN_ALIGN, poseBytes = Math.ceil(bindPose.byteLength / chunk2O2CG465_js.COLUMN_ALIGN) * chunk2O2CG465_js.COLUMN_ALIGN, total = new Uint8Array(parentBytes + poseBytes + (inverseBindMatrices?.byteLength ?? 0));
1395
+ total.set(new Uint8Array(parents.buffer, parents.byteOffset, parents.byteLength), 0), total.set(new Uint8Array(bindPose.buffer, bindPose.byteOffset, bindPose.byteLength), parentBytes), inverseBindMatrices && total.set(new Uint8Array(inverseBindMatrices.buffer, inverseBindMatrices.byteOffset, inverseBindMatrices.byteLength), parentBytes + poseBytes);
1396
+ let base = this.stage(total);
1397
+ d[18] = parents.length, d[19] = base, d[20] = base + parentBytes, d[21] = inverseBindMatrices ? base + parentBytes + poseBytes : 0;
1398
+ break;
1399
+ }
1400
+ case "points":
1401
+ d[0] = 3, d[1] = desc.geometry, d[2] = desc.material;
1402
+ break;
1403
+ case "lines":
1404
+ d[0] = 4, d[1] = desc.geometry, d[2] = desc.material, d[3] = desc.segments ? 8 : 0;
1405
+ break;
1406
+ case "sprite":
1407
+ d[0] = 5, d[2] = desc.material;
1408
+ break;
1409
+ case "camera":
1410
+ d[0] = 6, d[14] = desc.projection === "orthographic" ? 1 : 0, f[15] = desc.projection === "orthographic" ? desc.height : desc.projection === "perspective" ? desc.fov ?? 60 : 60, f[16] = desc.near ?? 0.1, f[17] = desc.far ?? 1e3;
1411
+ break;
1412
+ case "decal":
1413
+ break;
1414
+ case "light": {
1415
+ d[0] = 7, d[5] = chunkPKOZXD2Q_js.LIGHT_KINDS[desc.light], d[6] = desc.color ?? 16777215, d[12] = desc.groundColor ?? (4473924), d[3] = desc.castShadow ? 1 : 0, d[13] = desc.shadowMapSize ?? 0, f[7] = desc.intensity ?? 1, f[8] = desc.distance ?? 0, f[9] = desc.decay ?? (2), f[10] = desc.angle ?? DEFAULT_SPOT_ANGLE, f[11] = desc.penumbra ?? 0, this.writeShadow(d, desc.shadow);
1416
+ break;
1417
+ }
1418
+ case "particles":
1419
+ d[0] = 9, d[31] = desc.emitter;
1420
+ break;
1421
+ case "group":
1422
+ d[0] = 8;
1423
+ break;
1424
+ case "shape2d":
1425
+ throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "shape2d nodes need the 2D renderer");
1426
+ case "text2d":
1427
+ case "text3d": {
1428
+ let mode = desc.kind === "text2d" ? 2 : desc.billboard ? 1 : 0, font = desc.kind === "text3d" ? desc.font : this.resolveFont(desc.font, desc.fontFamily);
1429
+ this.writeText(d, f, font, desc, mode);
1430
+ let node2 = this.check(this.abi.engine_render_create_node(this.handle), `create ${desc.kind} node`);
1431
+ return this.textNodes.set(node2, { font, mode }), desc.text && this.setNodeText(node2, desc.text), node2;
1432
+ }
1433
+ }
1434
+ chunkPKOZXD2Q_js.writeNodeFeatures(desc, d, f, desc.kind === "sprite" ? this.features.spriteRotation(desc.material) : 0);
1435
+ let node = this.check(this.abi.engine_render_create_node(this.handle), `create ${desc.kind} node`);
1436
+ return this.features.node(node, desc), node;
1437
+ }
1438
+ setLod(node, near, far, hysteresis) {
1439
+ this.features.setLod(node, near, far, hysteresis);
1440
+ }
1441
+ setSprite(node, rotation, centerX, centerY) {
1442
+ this.features.setSprite(node, rotation, centerX, centerY);
1443
+ }
1444
+ setProbeCoefficients(light, sh) {
1445
+ this.features.setProbeCoefficients(light, sh);
1446
+ }
1447
+ setProjectionMatrix(camera, matrix, near, far) {
1448
+ this.features.setProjectionMatrix(camera, matrix, near, far);
1449
+ }
1450
+ setViewOffset(camera, offset) {
1451
+ this.features.setViewOffset(camera, offset);
1452
+ }
1453
+ batchBuffers(node) {
1454
+ let cached = this.batchViews.get(node);
1455
+ if (cached) return cached;
1456
+ this.flush();
1457
+ let slots = this.abi.engine_render_buffer(this.handle, 4, node, 5);
1458
+ if (slots === 0) return null;
1459
+ let slotCount = this.registers[31], ranges = this.abi.engine_render_buffer(this.handle, 4, node, 6);
1460
+ if (ranges === 0) return null;
1461
+ let views = {
1462
+ slots: new Uint32Array(this.buffer, slots, slotCount),
1463
+ ranges: new Uint32Array(this.buffer, ranges, this.registers[31])
1464
+ };
1465
+ return this.batchViews.set(node, views), views;
1466
+ }
1467
+ markBatch(node) {
1468
+ this.command(62, node);
1469
+ }
1470
+ gpuStats(out) {
1471
+ this.flush(), this.check(this.abi.engine_render_stats(this.handle), "stats"), this.features.readGpuStats(out);
1472
+ let timed = this.passTimings(this.passScratch);
1473
+ for (let i = 0; i < out.passNs.length; i++) out.passNs[i] = timed ? this.passScratch[i] ?? 0 : 0;
1474
+ return timed || out.gpuLastNs > 0;
1475
+ }
1476
+ resolveFont(font, family) {
1477
+ let found = font ?? (family !== void 0 ? this.fontFamilies.get(family) : void 0) ?? this.defaultFont;
1478
+ if (found == null) throw new chunk2V7IL4HC_js.GameError("asset_load_failed", "load a font with loadFont before creating text");
1479
+ return found;
1480
+ }
1481
+ writeText(d, f, font, style, mode) {
1482
+ d[0] = 11, d[4] = style.capacity ?? (128), d[6] = style.color ?? (16777215), d[37] = font, d[46] = mode, d[42] = TEXT_ALIGNS[style.align ?? "start"], d[43] = TEXT_DIRECTIONS[style.direction ?? "auto"], d[48] = style.outlineColor ?? 0, f[38] = style.size ?? (mode === 2 ? (16) : (1)), f[39] = style.lineHeight ?? 0, f[40] = style.letterSpacing ?? 0, f[41] = style.maxWidth ?? 0, f[44] = style.anchor?.[0] ?? 0, f[45] = style.anchor?.[1] ?? 0, f[47] = style.outlineWidth ?? 0, f[49] = style.opacity ?? 1;
1483
+ }
1484
+ async loadFont(source, family) {
1485
+ let [atlas, table] = await Promise.all([this.bytes(source.atlas, "font atlas"), this.bytes(source.table, "font table")]), texture = this.check(
1486
+ this.abi.engine_render_decode_texture(this.handle, this.stage(atlas), atlas.byteLength, (0)),
1487
+ "decode font atlas"
1488
+ ), material = this.createMaterial({ kind: "unlit", transparent: true, depthWrite: false });
1489
+ this.setMaterialTexture(material, "map", texture);
1490
+ let font = this.check(
1491
+ this.feature("engine_render_load_font")(this.handle, this.stage(table), table.byteLength, material),
1492
+ "load font"
1493
+ );
1494
+ return source.face !== void 0 && await this.loadFontFace(font, source.face), family !== void 0 && this.fontFamilies.set(family, font), this.defaultFont ?? (this.defaultFont = font), chunkPDOELNNQ_js.registerFontTable(font, new chunkPDOELNNQ_js.FontTable(table.slice().buffer)), font;
1495
+ }
1496
+ async loadFontFace(font, source) {
1497
+ let attach = this.abi.engine_render_font_face;
1498
+ if (attach === void 0) return;
1499
+ let face = await this.bytes(source, "font face");
1500
+ this.check(attach(this.handle, font, this.stage(face), face.byteLength), "load font face");
1501
+ }
1502
+ setTextStyle(node, style) {
1503
+ let text = this.textNodes.get(node);
1504
+ if (text === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", "setTextStyle needs a text node");
1505
+ this.writeText(this.clearDesc(), this.descFloats, text.font, style, text.mode), this.check(this.feature("engine_render_set_text_style")(this.handle, node), "set text style");
1506
+ }
1507
+ textBounds(node, out) {
1508
+ let pointer = this.pickScratch();
1509
+ this.check(this.feature("engine_render_text_bounds")(this.handle, node, pointer), "text bounds"), out.set(new Float32Array(this.buffer, pointer, 4));
1510
+ }
1511
+ batchHandle() {
1512
+ return this.handle;
1513
+ }
1514
+ forceQualityTier(tier) {
1515
+ return this.forceTierCall === null ? false : (this.check(this.forceTierCall(this.handle, tier === null ? (-1) : tier), "force quality tier"), true);
1516
+ }
1517
+ qualityTier() {
1518
+ return this.qualityTierCall === null ? (0) : this.check(this.qualityTierCall(this.handle), "quality tier");
1519
+ }
1520
+ governorPressure() {
1521
+ this.check(this.abi.engine_render_stats(this.handle), "stats");
1522
+ let word = this.registers[chunk7AAIAVAA_js.STAT_THERMAL_TIER];
1523
+ return Math.max(word & (255), word >>> (28) & (15));
1524
+ }
1525
+ raycast(origin, direction, far, layers, out) {
1526
+ let pointer = this.pickScratch(), ray = new Float32Array(this.buffer, pointer, 7);
1527
+ ray[0] = origin[0], ray[1] = origin[1], ray[2] = origin[2], ray[3] = direction[0], ray[4] = direction[1], ray[5] = direction[2], ray[6] = far;
1528
+ let result = pointer + 7 * chunk2O2CG465_js.WORD_BYTES;
1529
+ if (this.check(this.feature("engine_render_raycast")(this.handle, pointer, layers >>> 0, result), "raycast") !== (1)) return false;
1530
+ let words = new Uint32Array(this.buffer, result, 11), floats = new Float32Array(this.buffer, result, 11);
1531
+ return out.node = words[0], out.instance = words[1], out.triangle = words[2], out.distance = floats[3], out.point.set(floats.subarray(4, 7)), out.barycentric.set(floats.subarray(7, 9)), out.uv.set(floats.subarray(9, 11)), true;
1532
+ }
1533
+ pickScratch() {
1534
+ if (this.pickPointer === 0 && (this.pickPointer = this.runtime.exports.engine_alloc(18 * chunk2O2CG465_js.WORD_BYTES, chunk2O2CG465_js.COLUMN_ALIGN), this.pickPointer === 0))
1535
+ throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold the pick scratch");
1536
+ return this.pickPointer;
1537
+ }
1538
+ shadowFlags(cast, receive, giExclude) {
1539
+ return (cast ? 1 : 0) | (receive ? 2 : 0) | (giExclude ? 32 : 0);
1540
+ }
1541
+ destroyNode(node) {
1542
+ this.command(1, node), this.roots.delete(node), this.nodeViews.delete(node), this.textNodes.delete(node), this.batchViews.delete(node), this.features.forgetNode(node);
1543
+ }
1544
+ setNodeVisible(node, visible) {
1545
+ this.commandWords[this.command(2, node)] = visible ? 1 : 0;
1546
+ }
1547
+ setNodeLayers(node, mask) {
1548
+ this.commandWords[this.command(3, node)] = mask >>> 0;
1549
+ }
1550
+ setNodeMaterial(node, material) {
1551
+ this.commandWords[this.command(4, node)] = material;
1552
+ }
1553
+ setNodeText(node, text) {
1554
+ let needed = Math.max(text.length * (3), chunk2O2CG465_js.COLUMN_ALIGN);
1555
+ if (needed > this.textBytes && (this.textPointer !== 0 && this.runtime.exports.engine_free(this.textPointer, this.textBytes, chunk2O2CG465_js.COLUMN_ALIGN), this.textBytes = needed, this.textPointer = this.runtime.exports.engine_alloc(needed, chunk2O2CG465_js.COLUMN_ALIGN), this.textPointer === 0))
1556
+ throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot stage text");
1557
+ let written = UTF8.encodeInto(text, new Uint8Array(this.buffer, this.textPointer, this.textBytes)).written;
1558
+ this.check(this.feature("engine_render_set_text")(this.handle, node, this.textPointer, written), "set text");
1559
+ }
1560
+ writeNodeMatrices(nodes, matrices, rows, count) {
1561
+ if (matrices.buffer !== this.buffer) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "the Cimplify renderer reads render matrices from engine memory");
1562
+ let sync = this.sync;
1563
+ for (let i = 0; i < count; i++)
1564
+ sync[2 * i] = nodes[i], sync[2 * i + 1] = rows[i];
1565
+ this.flush(), this.check(this.abi.engine_render_sync(this.handle, count, matrices.byteOffset, matrices.length / 16), "sync matrices");
1566
+ }
1567
+ readNodeMatrix(node, out, offset) {
1568
+ this.flush();
1569
+ let scratch = this.nodeMatrixScratch();
1570
+ this.check(this.abi.engine_render_node_matrix(this.handle, node, scratch.byteOffset), "read node matrix");
1571
+ for (let i = 0; i < 16; i++) out[offset + i] = scratch[i];
1572
+ }
1573
+ createPoseReader(nodes) {
1574
+ let count = nodes.length, bytes = count * chunk2O2CG465_js.WORD_BYTES * (1 + chunk7AAIAVAA_js.NODE_POSE_FLOATS), pointer = count === 0 ? 0 : this.runtime.exports.engine_alloc(bytes, chunk2O2CG465_js.COLUMN_ALIGN);
1575
+ if (count > 0 && pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold a bone set");
1576
+ count > 0 && new Uint32Array(this.buffer, pointer, count).set(nodes);
1577
+ let reader = { pointer, bytes, count, out: pointer + count * chunk2O2CG465_js.WORD_BYTES, view: null }, free = this.poseReaders.indexOf(null, 1);
1578
+ return free > 0 ? (this.poseReaders[free] = reader, free) : (this.poseReaders.length === 0 && this.poseReaders.push(null), this.poseReaders.push(reader), this.poseReaders.length - 1);
1579
+ }
1580
+ poseReader(reader) {
1581
+ let found = this.poseReaders[reader];
1582
+ if (!found) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `bone set ${reader} does not exist`);
1583
+ return found;
1584
+ }
1585
+ readPoses(id, out, offset) {
1586
+ let reader = this.poseReader(id);
1587
+ if (reader.count === 0) return;
1588
+ this.flush(), this.check(this.feature("engine_render_node_poses")(this.handle, reader.pointer, reader.count, reader.out), "read bone poses");
1589
+ let view = reader.view;
1590
+ (view === null || view.buffer !== this.buffer) && (view = new Float32Array(this.buffer, reader.out, reader.count * chunk7AAIAVAA_js.NODE_POSE_FLOATS), reader.view = view);
1591
+ for (let i = 0; i < view.length; i++) out[offset + i] = view[i];
1592
+ }
1593
+ destroyPoseReader(id) {
1594
+ let reader = this.poseReader(id);
1595
+ reader.pointer !== 0 && this.runtime.exports.engine_free(reader.pointer, reader.bytes, chunk2O2CG465_js.COLUMN_ALIGN), this.poseReaders[id] = null;
1596
+ }
1597
+ nodeMatrixScratch() {
1598
+ if (!this.matrixScratch) {
1599
+ let pointer = this.runtime.exports.engine_alloc(16 * chunk2O2CG465_js.WORD_BYTES, chunk2O2CG465_js.COLUMN_ALIGN);
1600
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold a matrix");
1601
+ this.matrixScratch = new Float32Array(this.buffer, pointer, 16);
1602
+ }
1603
+ return this.matrixScratch;
1604
+ }
1605
+ nodeBuffer(node, slot) {
1606
+ let key = node * (4) + slot, cached = this.nodeViews.get(key);
1607
+ if (cached) return cached;
1608
+ let view = this.f32(4, node, slot);
1609
+ return this.nodeViews.set(key, view), view;
1610
+ }
1611
+ instanceMatrices(node) {
1612
+ return this.nodeBuffer(node, 0);
1613
+ }
1614
+ instanceColors(node) {
1615
+ try {
1616
+ return this.nodeBuffer(node, 1);
1617
+ } catch {
1618
+ return null;
1619
+ }
1620
+ }
1621
+ setInstanceCount(node, count) {
1622
+ this.commandWords[this.command(5, node)] = count;
1623
+ }
1624
+ markInstancesDirty(node) {
1625
+ this.command(6, node);
1626
+ }
1627
+ setInstanceFeed(node, table, columns, hostReads, pose) {
1628
+ if (this.feedSupport === null && (this.feedSupport = engineAdvertises(this.runtime, chunk7AAIAVAA_js.RENDER_KERNEL_INSTANCES_FEATURE)), !this.feedSupport || columns.length !== 4 || pose !== void 0 && (pose.length !== 2 || !this.posesSupported())) return false;
1629
+ let at = this.command(64, node);
1630
+ this.commandWords[at] = table;
1631
+ for (let k = 0; k < 4; k++) this.commandWords[at + 1 + k] = columns[k];
1632
+ if (this.commandWords[at + 1 + 4] = hostReads ? 1 : 0, pose !== void 0) {
1633
+ let words = this.command(66, node);
1634
+ for (let k = 0; k < 2; k++) this.commandWords[words + k] = pose[k];
1635
+ }
1636
+ return true;
1637
+ }
1638
+ setInstancePalette(node, model, skin, firstClip, clips, frames) {
1639
+ if (!this.posesSupported()) return false;
1640
+ let at = this.command(67, node);
1641
+ return this.commandWords[at] = model, this.commandWords[at + 1] = skin, this.commandWords[at + 2] = firstClip, this.commandWords[at + 3] = clips, this.commandWords[at + 4] = frames, true;
1642
+ }
1643
+ posesSupported() {
1644
+ return this.poseSupport === null && (this.poseSupport = engineAdvertises(this.runtime, chunk7AAIAVAA_js.RENDER_FEED_POSE_FEATURE)), this.poseSupport;
1645
+ }
1646
+ requireMedia() {
1647
+ if (this.mediaSupport === null && (this.mediaSupport = engineAdvertises(this.runtime, chunk7AAIAVAA_js.MEDIA_VOLUME_FEATURE)), !this.mediaSupport) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `this engine build has no media volumes (feature ${chunk7AAIAVAA_js.MEDIA_VOLUME_FEATURE}); update the app to use them`);
1648
+ }
1649
+ liveMedium(medium) {
1650
+ let id = medium;
1651
+ if (!(Number.isInteger(id) && id >= 1 && id <= 16 && this.mediaLive[id])) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `media volume ${id} does not exist`);
1652
+ return id;
1653
+ }
1654
+ sendMedium(op, id, desc) {
1655
+ chunk3C4C654I_js.writeMediumDesc(this.mediumWords, desc), this.flush(), this.f32(chunkPKOZXD2Q_js.OWNER_STAGING, 0, 0).set(this.mediumWords), this.command(op, id), this.flush(), this.mediaViews[id] = null;
1656
+ }
1657
+ createMedium(desc) {
1658
+ this.requireMedia();
1659
+ let id = this.mediaLive.indexOf(false, 1);
1660
+ if (id < 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", `a scene holds at most ${16} media volumes`);
1661
+ return this.sendMedium(68, id, desc), this.mediaLive[id] = true, id;
1662
+ }
1663
+ setMedium(medium, desc) {
1664
+ this.sendMedium(69, this.liveMedium(medium), desc);
1665
+ }
1666
+ mediumTexels(medium) {
1667
+ let id = this.liveMedium(medium), held = this.mediaViews[id];
1668
+ if (held !== null && held.buffer === this.buffer) return held;
1669
+ let view = this.u32(16, id, 0);
1670
+ return this.mediaViews[id] = view, view;
1671
+ }
1672
+ markMedium(medium) {
1673
+ this.command(71, this.liveMedium(medium));
1674
+ }
1675
+ destroyMedium(medium) {
1676
+ let id = this.liveMedium(medium);
1677
+ this.command(70, id), this.flush(), this.mediaLive[id] = false, this.mediaViews[id] = null;
1678
+ }
1679
+ clearInstanceFeed(node) {
1680
+ this.feedSupport === true && this.command(65, node);
1681
+ }
1682
+ morphWeights(node) {
1683
+ return this.nodeBuffer(node, 2);
1684
+ }
1685
+ markMorphWeightsDirty(node) {
1686
+ this.command(7, node);
1687
+ }
1688
+ skeletonPose(node) {
1689
+ return this.nodeBuffer(node, 3);
1690
+ }
1691
+ markSkeletonDirty(node) {
1692
+ this.command(8, node);
1693
+ }
1694
+ setCameraPerspective(node, fovDegrees, near, far) {
1695
+ let a = this.command(9, node);
1696
+ this.commandFloats[a] = fovDegrees, this.commandFloats[a + 1] = near, this.commandFloats[a + 2] = far, this.features.perspective(node, fovDegrees, near, far);
1697
+ }
1698
+ setCameraPerspectiveFrom(node, values, offset) {
1699
+ let a = this.command(9, node), f = this.commandFloats;
1700
+ f[a] = values[offset], f[a + 1] = values[offset + 1], f[a + 2] = values[offset + 2], this.features.perspectiveFrom(node, values, offset);
1701
+ }
1702
+ setCameraOrthographic(node, height, near, far) {
1703
+ let a = this.command(10, node);
1704
+ this.commandFloats[a] = height, this.commandFloats[a + 1] = near, this.commandFloats[a + 2] = far, this.features.orthographic(node, height, near, far);
1705
+ }
1706
+ setActiveCamera(node) {
1707
+ this.command(11, node);
1708
+ }
1709
+ setLight(node, color, intensity) {
1710
+ let a = this.command(12, node);
1711
+ this.commandWords[a] = color, this.commandFloats[a + 1] = intensity;
1712
+ }
1713
+ setEnvironment(desc) {
1714
+ this.flush();
1715
+ let d = this.clearDesc(), f = this.descFloats, background = desc.background;
1716
+ d[2] = 0, background && "color" in background ? (d[0] = 1, d[1] = background.color) : background && "texture" in background ? (d[0] = 2, d[2] = background.texture) : background ? d[0] = 3 : d[0] = 1, d[3] = desc.environment ?? 0, f[15] = desc.environmentIntensity ?? 1, f[16] = desc.environmentRotation ?? 0, f[17] = desc.backgroundBlurriness ?? 0, f[18] = desc.backgroundIntensity ?? 1;
1717
+ let fog = desc.fog;
1718
+ fog && (d[4] = 1, d[5] = fog.color, d[11] = chunk7AAIAVAA_js.FOG_MODES.indexOf(fog.mode ?? "linear"), fog.mode === "exp2" || fog.mode === "height" ? f[12] = fog.density : (f[6] = fog.near, f[7] = fog.far), fog.mode === "height" && (f[13] = fog.height, f[14] = fog.falloff)), d[8] = Math.max(0, chunk7AAIAVAA_js.TONE_MAPPINGS.indexOf(desc.toneMapping ?? "aces")), d[chunk7AAIAVAA_js.ENV_TONE_CURVE] = desc.toneCurve ?? 0, f[9] = desc.exposure ?? 1, d[10] = desc.shadows === false ? 0 : 1;
1719
+ let gi = desc.gi;
1720
+ if (gi && (d[chunk7AAIAVAA_js.ENV_GI] = Math.max(0, chunk7AAIAVAA_js.GI_MODES.indexOf(gi.mode ?? "field")), f[chunk7AAIAVAA_js.ENV_GI_INTENSITY] = gi.intensity ?? 1, f[chunk7AAIAVAA_js.ENV_GI_SPACING] = gi.spacing ?? 1, f[chunk7AAIAVAA_js.ENV_GI_SUN_ANGLE] = gi.sunAngle ?? 0.53), chunkPKOZXD2Q_js.writeSky(desc, d, f), this.check(this.abi.engine_render_set_environment(this.handle), "set environment"), desc.volumetrics)
1721
+ for (let [at, chunk] of volumetricChunks(volumetricWords(desc.volumetrics))) {
1722
+ let a = this.command(chunk7AAIAVAA_js.OP_SET_VOLUMETRICS, 0);
1723
+ this.commandWords[a] = at, chunk.forEach((value, k) => {
1724
+ this.commandFloats[a + 1 + k] = value;
1725
+ });
1726
+ }
1727
+ }
1728
+ createRenderTarget(desc) {
1729
+ let d = this.clearDesc();
1730
+ d[0] = desc.width, d[1] = desc.height, d[2] = desc.format === "rgba16f" ? 1 : desc.format === "rgba32f" ? 2 : 0, d[3] = desc.depth === false ? 0 : 1, d[4] = desc.samples ?? 1, d[chunk7AAIAVAA_js.TARGET_KIND] = desc.kind === "cube" ? chunk7AAIAVAA_js.TARGET_KIND_CUBE : desc.kind === "2d-array" ? chunk7AAIAVAA_js.TARGET_KIND_ARRAY : chunk7AAIAVAA_js.TARGET_KIND_2D, d[chunk7AAIAVAA_js.TARGET_LAYERS] = desc.layers ?? 1, d[chunk7AAIAVAA_js.TARGET_SAMPLED_DEPTH] = desc.sampleDepth ? 1 : 0, d[chunk7AAIAVAA_js.TARGET_COLORS] = desc.colors ?? 1;
1731
+ let id = this.check(this.abi.engine_render_create_target(this.handle), "create render target");
1732
+ this.targetTextures.set(id, this.registers[30]);
1733
+ let depth = d[chunk7AAIAVAA_js.TARGET_TEXTURES + chunk7AAIAVAA_js.TARGET_MAX_COLORS - 1];
1734
+ desc.sampleDepth && depth !== 0 && this.targetDepths.set(id, depth), this.targetFormats.set(id, desc.format ?? "rgba8");
1735
+ let extras = [];
1736
+ for (let k = 1; k < (desc.colors ?? 1); k++) extras.push(d[chunk7AAIAVAA_js.TARGET_TEXTURES + k - 1]);
1737
+ return this.targetAttachments.set(id, extras), id;
1738
+ }
1739
+ renderTargetAttachment(target, attachment) {
1740
+ if (attachment === 0) return this.renderTargetTexture(target);
1741
+ let texture = this.targetAttachments.get(target)?.[attachment - 1];
1742
+ if (texture === void 0 || texture === 0)
1743
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `render target ${target} has no colour attachment ${attachment}`);
1744
+ return texture;
1745
+ }
1746
+ renderTargetTexture(target) {
1747
+ let texture = this.targetTextures.get(target);
1748
+ if (texture === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `render target ${target} does not exist`);
1749
+ return texture;
1750
+ }
1751
+ renderTargetDepthTexture(target) {
1752
+ let texture = this.targetDepths.get(target);
1753
+ if (texture === void 0) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `render target ${target} was not created with sampleDepth`);
1754
+ return texture;
1755
+ }
1756
+ resizeRenderTarget(target, width, height) {
1757
+ let a = this.command(26, target);
1758
+ this.commandWords[a] = width, this.commandWords[a + 1] = height;
1759
+ }
1760
+ destroyRenderTarget(target) {
1761
+ this.command(27, target), this.targetTextures.delete(target), this.targetDepths.delete(target), this.targetFormats.delete(target), this.targetAttachments.delete(target);
1762
+ }
1763
+ createPostChain(desc) {
1764
+ if (desc.effects.length > chunk7AAIAVAA_js.MAX_CHAIN_EFFECTS) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `post chains hold ${chunk7AAIAVAA_js.MAX_CHAIN_EFFECTS} effects`);
1765
+ let shaders = desc.effects.map((effect) => effect.kind === "shader" ? postShader(effect) : null), params = desc.effects.map((effect, e) => {
1766
+ let shader = shaders[e];
1767
+ if (shader) return shader.values;
1768
+ let record = effect;
1769
+ return EFFECT_PARAMETERS[effect.kind].map((name) => Number(record[name] ?? 0));
1770
+ }), inline = Math.min(desc.effects.length, 12), d = this.clearDesc(), f = this.descFloats;
1771
+ d[0] = inline;
1772
+ for (let e = 0; e < inline; e++) {
1773
+ let at = 1 + e * 5;
1774
+ d[at + 0] = EFFECT_KINDS[desc.effects[e].kind], params[e].forEach((value, p) => {
1775
+ f[at + 1 + p] = value;
1776
+ });
1777
+ }
1778
+ let setShader = shaders.some((shader) => shader !== null) ? this.feature("engine_render_set_chain_shader") : null, id = this.check(this.abi.engine_render_create_chain(this.handle), "create post chain");
1779
+ for (let e = inline; e < desc.effects.length; e++) {
1780
+ let a = this.command(chunk7AAIAVAA_js.OP_SET_EFFECT, id);
1781
+ this.commandWords[a] = e, this.commandWords[a + 1] = EFFECT_KINDS[desc.effects[e].kind], params[e].forEach((value, p) => {
1782
+ this.commandFloats[a + 2 + p] = value;
1783
+ });
1784
+ }
1785
+ return inline < desc.effects.length && this.flush(), shaders.forEach((shader, e) => {
1786
+ if (!shader || !setShader) return;
1787
+ let pointer = this.stage(shader.source);
1788
+ this.check(setShader(this.handle, id, e, pointer, shader.source.byteLength), "set post shader");
1789
+ }), desc.effects.forEach((effect, e) => {
1790
+ if (!(effect.kind !== "shader" || effect.textures === void 0)) {
1791
+ if (effect.textures.length > chunk7AAIAVAA_js.POST_EFFECT_TEXTURES)
1792
+ throw new chunk2V7IL4HC_js.GameError("invalid_argument", `post shaders take ${chunk7AAIAVAA_js.POST_EFFECT_TEXTURES} textures`);
1793
+ effect.textures.forEach((texture, slot) => {
1794
+ let a = this.command(chunk7AAIAVAA_js.OP_SET_EFFECT_TEXTURE, id);
1795
+ this.commandWords[a] = e, this.commandWords[a + 1] = slot, this.commandWords[a + 2] = texture;
1796
+ });
1797
+ }
1798
+ }), this.chains.set(id, {
1799
+ kinds: desc.effects.map((e) => e.kind),
1800
+ params: desc.effects.map((effect, e) => shaders[e]?.params ?? EFFECT_PARAMETERS[effect.kind])
1801
+ }), id;
1802
+ }
1803
+ setPostScalar(chain, effect, uniform, value) {
1804
+ let mirror = this.chains.get(chain), kind = mirror?.kinds[effect];
1805
+ if (mirror === void 0 || kind === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `post chain ${chain} has no effect ${effect}`);
1806
+ let param = mirror.params[effect].indexOf(uniform);
1807
+ if (param < 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `${kind} has no parameter ${uniform}`);
1808
+ let a = this.command(24, chain);
1809
+ this.commandWords[a] = effect, this.commandWords[a + 1] = param, this.commandFloats[a + 2] = value;
1810
+ }
1811
+ setPostChain(chain) {
1812
+ this.command(23, chain ?? 0);
1813
+ }
1814
+ setWeather(state) {
1815
+ let w = weatherWords(state), a = this.command(chunk7AAIAVAA_js.OP_SET_WEATHER, w.snow ? 1 : 0), f = this.commandFloats;
1816
+ f[a] = w.cloudCover, f[a + 1] = w.haze, f[a + 2] = w.precipitation, f[a + 3] = w.wetness, f[a + 4] = w.windX, f[a + 5] = w.windZ;
1817
+ }
1818
+ setTimeOfDay(hours, latitude, dayOfYear) {
1819
+ let a = this.command(chunk7AAIAVAA_js.OP_SET_TIME_OF_DAY, 0), f = this.commandFloats;
1820
+ f[a] = hours, f[a + 1] = latitude ?? UNSET, f[a + 2] = dayOfYear ?? UNSET;
1821
+ }
1822
+ destroyPostChain(chain) {
1823
+ this.command(25, chain), this.chains.delete(chain);
1824
+ }
1825
+ createRenderPass(desc) {
1826
+ this.flush();
1827
+ let d = this.clearDesc(), f = this.descFloats;
1828
+ return d[0] = desc.camera, d[1] = desc.target ?? 0, d[2] = (desc.layers ?? 4294967295) >>> 0, d[3] = desc.clearColor ?? 0, f[4] = desc.clearAlpha ?? 1, d[5] = (desc.order ?? 0) >>> 0, d[chunk7AAIAVAA_js.PASS_SLICE] = desc.slice ?? 0, d[chunk7AAIAVAA_js.PASS_FLAGS] = (desc.cubeFace ? chunk7AAIAVAA_js.PASS_FLAG_CUBE_FACE : 0) | (desc.reflect ? chunk7AAIAVAA_js.PASS_FLAG_REFLECT : 0) | (desc.once ? chunk7AAIAVAA_js.PASS_FLAG_ONCE : 0), desc.reflect?.forEach((v, i) => {
1829
+ f[chunk7AAIAVAA_js.PASS_PLANE + i] = v;
1830
+ }), desc.viewport && (d[6] = 1, desc.viewport.forEach((v, i) => {
1831
+ f[7 + i] = v;
1832
+ })), this.check(this.abi.engine_render_create_pass(this.handle), "create render pass");
1833
+ }
1834
+ setRenderPassEnabled(pass, enabled) {
1835
+ this.commandWords[this.command(21, pass)] = enabled ? 1 : 0;
1836
+ }
1837
+ destroyRenderPass(pass) {
1838
+ this.command(22, pass);
1839
+ }
1840
+ async bytes(source, what) {
1841
+ if ("bytes" in source) return new Uint8Array(source.bytes);
1842
+ if ("text" in source) return UTF8.encode(source.text);
1843
+ let response = await fetch(source.url);
1844
+ if (!response.ok) throw new chunk2V7IL4HC_js.GameError("asset_load_failed", `${what} ${source.url} failed with ${response.status}`);
1845
+ return new Uint8Array(await response.arrayBuffer());
1846
+ }
1847
+ installShaders(bytes) {
1848
+ let pointer = this.stage(bytes);
1849
+ return this.check(
1850
+ this.abi.engine_render_install_shaders(this.handle, pointer, bytes.byteLength),
1851
+ "install shaders"
1852
+ );
1853
+ }
1854
+ async loadModel(source) {
1855
+ let bytes = await this.bytes(source, "model"), pointer = this.stage(bytes), id = this.check(this.abi.engine_render_load_model(this.handle, pointer, bytes.byteLength), "load model");
1856
+ return this.readModel(id, null);
1857
+ }
1858
+ async upgradeModel(model, source) {
1859
+ let previous = this.models.get(model);
1860
+ if (previous === void 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `model ${model} is not loaded`);
1861
+ let bytes = await this.bytes(source, "model"), reload = this.reloadExport("engine_render_reload_model");
1862
+ if (reload !== null) {
1863
+ this.flush();
1864
+ let code = reload(this.handle, model, this.stage(bytes), bytes.byteLength);
1865
+ if (code >= 0) return { model: this.readModel(model, previous), inPlace: true };
1866
+ if (code !== chunk2O2CG465_js.ERROR_INVALID_ARGUMENT) throw failure2(code, "reload model");
1867
+ }
1868
+ let id = this.check(this.abi.engine_render_load_model(this.handle, this.stage(bytes), bytes.byteLength), "load model");
1869
+ return { model: this.readModel(id, null), inPlace: false };
1870
+ }
1871
+ readModel(id, previous) {
1872
+ let nodes = this.registers[12], clips = nodes + this.registers[13], [names, length] = this.view(6, id, 0), all = NAMES.decode(new Uint8Array(this.buffer, names, length).slice()).split(String.fromCharCode((0))), clipNames = all.slice(nodes, clips);
1873
+ if (previous !== null) {
1874
+ let info2 = { ...previous, nodeNames: all.slice(0, nodes), clipNames };
1875
+ return this.models.set(id, info2), info2;
1876
+ }
1877
+ let named = this.owns(12), materialNames = named ? all.slice(clips, all.length - 1) : [], materials = named ? this.modelMaterials(id, materialNames.length) : [], info = { id, nodeNames: all.slice(0, nodes), clipNames, materialNames, materials };
1878
+ return this.models.set(id, info), info;
1879
+ }
1880
+ refreshModel(root) {
1881
+ let model = this.roots.get(root), previous = model === void 0 ? void 0 : this.models.get(model);
1882
+ if (model === void 0 || previous === void 0) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `node ${root} is not a model instance`);
1883
+ return this.readModel(model, previous);
1884
+ }
1885
+ async loadClips(root, source, options) {
1886
+ let rate = chunkYV52DGSA_js.bakeRate(options), load = this.feature("engine_render_load_clips");
1887
+ if (!this.roots.has(root)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", `node ${root} is not a model instance`);
1888
+ let bytes = await this.bytes(source, "clips");
1889
+ this.flush();
1890
+ let pointer = this.stage(bytes), first = this.check(load(this.handle, root, pointer, bytes.byteLength, rate), "load clips");
1891
+ return this.refreshModel(root).clipNames.slice(first);
1892
+ }
1893
+ setTint(node, tint) {
1894
+ let at = this.command(63, node);
1895
+ chunkPKOZXD2Q_js.writeTintWords(tint, this.commandWords, at);
1896
+ }
1897
+ modelMaterials(model, count) {
1898
+ let [ids] = this.view(12, model, 0);
1899
+ return Array.from(new Uint32Array(this.buffer, ids, count), (material) => material);
1900
+ }
1901
+ instantiateModel(model) {
1902
+ if (!this.models.get(model)) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `model ${model} is not loaded`);
1903
+ let root = this.check(this.abi.engine_render_instantiate(this.handle, model), "instantiate model");
1904
+ return this.roots.set(root, model), root;
1905
+ }
1906
+ findNode(root, name) {
1907
+ let bytes = UTF8.encode(name), node = this.check(this.abi.engine_render_find_node(this.handle, root, this.stage(bytes), bytes.byteLength), "find node");
1908
+ return node === (0) ? null : node;
1909
+ }
1910
+ playClip(root, clip, loop, fadeSeconds, speed) {
1911
+ let index = this.clipIndex(root, clip);
1912
+ if (index < 0) throw new chunk2V7IL4HC_js.GameError("unknown_resource", `node ${root} has no clip ${clip}`);
1913
+ return this.playClipIndex(root, index, loop, fadeSeconds, speed);
1914
+ }
1915
+ clipIndex(root, clip) {
1916
+ let model = this.roots.get(root);
1917
+ return model === void 0 ? -1 : this.models.get(model)?.clipNames.indexOf(clip) ?? -1;
1918
+ }
1919
+ playClipIndex(root, clip, loop, fadeSeconds, speed) {
1920
+ return this.flush(), this.check(this.abi.engine_render_play_clip(this.handle, root, clip, loop ? 1 : 0, fadeSeconds, speed), "play clip");
1921
+ }
1922
+ setClipWeight(action, weight) {
1923
+ this.commandFloats[this.command(28, action)] = weight;
1924
+ }
1925
+ stopClip(action, fadeSeconds) {
1926
+ this.commandFloats[this.command(29, action)] = fadeSeconds;
1927
+ }
1928
+ advanceAnimations(time) {
1929
+ this.flush(), this.registerFloats[16] = time.values[chunkYXGZQPUD_js.FRAME_SECONDS_SLOT], this.check(this.abi.engine_render_animate(this.handle), "advance animations");
1930
+ }
1931
+ render(time) {
1932
+ this.frameBudget !== null && this.followRefresh(time.values), this.flush();
1933
+ let native = this.nativeSurface;
1934
+ native !== null && native.before_render !== void 0 && native.before_render(), this.vectorSurfaces?.frame(time.values[chunkYXGZQPUD_js.FRAME_SECONDS_SLOT]), this.check(this.abi.engine_render_frame(this.handle), "render frame"), this.targetReads.length > 0 && this.pollTargetReads();
1935
+ }
1936
+ followRefresh(clock) {
1937
+ let refresh = this.refresh, interval = clock[chunkYXGZQPUD_js.FRAME_NOW_MS_SLOT] - refresh[(0)];
1938
+ if (refresh[(0)] = clock[chunkYXGZQPUD_js.FRAME_NOW_MS_SLOT], interval >= (1) && interval < (100) && (interval < refresh[(1)] && (refresh[(1)] = interval), this.observed++), this.observed < (64) || this.frameBudget === null) return;
1939
+ let micros = Math.round(refresh[(1)] * (1e3));
1940
+ refresh[(1)] = (100), this.observed = 0, !(Math.abs(micros - this.budgetMicros) * (50) <= this.budgetMicros) && (this.budgetMicros = micros, this.frameBudget(this.handle, micros));
1941
+ }
1942
+ pushVideoFrame(texture, frame, width, height) {
1943
+ let gpu = this.runtime.gpu;
1944
+ if (gpu === null || this.abi.engine_render_texture_object === void 0) return false;
1945
+ this.flush();
1946
+ let object = this.abi.engine_render_texture_object(this.handle, texture);
1947
+ return object <= 0 ? false : gpu.copyExternalImage(object, frame, width, height);
1948
+ }
1949
+ readRenderTarget(target, rect, slice = 0) {
1950
+ let read = this.feature("engine_render_read_target");
1951
+ if (this.abi.engine_render_raw_poll === void 0)
1952
+ throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build cannot poll readbacks");
1953
+ this.flush();
1954
+ let [x, y, width, height] = rect, request = this.check(read(this.handle, target, slice, x, y, width, height), "read render target"), bytes = width * height * (this.targetFormats.get(target) === "rgba8" ? 4 : 8);
1955
+ return new Promise((resolve, reject) => {
1956
+ this.targetReads.push({ request, bytes, resolve, reject });
1957
+ });
1958
+ }
1959
+ pollTargetReads() {
1960
+ let poll = this.abi.engine_render_raw_poll;
1961
+ if (poll === void 0) return;
1962
+ let waiting = [];
1963
+ for (let read of this.targetReads) {
1964
+ let pointer = poll(this.handle, read.request);
1965
+ if (pointer === 0) {
1966
+ waiting.push(read);
1967
+ continue;
1968
+ }
1969
+ if (pointer < 0) {
1970
+ read.reject(failure2(pointer, "read render target"));
1971
+ continue;
1972
+ }
1973
+ read.resolve(new Uint8Array(this.buffer, pointer, read.bytes).slice());
1974
+ }
1975
+ this.targetReads = waiting;
1976
+ }
1977
+ stats(out) {
1978
+ this.flush(), this.check(this.abi.engine_render_stats(this.handle), "stats");
1979
+ let r = this.registers;
1980
+ out.nodes = r[0], out.geometries = r[1], out.materials = r[2], out.textures = r[3], out.renderTargets = r[4], out.postChains = r[5], out.renderPasses = r[6], out.frames = r[7];
1981
+ }
1982
+ dispose() {
1983
+ this.disposed || (this.disposed = true, this.stopResize?.(), this.nativeSurface?.release(), this.nativeSurface = null, this.abi.engine_render_destroy(this.handle), this.scratch !== 0 && this.runtime.exports.engine_free(this.scratch, this.scratchBytes, chunk2O2CG465_js.COLUMN_ALIGN), this.matrixScratch && this.runtime.exports.engine_free(this.matrixScratch.byteOffset, 16 * chunk2O2CG465_js.WORD_BYTES, chunk2O2CG465_js.COLUMN_ALIGN), this.textPointer !== 0 && this.runtime.exports.engine_free(this.textPointer, this.textBytes, chunk2O2CG465_js.COLUMN_ALIGN), this.pickPointer !== 0 && this.runtime.exports.engine_free(this.pickPointer, 18 * chunk2O2CG465_js.WORD_BYTES, chunk2O2CG465_js.COLUMN_ALIGN), this.textPointer = 0, this.pickPointer = 0, this.scratch = 0, this.matrixScratch = null);
1984
+ }
1985
+ };
1986
+
1987
+ // src/game/backends/engine/ai.ts
1988
+ var NO_WORLD = 0;
1989
+ function engineAiExports(symbols) {
1990
+ for (let name of chunk3S6WPBZL_js.ENGINE_AI_EXPORT_NAMES) if (typeof symbols[name] != "function") return null;
1991
+ return symbols;
1992
+ }
1993
+ var EngineAiPort = class {
1994
+ constructor(runtime, exports, physicsWorld) {
1995
+ this.name = "cimplify-engine-ai";
1996
+ this.runtime = runtime, this.exports = exports, this.physicsWorld = physicsWorld;
1997
+ let stepWorld = runtime.symbols[chunk3S6WPBZL_js.ENGINE_AI_WORLD_STEP];
1998
+ this.stepWorld = typeof stepWorld == "function" ? stepWorld : null;
1999
+ }
2000
+ buffer() {
2001
+ return this.runtime.memory.buffer;
2002
+ }
2003
+ alloc(bytes, align) {
2004
+ return this.runtime.exports.engine_alloc(bytes, align);
2005
+ }
2006
+ free(pointer, bytes, align) {
2007
+ this.runtime.exports.engine_free(pointer, bytes, align);
2008
+ }
2009
+ step(ai) {
2010
+ let world = this.physicsWorld();
2011
+ return this.stepWorld !== null && world !== (0) ? this.stepWorld(ai, world) : this.exports.engine_ai_step(ai);
2012
+ }
2013
+ };
2014
+ function engineAi(runtime, physicsWorld = () => (0)) {
2015
+ let exports = engineAiExports(runtime.symbols);
2016
+ return exports ? new EngineAiPort(runtime, exports, physicsWorld) : null;
2017
+ }
2018
+
2019
+ // src/game/backends/engine/nav.ts
2020
+ var ENGINE_NAV_EXPORT_NAMES = [
2021
+ "engine_nav_create",
2022
+ "engine_nav_destroy",
2023
+ "engine_nav_registers",
2024
+ "engine_nav_costs",
2025
+ "engine_nav_include",
2026
+ "engine_nav_add_tile",
2027
+ "engine_nav_remove_tile",
2028
+ "engine_nav_nearest",
2029
+ "engine_nav_find_path",
2030
+ "engine_nav_agents",
2031
+ "engine_nav_agent_add",
2032
+ "engine_nav_agent_remove",
2033
+ "engine_nav_agent_target",
2034
+ "engine_nav_agent_stop",
2035
+ "engine_nav_step",
2036
+ "engine_nav_roads",
2037
+ "engine_nav_vehicles",
2038
+ "engine_nav_vehicle_add",
2039
+ "engine_nav_vehicle_remove",
2040
+ "engine_nav_vehicle_external",
2041
+ "engine_nav_signal",
2042
+ "engine_nav_add_link",
2043
+ "engine_nav_remove_link"
2044
+ ], NO_POINTER = 0, EMPTY = new Float32Array(0), ERROR_MESSAGES = ["", "capacity exceeded", "dead entity", "unknown resource", "invalid argument", "unsupported"], DRIVER_WORDS = 6;
2045
+ function engineNavExports(symbols) {
2046
+ for (let name of ENGINE_NAV_EXPORT_NAMES) if (typeof symbols[name] != "function") return null;
2047
+ return symbols;
2048
+ }
2049
+ var EngineNav = class {
2050
+ constructor(runtime, exports) {
2051
+ this.name = "cimplify-engine-nav";
2052
+ this.handle = (0);
2053
+ this.words = new Uint32Array(0);
2054
+ this.floats = new Float32Array(0);
2055
+ this.costs = new Float32Array(0);
2056
+ this.agentView = EMPTY;
2057
+ this.vehicleView = EMPTY;
2058
+ this.maxAgents = 0;
2059
+ this.maxVehicles = 0;
2060
+ this.scratch = (0);
2061
+ this.scratchBytes = 0;
2062
+ this.complete = false;
2063
+ this.runtime = runtime, this.exports = exports;
2064
+ }
2065
+ get pathComplete() {
2066
+ return this.complete;
2067
+ }
2068
+ batchHandle() {
2069
+ return this.handle;
2070
+ }
2071
+ check(code, what) {
2072
+ if (code < 0) {
2073
+ let kind = -code === 1 ? "capacity_exceeded" : -code === 3 ? "unknown_resource" : -code === 5 ? "unsupported_feature" : "invalid_argument";
2074
+ throw new chunk2V7IL4HC_js.GameError(kind, `${what}: ${ERROR_MESSAGES[-code] ?? "failed"}`);
2075
+ }
2076
+ return code;
2077
+ }
2078
+ require() {
2079
+ if (this.handle === (0)) throw new chunk2V7IL4HC_js.GameError("not_initialized", "navigation is not initialised");
2080
+ return this.handle;
2081
+ }
2082
+ alloc(bytes) {
2083
+ if (bytes <= this.scratchBytes) return this.scratch;
2084
+ if (this.scratch !== (0) && this.runtime.exports.engine_free(this.scratch, this.scratchBytes, chunk2O2CG465_js.WORD_BYTES), this.scratch = this.runtime.exports.engine_alloc(bytes, chunk2O2CG465_js.WORD_BYTES), this.scratch === (0)) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory is full");
2085
+ return this.scratchBytes = bytes, this.scratch;
2086
+ }
2087
+ init(desc) {
2088
+ let pointer = this.alloc(16 * chunk2O2CG465_js.WORD_BYTES), buffer = this.runtime.memory.buffer, words = new Uint32Array(buffer, pointer, 16), floats = new Float32Array(buffer, pointer, 16);
2089
+ words.fill(0);
2090
+ let origin = desc.origin ?? [0, 0], extents = desc.extents ?? chunk3S6WPBZL_js.DEFAULT_EXTENTS;
2091
+ floats[0] = origin[0], floats[1] = origin[1], floats[2] = desc.tileWorld, words[3] = desc.maxTiles ?? 256, words[4] = desc.queryNodes ?? 2048, this.maxAgents = desc.maxAgents ?? 512, words[5] = this.maxAgents, floats[6] = desc.neighbourDistance ?? 4, floats[7] = desc.timeHorizon ?? 2, words[8] = desc.pathBudget ?? 16, words[9] = desc.maxPathPolys ?? 256;
2092
+ for (let k = 0; k < 3; k++) floats[10 + k] = extents[k];
2093
+ if (this.handle = this.exports.engine_nav_create(pointer), this.handle === (0)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "navigation could not be created");
2094
+ let registers = this.exports.engine_nav_registers(this.handle);
2095
+ this.words = new Uint32Array(buffer, registers, 32), this.floats = new Float32Array(buffer, registers, 32);
2096
+ for (let k = 0; k < 3; k++) this.floats[6 + k] = extents[k];
2097
+ this.costs = new Float32Array(buffer, this.exports.engine_nav_costs(this.handle), 64), this.agentView = new Float32Array(buffer, this.exports.engine_nav_agents(this.handle), this.maxAgents * 8);
2098
+ }
2099
+ addTile(bytes) {
2100
+ let handle = this.require(), pointer = this.alloc(bytes.byteLength);
2101
+ return new Uint8Array(this.runtime.memory.buffer, pointer, bytes.byteLength).set(bytes), this.check(this.exports.engine_nav_add_tile(handle, pointer, bytes.byteLength), "add tile");
2102
+ }
2103
+ removeTile(x, z) {
2104
+ this.check(this.exports.engine_nav_remove_tile(this.require(), x, z), "remove tile");
2105
+ }
2106
+ addLink(start, end, radius, bidirectional, area, user) {
2107
+ let handle = this.require(), f = this.floats;
2108
+ for (let k = 0; k < 3; k++)
2109
+ f[0 + k] = start[k], f[3 + k] = end[k];
2110
+ return f[29] = radius, this.words[30] = (bidirectional ? 1 : 0) | area << 8, this.words[31] = user >>> 0, this.check(this.exports.engine_nav_add_link(handle), "add link");
2111
+ }
2112
+ removeLink(link) {
2113
+ this.check(this.exports.engine_nav_remove_link(this.require(), link), "remove link");
2114
+ }
2115
+ setAreaCost(area, cost) {
2116
+ this.require(), this.costs[area] = cost;
2117
+ }
2118
+ setIncludeMask(low, high) {
2119
+ let handle = this.require();
2120
+ this.words[27] = low, this.words[28] = high, this.check(this.exports.engine_nav_include(handle), "include mask");
2121
+ }
2122
+ nearest(x, y, z, out) {
2123
+ let handle = this.require(), f = this.floats;
2124
+ return f[0] = x, f[1] = y, f[2] = z, this.check(this.exports.engine_nav_nearest(handle), "nearest") === 0 ? false : (out[0] = f[10], out[1] = f[11], out[2] = f[12], true);
2125
+ }
2126
+ findPath(sx, sy, sz, ex, ey, ez, out) {
2127
+ let handle = this.require(), f = this.floats;
2128
+ f[0] = sx, f[1] = sy, f[2] = sz, f[3] = ex, f[4] = ey, f[5] = ez;
2129
+ let maxPoints = Math.max(Math.floor(out.length / 3), 1), pointer = this.alloc(maxPoints * 3 * chunk2O2CG465_js.WORD_BYTES), code = this.exports.engine_nav_find_path(handle, pointer, maxPoints);
2130
+ return code < 0 ? (this.complete = false, 0) : (out.set(new Float32Array(this.runtime.memory.buffer, pointer, code * 3)), this.complete = this.words[13] === 1, code);
2131
+ }
2132
+ addAgent(x, y, z, radius, speed, accel) {
2133
+ let handle = this.require(), f = this.floats;
2134
+ return f[0] = x, f[1] = y, f[2] = z, f[15] = radius, f[16] = speed, f[17] = accel, this.check(this.exports.engine_nav_agent_add(handle), "add agent");
2135
+ }
2136
+ removeAgent(agent) {
2137
+ this.check(this.exports.engine_nav_agent_remove(this.require(), agent), "remove agent");
2138
+ }
2139
+ setAgentTarget(agent, x, y, z) {
2140
+ let handle = this.require(), f = this.floats;
2141
+ f[3] = x, f[4] = y, f[5] = z, this.check(this.exports.engine_nav_agent_target(handle, agent), "agent target");
2142
+ }
2143
+ stopAgent(agent) {
2144
+ this.check(this.exports.engine_nav_agent_stop(this.require(), agent), "stop agent");
2145
+ }
2146
+ agents() {
2147
+ return this.agentView;
2148
+ }
2149
+ loadRoads(words) {
2150
+ let handle = this.require(), pointer = this.alloc(words.byteLength);
2151
+ new Uint32Array(this.runtime.memory.buffer, pointer, words.length).set(words), this.check(this.exports.engine_nav_roads(handle, pointer, words.length), "load roads"), this.maxVehicles = words[5];
2152
+ let padded = Math.ceil(this.maxVehicles / 4) * 4;
2153
+ this.vehicleView = new Float32Array(this.runtime.memory.buffer, this.exports.engine_nav_vehicles(handle), padded * 8);
2154
+ }
2155
+ addVehicle(lane, position, speed, driver) {
2156
+ let handle = this.require(), f = this.floats;
2157
+ f[18] = position, f[19] = speed;
2158
+ for (let k = 0; k < (6); k++) f[20 + k] = driver[k];
2159
+ return this.check(this.exports.engine_nav_vehicle_add(handle, lane), "add vehicle");
2160
+ }
2161
+ removeVehicle(vehicle) {
2162
+ this.check(this.exports.engine_nav_vehicle_remove(this.require(), vehicle), "remove vehicle");
2163
+ }
2164
+ setExternalVehicle(vehicle, lane, position, speed) {
2165
+ let handle = this.require();
2166
+ this.floats[18] = position, this.floats[19] = speed, this.check(this.exports.engine_nav_vehicle_external(handle, vehicle, lane), "external vehicle");
2167
+ }
2168
+ vehicles() {
2169
+ return this.vehicleView;
2170
+ }
2171
+ signal(lane) {
2172
+ return this.check(this.exports.engine_nav_signal(this.require(), lane), "signal");
2173
+ }
2174
+ step(dt) {
2175
+ let handle = this.require();
2176
+ this.floats[14] = dt, this.check(this.exports.engine_nav_step(handle), "nav step");
2177
+ }
2178
+ dispose() {
2179
+ this.handle !== (0) && this.exports.engine_nav_destroy(this.handle), this.scratch !== (0) && this.runtime.exports.engine_free(this.scratch, this.scratchBytes, chunk2O2CG465_js.WORD_BYTES), this.handle = (0), this.scratch = (0), this.scratchBytes = 0;
2180
+ }
2181
+ };
2182
+
2183
+ // src/game/backends/engine/craft.ts
2184
+ var ENGINE_CRAFT_NAME = "engine-craft", CRAFT_EXPORTS = [
2185
+ "engine_craft_create",
2186
+ "engine_craft_destroy",
2187
+ "engine_craft_registers",
2188
+ "engine_craft_controls",
2189
+ "engine_craft_telemetry",
2190
+ "engine_craft_set_water",
2191
+ "engine_craft_set_flow",
2192
+ "engine_craft_sea",
2193
+ "engine_craft_custom",
2194
+ "engine_craft_spin_up",
2195
+ "engine_craft_remove",
2196
+ "engine_craft_step",
2197
+ "engine_water_sample",
2198
+ "engine_alloc",
2199
+ "engine_free"
2200
+ ], MILLIMETRES = 1e3, OCEAN_SIZE = 113, OCEAN_PATCH = 114, OCEAN_WIND = 115, OCEAN_AMPLITUDE = 117, OCEAN_CHOPPINESS = 118, OCEAN_SMALL_WAVE = 119, OCEAN_SEED = 120, OCEAN_EVERY = 121, POINT_X = 122, POINT_Z = 123, POINT_AMOUNT = 124, DEFAULT_OCEAN_SIZE = 64, DEFAULT_OCEAN_PATCH = 64, DEFAULT_OCEAN_AMPLITUDE = 2e-4, DEFAULT_OCEAN_CHOPPINESS = 1.2, DEFAULT_OCEAN_SMALL_WAVE = 0.05, NO_RENDER = 0, DEFAULT_RIPPLE_SIZE = 128, DEFAULT_RIPPLE_CELL = 0.25, DEFAULT_RIPPLE_SPEED = 1.5, NO_RIPPLES = 0, NO_PUDDLES = 0, DEFAULT_PUDDLE_DEPTH = 0.5, REGISTER_WORDS2 = 128, WATER_LEVEL = 0, WATER_DEPTH = 1, WATER_GRAVITY = 2, WATER_DENSITY = 3, WATER_CURRENT = 4, WATER_WIND = 6, WATER_GUST = 8, WATER_GUST_PERIOD = 9, WATER_ITERATIONS = 10, WATER_WAVE_COUNT = 11, WATER_WAVES = 12, WAVE_WORDS = 6, DEFAULT_GRAVITY = 9.81, DEFAULT_DENSITY = 1025, DEFAULT_ITERATIONS = 2, NO_HANDLE2 = 0, FLOAT_BYTES = 4, SAMPLE_CAPACITY = 1024, CASCADE_DESC_FLOATS = 21, CASCADE_SEED_LOW = 19, CASCADE_SEED_HIGH = 20, SEED_HIGH = 2 ** 32, DEFAULT_PHYSICS_SIZE = 64, DEFAULT_CASCADES = {
2201
+ size: 256,
2202
+ count: 4,
2203
+ patches: [256, 64, 16, 4],
2204
+ windSpeed: 10,
2205
+ windDirection: 0,
2206
+ fetch: 1e5,
2207
+ peakEnhancement: 3.3,
2208
+ swell: 0,
2209
+ depth: Number.POSITIVE_INFINITY,
2210
+ shortWaves: 0.01,
2211
+ scale: 1,
2212
+ choppiness: 1,
2213
+ gravity: 9.81,
2214
+ seed: 1
2215
+ }, DEFAULT_FOAM = { threshold: 0.7, gain: 4, decaySeconds: 2.5 };
2216
+ function packCascades(desc) {
2217
+ let out = new Float32Array((21)), bits = new Uint32Array(out.buffer);
2218
+ if (desc === null) return out;
2219
+ let d = { ...DEFAULT_CASCADES, ...desc }, foam = { ...DEFAULT_FOAM, ...desc.foam };
2220
+ out.set([d.size, d.count, ...d.patches, d.windSpeed, d.windDirection, d.fetch, d.peakEnhancement, d.swell, d.depth, d.shortWaves, d.scale, d.choppiness, foam.threshold, foam.gain, foam.decaySeconds, d.gravity]);
2221
+ let seed = Math.max(0, Math.floor(d.seed));
2222
+ return bits[(19)] = seed % SEED_HIGH, bits[(20)] = Math.floor(seed / SEED_HIGH), out;
2223
+ }
2224
+ function hasCraft(symbols) {
2225
+ return CRAFT_EXPORTS.every((name) => typeof symbols[name] == "function");
2226
+ }
2227
+ function engineCraft(session) {
2228
+ return hasCraft(session.symbols) ? new EngineCraft(session, session.symbols) : null;
2229
+ }
2230
+ var EngineCraft = class {
2231
+ constructor(session, symbols, capacity = 64) {
2232
+ this.name = ENGINE_CRAFT_NAME;
2233
+ this.handle = (0);
2234
+ this.words = new Uint32Array(0);
2235
+ this.floats = new Float32Array(0);
2236
+ this.controlTable = new Float32Array(0);
2237
+ this.telemetryTable = new Float32Array(0);
2238
+ this.points = 0;
2239
+ this.samples = 0;
2240
+ this.render = () => (0);
2241
+ this.pointView = new Float32Array(0);
2242
+ this.sampleView = new Float32Array(0);
2243
+ if (!hasCraft(symbols)) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no craft simulation");
2244
+ this.session = session, this.exports = symbols, this.capacity = capacity;
2245
+ }
2246
+ configureWater(desc) {
2247
+ this.open();
2248
+ let w = this.words, f = this.floats, waves = desc.waves ?? [];
2249
+ if (waves.length > chunk3S6WPBZL_js.MAX_WAVES) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "too many waves");
2250
+ f[(0)] = desc.level ?? 0, f[(1)] = desc.depth ?? Number.POSITIVE_INFINITY, f[(2)] = desc.gravity ?? (9.81), f[(3)] = desc.density ?? (1025), f[(4)] = desc.current?.[0] ?? 0, f[(4) + 1] = desc.current?.[1] ?? 0, f[(6)] = desc.wind?.[0] ?? 0, f[(6) + 1] = desc.wind?.[1] ?? 0, f[(8)] = desc.gust ?? 0, f[(9)] = desc.gustPeriod ?? 0, w[(10)] = desc.iterations ?? (2), w[(11)] = waves.length, waves.forEach((wave, i) => {
2251
+ let o = (12) + i * (6);
2252
+ f[o] = wave.direction[0], f[o + 1] = wave.direction[1], f[o + 2] = wave.wavelength, f[o + 3] = wave.amplitude, f[o + 4] = wave.steepness, f[o + 5] = wave.phase;
2253
+ }), this.session.check(this.exports.engine_craft_set_water(this.handle), "configure water");
2254
+ }
2255
+ sea(state, windRadians, seed) {
2256
+ this.open(), this.session.check(this.exports.engine_craft_sea(this.handle, chunk3S6WPBZL_js.SEA_STATES.indexOf(state), windRadians, seed >>> 0), "sea state");
2257
+ }
2258
+ setFlow(flow) {
2259
+ this.open();
2260
+ let f = this.floats;
2261
+ f[(0)] = flow.level, f[(4)] = flow.current[0], f[(4) + 1] = flow.current[1], f[(6)] = flow.wind[0], f[(6) + 1] = flow.wind[1], f[(8)] = flow.gust, f[(9)] = flow.gustPeriod, this.session.check(this.exports.engine_craft_set_flow(this.handle), "water flow");
2262
+ }
2263
+ createCraft(_entity, body, collider, words, running) {
2264
+ this.open();
2265
+ let bytes = words.length * (4), pointer = this.exports.engine_alloc(bytes, (4));
2266
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "craft description could not be staged");
2267
+ try {
2268
+ new Float32Array(this.session.buffer, pointer, words.length).set(words);
2269
+ let id = this.session.check(
2270
+ this.exports.engine_craft_custom(this.handle, body, collider >>> 0, pointer, words.length),
2271
+ "create craft"
2272
+ );
2273
+ return running && this.session.check(this.exports.engine_craft_spin_up(this.handle, id), "spin up craft"), id;
2274
+ } finally {
2275
+ this.exports.engine_free(pointer, bytes, (4));
2276
+ }
2277
+ }
2278
+ removeCraft(craft) {
2279
+ this.open(), this.session.check(this.exports.engine_craft_remove(this.handle, craft), "remove craft");
2280
+ }
2281
+ controls() {
2282
+ return this.open(), this.controlTable;
2283
+ }
2284
+ telemetry() {
2285
+ return this.open(), this.telemetryTable;
2286
+ }
2287
+ setOcean(desc) {
2288
+ let ocean = this.exports.engine_craft_ocean;
2289
+ if (!ocean) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no ocean simulation");
2290
+ this.open();
2291
+ let w = this.words, f = this.floats;
2292
+ w[(113)] = desc ? desc.size ?? (64) : 0, f[(114)] = desc?.patch ?? (64), f[(115)] = desc?.wind?.[0] ?? f[(6)], f[(115) + 1] = desc?.wind?.[1] ?? f[(6) + 1], f[(117)] = desc?.amplitude ?? (2e-4), f[(118)] = desc?.choppiness ?? (1.2), f[(119)] = desc?.smallWave ?? (0.05), w[(120)] = (desc?.seed ?? 1) >>> 0, w[(121)] = Math.max(1, desc?.updateEvery ?? 1), this.session.check(ocean(this.handle), "configure ocean");
2293
+ }
2294
+ setRipples(desc) {
2295
+ let ripples = this.exports.engine_craft_ripples;
2296
+ if (!ripples) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no ripples");
2297
+ this.open();
2298
+ let size = desc ? desc.size ?? (128) : (0), cell = desc?.cell ?? (0.25), speed = desc?.speed ?? (1.5);
2299
+ this.session.check(ripples(this.handle, size, cell, speed), "configure ripples");
2300
+ }
2301
+ setCascades(desc) {
2302
+ let cascades = this.exports.engine_craft_cascades;
2303
+ if (!cascades) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no FFT ocean");
2304
+ let render = this.render();
2305
+ if (render === (0)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "the FFT ocean needs a render world to draw it");
2306
+ this.open();
2307
+ let words = packCascades(desc), pointer = this.exports.engine_alloc(words.byteLength, (4));
2308
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold the ocean desc");
2309
+ try {
2310
+ new Float32Array(this.session.buffer, pointer, (21)).set(words);
2311
+ let size = desc?.physicsSize ?? (64);
2312
+ this.session.check(cascades(this.handle, render, pointer, size), "FFT ocean");
2313
+ } finally {
2314
+ this.exports.engine_free(pointer, words.byteLength, (4));
2315
+ }
2316
+ }
2317
+ setPuddles(desc) {
2318
+ let puddles = this.exports.engine_craft_puddles;
2319
+ if (!puddles) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine build has no puddles");
2320
+ this.open();
2321
+ let width = desc ? desc.width : (0);
2322
+ this.session.check(
2323
+ puddles(this.handle, desc?.origin[0] ?? 0, desc?.origin[1] ?? 0, desc?.cell ?? 0, width, desc?.height ?? 0, desc?.maxDepth ?? (0.5)),
2324
+ "configure puddles"
2325
+ );
2326
+ }
2327
+ setPuddleBed(heights) {
2328
+ let bed = this.exports.engine_craft_puddles_bed;
2329
+ if (!bed || this.handle === (0)) return;
2330
+ let bytes = Math.max(heights.byteLength, (4)), pointer = this.exports.engine_alloc(bytes, (4));
2331
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold the puddle bed");
2332
+ try {
2333
+ new Float32Array(this.session.buffer, pointer, heights.length).set(heights), this.session.check(bed(this.handle, pointer, heights.length), "puddle bed");
2334
+ } finally {
2335
+ this.exports.engine_free(pointer, bytes, (4));
2336
+ }
2337
+ }
2338
+ pourPuddles(x, z, volume) {
2339
+ let pour = this.exports.engine_craft_puddles_pour;
2340
+ pour && this.handle !== (0) && (this.point(x, z, volume), this.session.check(pour(this.handle), "pour"));
2341
+ }
2342
+ /** Per-frame water calls pass integers only: the point goes through the registers. */
2343
+ point(x, z, amount) {
2344
+ let f = this.floats;
2345
+ f[(122)] = x, f[(123)] = z, f[(124)] = amount;
2346
+ }
2347
+ puddleWeather(rain, evaporation) {
2348
+ let weather = this.exports.engine_craft_puddles_weather;
2349
+ weather && this.handle !== (0) && this.session.check(weather(this.handle, rain, evaporation), "puddle weather");
2350
+ }
2351
+ followRipples(x, z) {
2352
+ let follow = this.exports.engine_craft_ripples_follow;
2353
+ follow && this.handle !== (0) && (this.point(x, z, 0), this.session.check(follow(this.handle), "follow ripples"));
2354
+ }
2355
+ pushRipples(x, z, amount) {
2356
+ let push = this.exports.engine_craft_ripples_push;
2357
+ push && this.handle !== (0) && (this.point(x, z, amount), this.session.check(push(this.handle), "push ripples"));
2358
+ }
2359
+ bindRender(source) {
2360
+ this.render = source;
2361
+ }
2362
+ step() {
2363
+ if (this.handle === (0) || this.session.world === 0) return;
2364
+ this.session.check(this.exports.engine_craft_step(this.handle, this.session.world), "craft step");
2365
+ let handoff = this.exports.engine_craft_render_water, render = this.render();
2366
+ handoff && render !== (0) && this.session.check(handoff(this.handle, render), "render water");
2367
+ }
2368
+ sampleWater(points, count, out) {
2369
+ this.open();
2370
+ let buffer = this.session.buffer;
2371
+ this.pointView.buffer !== buffer && (this.pointView = new Float32Array(buffer, this.points, (1024) * 2), this.sampleView = new Float32Array(buffer, this.samples, (1024) * chunk3S6WPBZL_js.WATER_SAMPLE_WORDS));
2372
+ for (let start = 0; start < count; start += (1024)) {
2373
+ let n = Math.min((1024), count - start);
2374
+ for (let i = 0; i < n * 2; i++) this.pointView[i] = points[start * 2 + i];
2375
+ this.session.check(this.exports.engine_water_sample(this.handle, this.points, n, this.samples), "water sample");
2376
+ let base = start * chunk3S6WPBZL_js.WATER_SAMPLE_WORDS;
2377
+ for (let i = 0; i < n * chunk3S6WPBZL_js.WATER_SAMPLE_WORDS; i++) out[base + i] = this.sampleView[i];
2378
+ }
2379
+ }
2380
+ floatsIn(values) {
2381
+ let pointer = this.exports.engine_alloc(Math.max(values.byteLength, (4)), (4));
2382
+ if (pointer === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold the crumple data");
2383
+ return new Float32Array(this.session.buffer, pointer, values.length).set(values), pointer;
2384
+ }
2385
+ crumpleExport(name) {
2386
+ let found = this.exports[name];
2387
+ if (!found) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `this engine build has no vehicle crumple (feature ${chunkX5A5FOWW_js.SOFT_BODY_FEATURE})`);
2388
+ return found;
2389
+ }
2390
+ crumple(craft, vertices, desc) {
2391
+ let create = this.crumpleExport("engine_craft_crumple");
2392
+ this.open();
2393
+ let points = this.floatsIn(vertices), words = desc === null ? 0 : this.floatsIn(desc);
2394
+ try {
2395
+ this.session.check(create(this.handle, craft, words, points, vertices.length / 3), "crumple cage");
2396
+ } finally {
2397
+ this.exports.engine_free(points, Math.max(vertices.byteLength, (4)), (4)), desc !== null && this.exports.engine_free(words, Math.max(desc.byteLength, (4)), (4));
2398
+ }
2399
+ }
2400
+ impact(craft, point, severity) {
2401
+ let impact = this.crumpleExport("engine_craft_impact");
2402
+ this.open();
2403
+ let words = this.floatsIn(new Float32Array([...point, ...severity]));
2404
+ try {
2405
+ return this.session.check(impact(this.handle, craft, words), "impact") === 1;
2406
+ } finally {
2407
+ this.exports.engine_free(words, chunkX5A5FOWW_js.CRUMPLE_IMPACT_FLOATS * (4), (4));
2408
+ }
2409
+ }
2410
+ damage(craft) {
2411
+ if (this.handle === (0)) return 0;
2412
+ let mm = this.crumpleExport("engine_craft_damage")(this.handle, craft);
2413
+ return mm >= 0 ? mm / (1e3) : 0;
2414
+ }
2415
+ presentCrumple(craft, geometry) {
2416
+ let render = this.render();
2417
+ if (this.handle === (0) || render === (0)) return 0;
2418
+ let written = this.crumpleExport("engine_craft_crumple_present")(this.handle, craft, render, geometry);
2419
+ return written >= 0 ? written : 0;
2420
+ }
2421
+ dispose() {
2422
+ this.handle !== (0) && (this.exports.engine_craft_destroy(this.handle), this.exports.engine_free(this.points, (1024) * 2 * (4), (4)), this.exports.engine_free(this.samples, (1024) * chunk3S6WPBZL_js.WATER_SAMPLE_WORDS * (4), (4)), this.handle = (0));
2423
+ }
2424
+ open() {
2425
+ if (this.handle !== (0)) return;
2426
+ let handle = this.exports.engine_craft_create(this.capacity);
2427
+ if (handle === (0)) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "craft world could not be created");
2428
+ this.handle = handle;
2429
+ let buffer = this.session.buffer, registers = this.exports.engine_craft_registers(handle);
2430
+ if (this.words = new Uint32Array(buffer, registers, (128)), this.floats = new Float32Array(buffer, registers, (128)), this.controlTable = new Float32Array(buffer, this.exports.engine_craft_controls(handle), this.capacity * 16), this.telemetryTable = new Float32Array(buffer, this.exports.engine_craft_telemetry(handle), this.capacity * 16), this.points = this.exports.engine_alloc((1024) * 2 * (4), (4)), this.samples = this.exports.engine_alloc((1024) * chunk3S6WPBZL_js.WATER_SAMPLE_WORDS * (4), (4)), this.points === 0 || this.samples === 0) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "water sample buffers could not be allocated");
2431
+ }
2432
+ };
2433
+
2434
+ // src/game/backends/engine/vehicles.ts
2435
+ var ENGINE_VEHICLE_EXPORT_NAMES = [
2436
+ "engine_vehicle_reserve",
2437
+ "engine_vehicle_create",
2438
+ "engine_vehicle_destroy",
2439
+ "engine_vehicle_capacity",
2440
+ "engine_vehicle_inputs",
2441
+ "engine_vehicle_states"
2442
+ ], NO_POINTER2 = 0, EMPTY2 = new Float32Array(0);
2443
+ function engineVehicleExports(symbols) {
2444
+ for (let name of ENGINE_VEHICLE_EXPORT_NAMES) if (typeof symbols[name] != "function") return null;
2445
+ return symbols;
2446
+ }
2447
+ var EngineVehicles = class {
2448
+ constructor(session, exports) {
2449
+ this.desc = (0);
2450
+ this.inputs = EMPTY2;
2451
+ this.states = EMPTY2;
2452
+ this.session = session, this.exports = exports;
2453
+ }
2454
+ createVehicle(body, desc) {
2455
+ let s = this.session;
2456
+ s.flush();
2457
+ let world = s.require();
2458
+ if (this.desc === (0) && (this.desc = s.exports.engine_alloc(chunk3S6WPBZL_js.VEHICLE_DESC_WORDS * chunk2O2CG465_js.WORD_BYTES, chunk2O2CG465_js.WORD_BYTES), this.desc === (0)))
2459
+ throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold a vehicle descriptor");
2460
+ new Float32Array(s.buffer, this.desc, chunk3S6WPBZL_js.VEHICLE_DESC_WORDS).set(desc.subarray(0, chunk3S6WPBZL_js.VEHICLE_DESC_WORDS));
2461
+ let id = s.check(this.exports.engine_vehicle_create(world, body, this.desc, chunk3S6WPBZL_js.VEHICLE_DESC_WORDS), "create vehicle");
2462
+ return this.bindViews(world), id;
2463
+ }
2464
+ destroyVehicle(vehicle) {
2465
+ let s = this.session;
2466
+ s.flush(), s.check(this.exports.engine_vehicle_destroy(s.require(), vehicle), "destroy vehicle");
2467
+ }
2468
+ vehicleInputs() {
2469
+ return this.inputs;
2470
+ }
2471
+ vehicleStates() {
2472
+ return this.states;
2473
+ }
2474
+ bindViews(world) {
2475
+ let capacity = this.exports.engine_vehicle_capacity(world), inputs = this.exports.engine_vehicle_inputs(world), states = this.exports.engine_vehicle_states(world);
2476
+ if (inputs === (0) || states === (0)) throw new chunk2V7IL4HC_js.GameError("not_initialized", "engine vehicles are not reserved");
2477
+ let buffer = this.session.buffer;
2478
+ (this.inputs.byteOffset !== inputs || this.inputs.buffer !== buffer) && (this.inputs = new Float32Array(buffer, inputs, capacity * chunk3S6WPBZL_js.INPUT_STRIDE), this.states = new Float32Array(buffer, states, capacity * chunk3S6WPBZL_js.STATE_STRIDE));
2479
+ }
2480
+ };
2481
+
2482
+ // src/game/backends/engine/physics.ts
2483
+ var ENGINE_PHYSICS_NAME = "cimplify-engine", COLLISION_GROUP_BITS = 65535, DEGREES_TO_RADIANS = Math.PI / 180, DEFAULT_CONTROLLER_OFFSET = 0.01, ORIGIN = [0, 0, 0], IDENTITY_ROTATION = [0, 0, 0, 1], ALL_AXES = [true, true, true], NO_AXES = [false, false, false], PLANAR_TRANSLATIONS = [true, true, false], PLANAR_ROTATIONS = [false, false, true], NO_POINTER3 = 0, NO_VALUE = Number.NaN;
2484
+ function axisBits(axes, shift) {
2485
+ return ((axes[0] ? 1 : 0) | (axes[1] ? 2 : 0) | (axes[2] ? 4 : 0)) << shift;
2486
+ }
2487
+ function shapeCode(shape) {
2488
+ switch (shape.kind) {
2489
+ case "ball":
2490
+ return chunk2O2CG465_js.SHAPE_BALL;
2491
+ case "cuboid":
2492
+ return chunk2O2CG465_js.SHAPE_CUBOID;
2493
+ case "capsule":
2494
+ return chunk2O2CG465_js.SHAPE_CAPSULE;
2495
+ case "cylinder":
2496
+ return chunk2O2CG465_js.SHAPE_CYLINDER;
2497
+ case "cone":
2498
+ return chunk2O2CG465_js.SHAPE_CONE;
2499
+ case "trimesh":
2500
+ return chunk2O2CG465_js.SHAPE_TRIMESH;
2501
+ case "convex_hull":
2502
+ return chunk2O2CG465_js.SHAPE_CONVEX_HULL;
2503
+ case "heightfield":
2504
+ return chunk2O2CG465_js.SHAPE_HEIGHTFIELD;
2505
+ case "round_cuboid":
2506
+ return chunk2O2CG465_js.SHAPE_ROUND_CUBOID;
2507
+ case "round_cylinder":
2508
+ return chunk2O2CG465_js.SHAPE_ROUND_CYLINDER;
2509
+ case "round_cone":
2510
+ return chunk2O2CG465_js.SHAPE_ROUND_CONE;
2511
+ case "round_convex_hull":
2512
+ return chunk2O2CG465_js.SHAPE_ROUND_CONVEX_HULL;
2513
+ case "compound":
2514
+ return chunk2O2CG465_js.SHAPE_COMPOUND;
2515
+ }
2516
+ }
2517
+ function writePrimitive(shape, floats, params, border) {
2518
+ switch (shape.kind) {
2519
+ case "ball":
2520
+ floats[params] = shape.radius;
2521
+ break;
2522
+ case "cuboid":
2523
+ case "round_cuboid":
2524
+ floats[params] = shape.halfExtents[0], floats[params + 1] = shape.halfExtents[1], floats[params + 2] = shape.halfExtents[2];
2525
+ break;
2526
+ case "capsule":
2527
+ case "cylinder":
2528
+ case "cone":
2529
+ case "round_cylinder":
2530
+ case "round_cone":
2531
+ floats[params] = shape.halfHeight, floats[params + 1] = shape.radius;
2532
+ break;
2533
+ }
2534
+ (shape.kind === "round_cuboid" || shape.kind === "round_cylinder" || shape.kind === "round_cone") && (floats[border] = shape.border);
2535
+ }
2536
+ function compoundFloats(parts) {
2537
+ let out = new Float32Array(parts.length * chunk2O2CG465_js.PART_FLOATS);
2538
+ for (let i = 0; i < parts.length; i++) {
2539
+ let part = parts[i], at = i * chunk2O2CG465_js.PART_FLOATS;
2540
+ out[at + chunk2O2CG465_js.PART_SHAPE] = shapeCode(part.shape), writePrimitive(part.shape, out, at + chunk2O2CG465_js.PART_PARAMS, at + chunk2O2CG465_js.PART_BORDER);
2541
+ let offset = part.offset ?? ORIGIN, rotation = part.rotation ?? IDENTITY_ROTATION;
2542
+ for (let k = 0; k < 3; k++) out[at + chunk2O2CG465_js.PART_OFFSET + k] = offset[k];
2543
+ for (let k = 0; k < 4; k++) out[at + chunk2O2CG465_js.PART_ROTATION + k] = rotation[k];
2544
+ }
2545
+ return out;
2546
+ }
2547
+ var LOCKED_AXES = ["locked", "locked", "locked"], LIMIT_PAIR = 2, SIX_DOF_AXES = 6, QUATERNION = 4;
2548
+ function encodeSixDof(desc, words, floats) {
2549
+ let frameA = desc.frameA ?? IDENTITY_ROTATION, frameB = desc.frameB ?? IDENTITY_ROTATION;
2550
+ for (let k = 0; k < (4); k++)
2551
+ floats[chunk2O2CG465_js.JOINT_FRAME_A + k] = frameA[k], floats[chunk2O2CG465_js.JOINT_FRAME_B + k] = frameB[k];
2552
+ let axes = [...desc.linear ?? LOCKED_AXES, ...desc.angular ?? LOCKED_AXES];
2553
+ if (axes.length !== (6)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "a six_dof joint has three linear and three angular axes");
2554
+ let motions = 0;
2555
+ for (let axis = 0; axis < (6); axis++) {
2556
+ let motion = axes[axis], code = chunk2O2CG465_js.MOTION_LOCKED;
2557
+ motion === "free" ? code = chunk2O2CG465_js.MOTION_FREE : motion !== "locked" && (code = chunk2O2CG465_js.MOTION_LIMITED, floats[chunk2O2CG465_js.JOINT_AXIS_LIMITS + axis * (2)] = motion[0], floats[chunk2O2CG465_js.JOINT_AXIS_LIMITS + axis * (2) + 1] = motion[1]), motions |= code << axis * chunk2O2CG465_js.MOTION_BITS;
2558
+ }
2559
+ words[chunk2O2CG465_js.JOINT_MOTIONS] = motions >>> 0, floats[chunk2O2CG465_js.JOINT_SWING_CONE] = desc.swingCone ?? NO_VALUE;
2560
+ }
2561
+ var EnginePhysics = class {
2562
+ constructor(session) {
2563
+ this.name = ENGINE_PHYSICS_NAME;
2564
+ this.session = session;
2565
+ let exports = engineVehicleExports(session.symbols);
2566
+ this.vehicles = exports ? new EngineVehicles(session, exports) : null, this.craft = engineCraft(session), this.jointPort = chunkH3OQKK6X_js.engineJoints(session);
2567
+ }
2568
+ bindTransforms(columns) {
2569
+ this.session.bind(columns);
2570
+ }
2571
+ init(desc) {
2572
+ return this.session.open(desc), Promise.resolve();
2573
+ }
2574
+ get rollback() {
2575
+ return this.session.snapshots;
2576
+ }
2577
+ setGravity(gravity) {
2578
+ this.vectorCommand(chunk2O2CG465_js.OP_SET_GRAVITY, 0, gravity);
2579
+ }
2580
+ createBody(entity, desc) {
2581
+ let s = this.session;
2582
+ s.flush();
2583
+ let words = s.descWords, floats = s.descFloats;
2584
+ words[chunk2O2CG465_js.BODY_KIND] = desc.kind === "dynamic" ? chunk2O2CG465_js.BODY_KIND_DYNAMIC : desc.kind === "kinematic" ? chunk2O2CG465_js.BODY_KIND_KINEMATIC : chunk2O2CG465_js.BODY_KIND_FIXED, floats[chunk2O2CG465_js.BODY_LINEAR_DAMPING] = desc.linearDamping ?? 0, floats[chunk2O2CG465_js.BODY_ANGULAR_DAMPING] = desc.angularDamping ?? 0, floats[chunk2O2CG465_js.BODY_GRAVITY_SCALE] = desc.gravityScale ?? 1;
2585
+ let translations = desc.planar ? PLANAR_TRANSLATIONS : desc.lockTranslations ? NO_AXES : desc.enabledTranslations ?? ALL_AXES, rotations = desc.planar ? PLANAR_ROTATIONS : desc.lockRotations ? NO_AXES : desc.enabledRotations ?? ALL_AXES;
2586
+ return words[chunk2O2CG465_js.BODY_FLAGS] = (desc.ccd ? chunk2O2CG465_js.BODY_FLAG_CCD : 0) | (desc.canSleep === false ? 0 : chunk2O2CG465_js.BODY_FLAG_CAN_SLEEP) | axisBits(translations, chunk2O2CG465_js.BODY_TRANSLATION_SHIFT) | axisBits(rotations, chunk2O2CG465_js.BODY_ROTATION_SHIFT), words[chunk2O2CG465_js.BODY_DOMINANCE] = desc.dominance ?? 0, s.check(s.exports.engine_body_create(s.require(), entity), "create body");
2587
+ }
2588
+ destroyBody(body) {
2589
+ let s = this.session;
2590
+ s.flush(), s.check(s.exports.engine_body_destroy(s.require(), body), "destroy body");
2591
+ }
2592
+ createCollider(body, desc) {
2593
+ let s = this.session;
2594
+ s.flush();
2595
+ let words = s.descWords, floats = s.descFloats;
2596
+ words.fill(0);
2597
+ let shape = desc.shape;
2598
+ words[chunk2O2CG465_js.COLLIDER_SHAPE] = shapeCode(shape);
2599
+ let staged = [];
2600
+ switch (shape.kind) {
2601
+ case "ball":
2602
+ case "cuboid":
2603
+ case "capsule":
2604
+ case "cylinder":
2605
+ case "cone":
2606
+ case "round_cuboid":
2607
+ case "round_cylinder":
2608
+ case "round_cone":
2609
+ writePrimitive(shape, floats, chunk2O2CG465_js.COLLIDER_PARAMS, chunk2O2CG465_js.COLLIDER_BORDER);
2610
+ break;
2611
+ case "round_convex_hull":
2612
+ this.stage(staged, shape.points, chunk2O2CG465_js.COLLIDER_DATA_A, chunk2O2CG465_js.COLLIDER_DATA_A_LEN), floats[chunk2O2CG465_js.COLLIDER_BORDER] = shape.border;
2613
+ break;
2614
+ case "compound":
2615
+ this.stage(staged, compoundFloats(shape.parts), chunk2O2CG465_js.COLLIDER_DATA_A, chunk2O2CG465_js.COLLIDER_DATA_A_LEN);
2616
+ break;
2617
+ case "trimesh":
2618
+ this.stage(staged, shape.vertices, chunk2O2CG465_js.COLLIDER_DATA_A, chunk2O2CG465_js.COLLIDER_DATA_A_LEN), this.stage(staged, shape.indices, chunk2O2CG465_js.COLLIDER_DATA_B, chunk2O2CG465_js.COLLIDER_DATA_B_LEN);
2619
+ break;
2620
+ case "convex_hull":
2621
+ this.stage(staged, shape.points, chunk2O2CG465_js.COLLIDER_DATA_A, chunk2O2CG465_js.COLLIDER_DATA_A_LEN);
2622
+ break;
2623
+ case "heightfield":
2624
+ this.stage(staged, shape.heights, chunk2O2CG465_js.COLLIDER_DATA_A, chunk2O2CG465_js.COLLIDER_DATA_A_LEN), words[chunk2O2CG465_js.COLLIDER_ROWS] = shape.rows, words[chunk2O2CG465_js.COLLIDER_COLUMNS] = shape.columns, floats[chunk2O2CG465_js.COLLIDER_PARAMS] = shape.scale[0], floats[chunk2O2CG465_js.COLLIDER_PARAMS + 1] = shape.scale[1], floats[chunk2O2CG465_js.COLLIDER_PARAMS + 2] = shape.scale[2];
2625
+ break;
2626
+ }
2627
+ let offset = desc.offset ?? ORIGIN, rotation = desc.rotation ?? IDENTITY_ROTATION;
2628
+ for (let k = 0; k < 3; k++) floats[chunk2O2CG465_js.COLLIDER_OFFSET + k] = offset[k];
2629
+ for (let k = 0; k < 4; k++) floats[chunk2O2CG465_js.COLLIDER_ROTATION + k] = rotation[k];
2630
+ floats[chunk2O2CG465_js.COLLIDER_DENSITY] = desc.density ?? NO_VALUE, floats[chunk2O2CG465_js.COLLIDER_MASS] = desc.mass ?? NO_VALUE, floats[chunk2O2CG465_js.COLLIDER_FRICTION] = desc.friction ?? NO_VALUE, floats[chunk2O2CG465_js.COLLIDER_RESTITUTION] = desc.restitution ?? NO_VALUE;
2631
+ let grouped = desc.membership !== void 0 || desc.filter !== void 0;
2632
+ words[chunk2O2CG465_js.COLLIDER_FLAGS] = (desc.sensor ? chunk2O2CG465_js.COLLIDER_FLAG_SENSOR : 0) | (desc.events ? chunk2O2CG465_js.COLLIDER_FLAG_EVENTS : 0) | (grouped ? chunk2O2CG465_js.COLLIDER_FLAG_GROUPS : 0), words[chunk2O2CG465_js.COLLIDER_MEMBERSHIP] = desc.membership ?? chunk2O2CG465_js.COLLISION_GROUP_ALL, words[chunk2O2CG465_js.COLLIDER_FILTER] = desc.filter ?? chunk2O2CG465_js.COLLISION_GROUP_ALL;
2633
+ try {
2634
+ return s.check(s.exports.engine_collider_create(s.require(), body), "create collider");
2635
+ } finally {
2636
+ for (let block of staged) s.exports.engine_free(block.pointer, block.bytes, chunk2O2CG465_js.WORD_BYTES);
2637
+ }
2638
+ }
2639
+ destroyCollider(collider) {
2640
+ let s = this.session;
2641
+ s.flush(), s.check(s.exports.engine_collider_destroy(s.require(), collider), "destroy collider");
2642
+ }
2643
+ setColliderEnabled(collider, enabled) {
2644
+ let s = this.session;
2645
+ s.flush(), s.check(s.exports.engine_collider_enable(s.require(), collider, enabled ? 1 : 0), "enable collider");
2646
+ }
2647
+ createJoint(bodyA, bodyB, desc) {
2648
+ let s = this.session;
2649
+ s.flush();
2650
+ let words = s.descWords, floats = s.descFloats;
2651
+ words.fill(0);
2652
+ for (let k = 0; k < 3; k++)
2653
+ floats[chunk2O2CG465_js.JOINT_ANCHOR_A + k] = desc.anchorA[k], floats[chunk2O2CG465_js.JOINT_ANCHOR_B + k] = desc.anchorB[k];
2654
+ switch (desc.kind) {
2655
+ case "fixed":
2656
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_FIXED;
2657
+ break;
2658
+ case "spherical":
2659
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_SPHERICAL;
2660
+ break;
2661
+ case "revolute":
2662
+ case "prismatic":
2663
+ words[chunk2O2CG465_js.JOINT_KIND] = desc.kind === "revolute" ? chunk2O2CG465_js.JOINT_REVOLUTE : chunk2O2CG465_js.JOINT_PRISMATIC;
2664
+ for (let k = 0; k < 3; k++) floats[chunk2O2CG465_js.JOINT_AXIS + k] = desc.axis[k];
2665
+ desc.limits && (words[chunk2O2CG465_js.JOINT_HAS_LIMITS] = 1, floats[chunk2O2CG465_js.JOINT_LIMITS] = desc.limits[0], floats[chunk2O2CG465_js.JOINT_LIMITS + 1] = desc.limits[1]);
2666
+ break;
2667
+ case "rope":
2668
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_ROPE, floats[chunk2O2CG465_js.JOINT_LENGTH] = desc.length;
2669
+ break;
2670
+ case "spring":
2671
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_SPRING, floats[chunk2O2CG465_js.JOINT_LENGTH] = desc.restLength, floats[chunk2O2CG465_js.JOINT_STIFFNESS] = desc.stiffness, floats[chunk2O2CG465_js.JOINT_DAMPING] = desc.damping;
2672
+ break;
2673
+ case "cone":
2674
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_CONE;
2675
+ for (let k = 0; k < 3; k++) floats[chunk2O2CG465_js.JOINT_AXIS + k] = desc.axis[k];
2676
+ floats[chunk2O2CG465_js.JOINT_SWING] = desc.swing, floats[chunk2O2CG465_js.JOINT_LIMITS] = desc.twist[0], floats[chunk2O2CG465_js.JOINT_LIMITS + 1] = desc.twist[1];
2677
+ break;
2678
+ case "six_dof":
2679
+ words[chunk2O2CG465_js.JOINT_KIND] = chunk2O2CG465_js.JOINT_SIX_DOF, encodeSixDof(desc, words, floats);
2680
+ break;
2681
+ }
2682
+ return s.check(s.exports.engine_joint_create(s.require(), bodyA, bodyB), "create joint");
2683
+ }
2684
+ setJointMotor(joint, targetVelocity, maxForce) {
2685
+ let s = this.session;
2686
+ s.flush();
2687
+ let world = s.require();
2688
+ s.registerFloats[chunk2O2CG465_js.REGISTER_MOTOR_VELOCITY] = targetVelocity, s.registerFloats[chunk2O2CG465_js.REGISTER_MOTOR_MAX_FORCE] = maxForce, s.check(s.exports.engine_joint_motor(world, joint), "joint motor");
2689
+ }
2690
+ destroyJoint(joint) {
2691
+ let s = this.session;
2692
+ s.flush(), s.check(s.exports.engine_joint_destroy(s.require(), joint), "destroy joint");
2693
+ }
2694
+ step() {
2695
+ this.session.step();
2696
+ }
2697
+ setBodyPose(body, positions, po, rotations, ro) {
2698
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_BODY_POSE, body), f = s.commandPayload;
2699
+ f[o] = positions[po], f[o + 1] = positions[po + 1], f[o + 2] = positions[po + 2], f[o + 3] = rotations[ro], f[o + 4] = rotations[ro + 1], f[o + 5] = rotations[ro + 2], f[o + 6] = rotations[ro + 3];
2700
+ }
2701
+ linearVelocity(body, out) {
2702
+ let s = this.session;
2703
+ s.flush(), s.check(s.exports.engine_body_linear_velocity(s.require(), body), "linear velocity"), this.readVector(out);
2704
+ }
2705
+ angularVelocity(body, out) {
2706
+ let s = this.session;
2707
+ s.flush(), s.check(s.exports.engine_body_angular_velocity(s.require(), body), "angular velocity"), this.readVector(out);
2708
+ }
2709
+ setLinearVelocity(body, velocity) {
2710
+ this.vectorCommand(chunk2O2CG465_js.OP_SET_LINEAR_VELOCITY, body, velocity);
2711
+ }
2712
+ setAngularVelocity(body, velocity) {
2713
+ this.vectorCommand(chunk2O2CG465_js.OP_SET_ANGULAR_VELOCITY, body, velocity);
2714
+ }
2715
+ applyImpulse(body, impulse) {
2716
+ this.vectorCommand(chunk2O2CG465_js.OP_APPLY_IMPULSE, body, impulse);
2717
+ }
2718
+ applyTorqueImpulse(body, impulse) {
2719
+ this.vectorCommand(chunk2O2CG465_js.OP_APPLY_TORQUE_IMPULSE, body, impulse);
2720
+ }
2721
+ addForce(body, force) {
2722
+ this.vectorCommand(chunk2O2CG465_js.OP_ADD_FORCE, body, force);
2723
+ }
2724
+ applyImpulseAtPoint(body, impulse, point) {
2725
+ this.pointCommand(chunk2O2CG465_js.OP_APPLY_IMPULSE_AT_POINT, body, impulse, point);
2726
+ }
2727
+ addForceAtPoint(body, force, point) {
2728
+ this.pointCommand(chunk2O2CG465_js.OP_ADD_FORCE_AT_POINT, body, force, point);
2729
+ }
2730
+ addTorque(body, torque) {
2731
+ this.vectorCommand(chunk2O2CG465_js.OP_ADD_TORQUE, body, torque);
2732
+ }
2733
+ extra(name) {
2734
+ let fn = this.session.symbols[name];
2735
+ if (typeof fn != "function") throw new chunk2V7IL4HC_js.GameError("unsupported_feature", `${name} is not in this engine build`);
2736
+ return fn;
2737
+ }
2738
+ velocityAtPoint(body, point, out) {
2739
+ let s = this.session;
2740
+ s.flush();
2741
+ let floats = s.registerFloats;
2742
+ floats[chunk2O2CG465_js.VECTOR_OUT] = point.x, floats[chunk2O2CG465_js.VECTOR_OUT + 1] = point.y, floats[chunk2O2CG465_js.VECTOR_OUT + 2] = point.z, s.check(this.extra("engine_body_velocity_at_point")(s.require(), body), "velocity at point"), this.readVector(out);
2743
+ }
2744
+ setJointMotorPosition(joint, target, stiffness, damping) {
2745
+ let s = this.session;
2746
+ s.flush();
2747
+ let floats = s.registerFloats;
2748
+ floats[chunk2O2CG465_js.MOTOR_TARGET] = target, floats[chunk2O2CG465_js.MOTOR_STIFFNESS] = stiffness, floats[chunk2O2CG465_js.MOTOR_DAMPING] = damping, s.check(this.extra("engine_joint_motor_position")(s.require(), joint), "joint motor position");
2749
+ }
2750
+ castShape(query, out) {
2751
+ let s = this.session;
2752
+ s.flush();
2753
+ let words = s.registerWords, floats = s.registerFloats;
2754
+ words[chunk2O2CG465_js.CAST_SHAPE] = chunkRCQ2MPBV_js.castShapeCode(query.kind), floats[chunk2O2CG465_js.CAST_PARAMS] = query.params.x, floats[chunk2O2CG465_js.CAST_PARAMS + 1] = query.params.y, floats[chunk2O2CG465_js.CAST_PARAMS + 2] = query.params.z;
2755
+ for (let k = 0; k < 4; k++) floats[chunk2O2CG465_js.CAST_ROTATION + k] = query.rotation[k];
2756
+ floats[chunk2O2CG465_js.RAY_ORIGIN] = query.origin.x, floats[chunk2O2CG465_js.RAY_ORIGIN + 1] = query.origin.y, floats[chunk2O2CG465_js.RAY_ORIGIN + 2] = query.origin.z, floats[chunk2O2CG465_js.RAY_DIRECTION] = query.direction.x, floats[chunk2O2CG465_js.RAY_DIRECTION + 1] = query.direction.y, floats[chunk2O2CG465_js.RAY_DIRECTION + 2] = query.direction.z, floats[chunk2O2CG465_js.RAY_MAX] = query.maxDistance, words[chunk2O2CG465_js.RAY_INCLUDE_SENSORS] = query.includeSensors ? 1 : 0, words[chunk2O2CG465_js.RAY_EXCLUDE] = query.excludeBody < 0 ? chunk2O2CG465_js.NO_EXCLUDE : query.excludeBody;
2757
+ let hit = s.check(this.extra("engine_shape_cast")(s.require()), "shape cast") === chunk2O2CG465_js.RAY_HIT;
2758
+ return out.hit = hit, hit ? (out.collider = words[chunk2O2CG465_js.HIT_COLLIDER], out.distance = floats[chunk2O2CG465_js.HIT_DISTANCE], out.pointX = floats[chunk2O2CG465_js.HIT_POINT], out.pointY = floats[chunk2O2CG465_js.HIT_POINT + 1], out.pointZ = floats[chunk2O2CG465_js.HIT_POINT + 2], out.normalX = floats[chunk2O2CG465_js.HIT_NORMAL], out.normalY = floats[chunk2O2CG465_js.HIT_NORMAL + 1], out.normalZ = floats[chunk2O2CG465_js.HIT_NORMAL + 2], true) : (out.collider = -1, false);
2759
+ }
2760
+ overlapSphere(x, y, z, radius, includeSensors, out) {
2761
+ let s = this.session;
2762
+ s.flush();
2763
+ let words = s.registerWords, floats = s.registerFloats;
2764
+ floats[chunk2O2CG465_js.RAY_ORIGIN] = x, floats[chunk2O2CG465_js.RAY_ORIGIN + 1] = y, floats[chunk2O2CG465_js.RAY_ORIGIN + 2] = z, floats[chunk2O2CG465_js.RAY_MAX] = radius, words[chunk2O2CG465_js.RAY_INCLUDE_SENSORS] = includeSensors ? 1 : 0, out.count = s.check(this.extra("engine_overlap_sphere")(s.require()), "sphere overlap"), out.collider = out.count > 0 ? words[chunk2O2CG465_js.HIT_COLLIDER] : -1;
2765
+ }
2766
+ pointCommand(op, body, v, p) {
2767
+ let s = this.session, o = s.command(op, body), f = s.commandPayload;
2768
+ f[o] = v.x, f[o + 1] = v.y, f[o + 2] = v.z, f[o + 3] = p.x, f[o + 4] = p.y, f[o + 5] = p.z;
2769
+ }
2770
+ resetForces(body) {
2771
+ this.session.command(chunk2O2CG465_js.OP_RESET_FORCES, body);
2772
+ }
2773
+ isSleeping(body) {
2774
+ let s = this.session;
2775
+ return s.flush(), s.check(s.exports.engine_body_sleeping(s.require(), body), "sleeping") === 1;
2776
+ }
2777
+ wake(body) {
2778
+ this.session.command(chunk2O2CG465_js.OP_WAKE, body);
2779
+ }
2780
+ batchHandle() {
2781
+ let s = this.session;
2782
+ return s.flush(), s.require();
2783
+ }
2784
+ raycast(ray, out) {
2785
+ let s = this.session;
2786
+ s.flush();
2787
+ let words = s.registerWords, floats = s.registerFloats;
2788
+ floats[chunk2O2CG465_js.RAY_ORIGIN] = ray.origin.x, floats[chunk2O2CG465_js.RAY_ORIGIN + 1] = ray.origin.y, floats[chunk2O2CG465_js.RAY_ORIGIN + 2] = ray.origin.z, floats[chunk2O2CG465_js.RAY_DIRECTION] = ray.direction.x, floats[chunk2O2CG465_js.RAY_DIRECTION + 1] = ray.direction.y, floats[chunk2O2CG465_js.RAY_DIRECTION + 2] = ray.direction.z, floats[chunk2O2CG465_js.RAY_MAX] = ray.maxDistance, words[chunk2O2CG465_js.RAY_SOLID] = ray.solid ? 1 : 0, words[chunk2O2CG465_js.RAY_INCLUDE_SENSORS] = ray.includeSensors ? 1 : 0, words[chunk2O2CG465_js.RAY_EXCLUDE] = ray.excludeCollider < 0 ? chunk2O2CG465_js.NO_EXCLUDE : ray.excludeCollider;
2789
+ let hit = s.check(s.exports.engine_raycast(s.require()), "raycast") === chunk2O2CG465_js.RAY_HIT;
2790
+ return out.hit = hit, hit ? (out.collider = words[chunk2O2CG465_js.HIT_COLLIDER], out.distance = floats[chunk2O2CG465_js.HIT_DISTANCE], out.pointX = floats[chunk2O2CG465_js.HIT_POINT], out.pointY = floats[chunk2O2CG465_js.HIT_POINT + 1], out.pointZ = floats[chunk2O2CG465_js.HIT_POINT + 2], out.normalX = floats[chunk2O2CG465_js.HIT_NORMAL], out.normalY = floats[chunk2O2CG465_js.HIT_NORMAL + 1], out.normalZ = floats[chunk2O2CG465_js.HIT_NORMAL + 2], true) : (out.collider = -1, false);
2791
+ }
2792
+ contactCount() {
2793
+ return this.session.contacts;
2794
+ }
2795
+ contactColliderA(index) {
2796
+ return this.session.contactA[index];
2797
+ }
2798
+ contactColliderB(index) {
2799
+ return this.session.contactB[index];
2800
+ }
2801
+ contactStarted(index) {
2802
+ return this.session.contactBegan[index] === 1;
2803
+ }
2804
+ createCharacterController(desc) {
2805
+ let s = this.session;
2806
+ s.flush();
2807
+ let words = s.descWords, floats = s.descFloats;
2808
+ if (words.fill(0), floats[chunk2O2CG465_js.CONTROLLER_OFFSET] = desc.offset ?? (0.01), floats[chunk2O2CG465_js.CONTROLLER_MAX_SLOPE_CLIMB] = desc.maxSlopeClimbDegrees === void 0 ? NO_VALUE : desc.maxSlopeClimbDegrees * DEGREES_TO_RADIANS, floats[chunk2O2CG465_js.CONTROLLER_MIN_SLOPE_SLIDE] = desc.minSlopeSlideDegrees === void 0 ? NO_VALUE : desc.minSlopeSlideDegrees * DEGREES_TO_RADIANS, floats[chunk2O2CG465_js.CONTROLLER_AUTOSTEP_HEIGHT] = desc.autostepMaxHeight ?? NO_VALUE, floats[chunk2O2CG465_js.CONTROLLER_AUTOSTEP_WIDTH] = desc.autostepMinWidth ?? NO_VALUE, floats[chunk2O2CG465_js.CONTROLLER_SNAP] = desc.snapToGround ?? NO_VALUE, words[chunk2O2CG465_js.CONTROLLER_SLIDE] = desc.slide === void 0 ? chunk2O2CG465_js.CONTROLLER_SLIDE_UNSET : desc.slide ? 1 : 0, desc.up) {
2809
+ words[chunk2O2CG465_js.CONTROLLER_HAS_UP] = 1;
2810
+ for (let k = 0; k < 3; k++) floats[chunk2O2CG465_js.CONTROLLER_UP + k] = desc.up[k];
2811
+ }
2812
+ return s.check(s.exports.engine_controller_create(s.require()), "create controller");
2813
+ }
2814
+ moveCharacter(controller, collider, desired, out) {
2815
+ let s = this.session;
2816
+ s.flush();
2817
+ let floats = s.registerFloats;
2818
+ floats[chunk2O2CG465_js.VECTOR_OUT] = desired.x, floats[chunk2O2CG465_js.VECTOR_OUT + 1] = desired.y, floats[chunk2O2CG465_js.VECTOR_OUT + 2] = desired.z, s.check(s.exports.engine_character_move(s.require(), controller, collider), "move character"), out.x = floats[chunk2O2CG465_js.VECTOR_OUT], out.y = floats[chunk2O2CG465_js.VECTOR_OUT + 1], out.z = floats[chunk2O2CG465_js.VECTOR_OUT + 2], out.grounded = s.registerWords[chunk2O2CG465_js.GROUNDED_OUT] === 1;
2819
+ }
2820
+ destroyCharacterController(controller) {
2821
+ let s = this.session;
2822
+ s.flush(), s.check(s.exports.engine_controller_destroy(s.require(), controller), "destroy controller");
2823
+ }
2824
+ dispose() {
2825
+ this.craft?.dispose(), this.session.close();
2826
+ }
2827
+ setColliderClass(collider, colliderClass) {
2828
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_COLLIDER_CLASS, collider);
2829
+ s.commandPayloadWords[o] = chunk3S6WPBZL_js.checkColliderClass(colliderClass);
2830
+ }
2831
+ setContactRule(platform, other, rule) {
2832
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_CONTACT_RULE, chunk3S6WPBZL_js.packContactRuleHeader(platform, other, rule));
2833
+ chunk3S6WPBZL_js.writeContactRulePayload(rule, s.commandPayload, o);
2834
+ }
2835
+ setCollisionGroups(collider, membership, filter) {
2836
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_COLLIDER_GROUPS, collider);
2837
+ s.commandPayloadWords[o] = membership & (65535), s.commandPayloadWords[o + 1] = filter & (65535);
2838
+ }
2839
+ setSolver(iterations, pgsIterations, ccdSubsteps) {
2840
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_SOLVER, 0);
2841
+ s.commandPayloadWords[o] = iterations, s.commandPayloadWords[o + 1] = pgsIterations, s.commandPayloadWords[o + 2] = ccdSubsteps;
2842
+ }
2843
+ setSoftCcd(body, distance) {
2844
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_BODY_SOFT_CCD, body);
2845
+ s.commandPayload[o] = distance;
2846
+ }
2847
+ setSleepThresholds(body, linear2, angular, seconds) {
2848
+ let s = this.session, o = s.command(chunk2O2CG465_js.OP_SET_BODY_SLEEP, body), f = s.commandPayload;
2849
+ f[o] = linear2, f[o + 1] = angular, f[o + 2] = seconds;
2850
+ }
2851
+ vectorCommand(op, body, v) {
2852
+ let s = this.session, o = s.command(op, body), f = s.commandPayload;
2853
+ f[o] = v.x, f[o + 1] = v.y, f[o + 2] = v.z;
2854
+ }
2855
+ readVector(out) {
2856
+ let floats = this.session.registerFloats;
2857
+ out.x = floats[chunk2O2CG465_js.VECTOR_OUT], out.y = floats[chunk2O2CG465_js.VECTOR_OUT + 1], out.z = floats[chunk2O2CG465_js.VECTOR_OUT + 2];
2858
+ }
2859
+ stage(staged, data, pointerSlot, lengthSlot) {
2860
+ let s = this.session, bytes = data.length * chunk2O2CG465_js.WORD_BYTES, pointer = s.exports.engine_alloc(bytes, chunk2O2CG465_js.WORD_BYTES);
2861
+ if (pointer === (0)) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold collider data");
2862
+ staged.push({ pointer, bytes }), new Uint8Array(s.buffer, pointer, bytes).set(new Uint8Array(data.buffer, data.byteOffset, bytes)), s.descWords[pointerSlot] = pointer, s.descWords[lengthSlot] = data.length;
2863
+ }
2864
+ };
2865
+
2866
+ // src/game/backends/engine/session.ts
2867
+ var NO_WORLD2 = 0, EMPTY_WORDS = new Uint32Array(0), EMPTY_FLOATS = new Float32Array(0), EMPTY_BYTES = new Uint8Array(0);
2868
+ function failure3(code, what) {
2869
+ switch (code) {
2870
+ case chunk2O2CG465_js.ERROR_CAPACITY_EXCEEDED:
2871
+ return new chunk2V7IL4HC_js.GameError("capacity_exceeded", `${what}: capacity exceeded`);
2872
+ case chunk2O2CG465_js.ERROR_DEAD_ENTITY:
2873
+ return new chunk2V7IL4HC_js.GameError("dead_entity", `${what}: entity has no transform`);
2874
+ case chunk2O2CG465_js.ERROR_UNKNOWN_RESOURCE:
2875
+ return new chunk2V7IL4HC_js.GameError("unknown_resource", `${what}: unknown resource`);
2876
+ case chunk2O2CG465_js.ERROR_UNSUPPORTED:
2877
+ return new chunk2V7IL4HC_js.GameError("unsupported_feature", `${what}: unsupported`);
2878
+ case chunk2O2CG465_js.ERROR_INVALID_ARGUMENT:
2879
+ default:
2880
+ return new chunk2V7IL4HC_js.GameError("invalid_argument", `${what}: invalid argument`);
2881
+ }
2882
+ }
2883
+ var EngineSession = class {
2884
+ constructor(runtime, memory) {
2885
+ this.world = (0);
2886
+ this.registerWords = EMPTY_WORDS;
2887
+ this.registerFloats = EMPTY_FLOATS;
2888
+ this.descWords = EMPTY_WORDS;
2889
+ this.descFloats = EMPTY_FLOATS;
2890
+ this.contactA = EMPTY_WORDS;
2891
+ this.contactB = EMPTY_WORDS;
2892
+ this.contactBegan = EMPTY_BYTES;
2893
+ this.contacts = 0;
2894
+ this.snapshots = null;
2895
+ this.commandWords = EMPTY_WORDS;
2896
+ this.commandFloats = EMPTY_FLOATS;
2897
+ this.commandCapacity = 0;
2898
+ this.pending = 0;
2899
+ this.columns = null;
2900
+ this.runtime = runtime, this.exports = runtime.exports, this.memory = memory;
2901
+ }
2902
+ bind(columns) {
2903
+ for (let array of [columns.position, columns.rotation, columns.render, columns.parent, columns.entities, columns.sparse])
2904
+ if (!this.memory.owns(array)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "engine transforms must live in engine memory");
2905
+ this.columns = columns, this.world !== (0) && this.bindLayout(columns);
2906
+ }
2907
+ open(desc) {
2908
+ if (this.world !== (0)) throw new chunk2V7IL4HC_js.GameError("invalid_argument", "engine world is already open");
2909
+ let scratch = this.memory.allocate("u32", chunk2O2CG465_js.DESC_WORDS), floats = new Float32Array(scratch.buffer, scratch.byteOffset, chunk2O2CG465_js.DESC_WORDS), g = desc.gravity ?? [0, -9.81, 0];
2910
+ floats[chunk2O2CG465_js.WORLD_GRAVITY] = g[0], floats[chunk2O2CG465_js.WORLD_GRAVITY + 1] = g[1], floats[chunk2O2CG465_js.WORLD_GRAVITY + 2] = g[2], floats[chunk2O2CG465_js.WORLD_STEP_SECONDS] = desc.stepSeconds, scratch[chunk2O2CG465_js.WORLD_MAX_BODIES] = desc.maxBodies ?? 2048, scratch[chunk2O2CG465_js.WORLD_MAX_COLLIDERS] = desc.maxColliders ?? 4096, scratch[chunk2O2CG465_js.WORLD_MAX_JOINTS] = desc.maxJoints ?? 1024, scratch[chunk2O2CG465_js.WORLD_MAX_CONTACTS] = desc.maxContactEvents ?? 1024, scratch[chunk2O2CG465_js.WORLD_MAX_CONTROLLERS] = desc.maxCharacterControllers ?? 64, scratch[chunk2O2CG465_js.WORLD_MAX_COMMANDS] = chunk2O2CG465_js.DEFAULT_MAX_COMMANDS;
2911
+ let world = desc.rollback === void 0 ? this.exports.engine_world_create(scratch.byteOffset) : this.createRollback(scratch, desc.rollback);
2912
+ if (world === (0)) throw chunkNZTKLY2W_js.engineSessionFailure(this.runtime.symbols) ?? new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine world could not be created");
2913
+ this.world = world, this.snapshots = desc.rollback === void 0 ? null : chunkH3OQKK6X_js.WorldSnapshots.bind(this.runtime.symbols, this.runtime.memory, world, () => this.discard(), desc.rollback.frames ?? chunkH3OQKK6X_js.DEFAULT_ROLLBACK_FRAMES), chunkPTRNO5UD_js.noteInspectorWorld(world);
2914
+ let buffer = this.runtime.memory.buffer, registers = this.exports.engine_world_registers(world);
2915
+ this.registerWords = new Uint32Array(buffer, registers, chunk2O2CG465_js.REGISTER_WORDS), this.registerFloats = new Float32Array(buffer, registers, chunk2O2CG465_js.REGISTER_WORDS);
2916
+ let descPointer = this.exports.engine_world_desc(world);
2917
+ this.descWords = new Uint32Array(buffer, descPointer, chunk2O2CG465_js.DESC_WORDS), this.descFloats = new Float32Array(buffer, descPointer, chunk2O2CG465_js.DESC_WORDS), this.commandCapacity = chunk2O2CG465_js.DEFAULT_MAX_COMMANDS;
2918
+ let commandBuffer = chunkNZTKLY2W_js.hasPhysics(this.runtime.symbols) ? buffer : new ArrayBuffer(chunk2O2CG465_js.DEFAULT_MAX_COMMANDS * chunk2O2CG465_js.COMMAND_WORDS * chunk2O2CG465_js.WORD_BYTES), commands = commandBuffer === buffer ? this.exports.engine_world_commands(world) : 0;
2919
+ this.commandWords = new Uint32Array(commandBuffer, commands, chunk2O2CG465_js.DEFAULT_MAX_COMMANDS * chunk2O2CG465_js.COMMAND_WORDS), this.commandFloats = new Float32Array(commandBuffer, commands, chunk2O2CG465_js.DEFAULT_MAX_COMMANDS * chunk2O2CG465_js.COMMAND_WORDS);
2920
+ let maxContacts = scratch[chunk2O2CG465_js.WORLD_MAX_CONTACTS];
2921
+ this.contactA = new Uint32Array(buffer, this.exports.engine_contacts_a(world), maxContacts), this.contactB = new Uint32Array(buffer, this.exports.engine_contacts_b(world), maxContacts), this.contactBegan = new Uint8Array(buffer, this.exports.engine_contacts_started(world), maxContacts), this.columns && this.bindLayout(this.columns);
2922
+ }
2923
+ createRollback(desc, rollback) {
2924
+ let symbols = this.runtime.symbols;
2925
+ if (!chunkH3OQKK6X_js.hasRollback(symbols)) throw new chunk2V7IL4HC_js.GameError("unsupported_feature", "this engine has no client rollback (feature rollback_1)");
2926
+ let config = this.memory.allocate("u32", chunkH3OQKK6X_js.ROLLBACK_CONFIG_WORDS);
2927
+ chunkH3OQKK6X_js.writeRollbackConfig(config, rollback);
2928
+ let create = symbols.engine_world_rollback_create;
2929
+ return create(desc.byteOffset, config.byteOffset);
2930
+ }
2931
+ require() {
2932
+ if (this.world === (0)) throw new chunk2V7IL4HC_js.GameError("not_initialized", "engine physics is not initialised");
2933
+ return this.world;
2934
+ }
2935
+ check(code, what) {
2936
+ if (!(code >= 0)) throw failure3(code, what);
2937
+ return code;
2938
+ }
2939
+ command(op, body) {
2940
+ this.pending === this.commandCapacity && this.flush();
2941
+ let o = this.pending * chunk2O2CG465_js.COMMAND_WORDS;
2942
+ return this.commandWords[o + chunk2O2CG465_js.COMMAND_OP] = op, this.commandWords[o + chunk2O2CG465_js.COMMAND_BODY] = body, this.pending++, o + chunk2O2CG465_js.COMMAND_PAYLOAD;
2943
+ }
2944
+ get commandPayload() {
2945
+ return this.commandFloats;
2946
+ }
2947
+ get commandPayloadWords() {
2948
+ return this.commandWords;
2949
+ }
2950
+ get symbols() {
2951
+ return this.runtime.symbols;
2952
+ }
2953
+ get buffer() {
2954
+ return this.runtime.memory.buffer;
2955
+ }
2956
+ discard() {
2957
+ this.pending = 0;
2958
+ }
2959
+ flush() {
2960
+ if (this.pending === 0) return;
2961
+ let count = this.pending;
2962
+ this.pending = 0, this.check(this.exports.engine_apply_commands(this.require(), count), "command");
2963
+ }
2964
+ step() {
2965
+ chunkNZTKLY2W_js.requireEngineMemoryHeld(this.runtime.memory);
2966
+ let count = this.pending;
2967
+ this.pending = 0, this.check(this.exports.engine_step(this.require(), count), "step"), this.contacts = this.exports.engine_contact_count(this.world);
2968
+ }
2969
+ close() {
2970
+ this.world !== (0) && (chunkPTRNO5UD_js.noteInspectorWorld((0)), this.exports.engine_world_destroy(this.world)), this.world = (0), this.snapshots = null, this.pending = 0, this.columns = null, this.memory.release(), chunkH3OQKK6X_js.releaseEngineArena(this.runtime.symbols);
2971
+ }
2972
+ bindLayout(columns) {
2973
+ let words = this.descWords;
2974
+ words[chunk2O2CG465_js.LAYOUT_POSITION] = columns.position.byteOffset, words[chunk2O2CG465_js.LAYOUT_ROTATION] = columns.rotation.byteOffset, words[chunk2O2CG465_js.LAYOUT_SCALE] = columns.scale.byteOffset, words[chunk2O2CG465_js.LAYOUT_PREVIOUS_POSITION] = columns.previousPosition.byteOffset, words[chunk2O2CG465_js.LAYOUT_PREVIOUS_ROTATION] = columns.previousRotation.byteOffset, words[chunk2O2CG465_js.LAYOUT_PREVIOUS_SCALE] = columns.previousScale.byteOffset, words[chunk2O2CG465_js.LAYOUT_PARENT] = columns.parent.byteOffset, words[chunk2O2CG465_js.LAYOUT_RENDER] = columns.render.byteOffset, words[chunk2O2CG465_js.LAYOUT_ENTITIES] = columns.entities.byteOffset, words[chunk2O2CG465_js.LAYOUT_SPARSE] = columns.sparse.byteOffset, words[chunk2O2CG465_js.LAYOUT_CAPACITY] = columns.capacity, words[chunk2O2CG465_js.LAYOUT_SPARSE_LEN] = columns.sparse.byteLength / chunk2O2CG465_js.WORD_BYTES, this.check(this.exports.engine_bind_transforms(this.world), "bind transforms");
2975
+ }
2976
+ };
2977
+
2978
+ // src/game/backends/engine/transforms.ts
2979
+ var EngineTransforms = class {
2980
+ constructor(session) {
2981
+ this.session = session;
2982
+ }
2983
+ bind(columns) {
2984
+ this.session.bind(columns);
2985
+ }
2986
+ snapshot(count) {
2987
+ let s = this.session;
2988
+ s.check(s.exports.engine_snapshot(s.require(), count), "snapshot");
2989
+ }
2990
+ computeRender(count, time, version) {
2991
+ let s = this.session, world = s.require();
2992
+ s.registerFloats[chunk2O2CG465_js.REGISTER_FRAME_ALPHA] = time.values[chunkYXGZQPUD_js.FRAME_ALPHA_SLOT], s.registerWords[chunk2O2CG465_js.REGISTER_FRAME_VERSION_LOW] = version >>> 0, s.registerWords[chunk2O2CG465_js.REGISTER_FRAME_VERSION_HIGH] = Math.floor(version / chunk2O2CG465_js.U32_RANGE), s.check(s.exports.engine_compute_render(world, count), "compute render");
2993
+ }
2994
+ };
2995
+
2996
+ // src/game/backends/engine/signatures.ts
2997
+ var ARITY_EXPORT = "engine_export_arity", PROTOTYPE_EXPORT = "engine_export_prototype_of", NAME_ALIGN = 8, NAME_CAPACITY = 64, NULL = 0, NO_PROTOTYPE = 0;
2998
+ function nativeByName(runtime, query) {
2999
+ let scratch = runtime.exports.engine_alloc((64), (8));
3000
+ if (scratch === (0)) throw new chunk2V7IL4HC_js.GameError("capacity_exceeded", "engine memory cannot hold an export name");
3001
+ return (name) => {
3002
+ let bytes = new Uint8Array(runtime.memory.buffer, scratch, (64));
3003
+ for (let i = 0; i < name.length; i++) bytes[i] = name.charCodeAt(i);
3004
+ return query(scratch, name.length);
3005
+ };
3006
+ }
3007
+ function engineArity(runtime) {
3008
+ let symbols = runtime.symbols, native = symbols[ARITY_EXPORT];
3009
+ return typeof native == "function" ? nativeByName(runtime, native) : (name) => {
3010
+ let fn = symbols[name];
3011
+ return typeof fn == "function" ? fn.length : -1;
3012
+ };
3013
+ }
3014
+ function enginePrototype(runtime) {
3015
+ let native = runtime.symbols[PROTOTYPE_EXPORT];
3016
+ return typeof native == "function" ? nativeByName(runtime, native) : null;
3017
+ }
3018
+ function engineSignatureMismatches(symbols, arity, prototype = null) {
3019
+ let mismatches = [];
3020
+ for (let name in chunk2O2CG465_js.ENGINE_EXPORT_ARITY) {
3021
+ if (typeof symbols[name] != "function") continue;
3022
+ let expected = chunk2O2CG465_js.ENGINE_EXPORT_ARITY[name], actual = arity(name);
3023
+ if (actual !== expected) {
3024
+ mismatches.push(`${name} takes ${actual < 0 ? "an unknown number of" : actual} arguments, this package expects ${expected}`);
3025
+ continue;
3026
+ }
3027
+ let advertised = prototype?.(name) ?? (0);
3028
+ advertised !== (0) && advertised !== chunk2O2CG465_js.ENGINE_EXPORT_PROTOTYPES[name] && mismatches.push(`${name} has another prototype than this package expects`);
3029
+ }
3030
+ return mismatches;
3031
+ }
3032
+ function verifyEngineSignatures(runtime) {
3033
+ let mismatches = engineSignatureMismatches(runtime.symbols, engineArity(runtime), enginePrototype(runtime));
3034
+ if (mismatches.length > 0)
3035
+ throw new chunk2V7IL4HC_js.GameError(
3036
+ "engine_mismatch",
3037
+ `this package was built for a different engine; rebuild it or update the app (${mismatches.length} exports differ: ${mismatches.slice(0, 3).join("; ")})`
3038
+ );
3039
+ }
3040
+
3041
+ // src/game/backends/engine/native.ts
3042
+ var ENGINE_BACKEND_NAME = "cimplify-engine", ENGINE_BACKEND_VERSION = "engine_core@0.1.0+rapier3d@0.36.0+three@0.186.1";
3043
+ function engineAudio(options, runtime) {
3044
+ let native = runtime ? nativeAudio(runtime, options.assets ?? null) : null;
3045
+ if (native) return native;
3046
+ let assets = options.assets ?? null, explicit = runtime && options.audioWorklet ? workletAudio(runtime, options.audioWorklet, assets) : null;
3047
+ if (explicit) return explicit;
3048
+ if (options.audio) return options.audio;
3049
+ let context = options.audioContext ?? runtime?.audioContext?.() ?? null, chosen = options.audioWorklet === null ? null : defaultWorklet(runtime, context), worklet = runtime && chosen ? workletAudio(runtime, chosen, assets) : null;
3050
+ return worklet || (context ? new chunkPKOZXD2Q_js.WebAudioPort(context) : new chunkPKOZXD2Q_js.HeadlessAudio());
3051
+ }
3052
+ function defaultWorklet(runtime, context) {
3053
+ let module = runtime?.audioWorklet ?? null, worklets = context?.audioWorklet;
3054
+ return context === null || module === null || typeof worklets?.addModule != "function" ? null : { context, module };
3055
+ }
3056
+ function engineHost(runtime) {
3057
+ return {
3058
+ exports: runtime.symbols,
3059
+ memory: runtime.memory,
3060
+ allocate: (bytes) => runtime.exports.engine_alloc(bytes, chunk2O2CG465_js.COLUMN_ALIGN),
3061
+ release: (pointer, bytes) => runtime.exports.engine_free(pointer, bytes, chunk2O2CG465_js.COLUMN_ALIGN)
3062
+ };
3063
+ }
3064
+ function workletAudio(runtime, options, assets) {
3065
+ let symbols = runtime.symbols;
3066
+ if ([...chunkH3OQKK6X_js.ENGINE_AUDIO_EXPORT_NAMES.filter((name) => name !== "engine_audio_bound"), ...chunkH3OQKK6X_js.ENGINE_AUDIO_WORKLET_EXPORTS].some((name) => typeof symbols[name] != "function")) return null;
3067
+ let host = engineHost(runtime), relay = chunkPKOZXD2Q_js.WorkletAudio.create(host, options);
3068
+ return new chunkH3OQKK6X_js.EngineAudioPort({ ...host, decode: runtime.decodeAudio ?? null, assets, handle: relay.handle, relay });
3069
+ }
3070
+ function nativeAudio(runtime, assets) {
3071
+ let symbols = runtime.symbols;
3072
+ if (chunkH3OQKK6X_js.ENGINE_AUDIO_EXPORT_NAMES.some((name) => typeof symbols[name] != "function")) return null;
3073
+ let exports = symbols;
3074
+ return exports.engine_audio_bound() === 0 ? null : new chunkH3OQKK6X_js.EngineAudioPort({
3075
+ exports,
3076
+ memory: runtime.memory,
3077
+ allocate: (bytes) => runtime.exports.engine_alloc(bytes, chunk2O2CG465_js.COLUMN_ALIGN),
3078
+ release: (pointer, bytes) => runtime.exports.engine_free(pointer, bytes, chunk2O2CG465_js.COLUMN_ALIGN),
3079
+ decode: runtime.decodeAudio ?? null,
3080
+ assets
3081
+ });
3082
+ }
3083
+ function assembleEngineBackend(runtime, graphics, audio) {
3084
+ verifyEngineSignatures(runtime);
3085
+ let memory = new chunkH3OQKK6X_js.EngineMemory(runtime), session = new EngineSession(runtime, memory), port = graphics(runtime), physics = new EnginePhysics(session);
3086
+ return port instanceof EngineGraphics && physics.craft?.bindRender?.(() => port.renderHandle), audio instanceof chunkH3OQKK6X_js.EngineAudioPort && audio.bindOcclusionWorld(() => session.world), chunk7AAIAVAA_js.useTransformEngine(chunk7AAIAVAA_js.bindTransformEngine(runtime.symbols, runtime.memory)), {
3087
+ name: ENGINE_BACKEND_NAME,
3088
+ version: ENGINE_BACKEND_VERSION,
3089
+ memory,
3090
+ transforms: new EngineTransforms(session),
3091
+ physics,
3092
+ graphics: port,
3093
+ audio,
3094
+ nav: engineNav(runtime),
3095
+ ai: engineAi(runtime, () => session.world),
3096
+ streaming: engineStreaming(runtime, port),
3097
+ scenery: engineScenery(runtime, port),
3098
+ terrain: engineTerrain(runtime, port, () => session.world),
3099
+ soa: chunkRCQ2MPBV_js.bindSoaEngine(runtime.symbols, runtime.memory),
3100
+ kernels: chunk3S6WPBZL_js.bindKernelEngine(runtime.symbols, runtime.memory),
3101
+ chemistry: chunk7AAIAVAA_js.bindChemistryEngine(runtime.symbols, runtime.memory),
3102
+ fluids: engineFluids(runtime, port),
3103
+ destruction: engineDestruction(runtime, () => session.world),
3104
+ softBodies: engineSoftBodies(runtime, port, () => session.world),
3105
+ reactive: engineReactive(runtime, port),
3106
+ cloths: engineCloths(runtime, port, () => session.world),
3107
+ smoke: engineSmoke(runtime, port),
3108
+ story: engineStory(runtime)
3109
+ };
3110
+ }
3111
+ function engineStory(runtime) {
3112
+ let exports = chunk3S6WPBZL_js.engineStoryExports(runtime);
3113
+ return exports !== null ? new chunk3S6WPBZL_js.EngineStory(runtime, exports) : null;
3114
+ }
3115
+ function engineSmoke(runtime, port) {
3116
+ let exports = chunk7AAIAVAA_js.engineSmokeExports(runtime);
3117
+ return exports !== null && port instanceof EngineGraphics ? new chunk7AAIAVAA_js.EngineSmoke(runtime, exports, () => port.renderHandle) : null;
3118
+ }
3119
+ function engineCloths(runtime, port, world) {
3120
+ let exports = chunkX5A5FOWW_js.engineClothExports(runtime);
3121
+ if (exports === null) return null;
3122
+ let render = port instanceof EngineGraphics ? () => port.renderHandle : () => 0;
3123
+ return new chunkX5A5FOWW_js.EngineCloths(runtime, exports, render, world);
3124
+ }
3125
+ function engineReactive(runtime, port) {
3126
+ let exports = chunk7AAIAVAA_js.engineReactiveExports(runtime);
3127
+ if (exports === null) return null;
3128
+ let render = port instanceof EngineGraphics ? () => port.renderHandle : () => 0;
3129
+ return new chunk7AAIAVAA_js.EngineReactive(runtime, exports, render);
3130
+ }
3131
+ function engineSoftBodies(runtime, port, world) {
3132
+ let exports = chunkX5A5FOWW_js.engineSoftBodyExports(runtime);
3133
+ if (exports === null) return null;
3134
+ let render = port instanceof EngineGraphics ? () => port.renderHandle : () => 0;
3135
+ return new chunkX5A5FOWW_js.EngineSoftBodies(runtime, exports, render, world);
3136
+ }
3137
+ function engineFluids(runtime, port) {
3138
+ let exports = chunk7AAIAVAA_js.engineFluidExports(runtime);
3139
+ return exports !== null && port instanceof EngineGraphics ? new chunk7AAIAVAA_js.EngineFluids(runtime, exports, () => port.renderHandle) : null;
3140
+ }
3141
+ function engineDestruction(runtime, world) {
3142
+ let exports = chunk7AAIAVAA_js.engineDestructionExports(runtime);
3143
+ return exports !== null ? new chunk7AAIAVAA_js.EngineDestruction(runtime, exports, world) : null;
3144
+ }
3145
+ function engineTerrain(runtime, port, world) {
3146
+ let exports = chunkPKOZXD2Q_js.engineTerrainExports(runtime);
3147
+ return exports !== null && port instanceof EngineGraphics ? new chunkPKOZXD2Q_js.EngineTerrain(runtime, exports, () => port.renderHandle, world) : null;
3148
+ }
3149
+ function engineStreaming(runtime, port) {
3150
+ let exports = chunkSKQFLBDD_js.engineStreamExports(runtime);
3151
+ return exports !== null && port instanceof EngineGraphics ? new chunkSKQFLBDD_js.EngineWorldStreaming(runtime, exports, () => port.renderHandle) : null;
3152
+ }
3153
+ function engineScenery(runtime, port) {
3154
+ let exports = chunkSKQFLBDD_js.engineSplatExports(runtime);
3155
+ return exports !== null && port instanceof EngineGraphics ? new chunkSKQFLBDD_js.EngineScenery(runtime, exports, () => port.renderHandle) : null;
3156
+ }
3157
+ function engineNav(runtime) {
3158
+ let exports = engineNavExports(runtime.symbols);
3159
+ return exports ? new EngineNav(runtime, exports) : null;
3160
+ }
3161
+ function createNativeEngineBackend(runtime, options = {}) {
3162
+ let attach = options.attach ?? null;
3163
+ return assembleEngineBackend(runtime, (r) => new EngineGraphics(r, void 0, attach, options.graphics), engineAudio(options, runtime));
3164
+ }
3165
+
3166
+ exports.ENGINE_BACKEND_NAME = ENGINE_BACKEND_NAME;
3167
+ exports.ENGINE_BACKEND_VERSION = ENGINE_BACKEND_VERSION;
3168
+ exports.EngineGraphics = EngineGraphics;
3169
+ exports.assembleEngineBackend = assembleEngineBackend;
3170
+ exports.createNativeEngineBackend = createNativeEngineBackend;
3171
+ exports.engineAudio = engineAudio;