@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.
- package/LICENSE +21 -0
- package/dist/advanced.d.mts +4 -3
- package/dist/advanced.d.ts +4 -3
- package/dist/advanced.js +24 -24
- package/dist/advanced.mjs +5 -5
- package/dist/animation-4EXBXRVX.js +27 -0
- package/dist/animation-6DICNWUP.mjs +6 -0
- package/dist/audio-DhvyjqdA.d.mts +249 -0
- package/dist/audio-m0w8cnxq.d.ts +249 -0
- package/dist/avatars.d.mts +110 -0
- package/dist/avatars.d.ts +110 -0
- package/dist/avatars.js +82 -0
- package/dist/avatars.mjs +5 -0
- package/dist/backend-gUCzs5Kg.d.mts +3866 -0
- package/dist/backend-gUCzs5Kg.d.ts +3866 -0
- package/dist/{catalogue-B4eLL8Mi.d.ts → catalogue-CPTMyBUz.d.mts} +109 -221
- package/dist/catalogue-DzrTXP3v.d.mts +541 -0
- package/dist/catalogue-DzrTXP3v.d.ts +541 -0
- package/dist/{catalogue-OT89_Ifs.d.mts → catalogue-OTuS5zp-.d.ts} +109 -221
- package/dist/chunk-22BD3RHN.mjs +1809 -0
- package/dist/chunk-25T4JHEA.mjs +21 -0
- package/dist/chunk-2AQ237Y4.js +508 -0
- package/dist/chunk-2IC4H6OV.mjs +48 -0
- package/dist/chunk-2LHLG4OB.mjs +71 -0
- package/dist/chunk-2O2CG465.js +1709 -0
- package/dist/chunk-2Q4DTHXK.js +316 -0
- package/dist/chunk-2QTQ6BUH.mjs +46 -0
- package/dist/chunk-2UN4SFLR.mjs +100 -0
- package/dist/chunk-2V75I7K3.js +454 -0
- package/dist/chunk-2V7IL4HC.js +10 -0
- package/dist/chunk-34XBXUMW.js +296 -0
- package/dist/chunk-3C4C654I.js +71 -0
- package/dist/chunk-3DAD2LDF.mjs +72 -0
- package/dist/chunk-3GXH2NFD.mjs +4 -0
- package/dist/chunk-3O47ZFW3.js +961 -0
- package/dist/chunk-3OY3VYNF.mjs +11 -0
- package/dist/chunk-3S6WPBZL.js +2936 -0
- package/dist/chunk-3TUOUP5T.js +399 -0
- package/dist/chunk-3VEH23I5.mjs +1380 -0
- package/dist/chunk-3ZYSAW2T.mjs +263 -0
- package/dist/chunk-4ANVF274.js +103 -0
- package/dist/chunk-4C7I3ELN.js +388 -0
- package/dist/chunk-4DYKAYFO.mjs +8 -0
- package/dist/chunk-4ZDR72SG.js +329 -0
- package/dist/chunk-52YS45RR.js +1066 -0
- package/dist/chunk-5325XSCH.js +107 -0
- package/dist/chunk-5AD5X6AV.js +13 -0
- package/dist/chunk-5BYDGGWO.mjs +197 -0
- package/dist/chunk-5C3C7VDM.mjs +55 -0
- package/dist/chunk-5HFMY3D7.js +660 -0
- package/dist/chunk-5LH2QN3T.js +1862 -0
- package/dist/chunk-5PJEXSOW.js +44 -0
- package/dist/chunk-5SXDH3Y7.js +90 -0
- package/dist/chunk-5YFBGGCK.mjs +502 -0
- package/dist/chunk-5YWN6H5Q.mjs +133 -0
- package/dist/chunk-66QP3SMN.js +402 -0
- package/dist/chunk-6DAEZKIG.mjs +385 -0
- package/dist/chunk-6DATW7TB.mjs +420 -0
- package/dist/{chunk-JRGK3NXR.mjs → chunk-6ETDAU62.mjs} +72 -212
- package/dist/chunk-6H254EVP.mjs +178 -0
- package/dist/chunk-6PFNJPBJ.mjs +820 -0
- package/dist/chunk-6PJWXIFX.mjs +357 -0
- package/dist/chunk-6SWKWCMS.js +80 -0
- package/dist/chunk-6VVXXX7S.js +808 -0
- package/dist/chunk-6WUBSMTX.js +1403 -0
- package/dist/chunk-73SGZLAQ.mjs +35 -0
- package/dist/chunk-76L2V6KD.mjs +4 -0
- package/dist/chunk-7AAIAVAA.js +1531 -0
- package/dist/chunk-7ARSJPV3.mjs +93 -0
- package/dist/chunk-7BHW5GTC.mjs +1234 -0
- package/dist/chunk-7DQSDKDU.js +6 -0
- package/dist/chunk-7IQQQENP.mjs +401 -0
- package/dist/chunk-7KFTYENS.js +11357 -0
- package/dist/chunk-7SM6XSPZ.js +3171 -0
- package/dist/chunk-7SXOHAIR.mjs +28 -0
- package/dist/chunk-A2MAX6S4.js +90 -0
- package/dist/chunk-A33OORT7.mjs +1530 -0
- package/dist/{chunk-U6ACF76H.mjs → chunk-A36JRXXH.mjs} +1075 -1845
- package/dist/chunk-A7BU3BK4.js +52 -0
- package/dist/chunk-A7MQSN2V.mjs +77 -0
- package/dist/chunk-A7V4L2IT.mjs +416 -0
- package/dist/chunk-AABEK6XU.js +226 -0
- package/dist/chunk-AGV33FWC.mjs +5005 -0
- package/dist/chunk-AHNR3BXI.js +108 -0
- package/dist/chunk-AQ5RLBU2.mjs +286 -0
- package/dist/chunk-AQOE6WCG.js +1270 -0
- package/dist/chunk-ATAWRACV.mjs +62 -0
- package/dist/chunk-ATCURNUV.js +14 -0
- package/dist/chunk-AWPV33OO.js +6 -0
- package/dist/chunk-AYJPHKYV.js +337 -0
- package/dist/chunk-AZ5BGWHB.js +162 -0
- package/dist/chunk-AZAXD44P.js +1373 -0
- package/dist/chunk-BBGKQIJJ.mjs +406 -0
- package/dist/chunk-BP4JLSUA.js +1453 -0
- package/dist/{chunk-SUCE7FWA.mjs → chunk-BTUSVHIE.mjs} +539 -978
- package/dist/chunk-BU6OK542.mjs +818 -0
- package/dist/chunk-CVSRWM6W.js +418 -0
- package/dist/chunk-CYBMFMJD.mjs +247 -0
- package/dist/chunk-DDJLDOUX.mjs +217 -0
- package/dist/{chunk-V32BCG7M.js → chunk-DFZWHNRG.js} +75 -215
- package/dist/chunk-DJ2C7AVG.js +644 -0
- package/dist/chunk-DS2VU4WW.mjs +102 -0
- package/dist/chunk-DSAG7T5P.js +7290 -0
- package/dist/chunk-E2QPPH7I.js +327 -0
- package/dist/chunk-E65WCTIG.mjs +1187 -0
- package/dist/{chunk-33VCYWVL.mjs → chunk-E6QQKDNE.mjs} +30 -42
- package/dist/chunk-ECDK6QBF.mjs +981 -0
- package/dist/chunk-EIB4OWVQ.mjs +620 -0
- package/dist/chunk-EQUZYCGO.js +250 -0
- package/dist/chunk-F3UJ6ZRM.mjs +313 -0
- package/dist/chunk-F63N2ZTQ.js +7023 -0
- package/dist/chunk-F6XRYEM3.mjs +26 -0
- package/dist/chunk-FE6VCE4K.js +5030 -0
- package/dist/chunk-FLWD6GRR.js +1372 -0
- package/dist/chunk-FQBFWJBS.mjs +110 -0
- package/dist/chunk-FXVJ2HFU.js +26 -0
- package/dist/chunk-FZMQMQBW.js +312 -0
- package/dist/chunk-G3EEC44R.js +53 -0
- package/dist/{chunk-KG3WT4PR.mjs → chunk-GCKWKLZF.mjs} +73 -104
- package/dist/chunk-GCX7TY4D.mjs +6826 -0
- package/dist/chunk-GDB6TCSD.js +450 -0
- package/dist/chunk-GDCV4IWO.mjs +21 -0
- package/dist/chunk-GDZT5LZ5.js +170 -0
- package/dist/chunk-GHPUYD4I.mjs +213 -0
- package/dist/chunk-GHS6MIL6.mjs +1432 -0
- package/dist/chunk-GPS2THCL.mjs +11 -0
- package/dist/{chunk-EV2EVOYS.js → chunk-GTJWQAGU.js} +31 -42
- package/dist/chunk-GVTI6UJQ.mjs +130 -0
- package/dist/chunk-GXKI64OT.mjs +1138 -0
- package/dist/chunk-GYDYF2WX.js +275 -0
- package/dist/chunk-GYLP6UG4.mjs +705 -0
- package/dist/chunk-H3OQKK6X.js +1158 -0
- package/dist/chunk-H5DFSCJ6.js +40 -0
- package/dist/chunk-HAGEIC2L.mjs +186 -0
- package/dist/chunk-HAJ4JRFO.js +293 -0
- package/dist/chunk-HDR72GB6.js +188 -0
- package/dist/chunk-HF5HPS4T.mjs +40 -0
- package/dist/chunk-HK6LOFDS.js +218 -0
- package/dist/chunk-HMWYTXCY.mjs +143 -0
- package/dist/chunk-HPCSRCMA.js +89 -0
- package/dist/chunk-HSEO6TPU.js +247 -0
- package/dist/chunk-I5FOHCLH.js +132 -0
- package/dist/chunk-IDLW4NWA.mjs +85 -0
- package/dist/chunk-IIDZ5WUX.js +61 -0
- package/dist/chunk-IR74FJHU.js +2332 -0
- package/dist/chunk-IRVFYAKP.mjs +100 -0
- package/dist/{chunk-XBL3TMPC.mjs → chunk-IZDWAL53.mjs} +1795 -3287
- package/dist/chunk-J2KZXIU3.js +51 -0
- package/dist/chunk-J2U6PJSO.js +91 -0
- package/dist/chunk-J5AJNY2N.js +283 -0
- package/dist/chunk-J6KQZ4FO.mjs +821 -0
- package/dist/{chunk-OWW5GUSB.js → chunk-JGBCIKJV.js} +7 -6
- package/dist/chunk-JKGTBMU7.mjs +25 -0
- package/dist/chunk-JR3TNEQC.js +422 -0
- package/dist/chunk-JURRXY2J.mjs +29 -0
- package/dist/chunk-K3HW5I2A.mjs +317 -0
- package/dist/chunk-K46SMZ66.mjs +103 -0
- package/dist/chunk-K4UDGE3Z.mjs +6 -0
- package/dist/chunk-KDQOR4QQ.mjs +350 -0
- package/dist/chunk-KDTVOLHI.mjs +288 -0
- package/dist/chunk-KGHJH5KJ.mjs +35 -0
- package/dist/chunk-KIZOA5LX.mjs +140 -0
- package/dist/chunk-KK6HYVBI.mjs +242 -0
- package/dist/chunk-KMKWGXMK.js +856 -0
- package/dist/chunk-KPA6K5IB.js +80 -0
- package/dist/chunk-KU7O4IXU.mjs +260 -0
- package/dist/chunk-KVFNRJOR.mjs +11142 -0
- package/dist/chunk-KZJRSXHK.js +2432 -0
- package/dist/chunk-LHWPRUJL.js +79 -0
- package/dist/chunk-LIV3KXJG.mjs +369 -0
- package/dist/chunk-LKV4LACG.js +21 -0
- package/dist/chunk-LUY45X3U.mjs +263 -0
- package/dist/chunk-LYEZZEEF.mjs +17 -0
- package/dist/chunk-M5EXQZYY.mjs +1519 -0
- package/dist/chunk-ME6HGG4I.mjs +1338 -0
- package/dist/chunk-MEXP6DA6.js +31 -0
- package/dist/chunk-MG52AW3H.js +902 -0
- package/dist/chunk-MIPO6F72.js +334 -0
- package/dist/{chunk-5QW7CQBA.js → chunk-MKIJQL5Q.js} +211 -321
- package/dist/chunk-MN3YETVN.mjs +17 -0
- package/dist/chunk-MOBSBXVE.mjs +2391 -0
- package/dist/chunk-MOMOZEUM.mjs +88 -0
- package/dist/chunk-MRFUNRAP.js +62 -0
- package/dist/chunk-MTIHEW2M.js +433 -0
- package/dist/chunk-N4RGGDEL.mjs +73 -0
- package/dist/chunk-NH654HAT.js +10 -0
- package/dist/chunk-NHJUGZUR.mjs +253 -0
- package/dist/chunk-NMQT4HG3.mjs +757 -0
- package/dist/chunk-NPSYB6DC.mjs +906 -0
- package/dist/chunk-NW2GPMSO.js +857 -0
- package/dist/chunk-NXKQOQ6L.js +76 -0
- package/dist/chunk-NXLAZIJZ.js +309 -0
- package/dist/chunk-NYWNA5CF.js +148 -0
- package/dist/chunk-NZTKLY2W.js +1442 -0
- package/dist/chunk-O2ICABUD.js +36 -0
- package/dist/chunk-OIVVQQ22.js +862 -0
- package/dist/chunk-OKC2B4O3.mjs +312 -0
- package/dist/chunk-OLWFPDBK.js +2220 -0
- package/dist/chunk-OMTVH334.js +3779 -0
- package/dist/chunk-OQRVEM56.mjs +362 -0
- package/dist/chunk-OXMIBOD4.js +337 -0
- package/dist/chunk-PBL6YL5L.mjs +288 -0
- package/dist/chunk-PDOELNNQ.js +97 -0
- package/dist/chunk-PDQJY2GZ.js +136 -0
- package/dist/chunk-PKOZXD2Q.js +1274 -0
- package/dist/chunk-PPF2BYFL.mjs +2191 -0
- package/dist/chunk-PQTQKNKD.js +539 -0
- package/dist/chunk-PRSR4FAV.mjs +81 -0
- package/dist/chunk-PTRNO5UD.js +95 -0
- package/dist/chunk-Q2Y3VMKH.js +2000 -0
- package/dist/chunk-QCZOE65N.js +96 -0
- package/dist/chunk-QDYFLATW.mjs +52 -0
- package/dist/chunk-QQABGCMM.js +22 -0
- package/dist/chunk-QS6TRHMR.js +345 -0
- package/dist/chunk-R56P64LB.mjs +208 -0
- package/dist/chunk-RCQ2MPBV.js +428 -0
- package/dist/chunk-RFVRPYR2.mjs +856 -0
- package/dist/chunk-RKBLPGPV.js +11521 -0
- package/dist/chunk-RM2V4IND.mjs +327 -0
- package/dist/chunk-RQXN5A34.mjs +613 -0
- package/dist/chunk-RUVGVNOF.mjs +2687 -0
- package/dist/chunk-SAFJIGYB.mjs +165 -0
- package/dist/chunk-SKQFLBDD.js +263 -0
- package/dist/chunk-SMK6JU2F.mjs +2092 -0
- package/dist/{chunk-UVRPC2P7.js → chunk-SNNEOS5Z.js} +1984 -3476
- package/dist/chunk-SPCRQ6NO.mjs +1246 -0
- package/dist/chunk-SWX4SALA.mjs +19 -0
- package/dist/{chunk-JVODCGFP.mjs → chunk-SYEO2WV4.mjs} +128 -238
- package/dist/chunk-T2QQMX2N.js +10 -0
- package/dist/chunk-T3AFF3L7.mjs +57 -0
- package/dist/chunk-T6Z2EXYL.js +712 -0
- package/dist/chunk-T7LOXGYX.js +118 -0
- package/dist/chunk-TJCAE7RC.mjs +1315 -0
- package/dist/chunk-TJI3K6RP.js +137 -0
- package/dist/chunk-TL2SVO4P.mjs +55 -0
- package/dist/chunk-TM63CYGN.mjs +399 -0
- package/dist/chunk-TU5RYTYU.mjs +13 -0
- package/dist/chunk-TVJZ4GPS.js +1553 -0
- package/dist/chunk-TWM6DLYF.js +371 -0
- package/dist/chunk-U63OC4TQ.js +30 -0
- package/dist/{chunk-L5GKVQVJ.js → chunk-U6BVSJZ6.js} +25 -57
- package/dist/chunk-U6UVWEAK.mjs +792 -0
- package/dist/chunk-UCEPNO6N.mjs +11048 -0
- package/dist/{chunk-ANT574FD.js → chunk-UCR5HRYM.js} +74 -105
- package/dist/chunk-UG5BTOTF.mjs +334 -0
- package/dist/chunk-UGH37BQW.mjs +157 -0
- package/dist/chunk-V7ZRH3PY.mjs +271 -0
- package/dist/chunk-VBGHBL3E.mjs +1394 -0
- package/dist/chunk-VRBDAS5I.js +920 -0
- package/dist/chunk-VVE3Y76O.js +230 -0
- package/dist/chunk-W65JIRI4.mjs +1182 -0
- package/dist/chunk-WHYKAT7G.js +62 -0
- package/dist/{chunk-YOIVZ6OA.mjs → chunk-WIZRUIZB.mjs} +25 -57
- package/dist/chunk-WKWTDZS7.js +385 -0
- package/dist/chunk-WLMINRC4.mjs +78 -0
- package/dist/chunk-WOF3AD3J.js +22 -0
- package/dist/chunk-WWKMOA76.js +1262 -0
- package/dist/chunk-X5A5FOWW.js +615 -0
- package/dist/chunk-X6CN6KQF.mjs +192 -0
- package/dist/chunk-XD2PMH46.mjs +517 -0
- package/dist/chunk-XJA2NGTI.mjs +88 -0
- package/dist/chunk-XJIHN3BY.mjs +8 -0
- package/dist/chunk-XK6UDWJS.js +203 -0
- package/dist/chunk-XPG3N5CF.mjs +415 -0
- package/dist/chunk-XVZ2NKSU.mjs +74 -0
- package/dist/chunk-XYP45OLE.js +117 -0
- package/dist/chunk-XZSDGZX6.mjs +301 -0
- package/dist/chunk-Y2EMGN4T.mjs +120 -0
- package/dist/chunk-Y3XWP5XW.mjs +298 -0
- package/dist/chunk-Y4K22JL6.js +228 -0
- package/dist/chunk-Y65LXQGA.mjs +3164 -0
- package/dist/chunk-Y66WVMO5.mjs +87 -0
- package/dist/chunk-Y7JWLB25.mjs +7280 -0
- package/dist/chunk-YCDXAJKU.js +175 -0
- package/dist/chunk-YRDQCCIS.js +152 -0
- package/dist/chunk-YV52DGSA.js +111 -0
- package/dist/chunk-YXGZQPUD.js +94 -0
- package/dist/chunk-Z3A3AFVU.mjs +102 -0
- package/dist/chunk-ZCY6YKKP.mjs +475 -0
- package/dist/chunk-ZEQHXVU5.js +215 -0
- package/dist/chunk-ZF7JCXCI.js +284 -0
- package/dist/chunk-ZJBRUH6V.js +29 -0
- package/dist/chunk-ZMIL4ZOA.js +365 -0
- package/dist/chunk-ZR5ULMN2.mjs +337 -0
- package/dist/chunk-ZXREOYOW.js +87 -0
- package/dist/{client-BSP9U1O1.d.mts → client-CX_WR0-J.d.mts} +2 -2
- package/dist/client-Dytx_ZTC.d.ts +230 -0
- package/dist/{client-B878xeAP.d.ts → client-dqOhP9Nc.d.ts} +2 -2
- package/dist/client-hTKbCuhG.d.mts +230 -0
- package/dist/clock-B-UAjkKa.d.mts +5 -0
- package/dist/clock-B-UAjkKa.d.ts +5 -0
- package/dist/config-BlXQluJR.d.mts +36 -0
- package/dist/config-BlXQluJR.d.ts +36 -0
- package/dist/courier-Cnn-edJ4.d.ts +95 -0
- package/dist/courier-FmGfkvIN.d.mts +95 -0
- package/dist/crowd-DdHFbqKK.d.ts +186 -0
- package/dist/crowd-hOVSAmA3.d.mts +186 -0
- package/dist/danfo-BEBapFlX.d.mts +146 -0
- package/dist/danfo-UQ_PTIIx.d.ts +146 -0
- package/dist/{elements-Bty6Qs_N.d.mts → elements-DdsRig-2.d.mts} +1548 -257
- package/dist/{elements-Bty6Qs_N.d.ts → elements-DdsRig-2.d.ts} +1548 -257
- package/dist/engines/godot.d.mts +56 -0
- package/dist/engines/godot.d.ts +56 -0
- package/dist/engines/godot.js +28 -0
- package/dist/engines/godot.mjs +3 -0
- package/dist/engines/wasm.d.mts +11 -0
- package/dist/engines/wasm.d.ts +11 -0
- package/dist/engines/wasm.js +178 -0
- package/dist/engines/wasm.mjs +176 -0
- package/dist/fallback-CrG_lTFk.d.mts +270 -0
- package/dist/fallback-CrG_lTFk.d.ts +270 -0
- package/dist/fallback-KDB4Y2CE.mjs +6 -0
- package/dist/fallback-Y26TQENE.js +19 -0
- package/dist/features-CZB4rmcD.d.mts +118 -0
- package/dist/features-CZB4rmcD.d.ts +118 -0
- package/dist/fit-BWiE7rgA.d.mts +44 -0
- package/dist/fit-DK0oT7zO.d.ts +44 -0
- package/dist/five-a-side-Bv1AOUy3.d.mts +115 -0
- package/dist/five-a-side-EC51SJY1.d.ts +115 -0
- package/dist/fluid-ARr0qUIL.d.ts +939 -0
- package/dist/fluid-DLlEj2cs.d.mts +939 -0
- package/dist/game/conformance.d.mts +84 -0
- package/dist/game/conformance.d.ts +84 -0
- package/dist/game/conformance.js +1025 -0
- package/dist/game/conformance.mjs +994 -0
- package/dist/game/heap.d.mts +40 -0
- package/dist/game/heap.d.ts +40 -0
- package/dist/game/heap.js +48 -0
- package/dist/game/heap.mjs +7 -0
- package/dist/game/kit/canvas.d.mts +240 -0
- package/dist/game/kit/canvas.d.ts +240 -0
- package/dist/game/kit/canvas.js +3566 -0
- package/dist/game/kit/canvas.mjs +1039 -0
- package/dist/game/kit/courier.d.mts +17 -0
- package/dist/game/kit/courier.d.ts +17 -0
- package/dist/game/kit/courier.js +66 -0
- package/dist/game/kit/courier.mjs +49 -0
- package/dist/game/kit/danfo.d.mts +11 -0
- package/dist/game/kit/danfo.d.ts +11 -0
- package/dist/game/kit/danfo.js +109 -0
- package/dist/game/kit/danfo.mjs +44 -0
- package/dist/game/kit/engine.d.mts +29 -0
- package/dist/game/kit/engine.d.ts +29 -0
- package/dist/game/kit/engine.js +183 -0
- package/dist/game/kit/engine.mjs +30 -0
- package/dist/game/kit/five-a-side.d.mts +11 -0
- package/dist/game/kit/five-a-side.d.ts +11 -0
- package/dist/game/kit/five-a-side.js +86 -0
- package/dist/game/kit/five-a-side.mjs +41 -0
- package/dist/game/kit/frontier.d.mts +344 -0
- package/dist/game/kit/frontier.d.ts +344 -0
- package/dist/game/kit/frontier.js +435 -0
- package/dist/game/kit/frontier.mjs +14 -0
- package/dist/game/kit/genesis.d.mts +752 -0
- package/dist/game/kit/genesis.d.ts +752 -0
- package/dist/game/kit/genesis.js +380 -0
- package/dist/game/kit/genesis.mjs +15 -0
- package/dist/game/kit/ludo.d.mts +15 -0
- package/dist/game/kit/ludo.d.ts +15 -0
- package/dist/game/kit/ludo.js +87 -0
- package/dist/game/kit/ludo.mjs +42 -0
- package/dist/game/kit/runner.d.mts +12 -0
- package/dist/game/kit/runner.d.ts +12 -0
- package/dist/game/kit/runner.js +83 -0
- package/dist/game/kit/runner.mjs +46 -0
- package/dist/game/kit/shootout.d.mts +13 -0
- package/dist/game/kit/shootout.d.ts +13 -0
- package/dist/game/kit/shootout.js +122 -0
- package/dist/game/kit/shootout.mjs +57 -0
- package/dist/game/kit/slots.d.mts +392 -0
- package/dist/game/kit/slots.d.ts +392 -0
- package/dist/game/kit/slots.js +215 -0
- package/dist/game/kit/slots.mjs +6 -0
- package/dist/game/kit/tycoon.d.mts +16 -0
- package/dist/game/kit/tycoon.d.ts +16 -0
- package/dist/game/kit/tycoon.js +145 -0
- package/dist/game/kit/tycoon.mjs +44 -0
- package/dist/game/kit/word.d.mts +11 -0
- package/dist/game/kit/word.d.ts +11 -0
- package/dist/game/kit/word.js +78 -0
- package/dist/game/kit/word.mjs +41 -0
- package/dist/game/kit/worlds.d.mts +18 -0
- package/dist/game/kit/worlds.d.ts +18 -0
- package/dist/game/kit/worlds.js +74 -0
- package/dist/game/kit/worlds.mjs +49 -0
- package/dist/game/kit.d.mts +53 -0
- package/dist/game/kit.d.ts +53 -0
- package/dist/game/kit.js +2610 -0
- package/dist/game/kit.mjs +101 -0
- package/dist/game/prepared.d.mts +14 -0
- package/dist/game/prepared.d.ts +14 -0
- package/dist/game/prepared.js +81 -0
- package/dist/game/prepared.mjs +32 -0
- package/dist/game-Bx8onkhX.d.mts +1451 -0
- package/dist/game-fgQy2YIm.d.ts +1451 -0
- package/dist/game-theme-CBTw1b_d.d.mts +35 -0
- package/dist/game-theme-Dg-ict5A.d.ts +35 -0
- package/dist/game.d.mts +3546 -0
- package/dist/game.d.ts +3546 -0
- package/dist/game.js +4455 -0
- package/dist/game.mjs +50 -0
- package/dist/graphics-C6YjWYvP.d.ts +5 -0
- package/dist/graphics-Dk2yQnYN.d.mts +5 -0
- package/dist/guest-DrsA00XD.d.mts +732 -0
- package/dist/guest-wIdfoT05.d.ts +732 -0
- package/dist/hit-stop-BKkVwTq7.d.mts +43 -0
- package/dist/hit-stop-D-8pPYnM.d.ts +43 -0
- package/dist/hot-Crn9XpHJ.d.ts +29 -0
- package/dist/hot-DH3nOhQD.d.mts +29 -0
- package/dist/{index-CQStGb3B.d.mts → index-6gkHMGAq.d.mts} +2 -2
- package/dist/index-B8ybCKJI.d.ts +41 -0
- package/dist/{index-DJwXmoaP.d.ts → index-B98Xac8e.d.ts} +2 -2
- package/dist/{index-B7oA_1XI.d.ts → index-B_ByTtIT.d.ts} +2 -2
- package/dist/index-DHjNHb1c.d.mts +41 -0
- package/dist/{index-DhUSTAhT.d.mts → index-DbAN_VQE.d.mts} +2 -2
- package/dist/index.d.mts +134 -24
- package/dist/index.d.ts +134 -24
- package/dist/index.js +407 -248
- package/dist/index.mjs +184 -58
- package/dist/interactives-authoring.d.mts +231 -0
- package/dist/interactives-authoring.d.ts +231 -0
- package/dist/interactives-authoring.js +1743 -0
- package/dist/interactives-authoring.mjs +1704 -0
- package/dist/interactives-canvas.global.js +148 -0
- package/dist/interactives-guest.d.mts +20 -0
- package/dist/interactives-guest.d.ts +20 -0
- package/dist/interactives-guest.js +63 -0
- package/dist/interactives-guest.json +1 -0
- package/dist/interactives-guest.mjs +61 -0
- package/dist/interactives-jsc.global.js +9357 -0
- package/dist/interactives-meters.d.mts +93 -0
- package/dist/interactives-meters.d.ts +93 -0
- package/dist/interactives-meters.js +252 -0
- package/dist/interactives-meters.mjs +68 -0
- package/dist/interactives-production.d.mts +430 -0
- package/dist/interactives-production.d.ts +430 -0
- package/dist/interactives-production.js +1231 -0
- package/dist/interactives-production.mjs +1170 -0
- package/dist/interactives-record.d.mts +112 -0
- package/dist/interactives-record.d.ts +112 -0
- package/dist/interactives-record.js +302 -0
- package/dist/interactives-record.mjs +295 -0
- package/dist/interactives-runtime.d.mts +61 -0
- package/dist/interactives-runtime.d.ts +61 -0
- package/dist/interactives-runtime.js +442 -0
- package/dist/interactives-runtime.mjs +25 -0
- package/dist/interactives-studio-kernel.global.js +1 -0
- package/dist/interactives-studio.d.mts +806 -0
- package/dist/interactives-studio.d.ts +806 -0
- package/dist/interactives-studio.js +5741 -0
- package/dist/interactives-studio.mjs +5651 -0
- package/dist/interactives-tick.d.mts +90 -0
- package/dist/interactives-tick.d.ts +90 -0
- package/dist/interactives-tick.js +203 -0
- package/dist/interactives-tick.mjs +6 -0
- package/dist/interactives-web.d.mts +762 -0
- package/dist/interactives-web.d.ts +762 -0
- package/dist/interactives-web.js +5000 -0
- package/dist/interactives-web.mjs +4628 -0
- package/dist/interactives.d.mts +2430 -0
- package/dist/interactives.d.ts +2430 -0
- package/dist/interactives.js +5723 -0
- package/dist/interactives.mjs +4333 -0
- package/dist/juice-CoHxlpKA.d.ts +42 -0
- package/dist/juice-DQztFS43.d.mts +42 -0
- package/dist/launch-T2f4_Di4.d.mts +151 -0
- package/dist/launch-d6oreMzR.d.ts +151 -0
- package/dist/library-DXYaMFhi.d.mts +69 -0
- package/dist/library-DXYaMFhi.d.ts +69 -0
- package/dist/link-BUTqGmyi.d.mts +38 -0
- package/dist/link-BUTqGmyi.d.ts +38 -0
- package/dist/lint.js +104 -204
- package/dist/lint.mjs +103 -203
- package/dist/local-D8_I6UeL.d.mts +6967 -0
- package/dist/local-VZkqsCzR.d.ts +6967 -0
- package/dist/lockstep-BLf6dglI.d.mts +321 -0
- package/dist/lockstep-D50Ia0JW.d.ts +321 -0
- package/dist/ludo-B8ClkDqr.d.ts +205 -0
- package/dist/ludo-BOuohQ-M.d.mts +205 -0
- package/dist/mock/cli.mjs +200 -56
- package/dist/mock/library.js +200 -56
- package/dist/mock/library.mjs +200 -56
- package/dist/mock/msw.js +200 -56
- package/dist/mock/msw.mjs +200 -56
- package/dist/native-BodxSh03.d.mts +16 -0
- package/dist/native-DUHMT8gA.d.ts +16 -0
- package/dist/network-ZXLD7l1b.d.mts +19 -0
- package/dist/network-ZXLD7l1b.d.ts +19 -0
- package/dist/online-XeymeM9s.d.ts +381 -0
- package/dist/online-d7W_Al9a.d.mts +381 -0
- package/dist/params-DxFb5G_U.d.mts +155 -0
- package/dist/params-DxFb5G_U.d.ts +155 -0
- package/dist/play-BRRlfLhX.d.ts +940 -0
- package/dist/play-ClrMd_e8.d.mts +940 -0
- package/dist/policy-CCw8tXLm.d.mts +3078 -0
- package/dist/policy-CMqOSQIu.d.ts +3078 -0
- package/dist/ports-B_0v_P3A.d.mts +13 -0
- package/dist/ports-CGU_3e_0.d.ts +13 -0
- package/dist/prefetch-BHnicOQj.d.ts +117 -0
- package/dist/prefetch-CBXgYacv.d.mts +117 -0
- package/dist/{price-CSztR02F.d.mts → price-BOzexBww.d.mts} +1 -1
- package/dist/{price-C_vasx9A.d.ts → price-C1h9sPxE.d.ts} +1 -1
- package/dist/protocol-C8qbpUbT.d.mts +242 -0
- package/dist/protocol-C8qbpUbT.d.ts +242 -0
- package/dist/rapier-AZHT4YI7.js +7886 -0
- package/dist/rapier-ODEPCQA6.mjs +7792 -0
- package/dist/react.d.mts +157 -15
- package/dist/react.d.ts +157 -15
- package/dist/react.js +5564 -5904
- package/dist/react.mjs +5451 -5808
- package/dist/runner-CQcLL7By.d.ts +189 -0
- package/dist/runner-D46Yj-wE.d.mts +189 -0
- package/dist/runtime-BRWfkf_q.d.mts +51 -0
- package/dist/runtime-DyuBMkKM.d.ts +51 -0
- package/dist/scheduling-D2ajXpMC.d.ts +224 -0
- package/dist/scheduling-DSRbbaZb.d.mts +224 -0
- package/dist/schema-BrWxzKp6.d.mts +63 -0
- package/dist/schema-BrWxzKp6.d.ts +63 -0
- package/dist/server/evict.js +34 -37
- package/dist/server/evict.mjs +34 -37
- package/dist/server/tanstack.d.mts +49 -3
- package/dist/server/tanstack.d.ts +49 -3
- package/dist/server/tanstack.js +169 -117
- package/dist/server/tanstack.mjs +166 -118
- package/dist/{server-Dckg4Vdr.d.ts → server-D29IIuDV.d.ts} +136 -130
- package/dist/{server-B6dW7-Lj.d.mts → server-DQMWPnc8.d.mts} +136 -130
- package/dist/server.d.mts +45 -5
- package/dist/server.d.ts +45 -5
- package/dist/server.js +171 -227
- package/dist/server.mjs +165 -225
- package/dist/session-grant-CJ27DwrT.d.mts +19 -0
- package/dist/session-grant-CJ27DwrT.d.ts +19 -0
- package/dist/shootout-BJZeX6FG.d.ts +140 -0
- package/dist/shootout-tcZd1Rxt.d.mts +140 -0
- package/dist/state-replica-stMtdkVD.d.mts +42 -0
- package/dist/state-replica-stMtdkVD.d.ts +42 -0
- package/dist/studio-CowqWqez.d.mts +14 -0
- package/dist/studio-CowqWqez.d.ts +14 -0
- package/dist/styles.css +1 -1
- package/dist/template-AhCdB1kW.d.mts +190 -0
- package/dist/template-BkEGVTQj.d.ts +190 -0
- package/dist/terrain-BMxEc6Oc.d.ts +429 -0
- package/dist/terrain-C-XC1Oui.d.mts +429 -0
- package/dist/testing/msw.d.mts +28 -4
- package/dist/testing/msw.d.ts +28 -4
- package/dist/testing/msw.js +15 -21
- package/dist/testing/msw.mjs +15 -21
- package/dist/testing/suite.d.mts +6 -5
- package/dist/testing/suite.d.ts +6 -5
- package/dist/testing/suite.js +89 -124
- package/dist/testing/suite.mjs +81 -116
- package/dist/testing.d.mts +27 -1227
- package/dist/testing.d.ts +27 -1227
- package/dist/testing.js +127 -131
- package/dist/testing.mjs +19 -23
- package/dist/tick-transport-C8QEh8Uw.d.mts +50 -0
- package/dist/tick-transport-UjHY3xK1.d.ts +50 -0
- package/dist/timeline-protocol-hp6e8zFB.d.mts +47 -0
- package/dist/timeline-protocol-hp6e8zFB.d.ts +47 -0
- package/dist/tokens-DhanQRQS.d.mts +21 -0
- package/dist/tokens-K8yxwd6G.d.ts +21 -0
- package/dist/tree-C-Io2Hbx.d.mts +35 -0
- package/dist/tree-CP_qSW4H.d.ts +35 -0
- package/dist/tycoon-B5KHk2Xx.d.mts +255 -0
- package/dist/tycoon-hmHo-3HX.d.ts +255 -0
- package/dist/types-BQkxPwZP.d.mts +219 -0
- package/dist/types-D_f6UUxM.d.ts +219 -0
- package/dist/ui-DwHicuFv.d.mts +563 -0
- package/dist/ui-hi7S2YcH.d.ts +563 -0
- package/dist/{sign-in-DQlIdqsi.d.mts → url-52ndUruG.d.mts} +15 -1
- package/dist/{sign-in-DQlIdqsi.d.ts → url-52ndUruG.d.ts} +15 -1
- package/dist/utils.d.mts +3 -3
- package/dist/utils.d.ts +3 -3
- package/dist/utils.js +37 -37
- package/dist/utils.mjs +4 -4
- package/dist/vars-Dc_PrhBK.d.mts +511 -0
- package/dist/vars-Dc_PrhBK.d.ts +511 -0
- package/dist/vm-IUARFFAI.mjs +63 -0
- package/dist/vm-N7L6MGGH.js +65 -0
- package/dist/weave-delivery-CW-Kstut.d.mts +360 -0
- package/dist/weave-delivery-CW-Kstut.d.ts +360 -0
- package/dist/web-Dss74a7v.d.ts +883 -0
- package/dist/web-f9ZQPoyw.d.mts +883 -0
- package/dist/web-transport-C7MkBL0a.d.ts +19 -0
- package/dist/web-transport-aYEqXMd9.d.mts +19 -0
- package/dist/weight-CPGjsgjV.d.ts +92 -0
- package/dist/weight-tF1ODR1p.d.mts +92 -0
- package/dist/word-BcX9Jcmv.d.mts +70 -0
- package/dist/word-C7sVPLHm.d.ts +70 -0
- package/dist/world-PvILHDR1.d.ts +2285 -0
- package/dist/world-qekkXjJv.d.mts +2285 -0
- package/dist/worlds-Br2Pb0Cs.d.ts +109 -0
- package/dist/worlds-D5ydYr7d.d.mts +109 -0
- package/engines/c/cimplify.h +108 -0
- package/engines/c/cimplify.lib.js +11 -0
- package/engines/godot/addons/cimplify/cimplify.gd +97 -0
- package/engines/rust/interactives-ctx/Cargo.toml +9 -0
- package/engines/rust/interactives-ctx/src/lib.rs +189 -0
- package/package.json +189 -3
- package/vendor/rapier3d-compat/LICENSE +201 -0
- package/vendor/rapier3d-compat/PATCHES.md +61 -0
- package/dist/chunk-2P4KXFB6.js +0 -274
- package/dist/chunk-3G6RQLXK.mjs +0 -21
- package/dist/chunk-3V4DVXV3.mjs +0 -254
- package/dist/chunk-EDK3LNM6.js +0 -2436
- package/dist/chunk-F7J3HK27.js +0 -4549
- package/dist/chunk-U4MW6PYU.mjs +0 -23
- 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;
|