@johnmorrisdotca/uchusen-rockets 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/CHANGELOG.md +30 -4
  2. package/NOTICE.md +22 -4
  3. package/README.md +16 -11
  4. package/dist/assets/hubble-hubble-aft-shroud.glb +0 -0
  5. package/dist/assets/hubble-hubble-aft-shroud.painted.svg +1 -0
  6. package/dist/assets/hubble-hubble-aft-shroud.svg +1 -0
  7. package/dist/assets/hubble-hubble-aft-shroud.thick.svg +1 -0
  8. package/dist/assets/hubble-hubble-antenna-far.glb +0 -0
  9. package/dist/assets/hubble-hubble-antenna-far.painted.svg +1 -0
  10. package/dist/assets/hubble-hubble-antenna-far.svg +1 -0
  11. package/dist/assets/hubble-hubble-antenna-far.thick.svg +1 -0
  12. package/dist/assets/hubble-hubble-antenna-near.glb +0 -0
  13. package/dist/assets/hubble-hubble-antenna-near.painted.svg +1 -0
  14. package/dist/assets/hubble-hubble-antenna-near.svg +1 -0
  15. package/dist/assets/hubble-hubble-antenna-near.thick.svg +1 -0
  16. package/dist/assets/hubble-hubble-apart.painted.svg +1 -0
  17. package/dist/assets/hubble-hubble-apart.svg +1 -0
  18. package/dist/assets/hubble-hubble-apart.thick.svg +1 -0
  19. package/dist/assets/hubble-hubble-aperture-door.glb +0 -0
  20. package/dist/assets/hubble-hubble-aperture-door.painted.svg +1 -0
  21. package/dist/assets/hubble-hubble-aperture-door.svg +1 -0
  22. package/dist/assets/hubble-hubble-aperture-door.thick.svg +1 -0
  23. package/dist/assets/hubble-hubble-array-left.glb +0 -0
  24. package/dist/assets/hubble-hubble-array-left.painted.svg +1 -0
  25. package/dist/assets/hubble-hubble-array-left.svg +1 -0
  26. package/dist/assets/hubble-hubble-array-left.thick.svg +1 -0
  27. package/dist/assets/hubble-hubble-array-right.glb +0 -0
  28. package/dist/assets/hubble-hubble-array-right.painted.svg +1 -0
  29. package/dist/assets/hubble-hubble-array-right.svg +1 -0
  30. package/dist/assets/hubble-hubble-array-right.thick.svg +1 -0
  31. package/dist/assets/hubble-hubble-equipment-section.glb +0 -0
  32. package/dist/assets/hubble-hubble-equipment-section.painted.svg +1 -0
  33. package/dist/assets/hubble-hubble-equipment-section.svg +1 -0
  34. package/dist/assets/hubble-hubble-equipment-section.thick.svg +1 -0
  35. package/dist/assets/hubble-hubble-forward-shell.glb +0 -0
  36. package/dist/assets/hubble-hubble-forward-shell.painted.svg +1 -0
  37. package/dist/assets/hubble-hubble-forward-shell.svg +1 -0
  38. package/dist/assets/hubble-hubble-forward-shell.thick.svg +1 -0
  39. package/dist/assets/hubble-hubble-light-shield.glb +0 -0
  40. package/dist/assets/hubble-hubble-light-shield.painted.svg +1 -0
  41. package/dist/assets/hubble-hubble-light-shield.svg +1 -0
  42. package/dist/assets/hubble-hubble-light-shield.thick.svg +1 -0
  43. package/dist/assets/hubble-hubble.glb +0 -0
  44. package/dist/assets/hubble-hubble.painted.svg +1 -1
  45. package/dist/assets/hubble-hubble.svg +1 -1
  46. package/dist/assets/hubble-hubble.thick.svg +1 -1
  47. package/dist/assets/iss-iss-airlock.glb +0 -0
  48. package/dist/assets/iss-iss-airlock.painted.svg +1 -0
  49. package/dist/assets/iss-iss-airlock.svg +1 -0
  50. package/dist/assets/iss-iss-airlock.thick.svg +1 -0
  51. package/dist/assets/iss-iss-apart.painted.svg +1 -0
  52. package/dist/assets/iss-iss-apart.svg +1 -0
  53. package/dist/assets/iss-iss-apart.thick.svg +1 -0
  54. package/dist/assets/iss-iss-arrays-p4.glb +0 -0
  55. package/dist/assets/iss-iss-arrays-p4.painted.svg +1 -0
  56. package/dist/assets/iss-iss-arrays-p4.svg +1 -0
  57. package/dist/assets/iss-iss-arrays-p4.thick.svg +1 -0
  58. package/dist/assets/iss-iss-arrays-p6.glb +0 -0
  59. package/dist/assets/iss-iss-arrays-p6.painted.svg +1 -0
  60. package/dist/assets/iss-iss-arrays-p6.svg +1 -0
  61. package/dist/assets/iss-iss-arrays-p6.thick.svg +1 -0
  62. package/dist/assets/iss-iss-arrays-s4.glb +0 -0
  63. package/dist/assets/iss-iss-arrays-s4.painted.svg +1 -0
  64. package/dist/assets/iss-iss-arrays-s4.svg +1 -0
  65. package/dist/assets/iss-iss-arrays-s4.thick.svg +1 -0
  66. package/dist/assets/iss-iss-arrays-s6.glb +0 -0
  67. package/dist/assets/iss-iss-arrays-s6.painted.svg +1 -0
  68. package/dist/assets/iss-iss-arrays-s6.svg +1 -0
  69. package/dist/assets/iss-iss-arrays-s6.thick.svg +1 -0
  70. package/dist/assets/iss-iss-columbus.glb +0 -0
  71. package/dist/assets/iss-iss-columbus.painted.svg +1 -0
  72. package/dist/assets/iss-iss-columbus.svg +1 -0
  73. package/dist/assets/iss-iss-columbus.thick.svg +1 -0
  74. package/dist/assets/iss-iss-destiny.glb +0 -0
  75. package/dist/assets/iss-iss-destiny.painted.svg +1 -0
  76. package/dist/assets/iss-iss-destiny.svg +1 -0
  77. package/dist/assets/iss-iss-destiny.thick.svg +1 -0
  78. package/dist/assets/iss-iss-harmony.glb +0 -0
  79. package/dist/assets/iss-iss-harmony.painted.svg +1 -0
  80. package/dist/assets/iss-iss-harmony.svg +1 -0
  81. package/dist/assets/iss-iss-harmony.thick.svg +1 -0
  82. package/dist/assets/iss-iss-kibo.glb +0 -0
  83. package/dist/assets/iss-iss-kibo.painted.svg +1 -0
  84. package/dist/assets/iss-iss-kibo.svg +1 -0
  85. package/dist/assets/iss-iss-kibo.thick.svg +1 -0
  86. package/dist/assets/iss-iss-radiators-port.glb +0 -0
  87. package/dist/assets/iss-iss-radiators-port.painted.svg +1 -0
  88. package/dist/assets/iss-iss-radiators-port.svg +1 -0
  89. package/dist/assets/iss-iss-radiators-port.thick.svg +1 -0
  90. package/dist/assets/iss-iss-radiators-starboard.glb +0 -0
  91. package/dist/assets/iss-iss-radiators-starboard.painted.svg +1 -0
  92. package/dist/assets/iss-iss-radiators-starboard.svg +1 -0
  93. package/dist/assets/iss-iss-radiators-starboard.thick.svg +1 -0
  94. package/dist/assets/iss-iss-soyuz-aft.glb +0 -0
  95. package/dist/assets/iss-iss-soyuz-aft.painted.svg +1 -0
  96. package/dist/assets/iss-iss-soyuz-aft.svg +1 -0
  97. package/dist/assets/iss-iss-soyuz-aft.thick.svg +1 -0
  98. package/dist/assets/iss-iss-soyuz-zarya-nadir.glb +0 -0
  99. package/dist/assets/iss-iss-soyuz-zarya-nadir.painted.svg +1 -0
  100. package/dist/assets/iss-iss-soyuz-zarya-nadir.svg +1 -0
  101. package/dist/assets/iss-iss-soyuz-zarya-nadir.thick.svg +1 -0
  102. package/dist/assets/iss-iss-soyuz-zvezda-nadir.glb +0 -0
  103. package/dist/assets/iss-iss-soyuz-zvezda-nadir.painted.svg +1 -0
  104. package/dist/assets/iss-iss-soyuz-zvezda-nadir.svg +1 -0
  105. package/dist/assets/iss-iss-soyuz-zvezda-nadir.thick.svg +1 -0
  106. package/dist/assets/iss-iss-soyuz-zvezda-zenith.glb +0 -0
  107. package/dist/assets/iss-iss-soyuz-zvezda-zenith.painted.svg +1 -0
  108. package/dist/assets/iss-iss-soyuz-zvezda-zenith.svg +1 -0
  109. package/dist/assets/iss-iss-soyuz-zvezda-zenith.thick.svg +1 -0
  110. package/dist/assets/iss-iss-truss-p1.glb +0 -0
  111. package/dist/assets/iss-iss-truss-p1.painted.svg +1 -0
  112. package/dist/assets/iss-iss-truss-p1.svg +1 -0
  113. package/dist/assets/iss-iss-truss-p1.thick.svg +1 -0
  114. package/dist/assets/iss-iss-truss-p3-p4.glb +0 -0
  115. package/dist/assets/iss-iss-truss-p3-p4.painted.svg +1 -0
  116. package/dist/assets/iss-iss-truss-p3-p4.svg +1 -0
  117. package/dist/assets/iss-iss-truss-p3-p4.thick.svg +1 -0
  118. package/dist/assets/iss-iss-truss-p5.glb +0 -0
  119. package/dist/assets/iss-iss-truss-p5.painted.svg +1 -0
  120. package/dist/assets/iss-iss-truss-p5.svg +1 -0
  121. package/dist/assets/iss-iss-truss-p5.thick.svg +1 -0
  122. package/dist/assets/iss-iss-truss-p6.glb +0 -0
  123. package/dist/assets/iss-iss-truss-p6.painted.svg +1 -0
  124. package/dist/assets/iss-iss-truss-p6.svg +1 -0
  125. package/dist/assets/iss-iss-truss-p6.thick.svg +1 -0
  126. package/dist/assets/iss-iss-truss-s0.glb +0 -0
  127. package/dist/assets/iss-iss-truss-s0.painted.svg +1 -0
  128. package/dist/assets/iss-iss-truss-s0.svg +1 -0
  129. package/dist/assets/iss-iss-truss-s0.thick.svg +1 -0
  130. package/dist/assets/iss-iss-truss-s1.glb +0 -0
  131. package/dist/assets/iss-iss-truss-s1.painted.svg +1 -0
  132. package/dist/assets/iss-iss-truss-s1.svg +1 -0
  133. package/dist/assets/iss-iss-truss-s1.thick.svg +1 -0
  134. package/dist/assets/iss-iss-truss-s3-s4.glb +0 -0
  135. package/dist/assets/iss-iss-truss-s3-s4.painted.svg +1 -0
  136. package/dist/assets/iss-iss-truss-s3-s4.svg +1 -0
  137. package/dist/assets/iss-iss-truss-s3-s4.thick.svg +1 -0
  138. package/dist/assets/iss-iss-truss-s5.glb +0 -0
  139. package/dist/assets/iss-iss-truss-s5.painted.svg +1 -0
  140. package/dist/assets/iss-iss-truss-s5.svg +1 -0
  141. package/dist/assets/iss-iss-truss-s5.thick.svg +1 -0
  142. package/dist/assets/iss-iss-truss-s6.glb +0 -0
  143. package/dist/assets/iss-iss-truss-s6.painted.svg +1 -0
  144. package/dist/assets/iss-iss-truss-s6.svg +1 -0
  145. package/dist/assets/iss-iss-truss-s6.thick.svg +1 -0
  146. package/dist/assets/iss-iss-unity.glb +0 -0
  147. package/dist/assets/iss-iss-unity.painted.svg +1 -0
  148. package/dist/assets/iss-iss-unity.svg +1 -0
  149. package/dist/assets/iss-iss-unity.thick.svg +1 -0
  150. package/dist/assets/iss-iss-zarya.glb +0 -0
  151. package/dist/assets/iss-iss-zarya.painted.svg +1 -0
  152. package/dist/assets/iss-iss-zarya.svg +1 -0
  153. package/dist/assets/iss-iss-zarya.thick.svg +1 -0
  154. package/dist/assets/iss-iss-zvezda.glb +0 -0
  155. package/dist/assets/iss-iss-zvezda.painted.svg +1 -0
  156. package/dist/assets/iss-iss-zvezda.svg +1 -0
  157. package/dist/assets/iss-iss-zvezda.thick.svg +1 -0
  158. package/dist/assets/iss-iss.glb +0 -0
  159. package/dist/assets/iss-iss.painted.svg +1 -1
  160. package/dist/assets/iss-iss.svg +1 -1
  161. package/dist/assets/iss-iss.thick.svg +1 -1
  162. package/dist/assets/jupiter-c-jupiter-c-apart.painted.svg +1 -0
  163. package/dist/assets/jupiter-c-jupiter-c-apart.svg +1 -0
  164. package/dist/assets/jupiter-c-jupiter-c-apart.thick.svg +1 -0
  165. package/dist/assets/jupiter-c-jupiter-c-first-stage.glb +0 -0
  166. package/dist/assets/jupiter-c-jupiter-c-first-stage.painted.svg +1 -0
  167. package/dist/assets/jupiter-c-jupiter-c-first-stage.svg +1 -0
  168. package/dist/assets/jupiter-c-jupiter-c-first-stage.thick.svg +1 -0
  169. package/dist/assets/jupiter-c-jupiter-c-fourth-stage.glb +0 -0
  170. package/dist/assets/jupiter-c-jupiter-c-fourth-stage.painted.svg +1 -0
  171. package/dist/assets/jupiter-c-jupiter-c-fourth-stage.svg +1 -0
  172. package/dist/assets/jupiter-c-jupiter-c-fourth-stage.thick.svg +1 -0
  173. package/dist/assets/jupiter-c-jupiter-c-tail.glb +0 -0
  174. package/dist/assets/jupiter-c-jupiter-c-tail.painted.svg +1 -0
  175. package/dist/assets/jupiter-c-jupiter-c-tail.svg +1 -0
  176. package/dist/assets/jupiter-c-jupiter-c-tail.thick.svg +1 -0
  177. package/dist/assets/jupiter-c-jupiter-c-tub.glb +0 -0
  178. package/dist/assets/jupiter-c-jupiter-c-tub.painted.svg +1 -0
  179. package/dist/assets/jupiter-c-jupiter-c-tub.svg +1 -0
  180. package/dist/assets/jupiter-c-jupiter-c-tub.thick.svg +1 -0
  181. package/dist/assets/jupiter-c-jupiter-c.glb +0 -0
  182. package/dist/assets/jupiter-c-jupiter-c.painted.svg +1 -1
  183. package/dist/assets/jupiter-c-jupiter-c.svg +1 -1
  184. package/dist/assets/jupiter-c-jupiter-c.thick.svg +1 -1
  185. package/dist/assets/models/hubble-aft-shroud.glb +0 -0
  186. package/dist/assets/models/hubble-antenna-far.glb +0 -0
  187. package/dist/assets/models/hubble-antenna-near.glb +0 -0
  188. package/dist/assets/models/hubble-aperture-door.glb +0 -0
  189. package/dist/assets/models/hubble-array-left.glb +0 -0
  190. package/dist/assets/models/hubble-array-right.glb +0 -0
  191. package/dist/assets/models/hubble-equipment-section.glb +0 -0
  192. package/dist/assets/models/hubble-forward-shell.glb +0 -0
  193. package/dist/assets/models/hubble-light-shield.glb +0 -0
  194. package/dist/assets/models/iss-airlock.glb +0 -0
  195. package/dist/assets/models/iss-arrays-p4.glb +0 -0
  196. package/dist/assets/models/iss-arrays-p6.glb +0 -0
  197. package/dist/assets/models/iss-arrays-s4.glb +0 -0
  198. package/dist/assets/models/iss-arrays-s6.glb +0 -0
  199. package/dist/assets/models/iss-columbus.glb +0 -0
  200. package/dist/assets/models/iss-destiny.glb +0 -0
  201. package/dist/assets/models/iss-harmony.glb +0 -0
  202. package/dist/assets/models/iss-kibo.glb +0 -0
  203. package/dist/assets/models/iss-radiators-port.glb +0 -0
  204. package/dist/assets/models/iss-radiators-starboard.glb +0 -0
  205. package/dist/assets/models/iss-soyuz-aft.glb +0 -0
  206. package/dist/assets/models/iss-soyuz-zarya-nadir.glb +0 -0
  207. package/dist/assets/models/iss-soyuz-zvezda-nadir.glb +0 -0
  208. package/dist/assets/models/iss-soyuz-zvezda-zenith.glb +0 -0
  209. package/dist/assets/models/iss-truss-p1.glb +0 -0
  210. package/dist/assets/models/iss-truss-p3-p4.glb +0 -0
  211. package/dist/assets/models/iss-truss-p5.glb +0 -0
  212. package/dist/assets/models/iss-truss-p6.glb +0 -0
  213. package/dist/assets/models/iss-truss-s0.glb +0 -0
  214. package/dist/assets/models/iss-truss-s1.glb +0 -0
  215. package/dist/assets/models/iss-truss-s3-s4.glb +0 -0
  216. package/dist/assets/models/iss-truss-s5.glb +0 -0
  217. package/dist/assets/models/iss-truss-s6.glb +0 -0
  218. package/dist/assets/models/iss-unity.glb +0 -0
  219. package/dist/assets/models/iss-zarya.glb +0 -0
  220. package/dist/assets/models/iss-zvezda.glb +0 -0
  221. package/dist/assets/models/jupiter-c-first-stage.glb +0 -0
  222. package/dist/assets/models/jupiter-c-fourth-stage.glb +0 -0
  223. package/dist/assets/models/jupiter-c-tail.glb +0 -0
  224. package/dist/assets/models/jupiter-c-tub.glb +0 -0
  225. package/dist/assets/models/tiangong-hub.glb +0 -0
  226. package/dist/assets/models/tiangong-mengtian-arrays.glb +0 -0
  227. package/dist/assets/models/tiangong-mengtian.glb +0 -0
  228. package/dist/assets/models/tiangong-shenzhou-forward.glb +0 -0
  229. package/dist/assets/models/tiangong-shenzhou-nadir.glb +0 -0
  230. package/dist/assets/models/tiangong-tianhe-arrays.glb +0 -0
  231. package/dist/assets/models/tiangong-tianhe.glb +0 -0
  232. package/dist/assets/models/tiangong-tianzhou.glb +0 -0
  233. package/dist/assets/models/tiangong-wentian-arrays.glb +0 -0
  234. package/dist/assets/models/tiangong-wentian.glb +0 -0
  235. package/dist/assets/tiangong-tiangong-apart.painted.svg +1 -0
  236. package/dist/assets/tiangong-tiangong-apart.svg +1 -0
  237. package/dist/assets/tiangong-tiangong-apart.thick.svg +1 -0
  238. package/dist/assets/tiangong-tiangong-hub.glb +0 -0
  239. package/dist/assets/tiangong-tiangong-hub.painted.svg +1 -0
  240. package/dist/assets/tiangong-tiangong-hub.svg +1 -0
  241. package/dist/assets/tiangong-tiangong-hub.thick.svg +1 -0
  242. package/dist/assets/tiangong-tiangong-mengtian-arrays.glb +0 -0
  243. package/dist/assets/tiangong-tiangong-mengtian-arrays.painted.svg +1 -0
  244. package/dist/assets/tiangong-tiangong-mengtian-arrays.svg +1 -0
  245. package/dist/assets/tiangong-tiangong-mengtian-arrays.thick.svg +1 -0
  246. package/dist/assets/tiangong-tiangong-mengtian.glb +0 -0
  247. package/dist/assets/tiangong-tiangong-mengtian.painted.svg +1 -0
  248. package/dist/assets/tiangong-tiangong-mengtian.svg +1 -0
  249. package/dist/assets/tiangong-tiangong-mengtian.thick.svg +1 -0
  250. package/dist/assets/tiangong-tiangong-shenzhou-forward.glb +0 -0
  251. package/dist/assets/tiangong-tiangong-shenzhou-forward.painted.svg +1 -0
  252. package/dist/assets/tiangong-tiangong-shenzhou-forward.svg +1 -0
  253. package/dist/assets/tiangong-tiangong-shenzhou-forward.thick.svg +1 -0
  254. package/dist/assets/tiangong-tiangong-shenzhou-nadir.glb +0 -0
  255. package/dist/assets/tiangong-tiangong-shenzhou-nadir.painted.svg +1 -0
  256. package/dist/assets/tiangong-tiangong-shenzhou-nadir.svg +1 -0
  257. package/dist/assets/tiangong-tiangong-shenzhou-nadir.thick.svg +1 -0
  258. package/dist/assets/tiangong-tiangong-tianhe-arrays.glb +0 -0
  259. package/dist/assets/tiangong-tiangong-tianhe-arrays.painted.svg +1 -0
  260. package/dist/assets/tiangong-tiangong-tianhe-arrays.svg +1 -0
  261. package/dist/assets/tiangong-tiangong-tianhe-arrays.thick.svg +1 -0
  262. package/dist/assets/tiangong-tiangong-tianhe.glb +0 -0
  263. package/dist/assets/tiangong-tiangong-tianhe.painted.svg +1 -0
  264. package/dist/assets/tiangong-tiangong-tianhe.svg +1 -0
  265. package/dist/assets/tiangong-tiangong-tianhe.thick.svg +1 -0
  266. package/dist/assets/tiangong-tiangong-tianzhou.glb +0 -0
  267. package/dist/assets/tiangong-tiangong-tianzhou.painted.svg +1 -0
  268. package/dist/assets/tiangong-tiangong-tianzhou.svg +1 -0
  269. package/dist/assets/tiangong-tiangong-tianzhou.thick.svg +1 -0
  270. package/dist/assets/tiangong-tiangong-wentian-arrays.glb +0 -0
  271. package/dist/assets/tiangong-tiangong-wentian-arrays.painted.svg +1 -0
  272. package/dist/assets/tiangong-tiangong-wentian-arrays.svg +1 -0
  273. package/dist/assets/tiangong-tiangong-wentian-arrays.thick.svg +1 -0
  274. package/dist/assets/tiangong-tiangong-wentian.glb +0 -0
  275. package/dist/assets/tiangong-tiangong-wentian.painted.svg +1 -0
  276. package/dist/assets/tiangong-tiangong-wentian.svg +1 -0
  277. package/dist/assets/tiangong-tiangong-wentian.thick.svg +1 -0
  278. package/dist/assets/tiangong-tiangong.glb +0 -0
  279. package/dist/assets/tiangong-tiangong.painted.svg +1 -0
  280. package/dist/assets/tiangong-tiangong.svg +1 -0
  281. package/dist/assets/tiangong-tiangong.thick.svg +1 -0
  282. package/dist/buildbar.js +22 -5
  283. package/dist/data/credits.d.ts +18 -1
  284. package/dist/data/credits.js +20 -3
  285. package/dist/data/hubble.js +16 -6
  286. package/dist/data/iss.js +52 -5
  287. package/dist/data/jupiterc.js +11 -6
  288. package/dist/data/makers.d.ts +1 -0
  289. package/dist/data/makers.js +2 -1
  290. package/dist/data/sources.d.ts +160 -0
  291. package/dist/data/sources.js +20 -0
  292. package/dist/data/tiangong.d.ts +12 -0
  293. package/dist/data/tiangong.js +54 -0
  294. package/dist/element/orbitWorld.d.ts +5 -0
  295. package/dist/element/orbitWorld.js +46 -1
  296. package/dist/element/probe.d.ts +15 -0
  297. package/dist/element/probe.js +46 -0
  298. package/dist/element/scene.d.ts +6 -0
  299. package/dist/element/scene.js +25 -11
  300. package/dist/element.d.ts +2 -0
  301. package/dist/element.js +27 -20
  302. package/dist/launches/data.d.ts +2 -0
  303. package/dist/launches/data.js +4 -0
  304. package/dist/launches/index.d.ts +318 -0
  305. package/dist/launches/index.js +249 -0
  306. package/dist/launches/links.d.ts +43 -0
  307. package/dist/launches/links.js +40 -0
  308. package/dist/launches/source.d.ts +20 -0
  309. package/dist/launches/source.js +22 -0
  310. package/dist/model/hubble.js +51 -17
  311. package/dist/model/iss.js +109 -23
  312. package/dist/model/jupiterc.js +29 -11
  313. package/dist/model/registry.js +4 -2
  314. package/dist/model/tiangong.d.ts +2 -0
  315. package/dist/model/tiangong.js +109 -0
  316. package/dist/parts.d.ts +1 -1
  317. package/dist/rockets.js +52 -3
  318. package/dist/thrusters.js +4 -4
  319. package/package.json +11 -1
  320. package/dist/assets/models/hubble-telescope.glb +0 -0
  321. package/dist/assets/models/iss-station.glb +0 -0
  322. package/dist/assets/models/jupiter-c-vehicle.glb +0 -0
@@ -538,6 +538,166 @@ export declare const SOURCES: {
538
538
  readonly read: "direct";
539
539
  readonly licence: "CC BY-SA 4.0";
540
540
  };
541
+ readonly "wikipedia-tiangong": {
542
+ readonly title: "Tiangong space station (the infobox and the module table)";
543
+ readonly publisher: "Wikipedia";
544
+ readonly url: "https://en.wikipedia.org/wiki/Tiangong_space_station";
545
+ readonly date: "2026-11-11";
546
+ readonly read: "direct";
547
+ readonly licence: "CC BY-SA 4.0";
548
+ };
549
+ readonly "wikipedia-tianhe": {
550
+ readonly title: "Tianhe core module (the infobox)";
551
+ readonly publisher: "Wikipedia";
552
+ readonly url: "https://en.wikipedia.org/wiki/Tianhe_core_module";
553
+ readonly date: "2026-11-11";
554
+ readonly read: "direct";
555
+ readonly licence: "CC BY-SA 4.0";
556
+ };
557
+ readonly "wikipedia-wentian": {
558
+ readonly title: "Wentian module (the infobox)";
559
+ readonly publisher: "Wikipedia";
560
+ readonly url: "https://en.wikipedia.org/wiki/Wentian_module";
561
+ readonly date: "2026-11-11";
562
+ readonly read: "direct";
563
+ readonly licence: "CC BY-SA 4.0";
564
+ };
565
+ readonly "wikipedia-mengtian": {
566
+ readonly title: "Mengtian module (the infobox)";
567
+ readonly publisher: "Wikipedia";
568
+ readonly url: "https://en.wikipedia.org/wiki/Mengtian";
569
+ readonly date: "2026-11-11";
570
+ readonly read: "direct";
571
+ readonly licence: "CC BY-SA 4.0";
572
+ };
573
+ readonly "wikipedia-shenzhou": {
574
+ readonly title: "Shenzhou (spacecraft) (the infobox)";
575
+ readonly publisher: "Wikipedia";
576
+ readonly url: "https://en.wikipedia.org/wiki/Shenzhou_(spacecraft)";
577
+ readonly date: "2026-11-11";
578
+ readonly read: "direct";
579
+ readonly licence: "CC BY-SA 4.0";
580
+ };
581
+ readonly "wikipedia-tianzhou": {
582
+ readonly title: "Tianzhou (spacecraft) (the infobox)";
583
+ readonly publisher: "Wikipedia";
584
+ readonly url: "https://en.wikipedia.org/wiki/Tianzhou_(spacecraft)";
585
+ readonly date: "2026-11-11";
586
+ readonly read: "direct";
587
+ readonly licence: "CC BY-SA 4.0";
588
+ };
589
+ readonly "wikipedia-zarya": {
590
+ readonly title: "Zarya (the infobox)";
591
+ readonly publisher: "Wikipedia";
592
+ readonly url: "https://en.wikipedia.org/wiki/Zarya_(ISS_module)";
593
+ readonly date: "2026-11-11";
594
+ readonly read: "direct";
595
+ readonly licence: "CC BY-SA 4.0";
596
+ };
597
+ readonly "wikipedia-unity": {
598
+ readonly title: "Unity (ISS module) (the infobox)";
599
+ readonly publisher: "Wikipedia";
600
+ readonly url: "https://en.wikipedia.org/wiki/Unity_(ISS_module)";
601
+ readonly date: "2026-11-11";
602
+ readonly read: "direct";
603
+ readonly licence: "CC BY-SA 4.0";
604
+ };
605
+ readonly "wikipedia-zvezda": {
606
+ readonly title: "Zvezda (ISS module) (the infobox)";
607
+ readonly publisher: "Wikipedia";
608
+ readonly url: "https://en.wikipedia.org/wiki/Zvezda_(ISS_module)";
609
+ readonly date: "2026-11-11";
610
+ readonly read: "direct";
611
+ readonly licence: "CC BY-SA 4.0";
612
+ };
613
+ readonly "wikipedia-destiny": {
614
+ readonly title: "Destiny (ISS module) (the infobox)";
615
+ readonly publisher: "Wikipedia";
616
+ readonly url: "https://en.wikipedia.org/wiki/Destiny_(ISS_module)";
617
+ readonly date: "2026-11-11";
618
+ readonly read: "direct";
619
+ readonly licence: "CC BY-SA 4.0";
620
+ };
621
+ readonly "wikipedia-harmony": {
622
+ readonly title: "Harmony (ISS module) (the infobox)";
623
+ readonly publisher: "Wikipedia";
624
+ readonly url: "https://en.wikipedia.org/wiki/Harmony_(ISS_module)";
625
+ readonly date: "2026-11-11";
626
+ readonly read: "direct";
627
+ readonly licence: "CC BY-SA 4.0";
628
+ };
629
+ readonly "wikipedia-columbus": {
630
+ readonly title: "Columbus (ISS module) (the infobox)";
631
+ readonly publisher: "Wikipedia";
632
+ readonly url: "https://en.wikipedia.org/wiki/Columbus_(ISS_module)";
633
+ readonly date: "2026-11-11";
634
+ readonly read: "direct";
635
+ readonly licence: "CC BY-SA 4.0";
636
+ };
637
+ readonly "wikipedia-kibo": {
638
+ readonly title: "Kibo (ISS module) (the infobox and the parts' sections)";
639
+ readonly publisher: "Wikipedia";
640
+ readonly url: "https://en.wikipedia.org/wiki/Kibo_(ISS_module)";
641
+ readonly date: "2026-11-11";
642
+ readonly read: "direct";
643
+ readonly licence: "CC BY-SA 4.0";
644
+ };
645
+ readonly "wikipedia-truss": {
646
+ readonly title: "Integrated Truss Structure (the segment table and the solar array wings)";
647
+ readonly publisher: "Wikipedia";
648
+ readonly url: "https://en.wikipedia.org/wiki/Integrated_Truss_Structure";
649
+ readonly date: "2026-11-11";
650
+ readonly read: "direct";
651
+ readonly licence: "CC BY-SA 4.0";
652
+ };
653
+ readonly "wikipedia-quest": {
654
+ readonly title: "Quest Joint Airlock (the infobox)";
655
+ readonly publisher: "Wikipedia";
656
+ readonly url: "https://en.wikipedia.org/wiki/Quest_Joint_Airlock";
657
+ readonly date: "2026-11-11";
658
+ readonly read: "direct";
659
+ readonly licence: "CC BY-SA 4.0";
660
+ };
661
+ readonly "wikipedia-poisk": {
662
+ readonly title: "Poisk (ISS module) (the infobox)";
663
+ readonly publisher: "Wikipedia";
664
+ readonly url: "https://en.wikipedia.org/wiki/Poisk_(ISS_module)";
665
+ readonly date: "2026-11-11";
666
+ readonly read: "direct";
667
+ readonly licence: "CC BY-SA 4.0";
668
+ };
669
+ readonly "wikipedia-rassvet": {
670
+ readonly title: "Rassvet (ISS module) (the infobox)";
671
+ readonly publisher: "Wikipedia";
672
+ readonly url: "https://en.wikipedia.org/wiki/Rassvet_(ISS_module)";
673
+ readonly date: "2026-11-11";
674
+ readonly read: "direct";
675
+ readonly licence: "CC BY-SA 4.0";
676
+ };
677
+ readonly "wikipedia-tranquility": {
678
+ readonly title: "Tranquility (ISS module) (the infobox)";
679
+ readonly publisher: "Wikipedia";
680
+ readonly url: "https://en.wikipedia.org/wiki/Tranquility_(ISS_module)";
681
+ readonly date: "2026-11-11";
682
+ readonly read: "direct";
683
+ readonly licence: "CC BY-SA 4.0";
684
+ };
685
+ readonly "wikipedia-cupola": {
686
+ readonly title: "Cupola (ISS module) (the infobox)";
687
+ readonly publisher: "Wikipedia";
688
+ readonly url: "https://en.wikipedia.org/wiki/Cupola_(ISS_module)";
689
+ readonly date: "2026-11-11";
690
+ readonly read: "direct";
691
+ readonly licence: "CC BY-SA 4.0";
692
+ };
693
+ readonly "wikipedia-leonardo": {
694
+ readonly title: "Leonardo (ISS module) (the infobox)";
695
+ readonly publisher: "Wikipedia";
696
+ readonly url: "https://en.wikipedia.org/wiki/Leonardo_(ISS_module)";
697
+ readonly date: "2026-11-11";
698
+ readonly read: "direct";
699
+ readonly licence: "CC BY-SA 4.0";
700
+ };
541
701
  readonly "wikipedia-discovery": {
542
702
  readonly title: "Space Shuttle Discovery (the infobox)";
543
703
  readonly publisher: "Wikipedia";
@@ -76,6 +76,26 @@ export const SOURCES = {
76
76
  "wikipedia-jupiter-c": { title: "Jupiter-C (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Jupiter-C", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
77
77
  "wikipedia-iss": { title: "International Space Station (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/International_Space_Station", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
78
78
  "wikipedia-hubble": { title: "Hubble Space Telescope (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Hubble_Space_Telescope", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
79
+ "wikipedia-tiangong": { title: "Tiangong space station (the infobox and the module table)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Tiangong_space_station", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
80
+ "wikipedia-tianhe": { title: "Tianhe core module (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Tianhe_core_module", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
81
+ "wikipedia-wentian": { title: "Wentian module (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Wentian_module", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
82
+ "wikipedia-mengtian": { title: "Mengtian module (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Mengtian", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
83
+ "wikipedia-shenzhou": { title: "Shenzhou (spacecraft) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Shenzhou_(spacecraft)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
84
+ "wikipedia-tianzhou": { title: "Tianzhou (spacecraft) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Tianzhou_(spacecraft)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
85
+ "wikipedia-zarya": { title: "Zarya (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Zarya_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
86
+ "wikipedia-unity": { title: "Unity (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Unity_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
87
+ "wikipedia-zvezda": { title: "Zvezda (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Zvezda_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
88
+ "wikipedia-destiny": { title: "Destiny (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Destiny_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
89
+ "wikipedia-harmony": { title: "Harmony (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Harmony_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
90
+ "wikipedia-columbus": { title: "Columbus (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Columbus_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
91
+ "wikipedia-kibo": { title: "Kibo (ISS module) (the infobox and the parts' sections)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Kibo_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
92
+ "wikipedia-truss": { title: "Integrated Truss Structure (the segment table and the solar array wings)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Integrated_Truss_Structure", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
93
+ "wikipedia-quest": { title: "Quest Joint Airlock (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Quest_Joint_Airlock", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
94
+ "wikipedia-poisk": { title: "Poisk (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Poisk_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
95
+ "wikipedia-rassvet": { title: "Rassvet (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Rassvet_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
96
+ "wikipedia-tranquility": { title: "Tranquility (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Tranquility_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
97
+ "wikipedia-cupola": { title: "Cupola (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Cupola_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
98
+ "wikipedia-leonardo": { title: "Leonardo (ISS module) (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Leonardo_(ISS_module)", date: "2026-11-11", read: "direct", licence: "CC BY-SA 4.0" },
79
99
  "wikipedia-discovery": { title: "Space Shuttle Discovery (the infobox)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Space_Shuttle_Discovery", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
80
100
  "wikipedia-falcon-heavy": { title: "Falcon Heavy", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Falcon_Heavy", date: "2026-10-31", read: "direct", licence: "CC BY-SA 4.0" },
81
101
  "wikipedia-flight-5": { title: "Starship flight test 5 (its flight timeline, read as raw wikitext)", publisher: "Wikipedia", url: "https://en.wikipedia.org/wiki/Starship_flight_test_5", date: "2026-11-02", read: "direct", licence: "CC BY-SA 4.0" },
@@ -0,0 +1,12 @@
1
+ import { type Figure, type Variant } from "./types.ts";
2
+ export declare const TIANHE_WIDE: Figure;
3
+ export declare const LAB_WIDE: Figure;
4
+ export declare const SHENZHOU_WIDE: Figure;
5
+ export declare const TIANZHOU_WIDE: Figure;
6
+ export declare const LAB_LONG: Figure;
7
+ export declare const SHENZHOU_LONG: Figure;
8
+ export declare const SHENZHOU_WINGS: Figure;
9
+ export declare const TIANZHOU_WINGS: Figure;
10
+ /** The laboratories' wings, tip to tip: "over 55 m" in their articles, drawn as 55.6 m, the station's sourced length. */
11
+ export declare const WING_SPAN: Figure;
12
+ export declare const TIANGONG_VARIANTS: readonly Variant[];
@@ -0,0 +1,54 @@
1
+ // Tiangong, China's space station, as its article and its modules' articles give it: Tianhe, the core module, 16.6 m long and 4.2 m across with its docking node at its forward end; Wentian and Mengtian, the two
2
+ // laboratory modules, 17.9 m by 4.2 m, on the node's starboard and port sides; Shenzhou at the forward and nadir ports and Tianzhou at the aft. It stands on end here, Tianhe's axis up and its aft at the foot, as the ISS does.
3
+ import { blank } from "./types.js";
4
+ const S = "wikipedia-tiangong";
5
+ export const TIANHE_WIDE = { value: 4.2, source: "wikipedia-tianhe", note: "14 feet, its big cylinder." };
6
+ export const LAB_WIDE = { value: 4.2, source: "wikipedia-wentian", note: "14 feet." };
7
+ export const SHENZHOU_WIDE = { value: 2.8, source: "wikipedia-shenzhou" };
8
+ export const TIANZHOU_WIDE = { value: 3.35, source: "wikipedia-tianzhou", note: "11 feet." };
9
+ export const LAB_LONG = { value: 17.9, source: "wikipedia-wentian", note: "59 feet, its length: it lies out from the node, so it is its widest here, and its height here is its 4.2 m width." };
10
+ export const SHENZHOU_LONG = { value: 9.25, source: "wikipedia-shenzhou", note: "Its length: it lies out from the nadir port, so it is its widest here, and its height here is its wings' span." };
11
+ export const SHENZHOU_WINGS = { value: 17, source: "wikipedia-shenzhou", note: "Its two wings, tip to tip." };
12
+ export const TIANZHOU_WINGS = { value: 14.9, source: "wikipedia-tianzhou", note: "Its two wings, tip to tip: 49 feet." };
13
+ /** The laboratories' wings, tip to tip: "over 55 m" in their articles, drawn as 55.6 m, the station's sourced length. */
14
+ export const WING_SPAN = { value: 55.6, source: "wikipedia-wentian", note: "Each laboratory's two wings, tip to tip: its article says over 55 m, and 110 m² of cells each. Drawn at the station's sourced length." };
15
+ export const TIANGONG_VARIANTS = [
16
+ {
17
+ id: "tiangong",
18
+ rocket: "tiangong",
19
+ name: "Tiangong 天宮",
20
+ status: "flown",
21
+ firstWord: "First module",
22
+ firstFlight: { value: "2021-04-29", source: S, note: "Tianhe, on a Long March 5B. Wentian followed on 2022-07-24 and Mengtian on 2022-10-31." },
23
+ slots: ["tianhe", "hub", "shenzhou-forward", "tianzhou", "wentian", "mengtian", "tianhe-arrays", "wentian-arrays", "mengtian-arrays", "shenzhou-nadir"],
24
+ note: "w29572227's model, its flags and mark left out, in the painted look, one file a part, each module and craft at its own sourced size; this package's own plain shapes in the line looks, from the sourced lengths and widths. It stands with Tianhe's axis up and the laboratories across the front: height here is the laboratories' wings tip to tip, along that axis. The two Shenzhou and the Tianzhou are the model's visiting craft.",
25
+ facts: {
26
+ height: { value: 55.6, source: S, note: "182 feet, the length its article gives. Drawn as the laboratories' wings, tip to tip, along Tianhe's axis." },
27
+ diameter: { value: 39, source: S, note: "128 feet, the width its article gives: across the two laboratories." },
28
+ parts: {
29
+ tianhe: blank("Tianhe's body without its node: 12.2 m of the sourced 16.6 m, as the model divides them."),
30
+ hub: blank("Tianhe's docking node: 4.4 m of the sourced 16.6 m, as the model divides them."),
31
+ "shenzhou-forward": { value: 9.25, source: "wikipedia-shenzhou", note: "Its service, re-entry and orbital modules are 2.94 m, 2.5 m and 2.8 m." },
32
+ tianzhou: { value: 10.6, source: "wikipedia-tianzhou", note: "35 feet." },
33
+ wentian: blank("It lies out from the node: 17.9 m long (59 feet) and 4.2 m across, so its height here is its width, 4.2 m."),
34
+ mengtian: blank("It lies out from the node: 17.9 m long (59 feet) and 4.2 m across, so its height here is its width, 4.2 m."),
35
+ "tianhe-arrays": blank("Tianhe's two wings have no size in a source read here: they are the model's, at Tianhe's scale."),
36
+ "wentian-arrays": WING_SPAN,
37
+ "mengtian-arrays": WING_SPAN,
38
+ "shenzhou-nadir": blank("The same craft as at the forward port, 9.25 m long, lying out from the nadir port: its height here is its wings' span, 17 m."),
39
+ },
40
+ engines: {},
41
+ more: {
42
+ "tianhe-length": { value: 16.6, source: "wikipedia-tianhe", note: "54 feet, the core module with its node." },
43
+ mass: { value: "about 100,000 kg", source: S },
44
+ crew: { value: 3, source: S },
45
+ orbit: { value: "386 to 392 km, 41.47 degrees", source: S, note: "As the infobox gave it on the day it was read." },
46
+ "shenzhou-wings": SHENZHOU_WINGS,
47
+ "tianzhou-wings": TIANZHOU_WINGS,
48
+ "wentian-length": LAB_LONG,
49
+ "mengtian-length": { value: 17.9, source: "wikipedia-mengtian", note: "59 feet." },
50
+ "pressurised-volume": { value: 340, source: S, note: "Cubic metres." },
51
+ },
52
+ },
53
+ },
54
+ ];
@@ -2,6 +2,11 @@ import { Group, Object3D } from "three";
2
2
  import { type SkyShown } from "./solarGroups.ts";
3
3
  /** Shows or hides the planets, the dwarf planets and the moons. The Earth under the craft stays. Belts and paths are the viewer's, because they also depend on how far the camera is. */
4
4
  export declare function applySolarGroups(root: Object3D, groups: Pick<SkyShown, "planets" | "moons" | "dwarfs">): void;
5
+ /**
6
+ * Turns the Earth about its own axis by the time `seconds` of its own day (a sidereal day), and the cloud layer a little faster than the ground.
7
+ * Returns the ground's turn in degrees, kept under one turn.
8
+ */
9
+ export declare function turnOrbit(group: Group, seconds: number): number;
5
10
  /** Moves the Moon, the major moons and the sketch so they match `when`. The paths and belts were drawn around the Sun at the first instant, so the whole sketch shifts with the Earth. */
6
11
  export declare function moveOrbit(group: Group, when: number): void;
7
12
  /** The Earth under the craft, the Moon where it is today, and the stars behind both. `ready` runs when the Earth's picture has arrived. */
@@ -1,6 +1,6 @@
1
1
  // The compare page's Earth, its Moon, the major moons, and a star field. The craft stay at the origin, 400 km above the surface. Loaded only when a page asks for it.
2
2
  import { BODIES, DWARF_IDS, heliocentric, PLANET_IDS } from "@johnmorrisdotca/wakusei-planets";
3
- import { BufferAttribute, BufferGeometry, Group, InstancedMesh, LineLoop, LineBasicMaterial, Mesh, MeshBasicMaterial, Object3D, Points, PointsMaterial, SphereGeometry, SRGBColorSpace, TextureLoader } from "three";
3
+ import { BufferAttribute, BufferGeometry, Group, InstancedMesh, LineLoop, LineBasicMaterial, Mesh, MeshBasicMaterial, Object3D, Points, PointsMaterial, SphereGeometry, SRGBColorSpace, TextureLoader, Vector3 } from "three";
4
4
  import { skyGroupOf } from "./solarGroups.js";
5
5
  import { beltPlaces, bodyScene, earthCentre, majorMoons, moonScene, sceneOf } from "./solarPlace.js";
6
6
  const STAR_R_M = 2e13;
@@ -143,12 +143,43 @@ export function applySolarGroups(root, groups) {
143
143
  if (major)
144
144
  major.visible = groups.moons;
145
145
  }
146
+ /** How much faster the cloud layer goes round than the ground under it, as a fraction of the ground's turn. */
147
+ const CLOUD_DRIFT = 0.12;
148
+ const NEAR_SIDE = new Vector3(1, 0, 0);
149
+ const toEarth = new Vector3();
150
+ /** The Moon keeps its near side toward the Earth, so it is turned to face it wherever it stands. */
151
+ function faceEarth(moon) {
152
+ const [ex, ey, ez] = earthCentre();
153
+ toEarth.set(ex - moon.position.x, ey - moon.position.y, ez - moon.position.z);
154
+ if (toEarth.lengthSq() === 0)
155
+ return;
156
+ moon.quaternion.setFromUnitVectors(NEAR_SIDE, toEarth.normalize());
157
+ }
158
+ /**
159
+ * Turns the Earth about its own axis by the time `seconds` of its own day (a sidereal day), and the cloud layer a little faster than the ground.
160
+ * Returns the ground's turn in degrees, kept under one turn.
161
+ */
162
+ export function turnOrbit(group, seconds) {
163
+ const earth = group.getObjectByName("earth");
164
+ if (!earth)
165
+ return 0;
166
+ const angle = (seconds * 2 * Math.PI) / (Math.abs(BODIES.earth.rotationHours) * 3600) * (BODIES.earth.rotationHours < 0 ? -1 : 1);
167
+ earth.rotation.y += angle;
168
+ const clouds = earth.getObjectByName("earth-clouds");
169
+ if (clouds)
170
+ clouds.rotation.y += angle * CLOUD_DRIFT;
171
+ const moon = group.getObjectByName("moon");
172
+ if (moon)
173
+ faceEarth(moon);
174
+ return ((((earth.rotation.y * 180) / Math.PI) % 360) + 360) % 360;
175
+ }
146
176
  /** Moves the Moon, the major moons and the sketch so they match `when`. The paths and belts were drawn around the Sun at the first instant, so the whole sketch shifts with the Earth. */
147
177
  export function moveOrbit(group, when) {
148
178
  const moon = group.getObjectByName("moon");
149
179
  if (moon) {
150
180
  const [x, y, z] = moonScene(when);
151
181
  moon.position.set(x, y, z);
182
+ faceEarth(moon);
152
183
  }
153
184
  const moons = group.getObjectByName("major-moons");
154
185
  if (moons instanceof InstancedMesh) {
@@ -193,6 +224,7 @@ export function orbitWorld(ready, when = Date.now()) {
193
224
  const moon = new Mesh(new SphereGeometry(moonR, 48, 32), new MeshBasicMaterial({ color: "#c4bfb4" }));
194
225
  moon.name = "moon";
195
226
  moon.position.set(mx, my, mz);
227
+ faceEarth(moon);
196
228
  const sketch = solarSketch(when);
197
229
  const moons = moonMesh(when);
198
230
  const planets = planetGroup(when);
@@ -210,6 +242,18 @@ export function orbitWorld(ready, when = Date.now()) {
210
242
  ready();
211
243
  });
212
244
  };
245
+ // The cloud layer is its own shell a little above the ground, drawn from the cloud picture's brightness, so it can turn at its own pace.
246
+ const clouds = new Mesh(new SphereGeometry(earthR * 1.004, 96, 64), new MeshBasicMaterial({ color: "#ffffff", transparent: true, opacity: 0.8, depthWrite: false }));
247
+ clouds.name = "earth-clouds";
248
+ // hidden until its picture has arrived: without it the shell would be a flat white globe, and it stays out if the picture never loads
249
+ clouds.visible = false;
250
+ earth.add(clouds);
251
+ loader.load(new URL("clouds-1024.webp", base).href, (map) => {
252
+ const material = clouds.material;
253
+ material.alphaMap = map;
254
+ material.needsUpdate = true;
255
+ clouds.visible = true;
256
+ });
213
257
  paint("day-2048.webp", earth);
214
258
  paint("moon-2048.webp", moon);
215
259
  return {
@@ -222,6 +266,7 @@ export function orbitWorld(ready, when = Date.now()) {
222
266
  const list = Array.isArray(material) ? material : material ? [material] : [];
223
267
  for (const one of list) {
224
268
  one.map?.dispose();
269
+ one.alphaMap?.dispose();
225
270
  one.dispose();
226
271
  }
227
272
  });
@@ -0,0 +1,15 @@
1
+ /** What one look at the browser's WebGL said. */
2
+ export interface GlProbe {
3
+ /** Whether a WebGL context can be made at all. */
4
+ works: boolean;
5
+ /** Whether the context draws in software (SwiftShader, llvmpipe, softpipe), where smooth edges cost a frame. */
6
+ software: boolean;
7
+ }
8
+ /** How many test contexts this page has made: 1 once the answer is known, 0 before it is asked for. */
9
+ export declare function probeCount(): number;
10
+ /**
11
+ * Says whether WebGL works here and whether it draws in software. The first call makes one test context and releases it at once; every later call, from any element or viewer, gets the same answer without making another.
12
+ *
13
+ * @returns The kept answer.
14
+ */
15
+ export declare function glProbe(): GlProbe;
@@ -0,0 +1,46 @@
1
+ // What the browser's WebGL is, asked once per page. A test context in software drawing takes seconds of the main thread, so the answer is kept for every element and every viewer on the page, and the context is let go the moment it has answered.
2
+ let answer = null;
3
+ let asked = 0;
4
+ /** How many test contexts this page has made: 1 once the answer is known, 0 before it is asked for. */
5
+ export function probeCount() {
6
+ return asked;
7
+ }
8
+ /**
9
+ * Says whether WebGL works here and whether it draws in software. The first call makes one test context and releases it at once; every later call, from any element or viewer, gets the same answer without making another.
10
+ *
11
+ * @returns The kept answer.
12
+ */
13
+ export function glProbe() {
14
+ if (answer)
15
+ return answer;
16
+ asked++;
17
+ let works = false;
18
+ let software = false;
19
+ let canvas = null;
20
+ try {
21
+ canvas = document.createElement("canvas");
22
+ const two = canvas.getContext("webgl2");
23
+ const gl = two ?? canvas.getContext("webgl");
24
+ works = Boolean(gl);
25
+ if (gl) {
26
+ try {
27
+ const info = gl.getExtension("WEBGL_debug_renderer_info");
28
+ software = /swiftshader|llvmpipe|softpipe/i.test(info ? String(gl.getParameter(info.UNMASKED_RENDERER_WEBGL)) : "");
29
+ }
30
+ catch {
31
+ // The name is only a hint for smooth edges.
32
+ }
33
+ gl.getExtension("WEBGL_lose_context")?.loseContext();
34
+ }
35
+ }
36
+ catch {
37
+ works = false;
38
+ }
39
+ if (canvas) {
40
+ // A canvas of no size lets its drawing buffer go with it.
41
+ canvas.width = 0;
42
+ canvas.height = 0;
43
+ }
44
+ answer = { works, software };
45
+ return answer;
46
+ }
@@ -203,6 +203,10 @@ export declare class RocketViewer {
203
203
  private skyGroups;
204
204
  private skyWhen;
205
205
  private moveSky;
206
+ /** Seconds of the Earth's own day that pass in each real second; 0 holds it still. */
207
+ private worldRate;
208
+ private worldAt;
209
+ private turnWorld;
206
210
  private paintSkyGroups;
207
211
  constructor(holder: HTMLElement, options: ViewerOptions);
208
212
  private homeAngle;
@@ -223,6 +227,8 @@ export declare class RocketViewer {
223
227
  setPaths(on: boolean): void;
224
228
  /** Shows or hides each sky group. The craft marks are the page's; this only remembers that choice on the canvas. */
225
229
  setGroups(groups: SkyShown): void;
230
+ /** How fast the Earth under the craft turns: seconds of its own day for each real second. 0 holds it still, and so does a reader who prefers less motion. */
231
+ setWorldTurn(rate: number): void;
226
232
  /** Puts the Moon, the major moons and the belts at `ms`. */
227
233
  setWhen(ms: number): void;
228
234
  private showSketch;
@@ -31,6 +31,7 @@ import { placeNameLabels } from "./namePlace.js";
31
31
  import { plinthGroup } from "./plinth.js";
32
32
  import { PartPlumes, PlumeKit } from "./plumes.js";
33
33
  import { ThrusterLayer } from "./thrusterLayer.js";
34
+ import { glProbe } from "./probe.js";
34
35
  import { craftJets, endQuads } from "../thrusters.js";
35
36
  /** The ships whose lamps turn the sun down in the Lit look. Kit modules stay in daylight. */
36
37
  const NIGHT_SHIPS = new Set(["fleet-ship-01", "fleet-kyotori", "fleet-drone", "fleet-ship-03", "fleet-ship-ariake", "fleet-02", "fleet-02-original", "fleet-kaminari", "fleet-emiake", "fleet-romaryu"]);
@@ -55,15 +56,8 @@ const COMPILE_MS = 4000;
55
56
  /** A change of craft, section or Fit eases the camera for this long, even in scale. */
56
57
  const SIZE_EASE_MS = 800;
57
58
  const autoRotateOf = (spin) => (spin.seconds <= 0 ? 0 : (60 / spin.seconds) * (spin.way === "cw" ? -1 : 1));
58
- /** A real graphics card keeps smooth edges. Software drawing spends the frame on them, and a heavy ship then misses a frame of the wait. */
59
- const smoothEdges = () => {
60
- const canvas = document.createElement("canvas");
61
- const gl = canvas.getContext("webgl2");
62
- const info = gl?.getExtension("WEBGL_debug_renderer_info");
63
- const name = info && gl ? String(gl.getParameter(info.UNMASKED_RENDERER_WEBGL)) : "";
64
- gl?.getExtension("WEBGL_lose_context")?.loseContext();
65
- return !/swiftshader|llvmpipe|softpipe/i.test(name);
66
- };
59
+ /** A real graphics card keeps smooth edges. Software drawing spends the frame on them, and a heavy ship then misses a frame of the wait. The page's one WebGL probe says which this is. */
60
+ const smoothEdges = () => !glProbe().software;
67
61
  const LINE_VERTEX = /* glsl */ `
68
62
  varying vec3 vNormal;
69
63
  varying vec2 vUv;
@@ -303,6 +297,10 @@ export class RocketViewer {
303
297
  skyGroups = { planets: true, moons: true, dwarfs: true, belts: true, craft: true };
304
298
  skyWhen = Date.now();
305
299
  moveSky = null;
300
+ /** Seconds of the Earth's own day that pass in each real second; 0 holds it still. */
301
+ worldRate = 0;
302
+ worldAt = 0;
303
+ turnWorld = null;
306
304
  paintSkyGroups = null;
307
305
  constructor(holder, options) {
308
306
  this.holder = holder;
@@ -467,6 +465,12 @@ export class RocketViewer {
467
465
  this.showSketch();
468
466
  this.wake();
469
467
  }
468
+ /** How fast the Earth under the craft turns: seconds of its own day for each real second. 0 holds it still, and so does a reader who prefers less motion. */
469
+ setWorldTurn(rate) {
470
+ this.worldRate = Number.isFinite(rate) ? rate : 0;
471
+ this.worldAt = 0;
472
+ this.wake();
473
+ }
470
474
  /** Puts the Moon, the major moons and the belts at `ms`. */
471
475
  setWhen(ms) {
472
476
  if (!Number.isFinite(ms))
@@ -503,7 +507,7 @@ export class RocketViewer {
503
507
  if (this.orbitGone || this.scene.getObjectByName("orbit-world"))
504
508
  return;
505
509
  this.orbitGone = () => { };
506
- void import("./orbitWorld.js").then(({ applySolarGroups, moveOrbit, orbitWorld }) => {
510
+ void import("./orbitWorld.js").then(({ applySolarGroups, moveOrbit, orbitWorld, turnOrbit }) => {
507
511
  if (this.disposed)
508
512
  return;
509
513
  const world = orbitWorld(() => {
@@ -515,6 +519,7 @@ export class RocketViewer {
515
519
  this.moonNode = world.group.getObjectByName("moon") ?? null;
516
520
  this.orbitGone = world.dispose;
517
521
  this.moveSky = (ms) => moveOrbit(world.group, ms);
522
+ this.turnWorld = (seconds) => turnOrbit(world.group, seconds);
518
523
  this.paintSkyGroups = (groups) => applySolarGroups(world.group, groups);
519
524
  this.paintSkyGroups(this.skyGroups);
520
525
  this.canvas.dataset.globe = this.orbitOn ? "earth" : "off";
@@ -2903,6 +2908,15 @@ export class RocketViewer {
2903
2908
  this.swarm?.step(now / 1000);
2904
2909
  this.needsDraw = true;
2905
2910
  }
2911
+ const worldTurning = this.orbitOn && this.turnWorld !== null && this.worldRate !== 0 && !this.options.reducedMotion;
2912
+ if (worldTurning && this.turnWorld && now - this.worldAt >= MOTION_GAP_MS) {
2913
+ // a gap longer than a few frames is the page being hidden or busy, not time the Earth should catch up on
2914
+ const seconds = this.worldAt === 0 ? MOTION_GAP_MS / 1000 : Math.min(0.1, (now - this.worldAt) / 1000);
2915
+ this.worldAt = now;
2916
+ this.canvas.dataset.worldTurn = this.turnWorld(seconds * this.worldRate).toFixed(3);
2917
+ this.needsDraw = true;
2918
+ }
2919
+ this.canvas.dataset.worldTurning = worldTurning ? "true" : "false";
2906
2920
  const pulsing = this.hasPulse && this.lightsMode !== "off" && !this.options.reducedMotion;
2907
2921
  if (pulsing && now - this.lampDrawn >= MOTION_GAP_MS) {
2908
2922
  this.lampDrawn = now;
@@ -3007,7 +3021,7 @@ export class RocketViewer {
3007
3021
  const drifting = this.drifting();
3008
3022
  const jetting = this.thrusterChoice === "station-keeping" && !this.options.reducedMotion && awake || (this.thrusters?.puffCount() ?? 0) > 0;
3009
3023
  const inspectingOn = this.inspectCount > 0 && this.inspectPlaying && this.progressAt === null && !this.options.reducedMotion;
3010
- if (!this.frame && ((ambient && this.controls.autoRotate) || changed || this.pose || this.needsDraw || Math.abs(dA) > 1e-5 || flaming || flying || motioning || welding || pulsing || drifting || jetting || inspectingOn || this.ghost || this.paintFades.length > 0))
3024
+ if (!this.frame && ((ambient && this.controls.autoRotate) || changed || this.pose || this.needsDraw || Math.abs(dA) > 1e-5 || flaming || flying || motioning || welding || worldTurning || pulsing || drifting || jetting || inspectingOn || this.ghost || this.paintFades.length > 0))
3011
3025
  this.frame = requestAnimationFrame(this.tick);
3012
3026
  this.inTick = false;
3013
3027
  };
package/dist/element.d.ts CHANGED
@@ -65,6 +65,8 @@ export declare class UchusenRocket extends HTMLBase {
65
65
  private stateNow;
66
66
  private shownAt;
67
67
  private starting;
68
+ /** Whether this element has asked the page's WebGL answer since it started watching. */
69
+ private glAsked;
68
70
  private key;
69
71
  private driven;
70
72
  private placeFrame;