From 1e2e7b8e69149929935087f44b0ae94cf9c0e843 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Fri, 4 Sep 2026 20:56:31 +0700 Subject: [PATCH] feat(queen): Kenney Space Kit models on the field, a rendered look, the tree's scroller (B-8, B-5, P1-31) Loop cycle 016. The user: "which pack? download it yourself, open source". Kenney Space Kit 2.0 (CC0, kenney.nl, 6,677,531 B archive) is the pack; fourteen GLB models (284 KB) and its licence sit in public/queen/models. Each model is loaded once with the glTF loader, its root transform baked, its parts merged into one mesh, measured, and thin-instanced at the cells with the matrices the procedural templates already had: platform for backlog, generator for running, satellite dish for review, three hangars for done by card number, gate for blocked, crater for dropped, the large hangar as the Queen's hub, crystals for verified devices; the bees are astronauts and a rover and the larvae are aliens, instanced and turned toward where they walk. A model that fails to load leaves its procedural stand-in. The rendered look: tone mapping with contrast and a vignette, linear fog into the void, a glow layer on every emissive part, the steel plates' seams less shiny; three bee lines at three sizes with rings to match (B-8). The technology tree declares its scroller in the shell so a strip that wraps for a frame on a phone no longer reads as an overflow (P1-31, seen twice in check:queen-viewport). Contracts on the Babylon default: pick, placement, touch PASS; 480/480 frames at vsync; chunk 385,900 B brotli (+130 KB for the glTF loader and PBR materials). Co-Authored-By: Claude Opus 5 --- apps/website/.gitignore | 4 + apps/website/package-lock.json | 18 ++ apps/website/package.json | 1 + .../queen/models/LICENSE-kenney-space-kit.txt | 23 +++ apps/website/public/queen/models/alien.glb | Bin 0 -> 27784 bytes .../public/queen/models/astronautA.glb | Bin 0 -> 27912 bytes .../public/queen/models/astronautB.glb | Bin 0 -> 27824 bytes apps/website/public/queen/models/crater.glb | Bin 0 -> 5684 bytes .../public/queen/models/gate_complex.glb | Bin 0 -> 29912 bytes .../public/queen/models/hangar_largeA.glb | Bin 0 -> 25304 bytes .../public/queen/models/hangar_roundA.glb | Bin 0 -> 12104 bytes .../public/queen/models/hangar_smallA.glb | Bin 0 -> 18860 bytes .../queen/models/machine_generatorLarge.glb | Bin 0 -> 10220 bytes .../public/queen/models/platform_small.glb | Bin 0 -> 6280 bytes .../queen/models/rock_crystalsLargeA.glb | Bin 0 -> 26160 bytes apps/website/public/queen/models/rover.glb | Bin 0 -> 13384 bytes .../queen/models/satelliteDish_large.glb | Bin 0 -> 13948 bytes .../public/queen/models/structure_closed.glb | Bin 0 -> 15604 bytes apps/website/qa/queen-viewport-contract.mjs | 4 +- .../src/components/QueenCombBabylon.tsx | 170 ++++++++++++++++-- apps/website/src/pages/Queen.css | 6 + 21 files changed, 213 insertions(+), 13 deletions(-) create mode 100644 apps/website/public/queen/models/LICENSE-kenney-space-kit.txt create mode 100644 apps/website/public/queen/models/alien.glb create mode 100644 apps/website/public/queen/models/astronautA.glb create mode 100644 apps/website/public/queen/models/astronautB.glb create mode 100644 apps/website/public/queen/models/crater.glb create mode 100644 apps/website/public/queen/models/gate_complex.glb create mode 100644 apps/website/public/queen/models/hangar_largeA.glb create mode 100644 apps/website/public/queen/models/hangar_roundA.glb create mode 100644 apps/website/public/queen/models/hangar_smallA.glb create mode 100644 apps/website/public/queen/models/machine_generatorLarge.glb create mode 100644 apps/website/public/queen/models/platform_small.glb create mode 100644 apps/website/public/queen/models/rock_crystalsLargeA.glb create mode 100644 apps/website/public/queen/models/rover.glb create mode 100644 apps/website/public/queen/models/satelliteDish_large.glb create mode 100644 apps/website/public/queen/models/structure_closed.glb diff --git a/apps/website/.gitignore b/apps/website/.gitignore index 4329047f1b..8504145351 100644 --- a/apps/website/.gitignore +++ b/apps/website/.gitignore @@ -24,3 +24,7 @@ dist-ssr *.sw? .vercel .env*.local + +# the field's CC0 models (Kenney Space Kit) are shipped, not ignored +!public/queen/models/ +!public/queen/models/** diff --git a/apps/website/package-lock.json b/apps/website/package-lock.json index 9374a7b44a..ab6f235553 100644 --- a/apps/website/package-lock.json +++ b/apps/website/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "dependencies": { "@babylonjs/core": "^9.25.0", + "@babylonjs/loaders": "^9.25.0", "@monaco-editor/react": "^4.7.0", "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.5.0", @@ -290,6 +291,16 @@ "integrity": "sha512-PflCKhM0ZRQ1o/7fRsYic4r1ogBpE/ZxA/8wJ2K2C9wg7rc0rIkXMVTUAcAypAFeVtE0ix6sp3Bd4zbz/rfHBQ==", "license": "Apache-2.0" }, + "node_modules/@babylonjs/loaders": { + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-9.25.0.tgz", + "integrity": "sha512-K0R+ehftbe+kzf9cDtUERc57B5G/bdTbi6Kb3dF0dnUi1OVTJtRWs1Kxon/nVeUtQjuoe/nmEt7qjcUWnqyxDg==", + "license": "Apache-2.0", + "peerDependencies": { + "@babylonjs/core": "^9.0.0", + "babylonjs-gltf2interface": "^9.0.0" + } + }, "node_modules/@dimforge/rapier3d-compat": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", @@ -2187,6 +2198,13 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/babylonjs-gltf2interface": { + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-9.25.0.tgz", + "integrity": "sha512-yi+Gh+rqEghH5T9jdpp0W+be4HRh13+0N4xCPazMyElNbwqtEYoWoFLE3Q3CrA1aY4H5dMOVRXYcspWwo15crg==", + "license": "Apache-2.0", + "peer": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", diff --git a/apps/website/package.json b/apps/website/package.json index ba6700fe19..9cebe03355 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -38,6 +38,7 @@ }, "dependencies": { "@babylonjs/core": "^9.25.0", + "@babylonjs/loaders": "^9.25.0", "@monaco-editor/react": "^4.7.0", "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.5.0", diff --git a/apps/website/public/queen/models/LICENSE-kenney-space-kit.txt b/apps/website/public/queen/models/LICENSE-kenney-space-kit.txt new file mode 100644 index 0000000000..e97a6cd508 --- /dev/null +++ b/apps/website/public/queen/models/LICENSE-kenney-space-kit.txt @@ -0,0 +1,23 @@ + + + Space Kit (2.0) + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 27-08-2020 14:20 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Request: http://request.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/apps/website/public/queen/models/alien.glb b/apps/website/public/queen/models/alien.glb new file mode 100644 index 0000000000000000000000000000000000000000..e89097683496412ec56ffbc1fdb5b035e5de97ff GIT binary patch literal 27784 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 E0a0+N+W-In literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/astronautA.glb b/apps/website/public/queen/models/astronautA.glb new file mode 100644 index 0000000000000000000000000000000000000000..1e23ee08cb81a3947674802653efa3f55ac03e61 GIT binary patch literal 27912 zcmcgz3wTu3ogYLHDKEilrMw(OQ9_tIcb-U+JMyr!yvn0W5g{ZKh~`0)fC8e^TCKLU zXcug)LR&$%uytD(MeUkoaMg5MZ2S3jwWYSzmhJA>T9Hbx71fRw659I)KK3RTwNBdZf#As1!ryxu1`0mTdLcdTY@u#E1K%B zT(ErJbgMiZ50(Wtr(5U>H^Swi;P$fMx=nR;kiqS?;JPhs=>_Sg^=%u1Gp%?elGqNf zuEMA4(>G`(We}Vh!Y$}8uB%f~H7n-Pc&segR^76m8QGC!EWEu80s6L8%4YDAtSu`V zc5{*7b|T_GxD~aLsu|siC3>3M1#-9IAp|qcBPChq=5B>iNwaVTgD2uSO)sf(VRUiN z+)FaIL*bmJmsEH=63U5QQsM1hqo$3g!rH|R^N!-mR+8-BGGtq z?sO|u7A}v6;#Mr4h=Gljg~~&*C~|15$3|_{^ia8Fm*IaqX~nUTB57IisGSU3VQ4iq zw=`Ba)Nke9unrr-boXw>P1thFZS2%aOSotNJs$cD5cW}#q5$&k)h> zq9ebeA@rE+-3DJF_(T^Cfs8opPcejzIi_d`y{_~QQPSAt__Cr{)2#ADC=!n+qPC37 zD28mTduZC_b}ST1+P0;}F$bv~v#of-j;moB3MG=!Sd11$bC2gMkI&qT2GBdEK8tf& zhG{Zi3w({Ch@UZp$>MzG7Iaqdo|YHq}+voL9LGBl^m zkQ#!vpRtDtHcwf73_g`k(a~q+ona87*zofiqJJ|CceTZvk#~ymH8^50FCHWBRB#$& z6q*f+4nS@hWB_7A5|63L(n^LwN0S(fJ(h3LPy>>8idP`-RN`kmGP|N7WE0)z6IgUS z`U}y|iG*)e#oGa;ek`k2$XAfO^MkJuX<@JxZ%CmDqS%Ox8Us=<-XZQI<5;hw$)qBoGHFGlxyv?&CEl3S zOHK^$>Iq+C6dQp4C0%rk%3JR#&6mE$sNKIw#@G0<^G-6p#*eS(z|K2g_=?fz4uKPx z{Nka0t7xijXHrXE!%Ax6G@q zQNM?*!r+QWqBz2{;@mPO6Cu1u~io`rD0HEM5ShvC&Cjy>7-vS4lVrgaVJ zW%ae*+c%C58a8gIUf5jA{1z`seR9QI{Lr#3s54fcOH4Ttu`N5!Q_@g*A|8t3(TUig zlV}I>{~$76iUyWaXKu)GN*xX3xP@tlL*WE|F!&%+om2Xlh{dC!SePY^TcJ?c;ubC* z$9xrezl+;?Jq~$FEi8s9MgfzIsWBUWpUc|PTvO^(CPNcjVLnxHjt3j#7OTJqknE`p z0e33E1c^lB;b_GyQdK^{(5x=GrZOMjEzpdBgKSN2`WJlS~P@$9j*whV**B6CI}GyiMeJgcOkPt33)B>rucw z!;f!o`3hKq_dHW6-`h@u_dXt86wvpi$2W|8S#WDF73ABLSwY*^a=~|t)8IW%|M0Ei zGZaC)>NfS=)G8dSl!c(! z(%jZVq&5hxHPsE+_OHTr0X&~2!+p5SE{l{!%VK5m?m*S8Z7t1B)tlNC<5@@P zp6z-DlCC+mcBmzxJA$9S@EfQ{=j);1wJgdfskH`Q8|n?LeyA|=^vJR0sgB1d+*T1e=kU~TzcQiYi3zv0k8Jw+_iw%ThaHQiE|~RvEhM9x^6hJRCkkg73jE^^6% zywH+cZqB09mw&OPj_cozCApbx6xz(0?d`Vh&e_y4;|2nmDtsQxE8~w21RDS2hR$c_ zXF6!)ho&y{RGd=izn&TGe57(l=e)*fhaZ~xz<(ukDxJ%lRhVY} z0M;PmhgL4te_k#$mAs13o?gbV0WFu;=Mea%J-v)!lle;5DWx*g3SH`Rrs{`*U18*XI8S5p7XZcqJ_;DCG5PU;Nq~uf z2^y2X5O5J-G9aii`6(JmUkt$K{3^~R8k1+dX@JWBmugJDOatlZ0A4cy&HFZo|Q{U7v+rk_qE@^3F zZl0#xY>U|D`V@W24~$tdg>|D(7n827=tGYCrcQUQ%-R|{6_jf~^esMn$b06{tz+mT zA1`i?9P-$<=ZlMHQs(H4KU%F>r@B5?8S7(Fnr-p3UYk1oSWmgu@yg(z4_fI`UFuf? zozK7LQ{vO7Puj~PW8}oOyUJL{i_&feDkl8!DopRaXP9%_^w*pl?tiKBu46SR@Y&5j z>T(`V-kd%Az$a7RTDjI~J2xKdLb0&dh-_dRA5J|n;40_&A@4f>{KAfZ`Nj9EDj$7$>7h}vuhCDIJTdwC zb#o8VFL~l?cMm&6zlf97ak4HyEX#bEH}m}UfzNh+b9Pl~;ni0=9~nJ8wHkJm(~g)t zYe0VQJqu`;b@^e!Lq_=yRfmsHy25t-?@)5`THndRo}XC#WatiaG|v8P{9}qI4&a(K z{oYRACuSXW9?E~I>nYb*uB%*6xsGxT<@!oY{)1jmxu$Y$<$B6>cp`vnF){f`09jYL z&YJ71throgxu){sI?IbZYa{C_*IILZVWoYDE@Qx#gBX6ZI{+jxlzvN8&g9k|0Cs( z_Vkp6wmDVW=RQZf@3k-Ld;eqPlqo<ysJOmyz7z06 z>pY}R%&7pKuU}j*Mh&EGflEHOtK;i`Z&Nim{j`^B#>o3rXq6w6Hrj9sG(5QVgDtPZ z`)yZ8=}COr6rl69S3DK6?XQlXw)oLe?X8k*bd5CYwGTXLkI&@LQX|Sen&)mO-o6}X zR{Na4o!o=7uYFm~XEpE859Jy=C$=BLxf=9&>@%ZK?g z55fBrp7IOUBoBeKACmno>cMPc;~6C)LZfperMMhtV&Ea9s`nc_p_@%y&@?Df?y?h^)_fo!(@;y}EPvyOo z=eq>n%RTRvb6%eNn&-Vd=jA<~`^q^l&wb7FUO59ko#(!M-{df5z!Jb>z#@&we-gkx zSPEdD5R+d9_!M9TV7bQRuhKyJYQRd3$$vUWMt&9GTEJ?+H5!v&qk;5VO%qoG)&V%y zhG|T`22cy&SmbXF#N^We=3NIkPh)8ZWo*xS4W!ww4S+CUl*Z)iHBBu2FZUth)#)OI zg=Y5=cu^)aap!B#{G{@ickXE?{mh~UkER^!NQbroa(!wY4iWm|rTlDO_m8wya?&El z$WiyfL!Y$rNf|G>Cv=r*YtW{?sUz}E`Z978n(eAG+NkL69L#*YJe7a8<&iO$cYblt zkSd{{U9>~B(U7;3)^f9k%2xD|L#NcouvN9X{E;!a{!O1s$Ltqrqv^+>RSx2laW!q` zrf8{&nSUNX)UPsp3e7yLjQR+z^d)EN81?b`!mu^{o3<5pMxRe{Q;KPkYKOzTRA+(!QhOtyUy-&5T~blkb;>s5Sy=Wei_FX=b7N0s6d7H|_OtM*CJl{Lxh9<+ZOMy>C)YXJhO&uB{oL zbd{lBlx8Nz@8!N|+8Ay1=(o1+Nxijo_YoIA2zn1_#RET>y6%Nkc3N%I5#pb&9st?+ zBjl+^e~>$_d=Fm7T>h^Aso?#T#z#JrIIiqm?COcVsVDmHy?09$?~5Pu5?|sGyLpUH z2^Rmv)Tcf5Zanu}3fFyeoRVukOP+C<|8Fk+!x7sRm@RXGtG} zms1x<^IqL_`@Hr_`-zzk`~8>Ce#bdB`T8v5lJ6R|Hub>l1n;NVAH2WI`coD-OU(Pv zy}SR&lkN9A8fS?iKSE4B`XjIXsBuJn^1xZ~|JK$Ep8l_^&J7c@zom}E%#U&xyW^Yr zF)xm9V)8g2I&$WfFYw$6`n!2vl+rwOcB_8Z{=i@G^q;!pWpm=F`x2LaUi`QC)AUPx z_t|$n_>&(#hZuW~5TAMF|7L%F`yiDc@!e;Snxf^7mZ!9SO7z}->_z5xBs$|f+NCs~ z627~=7d(9ip7a5H^l=fB9|#x>7z8*IaF(ViBh9lK-s5=P57te&o07h#}p66Ty(manKkmflUfi%x22&8$|LLe>QJ<=zA zOaP1r@LLUH@)H3;z=eQG8k3)_f%HXyO8^%Grf5ulDnQP`E(L9#hs^+A4w$Yn`H-fG zc`ghmJon;#@(VSP=J^*f?=RLsdWi60?@D>RU%EqP-4qKvvcFC$1Ul#}QA8uK7FdFH~iwhsZW)|foc*a)O~)>8~0p|clX-s|_U?G5GfMboAJo}Y>#(rgA5|igR;Fx3Iatsoa zXP?W(Z%#??oq41^8oO4}R^PRX+|(DJl7r-9 z=$N^wZ(@u25ucJLa^V?-5^0AjH-uddy%FYiBzg4b(6{aYCNAUKiVsGCj@zDE*te=TuIwQ1AHxKlJDyAFkN=?#(Ly;&iF`oBDykZy%f5QJ=Y~lP&T?m(~|v zjWR~PeA3KF*+ZXKVVd9HGPidh8R9(s>wEZpZkGJOf1i>iKXveZ5B=uEUdVT3i8pP& z^`Y-Rut$A2Ow0)UZkO2op4a_8nBNTxANtqb&R4&=ZX_|~&;4j~)hlD_M-odsBM%i9 z@l`(4MwCt2d(Sw2Pn{(u|I_)uQ~7A@e6D3Uw=@A_`v1mr-*(6olmFBFNvUH;m+vPg z-?epU>Q@sN>?dA-vQqh-7>*OU_ZL(i z#9g~ae~IlS=Jy1QBkgzjVOi}@;-P(m8DGUi9Ce?0Q=fSK$(xmb?JrCI49ExYCN5&~ z0|DG)a1YLX1~K`w07C(11BPf!p8Jmx0Paz^KOrVR5-=KIuD|5DH#iUQVZgZ>ljlB! zdj;+pxDS!N1NRi%M~?@L)0q53KoD>tV3Nk<8G}H2vIf!@0T`S2D8B@7F<^?usYn>btQ+LqQ#HM=|^blgkF49zN=I;W8FEny5s2Phm~CD z!tz(!2RDCK>$^1d#lLAQa>;@D)0T2+qtK=f+beCCSfVd-(J|XD`AdDIy;29M4{Vfw zkxLGg3(b6}-#KEO{ySoiRyrc5zNVF2+9-KSdqqFjr}QcP2yN(?u}r$cjBDttevy1A zH|s;1HKDD@g{B-s(bu|Tu1&Pj>w!xaS&NIWp?EfpHP_D?-K}G;r>Bip>oFT?w6mWy zOQrIIA6}=QF22|5xgYbh_v_ZlTiZOfQf=hD3@Kg5j3WEkOYr-uC$oQX_KzQMkeK|L z-~GDt;*tReiOKKmvQt02@4W-WEmbm$*YqRvb^12n-^p>$H>zS{rc%QGF2>u}G$toV@jQ8G!DTi|0 zR~YxRTCVh=C;o7MYzqFBKgy}cxbEK{@5`>cBb{YFL|vddVx%-Fz2k{n;_5c6? literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/astronautB.glb b/apps/website/public/queen/models/astronautB.glb new file mode 100644 index 0000000000000000000000000000000000000000..22ef8a7db564034f707409dde127a8437527723d GIT binary patch literal 27824 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 M1N#M&Ab0=pe^q@v9RL6T literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/crater.glb b/apps/website/public/queen/models/crater.glb new file mode 100644 index 0000000000000000000000000000000000000000..420d01b77c2fa20872a716af05fa93b292b4cb68 GIT binary patch literal 5684 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 SxWOd)O$PYQ#&40t?|%VVFF&yW literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/hangar_largeA.glb b/apps/website/public/queen/models/hangar_largeA.glb new file mode 100644 index 0000000000000000000000000000000000000000..dd12f438fe8232f818e11ba4293b31013a33c273 GIT binary patch literal 25304 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 literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/machine_generatorLarge.glb b/apps/website/public/queen/models/machine_generatorLarge.glb new file mode 100644 index 0000000000000000000000000000000000000000..d554538771e2a5153071219baacd3b37aa61a7d4 GIT binary patch literal 10220 zcmds7Yj9gv5muo*0;J{90)d1&mr@!~jC3Vgk|BQ7c{HsZr?wMX(qLp;wng=DBsniT zMdh7BO(_JLLP~jrwh$lwk%K1_u8055GE0=`iW=kMG;N=lWQF$u-F^ zDD%yJyLWfbo;`c6G)YFXecN9V2n3#gZy@m4>jHsWdb@W`IO)UXbiR}+=^>|i zpL6TYJ^i^hkN7*y zAv}V6_wcYRs;Y^0-H01>%BkWAD~d#uP42NE7Famg^R`!CS$q_=dgYk)!_h>d{`F(Y z7^=0`kHl-rk1SDsQ^c)VKG`&P@g<|9ZcX!|2^j3&Eg7B+)r7~`jJe?)j={lnsZ=m0 zEeF9(Pv^^hVvdDf>~63yp2x|C6X3bjVT@0xF%}Fp zHYFmVup1|fVbxp)qqc9eJPSgIF<&U=QrXN=4)ZW3I6d22ucGk0*;-*m%dViuZB6g& z3T{1nUUr4ZVteTAXzy(AS#XV*-`6C=LM`=9X)p>RKYq$zFC1 zOwel9h+NR`qZ zg>0d?JvAur(0yT!vzv&yQ8yX|cSA15+zp1gil#8msHSML`L<(0XQ(hfkWKeyhWx3= zoy?Anrn(A4EUbHX`)zx+;f*}uXsJV~;$15$6NSa2u~0G*=KXV%iBKfzx(V<|G#rjM zMH82}V(G=!m6zQVkA<4t2nvmdLm@YuB#TF4iD>e2RJ_6_C!&!sz8~p;#i} zMp=6jokzznNyRc~rO~wa9jpV=l`f4o%#maJ`HLx!PJ8EslgSPh)BFnL zt3r>hoEzJng0+l8Di>4vQZ`kVpJe+&LHvPZu~434l94J6rm}cZ;AMnA`>prHq7yJT zxr^lCMt&*Rk)H3h5`G1SxS`S@eoyM;>E2L)c|fOzhK3tA1Ohkh+!Z)^a$U>we`#zD z1S->j&njZ-H!(T8@!?VRe*wFu_)IeKN+ z#(kNdGrvGU(Q|E@@Lz! zGp9e>hMU>8axN6h8f?3%fzs#jnbvy5KFj^HW6$RF&F-`5rOn%E> z`eykvUfvI^-*8GR*5{Vp-!JE!vFh*JP2Wr&6H9+{f3ct1_b2<(vcSEb^G@KstGR=6 zXU+S^#xP0 zqb7VRs4Gw*TR9K3{`u^F#`9AzN6qq~e?9yX<*%5vE7CCYI{P=OpaM`y6)Hf$|<;Ra(hWm9?teWcNNL~MZ#|-#2F~6CK zIyslRVi*I9=9eibX`5^n)ndirK? z>Yil(Xn%6(nl{S*f7~nn)ahsRU+Hs7W4HXPYOm5C_8Ik`F}mif>N;Xa9`V0;^pw;$ zHMvP7^LJeLyXw^B<83=O-d}yDHy)%;Nu6=}e1Z%#a zs~ftoj}4+zQn%vGT%ZSQtJnW?{yATXJUnm4AzwRnN~3cfKG*fcZv5E~?IWc0S^CL- zP-lHplfU6T(SB|4^{L6@QooU2KQ~l$eUXgQIz)0^=3{;Ir!+eAc+Wj)&PngR+>V6UfEqB5|(=M5pxpr4IP7 zV|^lN*Ld9Xdt@C-{{N3F__c)(CG}S-r@Rt)4e)Bqmud?fUAM4 zfVC>AzY%x~@MhpmDyd%sybX9OaIH$}Z/Q%?B~1^GLbQ?6H#zF<&>KhjcN-+hJX*Kr0xPS zAPPiOQf~s1Kmv%Xq~5HY@`K7LKLqf{82^G{i%RNk$|>6w*rt;D&A_d|Ex=Bd)H{K0U>DG(lKO6-7w7?QQ%SuK_%N^+*rSsA?aC?d0PY0# z0UuFGeLwIqpda|CO6n;E`2dgxhJZnp)Q5o#Fba&Qr2cUr2V{Y}R8r3a2Y@l402EbH zFV)znmw`jTL10`Z^~1mfa1=NKOsb@Qtj0$DZr~oE0(?Rx^-n6N{FH+H)5r~Ewd1>j!bxJv3@1il1J0r#n-en0RP-~r&vDye@J_&V@4;Dk!*4+7r+9s*9P zr2b6>`6=a;4=c#Or67MqLH=#vd%$;r@2EVjoRaqMTl%Bm#A9lsr2e>q{09K-wEa*e zZD$nZKT?qYSV8`Tf}HCTtl=lhDSxUU{~2&rb#nUi`8nm3KUYrq3+0q%tzUw(h9?2m L$l55WKLz{;g*tCy literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/platform_small.glb b/apps/website/public/queen/models/platform_small.glb new file mode 100644 index 0000000000000000000000000000000000000000..0d0bb8954f7f9e6fa83872874416fbf69cc96c5e GIT binary patch literal 6280 zcmd5=$xa+s6zwF=JkN9DROYx%s;lR=4Q^wwv4O@6juS#q(G*Z}52&l~gpk-o$}$@- z9LdZ42AI9`2U+9~Vkwr1l}*lhbze~p?R2*+Cn@Xb4)5II-S?`%ELJ85ACARhKfDo( z{rW^Kc50$Dx@tI=e5dBQ^_n;3IrBzg+Bki3e70))PQ$e;-t0=P;`+u++^{{*@r}Z& zvFOyChV9oIM!}e>xhIAv2M;ECtgI0?E;tRQ!h+Rf8f$T5Ze?KsKBQeW<}Ulruv1&~ zmyAL(pG&PFX|R6QbuJ1=@r{CsCD2O?3#zD?Iy#X^TXDm;8;k5HnaXFZwKxj24i4DS z>fOa#Ni!9+qw8lgxz5Wc%`BRYmQUrdpJ?~Vf9O7$=3b-WR;ruuY<^dGf{y0uJl%5H z@w~b|Dm6(SORJ;sFE2Yd;w5%qsc?9+Lv(rW=}e9 z_9TEbs#RUwk?DiV8K;1+R&P}8ihG5ZZ~-^Z*%?aENMg^O=&q5r1!Pc>OSeR_jB z3ncHggNgp)aB;k4iF7#3goSf&TSKnu-c58=BhyINr5AGaIlyX-oXO`92ueP$D; zX(jU1vdMHV^g*9R$bq{Al#}tEW8tL zZQjKf4nHk$jK1G+=T>~0tHxMqVrX)xG^)OIqowhY;;>P`t(Y7**Iz1)AD=ai0)D)N z*AqM*`rgc_a=)1qtuy0=yWh;#+6;f*)-aD?isdD@GT(6c9p-BxL-ni6V>Y}#M(H=~ znuqzSAL!F&9REOU)cq!xx}sj$uHdD>i-&(Rk#}Ox`7|fBkTjvb{vD*{yX)b12a_A| z%J?lr?t|ny+->H~A$mm$(mImpXZTls{0Fu6u6c3oo1@`OG0ubB^YW@O!BXU+Lhr%tH>I zus6xg7(QX2Qb*5?Jtz*P*1_kx=Fq>vBzWlCq#|6ctG#IdPuH%|J_6ZGw9q#q9MOk0 zAF)cOAF-id>%09?zSesqu_`}%V@>*7=;W(Ca($Ps`O4p-AMxL7zdQX)UGkgu675H3 zwGnW3az;41PvNNi)b-w@vEo;Glpg6p^Lr!v6@D~l*aP@M9_EO})_E7!sr}dbAN$hk z9zynYq6a;PeT%8~(^6+%E=c~iy3B(i>z(M4{F|NVOdLGxYTxa2;~dN=$z3yvp<;qhIv&5snMn0?K$3yFJ*%{>K-`LF7@yoTbDCo zeAoJ|?bWS2SAH&1{`uGUltrsJwTUE9!=jkWXi>paSiAFz(z z+CFrHl6^wn5c>vg<`cQ4ZLY(QconC3kvN@4EmF;sHs=JX*VWu3JRKkMG{4LIVIEz7cV9X$ zCI9C65Wt6$_9Fu7`$VUFR6zYP0rkfL{K-^3%t4)8a-IbE=ylppiB0a)qEj;FIpA5~ z8IiQ{UzONPz>B~OB5A)2yav1qydskJ>%d#Un*jctt0e8Wf%kxSfp0z!$*hz-J<99{_rQgFsv)?Jot?P0=Y60_v84dJ;$hItO)f$w`Y} zuhY%|v{^SRIwfN`;~c>GQqt!6Qm4!ds26}kfaX%t*5^*09NLtO;V-oOPsd@AwD~bV z1{8s#K)*=Z?D06j{wQg4KGZ1(1k?wC6M*JY($;gMP7ZBK#+(9%fRiF=p9Y3SM(q*! z#()wqDw6gYvBx24Q*wO*I15YxlOkz<1)LKZwZDe%TVNXaMkMVS!FS@Lq;D4Z8x!t* AT>t<8 literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/rock_crystalsLargeA.glb b/apps/website/public/queen/models/rock_crystalsLargeA.glb new file mode 100644 index 0000000000000000000000000000000000000000..b880cffcf1a219b3c64d864a94f5befae445f14f GIT binary patch literal 26160 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 literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/rover.glb b/apps/website/public/queen/models/rover.glb new file mode 100644 index 0000000000000000000000000000000000000000..3daf55b7aa0a23bbc7ae2b8af2255b6342c02172 GIT binary patch literal 13384 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 uqEo6bK1@J;xagFJip}-Ifd2!;Ou)wg literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/satelliteDish_large.glb b/apps/website/public/queen/models/satelliteDish_large.glb new file mode 100644 index 0000000000000000000000000000000000000000..2b246dbf9988bf30fe2d84c0565208025f225c2d GIT binary patch literal 13948 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 M8_-%v>TQ7k0kGN8o&W#< literal 0 HcmV?d00001 diff --git a/apps/website/public/queen/models/structure_closed.glb b/apps/website/public/queen/models/structure_closed.glb new file mode 100644 index 0000000000000000000000000000000000000000..a586872eeeda83a0d6a5fb08b334ab09fd5c75fd GIT binary patch literal 15604 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 bGaV8*8)gjm7(VC0e9sY>4S@Unu=u|RRg^q5 literal 0 HcmV?d00001 diff --git a/apps/website/qa/queen-viewport-contract.mjs b/apps/website/qa/queen-viewport-contract.mjs index f48301ec01..4d81583001 100644 --- a/apps/website/qa/queen-viewport-contract.mjs +++ b/apps/website/qa/queen-viewport-contract.mjs @@ -136,7 +136,7 @@ listeners.push(msg => { if (msg.sessionId !== sessionId) return; if (msg.method === 'Runtime.exceptionThrown') { const d = msg.params.exceptionDetails; - errors.push(d.exception?.description || d.text || 'uncaught exception'); + errors.push((d.exception?.description || d.text || 'uncaught exception') + (d.stackTrace ? ' @ ' + d.stackTrace.callFrames.slice(0, 4).map(f => (f.url || '').split('/').pop() + ':' + f.lineNumber + ':' + f.columnNumber + (f.functionName ? ' ' + f.functionName : '')).join(' < ') : '')); } }); @@ -173,7 +173,7 @@ const DECLARED = [ // the views '.queen27-cards', '.queen27-kanban', '.queen27-mission-map', '.queen27-factory', '.queen27-factory-viewport', '.queen27-factory-bays ol', '.queen27-factory-modules', - '.queen27-tech-map', '.queen27-tech-details', + '.queen27-tech', '.queen27-tech-console', '.queen27-tech-map', '.queen27-tech-details', '.queen27-city-build-queue ol', '.queen27-hardware-foundry ol', '.queen27-city-console ol', '.queen27-city-head dl', '.queen27-city-build-queue dl', '.queen27-hardware-foundry dl', '.queen27-factory-command dl', '.queen27-activity-stream ol', '.queen27-flow-grid', diff --git a/apps/website/src/components/QueenCombBabylon.tsx b/apps/website/src/components/QueenCombBabylon.tsx index fdedc885ca..ddd60db02b 100644 --- a/apps/website/src/components/QueenCombBabylon.tsx +++ b/apps/website/src/components/QueenCombBabylon.tsx @@ -11,7 +11,7 @@ import { Engine } from "@babylonjs/core/Engines/engine"; import { Scene } from "@babylonjs/core/scene"; import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera"; import { Camera } from "@babylonjs/core/Cameras/camera"; -import { Vector3, Matrix } from "@babylonjs/core/Maths/math.vector"; +import { Vector3, Matrix, Quaternion } from "@babylonjs/core/Maths/math.vector"; import { Color3, Color4 } from "@babylonjs/core/Maths/math.color"; import { Mesh } from "@babylonjs/core/Meshes/mesh"; import { VertexBuffer } from "@babylonjs/core/Buffers/buffer"; @@ -29,7 +29,15 @@ import { HemisphericLight } from "@babylonjs/core/Lights/hemisphericLight"; import { DirectionalLight } from "@babylonjs/core/Lights/directionalLight"; import { ShadowGenerator } from "@babylonjs/core/Lights/Shadows/shadowGenerator"; import "@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent"; +import { GlowLayer } from "@babylonjs/core/Layers/glowLayer"; +import "@babylonjs/core/Layers/effectLayerSceneComponent"; import "@babylonjs/core/Meshes/thinInstanceMesh"; +import { LoadAssetContainerAsync } from "@babylonjs/core/Loading/sceneLoader"; +import "@babylonjs/loaders/glTF"; +import type { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh"; +import type { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial"; +import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture"; +import type { InstancedMesh } from "@babylonjs/core/Meshes/instancedMesh"; import type { LinesMesh } from "@babylonjs/core/Meshes/linesMesh"; import { PointerEventTypes } from "@babylonjs/core/Events/pointerEvents"; import "@babylonjs/core/Culling/ray"; @@ -66,6 +74,16 @@ const EMPTY_EVENTS: HudEvent[] = []; const RING_POOL = 24; const COLUMNS = ["backlog", "running", "review", "done", "blocked", "dropped"] as const; type Column = (typeof COLUMNS)[number]; +// Kenney Space Kit (CC0, kenney.nl), the user's "download it yourself, open +// source": one model per building state, three for done cards, the Queen's +// hangar, crystals, and units. Served from public/queen/models. +const MODELS = { + backlog: "platform_small", running: "machine_generatorLarge", review: "satelliteDish_large", + done: "hangar_smallA", doneDepot: "hangar_roundA", doneSilo: "structure_closed", + blocked: "gate_complex", dropped: "crater", hub: "hangar_largeA", crystal: "rock_crystalsLargeA", + scribe: "astronautA", wright: "rover", lapidary: "astronautB", larva: "alien", +} as const; +type ModelKey = keyof typeof MODELS; const MARGIN = S * 1.2; /** Point-in-down-triangle for the cell under a world point (x, z). */ @@ -116,6 +134,57 @@ function drawTiles(ctx: CanvasRenderingContext2D, size: number, per: number) { } } +/** + * Load a Kenney GLB and merge it into one mesh with a multi-material, so it + * can be thin-instanced like the procedural templates. Returns the mesh and + * its footprint (max of width and depth) and base (min y), both in model + * units, so the caller can scale it to a cell and stand it on the ground. + */ +async function loadTemplate(scene: Scene, key: ModelKey): Promise<{ mesh: Mesh; footprint: number; base: number; height: number } | null> { + try { + if (scene.isDisposed) return null; + const container = await LoadAssetContainerAsync(`./queen/models/${MODELS[key]}.glb`, scene); + // the view may have switched while the file was in flight: a disposed + // scene has no engine program to compile materials on + if (scene.isDisposed) { container.dispose(); return null; } + const parts = container.meshes.filter((m): m is Mesh => m instanceof Mesh && m.getTotalVertices() > 0); + if (parts.length === 0) return null; + // Kenney's models are flat palette colours: a StandardMaterial carries + // them as well as the glTF PBR one, lights like the rest of the field, + // and needs no BRDF lookup texture - the async generation of that texture + // ran its callback on a disposed engine when the view switched mid-load + // (TypeError: reading 'program' in bindSamplers), which the viewport gate + // counted as a failure. + for (const m of parts) { + const src = m.material as (PBRMaterial & { albedoTexture?: BaseTexture | null; albedoColor?: Color3 }) | null; + if (src && src.getClassName() === "PBRMaterial") { + const flat = new StandardMaterial(`${src.name}-flat`, scene); + if (src.albedoTexture) flat.diffuseTexture = src.albedoTexture; + if (src.albedoColor) flat.diffuseColor = src.albedoColor.clone(); + flat.specularColor = new Color3(0.12, 0.12, 0.14); + flat.specularPower = 32; + m.material = flat; + src.dispose(false, false); + } + } + // bake the glTF root transform (right-handed -> left-handed flip) into the vertices + for (const m of parts) { m.computeWorldMatrix(true); m.bakeCurrentTransformIntoVertices(); } + const merged = parts.length === 1 ? parts[0] : Mesh.MergeMeshes(parts, true, true, undefined, false, true); + if (!merged) return null; + merged.setParent(null); + merged.position.set(0, 0, 0); merged.rotationQuaternion = null; merged.rotation.set(0, 0, 0); merged.scaling.set(1, 1, 1); + merged.computeWorldMatrix(true); + const b = merged.getBoundingInfo().boundingBox; + const footprint = Math.max(b.maximum.x - b.minimum.x, b.maximum.z - b.minimum.z) || 1; + merged.isVisible = false; merged.isPickable = false; + scene.addMesh(merged); + for (const m of container.meshes) if (m !== merged && !(m as AbstractMesh).isDisposed()) m.dispose(); + return { mesh: merged, footprint, base: b.minimum.y, height: b.maximum.y - b.minimum.y }; + } catch { + return null; + } +} + export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = null, fitInset = 0, events = EMPTY_EVENTS }: QueenCombBabylonProps) { const hostRef = useRef(null); const canvasRef = useRef(null); @@ -159,6 +228,20 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = const scene = new Scene(engine); scene.clearColor = new Color4(2 / 255, 8 / 255, 6 / 255, 1); scene.skipPointerMovePicking = true; + // the rendered look: tone mapping with a little contrast and a vignette, + // depth fog into the void, and a glow on every emissive part (windows, + // lamps, bands, rings) - what a game's post pass gives a low-poly scene + const ipc = scene.imageProcessingConfiguration; + ipc.toneMappingEnabled = true; + ipc.contrast = 1.22; + ipc.exposure = 1.08; + ipc.vignetteEnabled = true; + ipc.vignetteWeight = 1.6; + ipc.vignetteColor = new Color4(0, 0.02, 0.01, 0); + scene.fogMode = Scene.FOGMODE_LINEAR; + scene.fogColor = new Color3(2 / 255, 8 / 255, 6 / 255); + const glow = new GlowLayer("glow", scene, { blurKernelSize: 24 }); + glow.intensity = 0.55; // ---- extents and the RTS camera: fixed angle, zoom, no idle sway ------ let minX = Infinity, maxX = -Infinity, minZ = Infinity, maxZ = -Infinity; @@ -168,6 +251,9 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = } const centre = new Vector3((minX + maxX) / 2, 0, (minZ + maxZ) / 2); const camera = new ArcRotateCamera("cam", Math.PI / 2 + 0.55, 0.95, 4000, centre.clone(), scene); + const depth = Math.max(maxX - minX, maxZ - minZ); + scene.fogStart = 4000 - depth * 0.1; + scene.fogEnd = 4000 + depth * 1.4; camera.mode = Camera.ORTHOGRAPHIC_CAMERA; camera.lowerBetaLimit = 0.95; camera.upperBetaLimit = 0.95; camera.lowerAlphaLimit = camera.alpha; camera.upperAlphaLimit = camera.alpha; @@ -214,7 +300,9 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = tex.vScale = groundH / (S * 4); const groundMat = new StandardMaterial("ground", scene); groundMat.diffuseTexture = tex; - groundMat.specularColor = new Color3(0.08, 0.08, 0.1); + groundMat.specularTexture = tex; + groundMat.specularColor = new Color3(0.18, 0.19, 0.22); + groundMat.specularPower = 48; const ground = CreateGround("ground", { width: groundW, height: groundH }, scene); ground.position = new Vector3(centre.x, 0, centre.z); ground.material = groundMat; @@ -318,6 +406,7 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = const hubDome = part(CreateSphere("hub-dome", { diameter: S * 0.5, slice: 0.5, segments: 16 }, scene), gold, 10, cells[home].x, cells[home].y); hubDome.isVisible = true; + // ---- rings: picked (gold), hover (dashed, territory colour) --------- const ring4 = () => [[new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]]; const picked = CreateLineSystem("picked", { lines: ring4(), updatable: true }, scene); @@ -364,17 +453,19 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = .map((c, i) => ({ i, d: (c.x - cells[home].x) ** 2 + (c.y - cells[home].y) ** 2 })) .filter((e) => e.i !== home) .sort((a, b) => a.d - b.d); - (devices ?? []).forEach((d, k) => { const r = ring[k]; if (r) put(`crystal-${crystalOf(d.family)}`, r.i, S * 0.4, 0, 64); }); + const crystalSprites: Sprite[] = []; + (devices ?? []).forEach((d, k) => { const r = ring[k]; if (r) { const sp = put(`crystal-${crystalOf(d.family)}`, r.i, S * 0.4, 0, 64); if (sp) crystalSprites.push(sp); } }); const running = cells.map((c, i) => ({ c, i })).filter(({ i }) => cards[i]?.column === "running").map(({ i }) => i); const indexByNumber = new Map(); cells.forEach((c, i) => { if (c.cardNumber !== null) indexByNumber.set(c.cardNumber, i); }); - interface Bee { slot: number; busy: boolean; work: boolean; from: number; to: number; t: number; speed: number; hover: number; line: BeeLine; body: Sprite; larva: Sprite } + interface Bee { slot: number; busy: boolean; work: boolean; from: number; to: number; t: number; speed: number; hover: number; line: BeeLine; body: Sprite; larva: Sprite; bodyModel?: InstancedMesh; bodyK?: number; bodyBase?: number; larvaModel?: InstancedMesh; larvaK?: number; larvaBase?: number } const bees: Bee[] = (workers?.slots ?? []).map((slot, k) => { const line = LINES[k % LINES.length]; const body = new Sprite(`bee-${slot.slot}`, manager(line, 16)); const larva = new Sprite(`larva-${slot.slot}`, manager("larva", 16)); - body.width = S * 0.34; body.height = body.width; body.isVisible = false; + const size = line === "scribe" ? S * 0.28 : line === "wright" ? S * 0.34 : S * 0.4; + body.width = size; body.height = size; body.isVisible = false; larva.width = S * 0.3; larva.height = larva.width; larva.isVisible = false; return { slot: slot.slot, busy: false, work: false, from: home, to: home, t: 1, speed: 0, hover: k * 1.7, line, body, larva }; }); @@ -394,7 +485,52 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = aimBees(); const beeAt = (index: number) => bees.find((b) => (b.t < 0.5 ? b.from : b.to) === index) ?? null; const flightLines = bees.map((b) => { const m = CreateDashedLines(`flight-${b.slot}`, { points: [new Vector3(0, 0, 0), new Vector3(1, 0, 1)], dashSize: 6, gapSize: 4, dashNb: 40, updatable: true }, scene); m.color = Color3.FromHexString("#64DCFF"); m.alpha = 0.55; m.isPickable = false; m.isVisible = false; return m; }); - const unitRings = bees.map((b) => { const m = CreateTorus(`unit-ring-${b.slot}`, { diameter: S * 0.26, thickness: 1.6, tessellation: 20 }, scene); m.material = green; m.isPickable = false; m.isVisible = false; return m; }); + const unitRings = bees.map((b) => { const m = CreateTorus(`unit-ring-${b.slot}`, { diameter: b.body.width * 0.8, thickness: 1.6, tessellation: 20 }, scene); m.material = green; m.isPickable = false; m.isVisible = false; return m; }); + + // ---- the Kenney models replace the procedural templates as they load; + // a model that fails to load leaves its procedural stand-in -------- + let disposed = false; + const modelInstances = new Map(); + const placeModel = (t: { mesh: Mesh; footprint: number; base: number }, matrices: number[], target: number, parts: Mesh[]) => { + if (disposed || scene.isDisposed || matrices.length === 0) return; + const k = target / t.footprint; + const out: number[] = []; + for (let i = 0; i < matrices.length; i += 16) { + const tx = matrices[i + 12], tz = matrices[i + 14]; + out.push(...Matrix.Compose(new Vector3(k, k, k), Quaternion.Identity(), new Vector3(tx, -t.base * k, tz)).toArray()); + } + t.mesh.thinInstanceSetBuffer("matrix", new Float32Array(out), 16, true); + t.mesh.isVisible = true; + shadows.addShadowCaster(t.mesh); + for (const p of parts) p.dispose(); + }; + const unitInstances: Array<{ key: ModelKey; node: InstancedMesh; k: number; base: number }> = []; + void (async () => { + const keys: ModelKey[] = ["backlog", "running", "review", "done", "doneDepot", "doneSilo", "blocked", "dropped", "hub", "crystal", "scribe", "wright", "lapidary", "larva"]; + const loaded = await Promise.all(keys.map(async (key) => [key, await loadTemplate(scene, key)] as const)); + if (disposed || scene.isDisposed) { for (const [, t] of loaded) t?.mesh.dispose(); return; } + for (const [key, t] of loaded) if (t) modelInstances.set(key, t); + const bind = (key: ModelKey, tpl: Template, target: number) => { const t = modelInstances.get(key); if (t) placeModel(t, tpl.matrices, target, tpl.parts); }; + // a building takes about half a cell, so the roads between them still show + bind("backlog", templates.backlog, u * 1.3); bind("running", templates.running, u * 1.25); bind("review", templates.review, u * 1.3); + bind("done", templates.done, u * 1.35); bind("doneDepot", doneDepot, u * 1.35); bind("doneSilo", doneSilo, u * 1.25); + bind("blocked", templates.blocked, u * 1.3); bind("dropped", templates.dropped, u * 1.2); + const hubT = modelInstances.get("hub"); + if (hubT) { placeModel(hubT, [...Matrix.Translation(cells[home].x, 0, cells[home].y).toArray()], S * 1.25, [hub, hubDome]); } + const crystalT = modelInstances.get("crystal"); + if (crystalT) { + const mats: number[] = []; + (devices ?? []).forEach((_, k2) => { const r = ring[k2]; if (r) mats.push(...Matrix.Translation(cells[r.i].x, 0, cells[r.i].y).toArray()); }); + placeModel(crystalT, mats, u * 1.0, []); + for (const sp of crystalSprites) sp.dispose(); + } + // units: one instance per bee (walking model) and one per larva (the alien) + bees.forEach((b) => { + const walk = modelInstances.get(b.line); const idle = modelInstances.get("larva"); + if (walk) { const k = (S * 0.3) / walk.footprint; const inst = walk.mesh.createInstance(`unit-${b.slot}`); inst.scaling.set(k, k, k); inst.isPickable = false; inst.isVisible = false; unitInstances.push({ key: b.line, node: inst, k, base: walk.base }); b.bodyModel = inst; b.bodyK = k; b.bodyBase = walk.base; b.body.isVisible = false; b.body.dispose(); } + if (idle) { const k = (S * 0.26) / idle.footprint; const inst = idle.mesh.createInstance(`larva-${b.slot}`); inst.scaling.set(k, k, k); inst.isPickable = false; inst.isVisible = false; b.larvaModel = inst; b.larvaK = k; b.larvaBase = idle.base; b.larva.dispose(); } + }); + })(); // ---- event glints: a ring that grows and fades on the issue's cell ---- interface Effect { index: number; tone: Tone; start: number; flip: boolean; flare?: string } @@ -477,11 +613,22 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = const e = b.t < 0.5 ? 2 * b.t * b.t : 1 - 2 * (1 - b.t) * (1 - b.t); let x = A.x + (B.x - A.x) * e, z = A.y + (B.y - A.y) * e; if (b.t >= 1 && b.busy) { const ph = nowMs / 700 + b.hover; x = B.x + Math.cos(ph) * S * 0.12; z = B.y + Math.sin(ph * 1.3) * S * 0.08; } - const sprite = b.busy ? b.body : b.larva; - b.body.isVisible = b.busy; b.larva.isVisible = !b.busy; - sprite.position.x = x; sprite.position.z = z; - sprite.position.y = sprite.height / 2 + (b.busy ? 2 + Math.abs(Math.sin(nowMs / 140 + k)) * 3 : 1); - sprite.invertU = B.x - A.x < 0; + const model = b.busy ? b.bodyModel : b.larvaModel; + const other = b.busy ? b.larvaModel : b.bodyModel; + if (other) other.isVisible = false; + if (model) { + const mk = (b.busy ? b.bodyK : b.larvaK) ?? 1, mb = (b.busy ? b.bodyBase : b.larvaBase) ?? 0; + model.isVisible = true; + model.position.set(x, -mb * mk + (b.busy ? Math.abs(Math.sin(nowMs / 140 + k)) * 2 : 0), z); + if (b.t < 1) model.rotation.y = Math.atan2(B.x - A.x, B.y - A.y); + b.body.isVisible = false; b.larva.isVisible = false; + } else { + const sprite = b.busy ? b.body : b.larva; + b.body.isVisible = b.busy; b.larva.isVisible = !b.busy; + sprite.position.x = x; sprite.position.z = z; + sprite.position.y = sprite.height / 2 + (b.busy ? 2 + Math.abs(Math.sin(nowMs / 140 + k)) * 3 : 1); + sprite.invertU = B.x - A.x < 0; + } const ur = unitRings[k]; ur.position.set(x, 1.2, z); ur.isVisible = true; const line = flightLines[k]; if (b.busy && b.t < 1) { CreateDashedLines(`flight-${b.slot}`, { points: [new Vector3(A.x, 2, A.y), new Vector3(B.x, 2, B.y)], dashSize: 6, gapSize: 4, dashNb: 40, instance: line }, scene); line.isVisible = true; } @@ -521,6 +668,7 @@ export function QueenCombBabylon({ cards, workers, devices, onPick, pickIndex = document.addEventListener("visibilitychange", onVisible); document.addEventListener("fullscreenchange", onVisible); return () => { + disposed = true; document.removeEventListener("visibilitychange", onVisible); document.removeEventListener("fullscreenchange", onVisible); ro.disconnect(); engine.stopRenderLoop(); scene.dispose(); engine.dispose(); diff --git a/apps/website/src/pages/Queen.css b/apps/website/src/pages/Queen.css index 99a5b9793c..b10fc5cc38 100644 --- a/apps/website/src/pages/Queen.css +++ b/apps/website/src/pages/Queen.css @@ -3890,6 +3890,9 @@ main:where(.queen27-page.is-shell) section { min-height: 0; padding: 0; border: 0; + /* the strip can wrap for a frame on a phone and push the console 8 px past + the box; the tree is then a declared scroller, never an overflow (P1-31) */ + overflow: auto; } .queen27-page.is-shell .queen27-tech-strip { @@ -3928,6 +3931,9 @@ main:where(.queen27-page.is-shell) section { min-height: 0; max-height: none; border: 0; + /* on a phone the map and details can exceed the console by a few px in a + transient state; the console is then a declared scroller (P1-31) */ + overflow: auto; } .queen27-page.is-shell .queen27-tech-map {