@johnmorrisdotca/uchusen-rockets 0.17.0 → 0.19.0

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 (319) hide show
  1. package/CHANGELOG.md +30 -4
  2. package/NOTICE.md +22 -4
  3. package/README.md +15 -10
  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/scene.d.ts +6 -0
  297. package/dist/element/scene.js +22 -2
  298. package/dist/element.js +11 -2
  299. package/dist/launches/data.d.ts +2 -0
  300. package/dist/launches/data.js +4 -0
  301. package/dist/launches/index.d.ts +318 -0
  302. package/dist/launches/index.js +249 -0
  303. package/dist/launches/links.d.ts +43 -0
  304. package/dist/launches/links.js +40 -0
  305. package/dist/launches/source.d.ts +20 -0
  306. package/dist/launches/source.js +22 -0
  307. package/dist/model/hubble.js +51 -17
  308. package/dist/model/iss.js +109 -23
  309. package/dist/model/jupiterc.js +29 -11
  310. package/dist/model/registry.js +4 -2
  311. package/dist/model/tiangong.d.ts +2 -0
  312. package/dist/model/tiangong.js +109 -0
  313. package/dist/parts.d.ts +1 -1
  314. package/dist/rockets.js +52 -3
  315. package/dist/thrusters.js +4 -4
  316. package/package.json +12 -2
  317. package/dist/assets/models/hubble-telescope.glb +0 -0
  318. package/dist/assets/models/iss-station.glb +0 -0
  319. package/dist/assets/models/jupiter-c-vehicle.glb +0 -0
@@ -0,0 +1,22 @@
1
+ // GENERATED by scripts/make-launches.ts. Do not edit by hand: see NOTICE.md and docs/guides/launch-log.md.
2
+ // Where the launch log comes from. It is a file of its own so that reading the credit does not load the data in ./data.ts.
3
+ /**
4
+ * Where the log comes from: GCAT, its author, its licence and the exact credit to print where the log is used, with the release it was packed from and the day its files were last updated.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { LAUNCH_LOG_SOURCE } from "@johnmorrisdotca/uchusen-rockets/launches/source";
9
+ *
10
+ * console.log(LAUNCH_LOG_SOURCE.credit);
11
+ * ```
12
+ */
13
+ export const LAUNCH_LOG_SOURCE = {
14
+ title: "GCAT: General Catalog of Artificial Space Objects",
15
+ author: "Jonathan C. McDowell",
16
+ url: "https://planet4589.org/space/gcat",
17
+ licence: "CC BY 4.0",
18
+ licenceUrl: "https://creativecommons.org/licenses/by/4.0/",
19
+ credit: "Data from GCAT (J. McDowell, planet4589.org/space/gcat)",
20
+ release: "1.8.9",
21
+ updated: "2026-11-09",
22
+ };
@@ -1,28 +1,62 @@
1
- // Hubble in plain shapes, for the line looks: its length and width are sourced, and where its arrays and door stand is measured from NASA's model at that scale. The painted look is NASA's model.
1
+ // Hubble in plain shapes, for the line looks, as parts in slots: its length and width are sourced, and where each part begins, and where its arrays and antennas stand, is measured from the licensed model at that
2
+ // scale. The painted look is that model, one file a part. The five sections stack up the axis; the arrays run out along ±X and the antennas along ±Z from where they are rooted on the forward shell.
2
3
  import { HUBBLE_WIDE } from "../data/hubble.js";
3
- import { tube } from "./kit.js";
4
- const H = 13.2;
4
+ import { blank } from "../data/types.js";
5
+ import { horn } from "./fleet/detail.js";
6
+ import { taper, tube } from "./kit.js";
7
+ import { strut } from "./pieces.js";
5
8
  const R = (HUBBLE_WIDE.value ?? 0) / 2;
6
- const TUBE_R = R * 0.74;
7
- const WAIST = 5.1;
9
+ /** The forward section's radius, from the model at the sourced width. */
10
+ const SHIELD_R = 1.285;
11
+ const AFT = 3.65;
12
+ const EQUIPMENT = 1.7;
13
+ const FORWARD = 3.04;
14
+ const SHIELD = 4.74;
15
+ const DOOR = 0.07;
16
+ /** Where the arrays' masts and the antennas' booms are rooted: up the stack, and out from the axis. */
17
+ const ARRAY_Y = 5.82;
18
+ const ARRAY_ROOT = 1.48;
19
+ const ANTENNA_Y = 6.13;
20
+ const ANTENNA_ROOT = 1.69;
21
+ /** The forward section's width, and a wing's and a boom's reach, have no figure in a source read here. */
22
+ const FORWARD_WIDE = blank("The forward section's width has no figure in a source read here: the model's is 2.6 m at the sourced width of the aft shroud.");
23
+ const ARRAY_WIDE = blank("A wing's reach has no figure in a source read here: the model's is 3.7 m out from the shell.");
24
+ const ANTENNA_WIDE = blank("A boom's reach has no figure in a source read here: the model's is 3.9 m out from the shell.");
25
+ const aftShroud = () => [tube("steel", R, 0, AFT, { rings: [0.02, 2.2, AFT - 0.02] }), { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [R, 0]] }];
26
+ const equipmentSection = () => [tube("steel", R, 0, EQUIPMENT, { welds: [0.6, 1.1] })];
27
+ const forwardShell = () => [tube("steel", R, 0, 0.98, { rings: [0.02] }), taper("steel", R, 0.98, SHIELD_R, FORWARD)];
28
+ const lightShield = () => [tube("steel", SHIELD_R, 0, SHIELD, { rings: [1, 2.2, 3.4], welds: [SHIELD - 0.02] })];
29
+ const apertureDoor = () => [{ kind: "lathe", material: "engine-pale", segs: 32, body: true, outline: true, profile: [[SHIELD_R, 0], [SHIELD_R, DOOR], [0.001, DOOR]] }];
30
+ /** A wing: its mast out along `side` X from the root, then the panel, 2.1 m wide and 6.2 m tall. */
8
31
  const array = (side) => {
9
- const frame = { o: [side * (R + 3.5), WAIST, 0], u: [1, 0, 0], v: [0, 0, 1], w: [0, 1, 0] };
10
- return { kind: "plate", material: "gold", frame, outline: [[-1.2, -6.2], [1.2, -6.2], [1.2, 6.2], [-1.2, 6.2]], thickness: 0.06, ribs: [[[-1.2, 0], [1.2, 0]]] };
32
+ const frame = { o: [side * 2.62, 0, 0], u: [1, 0, 0], v: [0, 1, 0], w: [0, 0, 1] };
33
+ return [
34
+ strut("engine-pale", [0, 0, 0], [side * 1.56, 0, 0], 0.3, 0.3, { plain: false }),
35
+ { kind: "plate", material: "gold", frame, outline: [[-1.05, -3.1], [1.05, -3.1], [1.05, 3.1], [-1.05, 3.1]], thickness: 0.06, ribs: [[[0, -3.1], [0, 3.1]]] },
36
+ ];
11
37
  };
12
- const telescope = () => [
13
- tube("steel", R, 0, WAIST, { rings: [0.02, 2.2, WAIST - 0.02] }),
14
- { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [R, 0]] },
15
- tube("steel", TUBE_R, WAIST, H, { rings: [8.4], welds: [10.2] }),
16
- { kind: "lathe", material: "soot", segs: 28, under: true, only: "mesh", profile: [[TUBE_R * 0.96, H], [0, H]] },
17
- { kind: "plate", material: "engine-pale", frame: { o: [0, H + 0.02, 0], u: [1, 0, 0], v: [0, 0, 1], w: [0, 1, 0] }, outline: [[-TUBE_R, -TUBE_R], [TUBE_R, -TUBE_R], [TUBE_R, TUBE_R], [-TUBE_R, TUBE_R]], thickness: 0.05, plain: true },
18
- array(1),
19
- array(-1),
38
+ /** A high-gain antenna: its boom out along `side` Z from the root, and its dish at the end. */
39
+ const antenna = (side) => [
40
+ strut("engine-pale", [0, 0, 0], [0, 0, side * 2.9], 0.15, 0.15, { plain: false }),
41
+ ...horn("engine-pale", [0, 0, side * 2.9], [0, 0, side * 3.9], [0.15, 0.4, 0.6], 12, { only: undefined, plain: false }),
20
42
  ];
43
+ const FROM = "Cybertron B-127's model for the painted look, one file a part, its wordmark and logos painted out and its door turned shut. This package's plain shapes for the two line looks, from the sourced length and width; where each part begins, and where its arrays and antennas stand, is measured from that model. No lettering or mark is drawn.";
44
+ const painted = (part) => ({ file: `hubble-${part}.glb`, credit: "robo-reboot-hubble" });
21
45
  export const HUBBLE_BUILDS = [
22
46
  {
23
47
  rocket: "hubble",
24
48
  variant: "hubble",
25
- drawnFrom: "NASA's model for the painted look. This package's plain shapes for the two line looks, from the sourced length and width; its arrays and door are measured from NASA's model. No lettering or mark is drawn.",
26
- parts: [{ slot: "telescope", kind: "spacecraft", name: "Hubble Space Telescope", height: H, diameter: R * 2, sourcedDiameter: HUBBLE_WIDE, painted: { file: "hubble-telescope.glb", credit: "nasa-hubble" }, pieces: telescope }],
49
+ drawnFrom: FROM,
50
+ parts: [
51
+ { slot: "aft-shroud", kind: "module", name: "Aft shroud, Hubble", height: AFT, diameter: R * 2, top: [AFT, R * 2], sourcedDiameter: HUBBLE_WIDE, painted: painted("aft-shroud"), pieces: aftShroud },
52
+ { slot: "equipment-section", kind: "module", name: "Equipment section, Hubble", height: EQUIPMENT, diameter: R * 2, bottom: [0, R * 2], top: [EQUIPMENT, R * 2], sourcedDiameter: HUBBLE_WIDE, painted: painted("equipment-section"), pieces: equipmentSection },
53
+ { slot: "forward-shell", kind: "module", name: "Forward shell, Hubble", height: FORWARD, diameter: R * 2, bottom: [0, R * 2], top: [FORWARD, SHIELD_R * 2], sourcedDiameter: HUBBLE_WIDE, painted: painted("forward-shell"), pieces: forwardShell },
54
+ { slot: "light-shield", kind: "module", name: "Light shield, Hubble", height: SHIELD, diameter: SHIELD_R * 2, bottom: [0, SHIELD_R * 2], top: [SHIELD, SHIELD_R * 2], sourcedDiameter: FORWARD_WIDE, painted: painted("light-shield"), pieces: lightShield },
55
+ { slot: "aperture-door", kind: "module", name: "Aperture door, Hubble", height: DOOR, diameter: SHIELD_R * 2, bottom: [0, SHIELD_R * 2], sourcedDiameter: FORWARD_WIDE, painted: painted("aperture-door"), pieces: apertureDoor },
56
+ { slot: "array-left", kind: "array", name: "Solar array, left, Hubble", height: 6.2, diameter: 3.67, place: { x: -ARRAY_ROOT, z: 0, y: ARRAY_Y }, sourcedDiameter: ARRAY_WIDE, painted: painted("array-left"), pieces: () => array(-1) },
57
+ { slot: "array-right", kind: "array", name: "Solar array, right, Hubble", height: 6.2, diameter: 3.67, place: { x: ARRAY_ROOT, z: 0, y: ARRAY_Y }, sourcedDiameter: ARRAY_WIDE, painted: painted("array-right"), pieces: () => array(1) },
58
+ { slot: "antenna-near", kind: "antenna", name: "High-gain antenna, near side, Hubble", height: 1.2, diameter: 3.9, place: { x: 0, z: ANTENNA_ROOT, y: ANTENNA_Y }, sourcedDiameter: ANTENNA_WIDE, painted: painted("antenna-near"), pieces: () => antenna(1) },
59
+ { slot: "antenna-far", kind: "antenna", name: "High-gain antenna, far side, Hubble", height: 1.2, diameter: 3.9, place: { x: 0, z: -ANTENNA_ROOT, y: ANTENNA_Y }, sourcedDiameter: ANTENNA_WIDE, painted: painted("antenna-far"), pieces: () => antenna(-1) },
60
+ ],
27
61
  },
28
62
  ];
package/dist/model/iss.js CHANGED
@@ -1,32 +1,118 @@
1
- // The station in plain shapes, for the line looks: its length and truss are sourced, and where its arrays and modules stand is measured from NASA's model at that scale. Boxes and tubes, few enough for a drawing. The painted look is NASA's model.
1
+ // The station in plain shapes, for the line looks, as parts in slots: its length and truss are sourced, and where each module, segment, array, radiator and visiting craft stands is measured from NASA's model at that
2
+ // scale. Boxes and tubes, few enough for a drawing. The painted look is NASA's model, one file a part. The module run stacks up the axis from Zvezda's aft; the laboratories lie out along ±X from Harmony, the airlock
3
+ // and the visiting craft along ±Z, and the truss, its arrays and its radiators stand where the model has them, each in a frame of its own.
2
4
  import { ISS_DRAWN_TALL, ISS_LONG } from "../data/iss.js";
3
- import { tube } from "./kit.js";
5
+ import { blank } from "../data/types.js";
6
+ import { horn, rod } from "./fleet/detail.js";
7
+ import { taper, tube } from "./kit.js";
4
8
  import { strut } from "./pieces.js";
5
9
  const SPAN = (ISS_LONG.value ?? 0) / 2;
6
- const TRUSS_Y = 34;
7
- const TRUSS = 94 / 2;
8
- const array = (x, y0, y1) => {
9
- const frame = { o: [x, 0, 0], u: [1, 0, 0], v: [0, 1, 0], w: [0, 0, 1] };
10
- return { kind: "plate", material: "gold", frame, outline: [[-2.4, y0], [2.4, y0], [2.4, y1], [-2.4, y1]], thickness: 0.1 };
11
- };
12
- const station = () => {
13
- const out = [strut("engine-pale", [-TRUSS, TRUSS_Y, 0], [TRUSS, TRUSS_Y, 0], 1.5, 1.5, { plain: false })];
14
- for (const x of [SPAN - 3, SPAN - 17, -(SPAN - 3), -(SPAN - 17)])
15
- out.push(array(x, 0, TRUSS_Y - 2), array(x, TRUSS_Y + 2, ISS_DRAWN_TALL));
16
- // the long run of modules, and the crossing ones
17
- out.push(tube("white", 2.1, 16, 47, { rings: [24, 34, 40] }));
18
- for (const [y, half] of [[20, 7], [44, 8]])
19
- out.push(strut("white", [-half, y, 0], [half, y, 0], 3.6, 3.6));
20
- // radiators
21
- for (const side of [1, -1])
22
- out.push({ kind: "plate", material: "white", frame: { o: [side * 22, 0, 0], u: [1, 0, 0], v: [0, 1, 0], w: [0, 0, 1] }, outline: [[-6, 18], [6, 18], [6, TRUSS_Y - 1], [-6, TRUSS_Y - 1]], thickness: 0.1 });
23
- return out;
24
- };
10
+ /** Where the module run's parts begin, from NASA's model at the sourced length, from Zvezda's aft. */
11
+ const ZVEZDA = 11.9;
12
+ const ZARYA = 10.8;
13
+ const UNITY = 4.7;
14
+ const DESTINY = 6.3;
15
+ const HARMONY = 5.6;
16
+ /** Where the truss, the laboratories, the airlock and the visiting craft are rooted, from Zvezda's aft. */
17
+ const TRUSS_Y = 24.3;
18
+ const TRUSS_Z = 2.5;
19
+ const ARRAYS_Y = 25.8;
20
+ const LAB_Y = 36.3;
21
+ const LAB_ROOT = 1.85;
22
+ const SIDE = 2;
23
+ const MODULE_R = 1.85;
24
+ const CRAFT_R = 1.1;
25
+ const ARRAY_HALF = 2.4;
26
+ /** A round rod drawn in every look: a module or a craft lying along an axis. */
27
+ const pipe = (material, a, b, r) => rod(material, a, b, r, 20, { only: undefined, plain: false });
28
+ const panel = (material, o, half) => ({ kind: "plate", material, frame: { o, u: [1, 0, 0], v: [0, 1, 0], w: [0, 0, 1] }, outline: [[-half[0], -half[1]], [half[0], -half[1]], [half[0], half[1]], [-half[0], half[1]]], thickness: 0.1 });
29
+ const zvezda = () => [
30
+ tube("white", 2.1, 0, 4.3, { rings: [0.02, 4.28] }),
31
+ { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [2.1, 0]] },
32
+ taper("white", 2.1, 4.3, 1.5, 5),
33
+ tube("white", 1.5, 5, 9.3, { rings: [7] }),
34
+ tube("white", 1.2, 9.3, 11.3, { rings: [9.32, 11.28] }),
35
+ tube("engine-pale", 1, 11.3, ZVEZDA),
36
+ ...[1, -1].map((side) => panel("gold", [side * 6.6, 7.3, 0], [5.4, 1])),
37
+ ];
38
+ const zarya = () => [
39
+ tube("engine-pale", 1, 0, 1.5),
40
+ taper("white", 1, 1.5, 2, 2.6),
41
+ tube("white", 2, 2.6, 8.5, { rings: [2.62, 5.5, 8.48] }),
42
+ taper("white", 2, 8.5, 1.2, 9.2),
43
+ tube("white", 1.2, 9.2, ZARYA, { rings: [ZARYA - 0.02] }),
44
+ ...[1, -1].map((side) => panel("gold", [side * 4.5, 4.9, 0], [3.5, 1.5])),
45
+ ];
46
+ const unity = () => [tube("white", 1.13, 0, UNITY, { rings: [0.6, 1.5, 3.2, UNITY - 0.02] })];
47
+ const destiny = () => [tube("white", MODULE_R, 0, DESTINY, { rings: [0.02, 3.1, DESTINY - 0.02] })];
48
+ const harmony = () => [tube("white", MODULE_R, 0, 3.9, { rings: [0.02, 3.88] }), taper("white", MODULE_R, 3.9, 1, 5), tube("engine-pale", 1, 5, HARMONY)];
49
+ /** A visiting craft standing on its service module, its docking end at the top. */
50
+ const craftUp = () => [
51
+ tube("white", CRAFT_R, 0, 2.2, { rings: [0.02, 2.18] }),
52
+ { kind: "lathe", material: "dark", segs: 24, under: true, profile: [[0, 0], [CRAFT_R, 0]] },
53
+ taper("white", CRAFT_R, 2.2, 0.9, 3.6),
54
+ tube("white", CRAFT_R, 3.6, 5.5, { rings: [3.62] }),
55
+ ...[1, -1].map((side) => panel("gold", [side * 2.6, 1.1, 0], [1.5, 0.7])),
56
+ ];
57
+ /** The same craft lying out along `side` Z from its docking end, its wings flat. */
58
+ const craftOut = (side) => [
59
+ pipe("white", [0, 0, 0], [0, 0, side * 1.9], CRAFT_R),
60
+ ...horn("white", [0, 0, side * 1.9], [0, 0, side * 3.3], [0.9, 1, 1.1, 1.1], 20, { only: undefined, plain: false }),
61
+ pipe("white", [0, 0, side * 3.3], [0, 0, side * 5.5], CRAFT_R),
62
+ ...[1, -1].map((wing) => ({ kind: "plate", material: "gold", frame: { o: [wing * 2.6, 0, side * 4.4], u: [1, 0, 0], v: [0, 0, 1], w: [0, 1, 0] }, outline: [[-1.5, -0.7], [1.5, -0.7], [1.5, 0.7], [-1.5, 0.7]], thickness: 0.1 })),
63
+ ];
64
+ /** The airlock lying out along -Z where the model puts it: its equipment lock, then its narrower crew lock. */
65
+ const airlock = () => [pipe("white", [0, 0, 0], [0, 0, -4.1], 1.83), ...horn("white", [0, 0, -4.1], [0, 0, -4.9], [1.83, 1.2, 0.75], 20, { only: undefined, plain: false }), pipe("white", [0, 0, -4.9], [0, 0, -6.2], 0.75)];
66
+ const columbus = () => [pipe("white", [0, 0, 0], [5.75, 0, 0], MODULE_R)];
67
+ /** Kibo lying out along -X: its pressurised module, its logistics module standing on it, and its exposed facility beyond with the arm. */
68
+ const kibo = () => [
69
+ pipe("white", [0, 0, 0], [-7.45, 0, 0], MODULE_R),
70
+ pipe("white", [-4.75, 0, 1.6], [-4.75, 0, 5], 1.75),
71
+ strut("engine-pale", [-7.45, 0, 0], [-15.2, 0, 0], 2, 1.2, { plain: false }),
72
+ ];
73
+ /** A truss segment: a square-section beam, `from` to `to` along X, 1.5 m across, in the model's place. */
74
+ const segment = (from, to) => [strut("engine-pale", [from, 1, 0], [to, 1, 0], 1.5, 1.5, { plain: false })];
75
+ /** A pair of solar array wings on their mast: one blanket below the truss and one above, `outer` metres out along X from the mast. */
76
+ const arrays = (outer) => [panel("gold", [outer, -(ARRAYS_Y + 8.7) / 2 - 0.75, 0], [ARRAY_HALF, (ARRAYS_Y + 8.7) / 2 - 0.75]), panel("gold", [outer, (ISS_DRAWN_TALL - ARRAYS_Y - 8.7) / 2 + 0.75, 0], [ARRAY_HALF, (ISS_DRAWN_TALL - ARRAYS_Y - 8.7) / 2 - 0.75])];
77
+ const radiators = () => [-4.2, 0, 4.2].map((x) => panel("white", [x, -7.3, 0], [1.65, 9.7]));
78
+ const FROM = "NASA's model for the painted look, one file a part, with its colours judged from photographs. This package's plain shapes for the two line looks, from the sourced length and truss; where each part stands is measured from NASA's model. No flag or mark is drawn.";
79
+ const painted = (part) => ({ file: `iss-${part}.glb`, credit: "nasa-iss" });
80
+ const across = (what, metres) => blank(`${what}, as NASA's model draws it: ${metres} m.`);
81
+ const CRAFT_WIDE = across("A visiting craft's wings, tip to tip", 8.2);
82
+ const OUTER = SPAN - 50.5 - ARRAY_HALF + 0.4;
25
83
  export const ISS_BUILDS = [
26
84
  {
27
85
  rocket: "iss",
28
86
  variant: "iss",
29
- drawnFrom: "NASA's model for the painted look, with its colours judged from photographs. This package's plain shapes for the two line looks, from the sourced length and truss; where its arrays and modules stand is measured from NASA's model. No flag or mark is drawn.",
30
- parts: [{ slot: "station", kind: "spacecraft", name: "International Space Station", height: ISS_DRAWN_TALL, diameter: SPAN * 2, sourcedDiameter: ISS_LONG, painted: { file: "iss-station.glb", credit: "nasa-iss" }, pieces: station }],
87
+ drawnFrom: FROM,
88
+ parts: [
89
+ { slot: "zvezda", kind: "module", name: "Zvezda service module, ISS", height: ZVEZDA, diameter: 24, top: [ZVEZDA, 2], sourcedDiameter: across("Zvezda's wings, tip to tip", 24), painted: painted("zvezda"), pieces: zvezda },
90
+ { slot: "zarya", kind: "module", name: "Zarya, ISS", height: ZARYA, diameter: 16, bottom: [0, 2], top: [ZARYA, 2.4], sourcedDiameter: across("Zarya's wings, tip to tip", 16), painted: painted("zarya"), pieces: zarya },
91
+ { slot: "unity", kind: "module", name: "Unity node with PMA-1, ISS", height: UNITY, diameter: 2.26, bottom: [0, 2.4], top: [UNITY, MODULE_R * 2], sourcedDiameter: across("Unity with PMA-1, which the model draws narrow", 2.26), painted: painted("unity"), pieces: unity },
92
+ { slot: "destiny", kind: "module", name: "Destiny laboratory, ISS", height: DESTINY, diameter: MODULE_R * 2, bottom: [0, MODULE_R * 2], top: [DESTINY, MODULE_R * 2], sourcedDiameter: across("Destiny", 3.7), painted: painted("destiny"), pieces: destiny },
93
+ { slot: "harmony", kind: "module", name: "Harmony node with PMA-2, ISS", height: HARMONY, diameter: MODULE_R * 2, bottom: [0, MODULE_R * 2], sourcedDiameter: across("Harmony", 3.7), painted: painted("harmony"), pieces: harmony },
94
+ { slot: "soyuz-aft", kind: "spacecraft", name: "Visiting craft at Zvezda's aft port, ISS", height: 5.5, diameter: 8.2, place: { x: 0, z: 0, y: -5.5 }, sourcedDiameter: CRAFT_WIDE, painted: painted("soyuz-aft"), pieces: craftUp },
95
+ { slot: "soyuz-zvezda-nadir", kind: "spacecraft", name: "Visiting craft at Zvezda's nadir port, ISS", height: CRAFT_R * 2, diameter: 8.2, place: { x: 0, z: -SIDE, y: 7 }, sourcedDiameter: CRAFT_WIDE, painted: painted("soyuz-zvezda-nadir"), pieces: () => craftOut(-1) },
96
+ { slot: "soyuz-zvezda-zenith", kind: "spacecraft", name: "Visiting craft at Zvezda's zenith port, ISS", height: CRAFT_R * 2, diameter: 8.2, place: { x: 0, z: SIDE, y: 10.3 }, sourcedDiameter: CRAFT_WIDE, painted: painted("soyuz-zvezda-zenith"), pieces: () => craftOut(1) },
97
+ { slot: "soyuz-zarya-nadir", kind: "spacecraft", name: "Visiting craft at Zarya's nadir port, ISS", height: CRAFT_R * 2, diameter: 8.2, place: { x: 0, z: -SIDE, y: 17 }, sourcedDiameter: CRAFT_WIDE, painted: painted("soyuz-zarya-nadir"), pieces: () => craftOut(-1) },
98
+ { slot: "airlock", kind: "module", name: "Airlock under Unity, as NASA's model places it, ISS", height: 3.66, diameter: 6.2, place: { x: 0, z: -1.3, y: 25.2 }, sourcedDiameter: blank("The airlock's length, lying out from the run, as NASA's model draws it: 6.2 m. Quest is 5.5 m in its article."), painted: painted("airlock"), pieces: airlock },
99
+ { slot: "columbus", kind: "module", name: "Columbus laboratory, ISS", height: MODULE_R * 2, diameter: 5.75, place: { x: LAB_ROOT, z: 0, y: LAB_Y }, sourcedDiameter: blank("Columbus's length, lying out from Harmony, as NASA's model draws it: 5.75 m. Its article gives 6.9 m."), painted: painted("columbus"), pieces: columbus },
100
+ { slot: "kibo", kind: "module", name: "Kibo laboratory with its logistics module and exposed facility, ISS", height: 7, diameter: 15.2, place: { x: -LAB_ROOT, z: 0, y: LAB_Y }, sourcedDiameter: blank("Kibo's reach, lying out from Harmony with its exposed facility, as NASA's model draws it: 15.2 m. Its pressurised module is 11.2 m in its article."), painted: painted("kibo"), pieces: kibo },
101
+ { slot: "truss-s0", kind: "module", name: "Truss segment S0, ISS", height: 2, diameter: 14, place: { x: 0, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The centre segment's length", 14), painted: painted("truss-s0"), pieces: () => segment(-7, 7) },
102
+ { slot: "truss-s1", kind: "module", name: "Truss segment S1, ISS", height: 2, diameter: 12, place: { x: 7, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 12), painted: painted("truss-s1"), pieces: () => segment(0, 12) },
103
+ { slot: "truss-p1", kind: "module", name: "Truss segment P1, ISS", height: 2, diameter: 12, place: { x: -7, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 12), painted: painted("truss-p1"), pieces: () => segment(-12, 0) },
104
+ { slot: "truss-s3-s4", kind: "module", name: "Truss segments S3 and S4, ISS", height: 2, diameter: 14, place: { x: 19, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segments' length", 14), painted: painted("truss-s3-s4"), pieces: () => segment(0, 14) },
105
+ { slot: "truss-p3-p4", kind: "module", name: "Truss segments P3 and P4, ISS", height: 2, diameter: 14, place: { x: -19, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segments' length", 14), painted: painted("truss-p3-p4"), pieces: () => segment(-14, 0) },
106
+ { slot: "truss-s5", kind: "module", name: "Truss segment S5, ISS", height: 2, diameter: 5, place: { x: 33, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 5), painted: painted("truss-s5"), pieces: () => segment(0, 5) },
107
+ { slot: "truss-p5", kind: "module", name: "Truss segment P5, ISS", height: 2, diameter: 5, place: { x: -33, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 5), painted: painted("truss-p5"), pieces: () => segment(-5, 0) },
108
+ { slot: "truss-s6", kind: "module", name: "Truss segment S6, ISS", height: 2, diameter: 13, place: { x: 38, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 13), painted: painted("truss-s6"), pieces: () => segment(0, 13) },
109
+ { slot: "truss-p6", kind: "module", name: "Truss segment P6, ISS", height: 2, diameter: 13, place: { x: -38, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The segment's length", 13), painted: painted("truss-p6"), pieces: () => segment(-13, 0) },
110
+ { slot: "arrays-s4", kind: "array", name: "Solar array wings on S4, ISS", height: ISS_DRAWN_TALL, diameter: ARRAY_HALF * 2, place: { x: 35.5, z: TRUSS_Z, y: ARRAYS_Y }, sourcedDiameter: across("A wing's width", ARRAY_HALF * 2), painted: painted("arrays-s4"), pieces: () => arrays(0) },
111
+ { slot: "arrays-p4", kind: "array", name: "Solar array wings on P4, ISS", height: ISS_DRAWN_TALL, diameter: ARRAY_HALF * 2, place: { x: -35.5, z: TRUSS_Z, y: ARRAYS_Y }, sourcedDiameter: across("A wing's width", ARRAY_HALF * 2), painted: painted("arrays-p4"), pieces: () => arrays(0) },
112
+ { slot: "arrays-s6", kind: "array", name: "Solar array wings on S6, ISS", height: ISS_DRAWN_TALL, diameter: ARRAY_HALF * 2 + OUTER, place: { x: 50.5, z: TRUSS_Z, y: ARRAYS_Y }, sourcedDiameter: across("A wing's width, standing out from its mast", ARRAY_HALF * 2 + OUTER), painted: painted("arrays-s6"), pieces: () => arrays(OUTER) },
113
+ { slot: "arrays-p6", kind: "array", name: "Solar array wings on P6, ISS", height: ISS_DRAWN_TALL, diameter: ARRAY_HALF * 2 + OUTER, place: { x: -50.5, z: TRUSS_Z, y: ARRAYS_Y }, sourcedDiameter: across("A wing's width, standing out from its mast", ARRAY_HALF * 2 + OUTER), painted: painted("arrays-p6"), pieces: () => arrays(-OUTER) },
114
+ { slot: "radiators-starboard", kind: "module", name: "Radiators on S1, ISS", height: 19.4, diameter: 11.7, place: { x: 19, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The three panels, across", 11.7), painted: painted("radiators-starboard"), pieces: radiators },
115
+ { slot: "radiators-port", kind: "module", name: "Radiators on P1, ISS", height: 19.4, diameter: 11.7, place: { x: -19, z: TRUSS_Z, y: TRUSS_Y }, sourcedDiameter: across("The three panels, across", 11.7), painted: painted("radiators-port"), pieces: radiators },
116
+ ],
31
117
  },
32
118
  ];
@@ -1,24 +1,42 @@
1
- // Jupiter-C in plain shapes, for the line looks: its height and width are sourced, and its outline is measured from NASA's model at that scale. The painted look is NASA's model.
1
+ // Jupiter-C in plain shapes, for the line looks, as four stages in slots: its height and width are sourced, and where each stage begins is measured from NASA's model at that scale. The painted look is NASA's model, one file a stage.
2
2
  import { JUPITER_C_WIDE } from "../data/jupiterc.js";
3
+ import { blank } from "../data/types.js";
3
4
  import { fins, floor, stripes, taper, tube } from "./kit.js";
4
5
  const H = 21.3;
5
6
  const R = (JUPITER_C_WIDE.value ?? 0) / 2;
6
- const vehicle = () => [
7
- tube("white", R, 0.42, 3.1, { rings: [0.44, 3.08] }),
8
- ...stripes("black", R, 0.42, 3.1, [0, 180], 60),
7
+ /** Where each stage begins, from NASA's model at the sourced height: the tail unit, the Redstone body, the spinning tub and the top stage. The tub nests a little in the body's top, and the top stage in the tub's. */
8
+ const TAIL = 3.095;
9
+ const BODY = 15.03;
10
+ const TUB = 1.442;
11
+ const TUB_NEST = 0.173;
12
+ const TOP_NEST = 0.022;
13
+ const TOP = H - (TAIL + BODY + TUB - TUB_NEST) + TOP_NEST;
14
+ const TUB_R = 0.48;
15
+ const TOP_R = 0.167;
16
+ const FINS_WIDE = blank("1.8 m across its body, the sourced width; 2.9 m across its fins, from NASA's model.");
17
+ const TUB_WIDE = blank("The tub's width has no figure in its article: NASA's model at the sourced height gives 0.96 m.");
18
+ const TOP_WIDE = blank("The top stage's width has no figure in its article: NASA's model at the sourced height gives 0.33 m.");
19
+ const tail = () => [
20
+ tube("white", R, 0.42, TAIL, { rings: [0.44, TAIL - 0.02] }),
21
+ ...stripes("black", R, 0.42, TAIL, [0, 180], 60),
9
22
  floor(R, 0.42),
10
23
  ...fins("engine-pale", R, [45, 135, 225, 315], [[0, 0.9], [0.5, 0.1], [0.55, 0.9], [0, 2.9]], 0.06),
11
- tube("steel", R, 3.1, 14.6, { rings: [9.2], welds: [6, 12] }),
12
- taper("steel", R, 14.6, 0.47, 18.2, { rings: [14.62] }),
13
- taper("steel", 0.47, 18.2, 0.17, 19.4),
14
- tube("engine-pale", 0.17, 19.4, H - 0.4),
15
- taper("engine-pale", 0.17, H - 0.4, 0.02, H),
16
24
  ];
25
+ const body = () => [tube("steel", R, 0, 11.5, { rings: [6.1], welds: [2.9, 8.9] }), taper("steel", R, 11.5, TUB_R, BODY, { rings: [11.52] })];
26
+ const tub = () => [tube("engine-pale", TUB_R, 0, 0.85, { rings: [0.02, 0.83] }), taper("engine-pale", TUB_R, 0.85, 0.3, 0.95), tube("engine-pale", 0.3, 0.95, TUB, { rings: [TUB - 0.02] })];
27
+ const top = () => [tube("engine-pale", TOP_R, 0, TOP - 0.4), taper("engine-pale", TOP_R, TOP - 0.4, 0.02, TOP)];
28
+ const FROM = "NASA's model for the painted look, its lettering removed, one file a stage. This package's plain shapes for the two line looks, from the sourced height and width; where each stage begins is measured from NASA's model. No lettering is drawn.";
29
+ const painted = (stage) => ({ file: `jupiter-c-${stage}.glb`, credit: "nasa-jupiter-c" });
17
30
  export const JUPITER_C_BUILDS = [
18
31
  {
19
32
  rocket: "jupiter-c",
20
33
  variant: "jupiter-c",
21
- drawnFrom: "NASA's model for the painted look, its lettering removed. This package's plain shapes for the two line looks, from the sourced height and width. No lettering is drawn.",
22
- parts: [{ slot: "vehicle", kind: "first-stage", name: "Jupiter-C", height: H, diameter: R * 2, sourcedDiameter: JUPITER_C_WIDE, painted: { file: "jupiter-c-vehicle.glb", credit: "nasa-jupiter-c" }, pieces: vehicle }],
34
+ drawnFrom: FROM,
35
+ parts: [
36
+ { slot: "tail", kind: "tail", name: "Tail unit with its four fins, Jupiter-C", height: TAIL, diameter: R * 2 + 1.1, top: [TAIL, R * 2], sourcedDiameter: FINS_WIDE, painted: painted("tail"), pieces: tail },
37
+ { slot: "first-stage", kind: "first-stage", name: "Redstone first stage, Jupiter-C", height: BODY, diameter: R * 2, bottom: [0, R * 2], top: [BODY, TUB_R * 2], sourcedDiameter: JUPITER_C_WIDE, painted: painted("first-stage"), pieces: body },
38
+ { slot: "tub", kind: "second-stage", name: "Spinning tub with stages 2 and 3, Jupiter-C", height: TUB, diameter: TUB_R * 2, bottom: [TUB_NEST, TUB_R * 2], top: [TUB, TOP_R * 2], sourcedDiameter: TUB_WIDE, painted: painted("tub"), pieces: tub },
39
+ { slot: "fourth-stage", kind: "fourth-stage", name: "Fourth stage with Explorer 1, Jupiter-C", height: TOP, diameter: TOP_R * 2, bottom: [TOP_NEST, TOP_R * 2], sourcedDiameter: TOP_WIDE, painted: painted("fourth-stage"), pieces: top },
40
+ ],
23
41
  },
24
42
  ];
@@ -35,6 +35,8 @@ import { ISS_VARIANTS } from "../data/iss.js";
35
35
  import { ISS_BUILDS } from "./iss.js";
36
36
  import { HUBBLE_VARIANTS } from "../data/hubble.js";
37
37
  import { HUBBLE_BUILDS } from "./hubble.js";
38
+ import { TIANGONG_VARIANTS } from "../data/tiangong.js";
39
+ import { TIANGONG_BUILDS } from "./tiangong.js";
38
40
  import { DRONE_VARIANTS } from "../data/drone.js";
39
41
  import { DRONE_BUILDS } from "./drone.js";
40
42
  import { DRAGON_INSIDE_BUILDS } from "./dragoninside.js";
@@ -146,8 +148,8 @@ const figure = (value, source) => ({ value, source });
146
148
  entries.push({ record: { id: "falcon-heavy-falcon-heavy-centre", kind: "first-stage", name: "Falcon Heavy centre core, with its upper stage and fairing", rocket: "falcon-heavy", trueTo: ["falcon-heavy"], height: 70, diameter: 5.2, sourced: { height: figure(70, "wikipedia-falcon-heavy"), diameter: { ...blankFigure, note: "3.7 m the core; 5.2 m the fairing." } }, joints: {}, painted: PAINTED["falcon-heavy-falcon-heavy-centre"], drawnFrom: FH_FROM }, pieces: () => centreCore(70, 1.85) }, { record: { id: "falcon-heavy-falcon-heavy-side-left", kind: "first-stage", name: "Falcon Heavy side booster, left", rocket: "falcon-heavy", trueTo: ["falcon-heavy"], height: FH_SIDE_HEIGHT, diameter: 3.7, strapOn: { x: -FH_OFFSET, z: 0 }, sourced: { height: blankFigure, diameter: figure(3.7, "wikipedia-falcon-heavy") }, joints: {}, painted: PAINTED["falcon-heavy-falcon-heavy-side-left"], drawnFrom: FH_FROM }, pieces: () => sideBooster(FH_SIDE_HEIGHT, 1.85, -1) }, { record: { id: "falcon-heavy-falcon-heavy-side-right", kind: "first-stage", name: "Falcon Heavy side booster, right", rocket: "falcon-heavy", trueTo: ["falcon-heavy"], height: FH_SIDE_HEIGHT, diameter: 3.7, strapOn: { x: FH_OFFSET, z: 0 }, sourced: { height: blankFigure, diameter: figure(3.7, "wikipedia-falcon-heavy") }, joints: {}, painted: PAINTED["falcon-heavy-falcon-heavy-side-right"], drawnFrom: FH_FROM }, pieces: () => sideBooster(FH_SIDE_HEIGHT, 1.85, 1) }, { record: { id: "grasshopper-grasshopper-vehicle", kind: "test-vehicle", name: "Grasshopper, test vehicle", rocket: "grasshopper", trueTo: ["grasshopper"], height: 32, diameter: 3.2, sourced: { height: figure(32, "wikipedia-grasshopper"), diameter: blankFigure }, joints: {}, painted: PAINTED["grasshopper-grasshopper-vehicle"], drawnFrom: "This package's code for the two line looks, proportions taken from Echo_3's low-poly model at the sourced height; that model for the painted look." }, pieces: () => grasshopper(32) });
147
149
  // ---------------------------------------------------------------------------------------------------------------------------------
148
150
  // Rockets drawn wholly by this package's code, from their tables
149
- const stackFacts = [...DRONE_VARIANTS, ...HUBBLE_VARIANTS, ...ISS_VARIANTS, ...JUPITER_C_VARIANTS, ...MERCURY_VARIANTS, ...GEMINI_VARIANTS, ...APOLLO_SOYUZ_VARIANTS, ...LUNAR_MODULE_VARIANTS, ...STARBASE_VARIANTS, ...DRAGON_VARIANTS, ...TOWER_VARIANTS, ...DRONESHIP_VARIANTS, ...LANDING_ZONE_VARIANTS, ...SOYUZ_VARIANTS, ...NEW_GLENN_VARIANTS, ...ELECTRON_VARIANTS, ...SLS_VARIANTS, ...FALCON_1_VARIANTS, ...SATURN_V_VARIANTS, ...SHUTTLE_VARIANTS, ...SHIP_02_VARIANTS];
150
- const stacks = [...DRONE_BUILDS, ...HUBBLE_BUILDS, ...ISS_BUILDS, ...JUPITER_C_BUILDS, ...MERCURY_BUILDS, ...GEMINI_BUILDS, ...APOLLO_SOYUZ_BUILDS, ...LUNAR_MODULE_BUILDS, ...STARBASE_BUILDS, ...DRAGON_INSIDE_BUILDS, ...TOWER_BUILDS, ...DRONESHIP_BUILDS, ...LANDING_ZONE_BUILDS, ...SOYUZ_BUILDS, ...NEW_GLENN_BUILDS, ...ELECTRON_BUILDS, ...SLS_BUILDS, ...FALCON_1_BUILDS, ...SATURN_V_BUILDS, ...SHUTTLE_BUILDS, ...SHIP_02_BUILDS];
151
+ const stackFacts = [...DRONE_VARIANTS, ...HUBBLE_VARIANTS, ...ISS_VARIANTS, ...TIANGONG_VARIANTS, ...JUPITER_C_VARIANTS, ...MERCURY_VARIANTS, ...GEMINI_VARIANTS, ...APOLLO_SOYUZ_VARIANTS, ...LUNAR_MODULE_VARIANTS, ...STARBASE_VARIANTS, ...DRAGON_VARIANTS, ...TOWER_VARIANTS, ...DRONESHIP_VARIANTS, ...LANDING_ZONE_VARIANTS, ...SOYUZ_VARIANTS, ...NEW_GLENN_VARIANTS, ...ELECTRON_VARIANTS, ...SLS_VARIANTS, ...FALCON_1_VARIANTS, ...SATURN_V_VARIANTS, ...SHUTTLE_VARIANTS, ...SHIP_02_VARIANTS];
152
+ const stacks = [...DRONE_BUILDS, ...HUBBLE_BUILDS, ...ISS_BUILDS, ...TIANGONG_BUILDS, ...JUPITER_C_BUILDS, ...MERCURY_BUILDS, ...GEMINI_BUILDS, ...APOLLO_SOYUZ_BUILDS, ...LUNAR_MODULE_BUILDS, ...STARBASE_BUILDS, ...DRAGON_INSIDE_BUILDS, ...TOWER_BUILDS, ...DRONESHIP_BUILDS, ...LANDING_ZONE_BUILDS, ...SOYUZ_BUILDS, ...NEW_GLENN_BUILDS, ...ELECTRON_BUILDS, ...SLS_BUILDS, ...FALCON_1_BUILDS, ...SATURN_V_BUILDS, ...SHUTTLE_BUILDS, ...SHIP_02_BUILDS];
151
153
  for (const build of stacks)
152
154
  for (const part of build.parts) {
153
155
  const { height, diameter } = facts(stackFacts, build.variant, part.slot);
@@ -0,0 +1,2 @@
1
+ import type { StackBuild } from "./stacks.ts";
2
+ export declare const TIANGONG_BUILDS: readonly StackBuild[];
@@ -0,0 +1,109 @@
1
+ // Tiangong in plain shapes, for the line looks, as parts in slots: every length and width is sourced, and where the node's ports and the wings stand is judged from the licensed model and photographs. The painted look is
2
+ // that model, one file a part. Tianhe stands on end with its node and the forward Shenzhou stacked above it; Tianzhou hangs under its aft; the laboratories run out along ±X from the node, Wentian to the left, and the nadir Shenzhou out along +Z.
3
+ import { LAB_LONG, LAB_WIDE, SHENZHOU_LONG, SHENZHOU_WIDE, SHENZHOU_WINGS, TIANHE_WIDE, TIANZHOU_WIDE, TIANZHOU_WINGS, WING_SPAN } from "../data/tiangong.js";
4
+ import { blank } from "../data/types.js";
5
+ import { horn, rod } from "./fleet/detail.js";
6
+ import { taper, tube } from "./kit.js";
7
+ import { strut } from "./pieces.js";
8
+ const TIANHE_R = (TIANHE_WIDE.value ?? 0) / 2;
9
+ const LAB_R = (LAB_WIDE.value ?? 0) / 2;
10
+ const SHENZHOU_R = (SHENZHOU_WIDE.value ?? 0) / 2;
11
+ const TIANZHOU_R = (TIANZHOU_WIDE.value ?? 0) / 2;
12
+ /** Tianhe's body and its node, as the model divides the sourced 16.6 m. */
13
+ const TIANHE = 12.2;
14
+ const HUB = 4.4;
15
+ const LAB = 17.9;
16
+ const SHENZHOU = 9.25;
17
+ const TIANZHOU = 10.6;
18
+ /** The narrow cylinder at Tianhe's forward end and the node, and the ports' rings. */
19
+ const NECK_R = 1.55;
20
+ const PORT_R = 1.4;
21
+ /** Where the node's side ports stand: the laboratories' and the nadir Shenzhou's axis, up the stack, and the collars' reach. */
22
+ const HUB_PORT_Y = TIANHE + 2.2;
23
+ const COLLAR = 1.66;
24
+ /** A wing: half the sourced span, and its width from the sourced area. */
25
+ const WING = (WING_SPAN.value ?? 0) / 2;
26
+ const WING_WIDE = 4;
27
+ const HUB_WIDE = blank("The node's width has no figure in a source read here: 3.3 m across its collars as drawn.");
28
+ const TIANHE_WINGS_WIDE = blank("Tianhe's two wings have no size in a source read here: the model's reach 11.6 m each side, at Tianhe's scale.");
29
+ const LAB_WINGS_WIDE = blank("4 m wide: the sourced 110 m² of cells over a 27.8 m wing.");
30
+ /** A round rod drawn in every look: a module or a craft lying along an axis. */
31
+ const pipe = (material, a, b, r) => rod(material, a, b, r, 24, { only: undefined, plain: false });
32
+ /** A flat panel in a frame: a solar wing. */
33
+ const panel = (o, u, v, w, half, ribs = true) => ({ kind: "plate", material: "gold", frame: { o, u, v, w }, outline: [[-half[0], -half[1]], [half[0], -half[1]], [half[0], half[1]], [-half[0], half[1]]], thickness: 0.08, ...(ribs ? { ribs: [[[0, -half[1]], [0, half[1]]]] } : {}) });
34
+ const tianhe = () => [
35
+ tube("white", TIANHE_R * 0.75, 0, 1.2, { rings: [0.02] }),
36
+ taper("white", TIANHE_R * 0.75, 1.2, TIANHE_R, 2.4),
37
+ tube("white", TIANHE_R, 2.4, 9.6, { rings: [2.42, 6, 9.58] }),
38
+ taper("white", TIANHE_R, 9.6, NECK_R, 10.3),
39
+ tube("white", NECK_R, 10.3, TIANHE, { rings: [TIANHE - 0.02] }),
40
+ { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [TIANHE_R * 0.75, 0]] },
41
+ ];
42
+ /** The node: a short neck, the sphere-like hub with its four side collars, and the forward port. */
43
+ const hub = () => [
44
+ tube("white", NECK_R, 0, 0.8),
45
+ taper("white", NECK_R, 0.8, NECK_R + 0.15, 1.2),
46
+ tube("white", NECK_R + 0.15, 1.2, 3.2, { rings: [2.2] }),
47
+ taper("white", NECK_R + 0.15, 3.2, PORT_R, 3.7),
48
+ tube("engine-pale", PORT_R, 3.7, HUB, { rings: [HUB - 0.02] }),
49
+ ...[1, -1].map((side) => strut("engine-pale", [side * NECK_R, 2.2, 0], [side * COLLAR, 2.2, 0], 2.6, 2.6, { plain: false })),
50
+ strut("engine-pale", [0, 2.2, NECK_R], [0, 2.2, COLLAR], 2.6, 2.6, { plain: false }),
51
+ strut("white", [0, 2.2, -NECK_R], [0, 2.2, -COLLAR], 2.6, 2.6, { plain: false }),
52
+ ];
53
+ /** Shenzhou standing on its service module: service module, the bell of the re-entry module, the orbital module and its docking collar, with its two wings on the service module. */
54
+ const shenzhouUp = () => [
55
+ tube("white", SHENZHOU_R, 0, 2.94, { rings: [0.02, 2.92] }),
56
+ { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [SHENZHOU_R, 0]] },
57
+ taper("white", SHENZHOU_R, 2.94, 1.05, 5.44, { rings: [2.96] }),
58
+ tube("white", 1.1, 5.44, 8.24, { rings: [5.46, 8.22] }),
59
+ tube("engine-pale", 0.7, 8.24, SHENZHOU),
60
+ ...[1, -1].map((side) => panel([side * (SHENZHOU_R + 3.55), 1.5, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [3.55, 1.0])),
61
+ ];
62
+ /** The same craft lying out along +Z from its docking collar, as it hangs under the nadir port. */
63
+ const shenzhouOut = () => [
64
+ pipe("engine-pale", [0, 0, 0], [0, 0, 1.01], 0.7),
65
+ pipe("white", [0, 0, 1.01], [0, 0, 3.81], 1.1),
66
+ ...horn("white", [0, 0, 3.81], [0, 0, 6.31], [1.05, 1.2, 1.35, 1.4, 1.4], 24, { only: undefined, plain: false }),
67
+ pipe("white", [0, 0, 6.31], [0, 0, SHENZHOU], SHENZHOU_R),
68
+ ...[1, -1].map((side) => panel([side * (SHENZHOU_R + 3.55), 0, 7.75], [1, 0, 0], [0, 0, 1], [0, -1, 0], [3.55, 1.0])),
69
+ ];
70
+ /** Tianzhou standing on its propulsion module, its cargo module above with the docking end at the top, and its two wings on the propulsion module. */
71
+ const tianzhou = () => [
72
+ tube("white", 1.2, 0, 3.6, { rings: [0.02, 3.58] }),
73
+ { kind: "lathe", material: "dark", segs: 28, under: true, profile: [[0, 0], [1.2, 0]] },
74
+ taper("white", 1.2, 3.6, TIANZHOU_R, 4.2),
75
+ tube("white", TIANZHOU_R, 4.2, TIANZHOU - 0.3, { rings: [4.22, 7.4, TIANZHOU - 0.32] }),
76
+ tube("engine-pale", 0.7, TIANZHOU - 0.3, TIANZHOU),
77
+ ...[1, -1].map((side) => panel([side * 4.45, 1.8, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [3.0, 1.2])),
78
+ ];
79
+ /** A laboratory lying out along `side` X from the node's collar: its big cylinder, then its narrower resource section at the far end. */
80
+ const lab = (side) => [
81
+ pipe("white", [0, 0, 0], [side * 12, 0, 0], LAB_R),
82
+ ...horn("white", [side * 12, 0, 0], [side * 12.8, 0, 0], [LAB_R, 1.8], 24, { only: undefined, plain: false }),
83
+ pipe("white", [side * 12.8, 0, 0], [side * LAB, 0, 0], 1.5),
84
+ ];
85
+ /** A laboratory's two wings, up and down from its resource section, each half the sourced span. */
86
+ const labWings = () => [1, -1].map((up) => panel([0, up * (2.5 + (WING - 2.5) / 2), 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [WING_WIDE / 2, (WING - 2.5) / 2]));
87
+ /** Tianhe's two wings, out along ±X, as the model draws them. */
88
+ const tianheWings = () => [1, -1].map((side) => panel([side * 7.5, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [4.1, 2.7]));
89
+ const FROM = "w29572227's model for the painted look, one file a part, its flags and mark left out and each module at its own sourced size. This package's plain shapes for the two line looks, from the sourced lengths and widths; where the ports and the wings stand is judged from that model and photographs. No flag or mark is drawn.";
90
+ const painted = (part) => ({ file: `tiangong-${part}.glb`, credit: "w29572227-tiangong" });
91
+ export const TIANGONG_BUILDS = [
92
+ {
93
+ rocket: "tiangong",
94
+ variant: "tiangong",
95
+ drawnFrom: FROM,
96
+ parts: [
97
+ { slot: "tianhe", kind: "module", name: "Tianhe core module, Tiangong", height: TIANHE, diameter: TIANHE_R * 2, top: [TIANHE, NECK_R * 2], sourcedDiameter: TIANHE_WIDE, painted: painted("tianhe"), pieces: tianhe },
98
+ { slot: "hub", kind: "module", name: "Tianhe's docking node, Tiangong", height: HUB, diameter: COLLAR * 2, bottom: [0, NECK_R * 2], top: [HUB, PORT_R * 2], sourcedDiameter: HUB_WIDE, painted: painted("hub"), pieces: hub },
99
+ { slot: "shenzhou-forward", kind: "spacecraft", name: "Shenzhou at the forward port, Tiangong", height: SHENZHOU, diameter: SHENZHOU_WINGS.value ?? 0, bottom: [0, PORT_R * 2], sourcedDiameter: SHENZHOU_WINGS, painted: painted("shenzhou-forward"), pieces: shenzhouUp },
100
+ { slot: "tianzhou", kind: "spacecraft", name: "Tianzhou at the aft port, Tiangong", height: TIANZHOU, diameter: TIANZHOU_WINGS.value ?? 0, place: { x: 0, z: 0, y: -TIANZHOU }, sourcedDiameter: TIANZHOU_WINGS, painted: painted("tianzhou"), pieces: tianzhou },
101
+ { slot: "wentian", kind: "module", name: "Wentian laboratory module, Tiangong", height: LAB_R * 2, diameter: LAB, place: { x: -COLLAR, z: 0, y: HUB_PORT_Y }, sourcedDiameter: LAB_LONG, painted: painted("wentian"), pieces: () => lab(-1) },
102
+ { slot: "mengtian", kind: "module", name: "Mengtian laboratory module, Tiangong", height: LAB_R * 2, diameter: LAB, place: { x: COLLAR, z: 0, y: HUB_PORT_Y }, sourcedDiameter: LAB_LONG, painted: painted("mengtian"), pieces: () => lab(1) },
103
+ { slot: "tianhe-arrays", kind: "array", name: "Tianhe's solar wings, Tiangong", height: 5.4, diameter: 23.2, place: { x: 0, z: 0, y: 8.7 }, sourcedDiameter: TIANHE_WINGS_WIDE, painted: painted("tianhe-arrays"), pieces: tianheWings },
104
+ { slot: "wentian-arrays", kind: "array", name: "Wentian's solar wings, Tiangong", height: WING * 2, diameter: WING_WIDE, place: { x: -(COLLAR + LAB - 2.5), z: 0, y: HUB_PORT_Y }, sourcedDiameter: LAB_WINGS_WIDE, painted: painted("wentian-arrays"), pieces: labWings },
105
+ { slot: "mengtian-arrays", kind: "array", name: "Mengtian's solar wings, Tiangong", height: WING * 2, diameter: WING_WIDE, place: { x: COLLAR + LAB - 2.5, z: 0, y: HUB_PORT_Y }, sourcedDiameter: LAB_WINGS_WIDE, painted: painted("mengtian-arrays"), pieces: labWings },
106
+ { slot: "shenzhou-nadir", kind: "spacecraft", name: "Shenzhou at the nadir port, Tiangong", height: SHENZHOU_WINGS.value ?? 0, diameter: SHENZHOU, place: { x: 0, z: COLLAR, y: HUB_PORT_Y }, sourcedDiameter: SHENZHOU_LONG, painted: painted("shenzhou-nadir"), pieces: shenzhouOut },
107
+ ],
108
+ },
109
+ ];
package/dist/parts.d.ts CHANGED
@@ -11,7 +11,7 @@ import type { Figure } from "./data/types.ts";
11
11
  * console.log(kind);
12
12
  * ```
13
13
  */
14
- export type PartKind = "booster" | "first-stage" | "ship" | "second-stage" | "fairing" | "capsule" | "trunk" | "engine" | "fin" | "flap" | "ring" | "test-vehicle" | "third-stage" | "adapter" | "service-module" | "tower" | "tank" | "solid-booster" | "liquid-booster" | "orbiter" | "deck" | "mount" | "arms" | "site" | "spacecraft" | "module";
14
+ export type PartKind = "booster" | "first-stage" | "ship" | "second-stage" | "fairing" | "capsule" | "trunk" | "engine" | "fin" | "flap" | "ring" | "test-vehicle" | "third-stage" | "fourth-stage" | "tail" | "adapter" | "service-module" | "tower" | "tank" | "solid-booster" | "liquid-booster" | "orbiter" | "deck" | "mount" | "arms" | "site" | "spacecraft" | "module" | "array" | "antenna";
15
15
  /**
16
16
  * Where a part mates. Every part's origin is the middle of its base on its axis, at its lowest point; Y is up and the windward side faces +Z, in metres.
17
17
  *
package/dist/rockets.js CHANGED
@@ -20,6 +20,7 @@ import { MERCURY_VARIANTS } from "./data/mercury.js";
20
20
  import { JUPITER_C_VARIANTS } from "./data/jupiterc.js";
21
21
  import { ISS_VARIANTS } from "./data/iss.js";
22
22
  import { HUBBLE_VARIANTS } from "./data/hubble.js";
23
+ import { TIANGONG_VARIANTS } from "./data/tiangong.js";
23
24
  import { STARSHIP_VARIANTS } from "./data/starship.js";
24
25
  import { FLEET_KIT_ROCKETS, FLEET_SLOT_NAMES } from "./data/fleet.js";
25
26
  import { CONCEPT_SLOT_NAMES, KAMINARI_VARIANTS } from "./data/kaminari-concepts.js";
@@ -29,7 +30,7 @@ import { DRONE_VARIANTS } from "./data/drone.js";
29
30
  import { ARIAKE_VARIANTS, SHIP_03_INSET_ROCKET, SHIP_03_SLOT_NAMES, SHIP_03_VARIANTS } from "./data/ship-03.js";
30
31
  import { MADE_BY } from "./data/makers.js";
31
32
  /** Craft that fly in space: seen from any side, from straight above or below. Everything else stands on the ground or the sea, and keeps the ground in view. */
32
- const IN_SPACE = new Set(["dragon", "lunar-module", "apollo-soyuz", "gemini", "mercury", "iss", "hubble"]);
33
+ const IN_SPACE = new Set(["dragon", "lunar-module", "apollo-soyuz", "gemini", "mercury", "iss", "hubble", "tiangong"]);
33
34
  /**
34
35
  * Whether a craft flies in space: the same ones that may be seen from straight above or below, including the fleet. A rocket or a place on the ground does not. On the compare page one of these stands on a marked plinth, so it is not read as a rocket on a pad.
35
36
  *
@@ -76,6 +77,7 @@ export const ROCKETS = withTilt({
76
77
  "jupiter-c": { id: "jupiter-c", name: "Jupiter-C", status: "built", ...MADE_BY["jupiter-c"], variants: JUPITER_C_VARIANTS, defaultVariant: "jupiter-c" },
77
78
  "iss": { id: "iss", name: "International Space Station", status: "built", ...MADE_BY["iss"], variants: ISS_VARIANTS, defaultVariant: "iss" },
78
79
  "hubble": { id: "hubble", name: "Hubble Space Telescope", status: "built", ...MADE_BY["hubble"], variants: HUBBLE_VARIANTS, defaultVariant: "hubble" },
80
+ tiangong: { id: "tiangong", name: "Tiangong 天宮", status: "built", ...MADE_BY["tiangong"], variants: TIANGONG_VARIANTS, defaultVariant: "tiangong" },
79
81
  droneship: { id: "droneship", name: "Drone ships", status: "built", ...MADE_BY["droneship"], variants: DRONESHIP_VARIANTS, defaultVariant: "ocisly" },
80
82
  "landing-zone": { id: "landing-zone", name: "Landing zones", status: "built", ...MADE_BY["landing-zone"], variants: LANDING_ZONE_VARIANTS, defaultVariant: "lz-1" },
81
83
  "launch-tower": { id: "launch-tower", name: "Launch tower", status: "built", ...MADE_BY["launch-tower"], variants: TOWER_VARIANTS, defaultVariant: "stack" },
@@ -184,8 +186,55 @@ export const SLOT_NAMES = {
184
186
  "ascent": "Ascent stage",
185
187
  "csm": "Apollo command and service module",
186
188
  "docking-module": "Docking module",
187
- "station": "The station",
188
- "telescope": "The telescope",
189
+ tail: "Tail unit",
190
+ tub: "Spinning tub",
191
+ "fourth-stage": "Fourth stage",
192
+ "aft-shroud": "Aft shroud",
193
+ "equipment-section": "Equipment section",
194
+ "forward-shell": "Forward shell",
195
+ "light-shield": "Light shield",
196
+ "aperture-door": "Aperture door",
197
+ "array-left": "Solar array, left",
198
+ "array-right": "Solar array, right",
199
+ "antenna-near": "High-gain antenna, near side",
200
+ "antenna-far": "High-gain antenna, far side",
201
+ tianhe: "Tianhe core module",
202
+ hub: "Docking node",
203
+ "shenzhou-forward": "Shenzhou, forward port",
204
+ "shenzhou-nadir": "Shenzhou, nadir port",
205
+ tianzhou: "Tianzhou, aft port",
206
+ wentian: "Wentian laboratory",
207
+ mengtian: "Mengtian laboratory",
208
+ "tianhe-arrays": "Tianhe's solar wings",
209
+ "wentian-arrays": "Wentian's solar wings",
210
+ "mengtian-arrays": "Mengtian's solar wings",
211
+ zvezda: "Zvezda",
212
+ zarya: "Zarya",
213
+ unity: "Unity with PMA-1",
214
+ destiny: "Destiny",
215
+ harmony: "Harmony with PMA-2",
216
+ "soyuz-aft": "Visiting craft, Zvezda's aft port",
217
+ "soyuz-zvezda-nadir": "Visiting craft, Zvezda's nadir port",
218
+ "soyuz-zvezda-zenith": "Visiting craft, Zvezda's zenith port",
219
+ "soyuz-zarya-nadir": "Visiting craft, Zarya's nadir port",
220
+ airlock: "Airlock",
221
+ columbus: "Columbus",
222
+ kibo: "Kibo",
223
+ "truss-s0": "Truss S0",
224
+ "truss-s1": "Truss S1",
225
+ "truss-p1": "Truss P1",
226
+ "truss-s3-s4": "Truss S3 and S4",
227
+ "truss-p3-p4": "Truss P3 and P4",
228
+ "truss-s5": "Truss S5",
229
+ "truss-p5": "Truss P5",
230
+ "truss-s6": "Truss S6",
231
+ "truss-p6": "Truss P6",
232
+ "arrays-s4": "Solar arrays on S4",
233
+ "arrays-p4": "Solar arrays on P4",
234
+ "arrays-s6": "Solar arrays on S6",
235
+ "arrays-p6": "Solar arrays on P6",
236
+ "radiators-starboard": "Radiators, starboard",
237
+ "radiators-port": "Radiators, port",
189
238
  ground: "The ground and the road",
190
239
  pads: "The pads",
191
240
  "tank-farm": "The tank farm",
package/dist/thrusters.js CHANGED
@@ -92,19 +92,19 @@ function dragonJets(variant) {
92
92
  return out;
93
93
  }
94
94
  /**
95
- * Zvezda's aft end, in the station's plain model: the module tube runs from y = 16, and that low end is aft.
95
+ * Zvezda's aft end, in the station's plain model: Zvezda is the foot of the module run, and its low end is aft.
96
96
  * Two large bells side by side, then a ring of small attitude jets.
97
97
  */
98
98
  function issJets() {
99
99
  const out = [
100
- jet("station", [0.7, 15.2, 0], [0, -1, 0], "hypergolic", 0.9),
101
- jet("station", [-0.7, 15.2, 0], [0, -1, 0], "hypergolic", 0.9),
100
+ jet("zvezda", [0.7, 0.3, 0], [0, -1, 0], "hypergolic", 0.9),
101
+ jet("zvezda", [-0.7, 0.3, 0], [0, -1, 0], "hypergolic", 0.9),
102
102
  ];
103
103
  for (let i = 0; i < 8; i++) {
104
104
  const angle = (i / 8) * Math.PI * 2;
105
105
  const c = Math.cos(angle);
106
106
  const s = Math.sin(angle);
107
- out.push(jet("station", [c * 2.25, 16.3, s * 2.25], [c * 0.6, -0.8, s * 0.6], "hypergolic", 0.22));
107
+ out.push(jet("zvezda", [c * 2.15, 1.4, s * 2.15], [c * 0.6, -0.8, s * 0.6], "hypergolic", 0.22));
108
108
  }
109
109
  return out;
110
110
  }