@johnmorrisdotca/uchusen-rockets 0.2.1 → 0.3.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.
- package/CHANGELOG.md +44 -0
- package/LICENSES/ODbL-1.0.txt +540 -0
- package/NOTICE.md +56 -6
- package/README.md +49 -14
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-apart.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-csm.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-docking-module.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz-soyuz.thick.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.glb +0 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.painted.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.svg +1 -0
- package/dist/assets/apollo-soyuz-apollo-soyuz.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-apart.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-capsule.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2-trunk.thick.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.glb +0 -0
- package/dist/assets/dragon-cargo-dragon-2.painted.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.svg +1 -0
- package/dist/assets/dragon-cargo-dragon-2.thick.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.glb +0 -0
- package/dist/assets/dragon-crew-dragon-inside.painted.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.svg +1 -0
- package/dist/assets/dragon-crew-dragon-inside.thick.svg +1 -0
- package/dist/assets/dragon-dragon-1-apart.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-apart.svg +1 -1
- package/dist/assets/dragon-dragon-1-apart.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.svg +1 -1
- package/dist/assets/dragon-dragon-1-capsule.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.svg +1 -1
- package/dist/assets/dragon-dragon-1-trunk.thick.svg +1 -1
- package/dist/assets/dragon-dragon-1.painted.svg +1 -1
- package/dist/assets/dragon-dragon-1.svg +1 -1
- package/dist/assets/dragon-dragon-1.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.svg +1 -1
- package/dist/assets/dragon-dragon-2-apart.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.svg +1 -1
- package/dist/assets/dragon-dragon-2-capsule.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.svg +1 -1
- package/dist/assets/dragon-dragon-2-trunk.thick.svg +1 -1
- package/dist/assets/dragon-dragon-2.painted.svg +1 -1
- package/dist/assets/dragon-dragon-2.svg +1 -1
- package/dist/assets/dragon-dragon-2.thick.svg +1 -1
- package/dist/assets/droneship-asog-apart.painted.svg +1 -0
- package/dist/assets/droneship-asog-apart.svg +1 -0
- package/dist/assets/droneship-asog-apart.thick.svg +1 -0
- package/dist/assets/droneship-asog-deck.glb +0 -0
- package/dist/assets/droneship-asog-deck.painted.svg +1 -0
- package/dist/assets/droneship-asog-deck.svg +1 -0
- package/dist/assets/droneship-asog-deck.thick.svg +1 -0
- package/dist/assets/droneship-asog-landed.glb +0 -0
- package/dist/assets/droneship-asog-landed.painted.svg +1 -0
- package/dist/assets/droneship-asog-landed.svg +1 -0
- package/dist/assets/droneship-asog-landed.thick.svg +1 -0
- package/dist/assets/droneship-asog.glb +0 -0
- package/dist/assets/droneship-asog.painted.svg +1 -0
- package/dist/assets/droneship-asog.svg +1 -0
- package/dist/assets/droneship-asog.thick.svg +1 -0
- package/dist/assets/droneship-jrti-apart.painted.svg +1 -0
- package/dist/assets/droneship-jrti-apart.svg +1 -0
- package/dist/assets/droneship-jrti-apart.thick.svg +1 -0
- package/dist/assets/droneship-jrti-deck.glb +0 -0
- package/dist/assets/droneship-jrti-deck.painted.svg +1 -0
- package/dist/assets/droneship-jrti-deck.svg +1 -0
- package/dist/assets/droneship-jrti-deck.thick.svg +1 -0
- package/dist/assets/droneship-jrti-landed.glb +0 -0
- package/dist/assets/droneship-jrti-landed.painted.svg +1 -0
- package/dist/assets/droneship-jrti-landed.svg +1 -0
- package/dist/assets/droneship-jrti-landed.thick.svg +1 -0
- package/dist/assets/droneship-jrti.glb +0 -0
- package/dist/assets/droneship-jrti.painted.svg +1 -0
- package/dist/assets/droneship-jrti.svg +1 -0
- package/dist/assets/droneship-jrti.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.svg +1 -0
- package/dist/assets/droneship-ocisly-apart.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.glb +0 -0
- package/dist/assets/droneship-ocisly-deck.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.svg +1 -0
- package/dist/assets/droneship-ocisly-deck.thick.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.glb +0 -0
- package/dist/assets/droneship-ocisly-landed.painted.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.svg +1 -0
- package/dist/assets/droneship-ocisly-landed.thick.svg +1 -0
- package/dist/assets/droneship-ocisly.glb +0 -0
- package/dist/assets/droneship-ocisly.painted.svg +1 -0
- package/dist/assets/droneship-ocisly.svg +1 -0
- package/dist/assets/droneship-ocisly.thick.svg +1 -0
- package/dist/assets/electron-electron-adapter.glb +0 -0
- package/dist/assets/electron-electron-adapter.painted.svg +1 -0
- package/dist/assets/electron-electron-adapter.svg +1 -0
- package/dist/assets/electron-electron-adapter.thick.svg +1 -0
- package/dist/assets/electron-electron-apart.painted.svg +1 -0
- package/dist/assets/electron-electron-apart.svg +1 -0
- package/dist/assets/electron-electron-apart.thick.svg +1 -0
- package/dist/assets/electron-electron-fairing.glb +0 -0
- package/dist/assets/electron-electron-fairing.painted.svg +1 -0
- package/dist/assets/electron-electron-fairing.svg +1 -0
- package/dist/assets/electron-electron-fairing.thick.svg +1 -0
- package/dist/assets/electron-electron-first-stage.glb +0 -0
- package/dist/assets/electron-electron-first-stage.painted.svg +1 -0
- package/dist/assets/electron-electron-first-stage.svg +1 -0
- package/dist/assets/electron-electron-first-stage.thick.svg +1 -0
- package/dist/assets/electron-electron-second-stage.glb +0 -0
- package/dist/assets/electron-electron-second-stage.painted.svg +1 -0
- package/dist/assets/electron-electron-second-stage.svg +1 -0
- package/dist/assets/electron-electron-second-stage.thick.svg +1 -0
- package/dist/assets/electron-electron.glb +0 -0
- package/dist/assets/electron-electron.painted.svg +1 -0
- package/dist/assets/electron-electron.svg +1 -0
- package/dist/assets/electron-electron.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-apart.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-fairing.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-fairing.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-first-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1-second-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.glb +0 -0
- package/dist/assets/falcon-1-falcon-1.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.svg +1 -0
- package/dist/assets/falcon-1-falcon-1.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-apart.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-fairing.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-first-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e-second-stage.thick.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.glb +0 -0
- package/dist/assets/falcon-1-falcon-1e.painted.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.svg +1 -0
- package/dist/assets/falcon-1-falcon-1e.thick.svg +1 -0
- package/dist/assets/falcon-9-block-5-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-apart.svg +1 -1
- package/dist/assets/falcon-9-block-5-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-capsule.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2-trunk.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.svg +1 -1
- package/dist/assets/falcon-9-block-5-dragon-2.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.svg +1 -1
- package/dist/assets/falcon-9-block-5-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.svg +1 -1
- package/dist/assets/falcon-9-block-5-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-block-5.painted.svg +1 -1
- package/dist/assets/falcon-9-block-5.svg +1 -1
- package/dist/assets/falcon-9-block-5.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.svg +1 -1
- package/dist/assets/falcon-9-ft-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.svg +1 -1
- package/dist/assets/falcon-9-ft-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.svg +1 -1
- package/dist/assets/falcon-9-ft-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.svg +1 -1
- package/dist/assets/falcon-9-ft-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-ft.painted.svg +1 -1
- package/dist/assets/falcon-9-ft.svg +1 -1
- package/dist/assets/falcon-9-ft.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.svg +1 -1
- package/dist/assets/falcon-9-v1.0-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.svg +1 -1
- package/dist/assets/falcon-9-v1.0-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.0-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.0-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.0.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.0.svg +1 -1
- package/dist/assets/falcon-9-v1.0.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.svg +1 -1
- package/dist/assets/falcon-9-v1.1-apart.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.svg +1 -1
- package/dist/assets/falcon-9-v1.1-fairing.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.1-first-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.svg +1 -1
- package/dist/assets/falcon-9-v1.1-second-stage.thick.svg +1 -1
- package/dist/assets/falcon-9-v1.1.painted.svg +1 -1
- package/dist/assets/falcon-9-v1.1.svg +1 -1
- package/dist/assets/falcon-9-v1.1.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-apart.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-centre.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-left.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy-side-right.thick.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.painted.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.svg +1 -1
- package/dist/assets/falcon-heavy-falcon-heavy.thick.svg +1 -1
- package/dist/assets/gemini-gemini-adapter.glb +0 -0
- package/dist/assets/gemini-gemini-adapter.painted.svg +1 -0
- package/dist/assets/gemini-gemini-adapter.svg +1 -0
- package/dist/assets/gemini-gemini-adapter.thick.svg +1 -0
- package/dist/assets/gemini-gemini-apart.painted.svg +1 -0
- package/dist/assets/gemini-gemini-apart.svg +1 -0
- package/dist/assets/gemini-gemini-apart.thick.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.glb +0 -0
- package/dist/assets/gemini-gemini-capsule.painted.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.svg +1 -0
- package/dist/assets/gemini-gemini-capsule.thick.svg +1 -0
- package/dist/assets/gemini-gemini.glb +0 -0
- package/dist/assets/gemini-gemini.painted.svg +1 -0
- package/dist/assets/gemini-gemini.svg +1 -0
- package/dist/assets/gemini-gemini.thick.svg +1 -0
- package/dist/assets/grasshopper-grasshopper.painted.svg +1 -1
- package/dist/assets/grasshopper-grasshopper.svg +1 -1
- package/dist/assets/grasshopper-grasshopper.thick.svg +1 -1
- package/dist/assets/hubble-hubble.glb +0 -0
- package/dist/assets/hubble-hubble.painted.svg +1 -0
- package/dist/assets/hubble-hubble.svg +1 -0
- package/dist/assets/hubble-hubble.thick.svg +1 -0
- package/dist/assets/iss-iss.glb +0 -0
- package/dist/assets/iss-iss.painted.svg +1 -0
- package/dist/assets/iss-iss.svg +1 -0
- package/dist/assets/iss-iss.thick.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.glb +0 -0
- package/dist/assets/jupiter-c-jupiter-c.painted.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.svg +1 -0
- package/dist/assets/jupiter-c-jupiter-c.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.svg +1 -0
- package/dist/assets/landing-zone-lz-1-apart.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-1-landed.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.svg +1 -0
- package/dist/assets/landing-zone-lz-1-landed.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.glb +0 -0
- package/dist/assets/landing-zone-lz-1-pad.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.svg +1 -0
- package/dist/assets/landing-zone-lz-1-pad.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-1.glb +0 -0
- package/dist/assets/landing-zone-lz-1.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-1.svg +1 -0
- package/dist/assets/landing-zone-lz-1.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.svg +1 -0
- package/dist/assets/landing-zone-lz-4-apart.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.glb +0 -0
- package/dist/assets/landing-zone-lz-4-landed.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.svg +1 -0
- package/dist/assets/landing-zone-lz-4-landed.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.glb +0 -0
- package/dist/assets/landing-zone-lz-4-pad.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.svg +1 -0
- package/dist/assets/landing-zone-lz-4-pad.thick.svg +1 -0
- package/dist/assets/landing-zone-lz-4.glb +0 -0
- package/dist/assets/landing-zone-lz-4.painted.svg +1 -0
- package/dist/assets/landing-zone-lz-4.svg +1 -0
- package/dist/assets/landing-zone-lz-4.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.svg +1 -0
- package/dist/assets/launch-tower-catch-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.glb +0 -0
- package/dist/assets/launch-tower-catch-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.svg +1 -0
- package/dist/assets/launch-tower-catch-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.glb +0 -0
- package/dist/assets/launch-tower-catch-booster.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.svg +1 -0
- package/dist/assets/launch-tower-catch-booster.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.glb +0 -0
- package/dist/assets/launch-tower-catch-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.svg +1 -0
- package/dist/assets/launch-tower-catch-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.glb +0 -0
- package/dist/assets/launch-tower-catch-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.svg +1 -0
- package/dist/assets/launch-tower-catch-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-catch.glb +0 -0
- package/dist/assets/launch-tower-catch.painted.svg +1 -0
- package/dist/assets/launch-tower-catch.svg +1 -0
- package/dist/assets/launch-tower-catch.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.svg +1 -0
- package/dist/assets/launch-tower-stack-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.glb +0 -0
- package/dist/assets/launch-tower-stack-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.svg +1 -0
- package/dist/assets/launch-tower-stack-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.glb +0 -0
- package/dist/assets/launch-tower-stack-booster.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.svg +1 -0
- package/dist/assets/launch-tower-stack-booster.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.glb +0 -0
- package/dist/assets/launch-tower-stack-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.svg +1 -0
- package/dist/assets/launch-tower-stack-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.glb +0 -0
- package/dist/assets/launch-tower-stack-ship.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.svg +1 -0
- package/dist/assets/launch-tower-stack-ship.thick.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.glb +0 -0
- package/dist/assets/launch-tower-stack-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.svg +1 -0
- package/dist/assets/launch-tower-stack-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-stack.glb +0 -0
- package/dist/assets/launch-tower-stack.painted.svg +1 -0
- package/dist/assets/launch-tower-stack.svg +1 -0
- package/dist/assets/launch-tower-stack.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.svg +1 -0
- package/dist/assets/launch-tower-tower-apart.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.glb +0 -0
- package/dist/assets/launch-tower-tower-arms.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.svg +1 -0
- package/dist/assets/launch-tower-tower-arms.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.glb +0 -0
- package/dist/assets/launch-tower-tower-mount.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.svg +1 -0
- package/dist/assets/launch-tower-tower-mount.thick.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.glb +0 -0
- package/dist/assets/launch-tower-tower-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.svg +1 -0
- package/dist/assets/launch-tower-tower-tower.thick.svg +1 -0
- package/dist/assets/launch-tower-tower.glb +0 -0
- package/dist/assets/launch-tower-tower.painted.svg +1 -0
- package/dist/assets/launch-tower-tower.svg +1 -0
- package/dist/assets/launch-tower-tower.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-apart.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.glb +0 -0
- package/dist/assets/lunar-module-lunar-module-ascent.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-ascent.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.glb +0 -0
- package/dist/assets/lunar-module-lunar-module-descent.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.svg +1 -0
- package/dist/assets/lunar-module-lunar-module-descent.thick.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.glb +0 -0
- package/dist/assets/lunar-module-lunar-module.painted.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.svg +1 -0
- package/dist/assets/lunar-module-lunar-module.thick.svg +1 -0
- package/dist/assets/mercury-friendship-7.glb +0 -0
- package/dist/assets/mercury-friendship-7.painted.svg +1 -0
- package/dist/assets/mercury-friendship-7.svg +1 -0
- package/dist/assets/mercury-friendship-7.thick.svg +1 -0
- package/dist/assets/models/apollo-soyuz-csm.glb +0 -0
- package/dist/assets/models/apollo-soyuz-docking-module.glb +0 -0
- package/dist/assets/models/apollo-soyuz-soyuz.glb +0 -0
- package/dist/assets/models/gemini-adapter.glb +0 -0
- package/dist/assets/models/gemini-capsule.glb +0 -0
- package/dist/assets/models/hubble-telescope.glb +0 -0
- package/dist/assets/models/iss-station.glb +0 -0
- package/dist/assets/models/jupiter-c-vehicle.glb +0 -0
- package/dist/assets/models/lunar-module-ascent.glb +0 -0
- package/dist/assets/models/lunar-module-descent.glb +0 -0
- package/dist/assets/models/mercury-capsule.glb +0 -0
- package/dist/assets/models/space-shuttle-discovery-orbiter.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-external-tank.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-orbiter.glb +0 -0
- package/dist/assets/models/space-shuttle-stack-srb.glb +0 -0
- package/dist/assets/new-glenn-7x2-apart.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-apart.svg +1 -0
- package/dist/assets/new-glenn-7x2-apart.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.glb +0 -0
- package/dist/assets/new-glenn-7x2-fairing.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.svg +1 -0
- package/dist/assets/new-glenn-7x2-fairing.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.glb +0 -0
- package/dist/assets/new-glenn-7x2-first-stage.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.svg +1 -0
- package/dist/assets/new-glenn-7x2-first-stage.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.glb +0 -0
- package/dist/assets/new-glenn-7x2-second-stage.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.svg +1 -0
- package/dist/assets/new-glenn-7x2-second-stage.thick.svg +1 -0
- package/dist/assets/new-glenn-7x2.glb +0 -0
- package/dist/assets/new-glenn-7x2.painted.svg +1 -0
- package/dist/assets/new-glenn-7x2.svg +1 -0
- package/dist/assets/new-glenn-7x2.thick.svg +1 -0
- package/dist/assets/parts/flap-aft.painted.svg +1 -1
- package/dist/assets/parts/flap-aft.svg +1 -1
- package/dist/assets/parts/flap-aft.thick.svg +1 -1
- package/dist/assets/parts/flap-forward.painted.svg +1 -1
- package/dist/assets/parts/flap-forward.svg +1 -1
- package/dist/assets/parts/flap-forward.thick.svg +1 -1
- package/dist/assets/parts/grid-fin-four.painted.svg +1 -1
- package/dist/assets/parts/grid-fin-four.svg +1 -1
- package/dist/assets/parts/grid-fin-four.thick.svg +1 -1
- package/dist/assets/parts/grid-fin-three.painted.svg +1 -1
- package/dist/assets/parts/grid-fin-three.svg +1 -1
- package/dist/assets/parts/grid-fin-three.thick.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.painted.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.svg +1 -1
- package/dist/assets/parts/merlin-sea-level.thick.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.painted.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.svg +1 -1
- package/dist/assets/parts/raptor-sea-level.thick.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.painted.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.svg +1 -1
- package/dist/assets/parts/raptor-vacuum.thick.svg +1 -1
- package/dist/assets/saturn-v-saturn-v-adapter.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-adapter.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-adapter.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-adapter.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-apart.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-capsule.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-capsule.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-escape-tower.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-first-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-second-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-service-module.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-service-module.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.glb +0 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.svg +1 -0
- package/dist/assets/saturn-v-saturn-v-third-stage.thick.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.glb +0 -0
- package/dist/assets/saturn-v-saturn-v.painted.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.svg +1 -0
- package/dist/assets/saturn-v-saturn-v.thick.svg +1 -0
- package/dist/assets/sls-block-1-apart.painted.svg +1 -0
- package/dist/assets/sls-block-1-apart.svg +1 -0
- package/dist/assets/sls-block-1-apart.thick.svg +1 -0
- package/dist/assets/sls-block-1-capsule.glb +0 -0
- package/dist/assets/sls-block-1-capsule.painted.svg +1 -0
- package/dist/assets/sls-block-1-capsule.svg +1 -0
- package/dist/assets/sls-block-1-capsule.thick.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.glb +0 -0
- package/dist/assets/sls-block-1-escape-tower.painted.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.svg +1 -0
- package/dist/assets/sls-block-1-escape-tower.thick.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.glb +0 -0
- package/dist/assets/sls-block-1-first-stage.painted.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.svg +1 -0
- package/dist/assets/sls-block-1-first-stage.thick.svg +1 -0
- package/dist/assets/sls-block-1-service-module.glb +0 -0
- package/dist/assets/sls-block-1-service-module.painted.svg +1 -0
- package/dist/assets/sls-block-1-service-module.svg +1 -0
- package/dist/assets/sls-block-1-service-module.thick.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.glb +0 -0
- package/dist/assets/sls-block-1-srb-left.painted.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.svg +1 -0
- package/dist/assets/sls-block-1-srb-left.thick.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.glb +0 -0
- package/dist/assets/sls-block-1-srb-right.painted.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.svg +1 -0
- package/dist/assets/sls-block-1-srb-right.thick.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.glb +0 -0
- package/dist/assets/sls-block-1-upper-stage.painted.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.svg +1 -0
- package/dist/assets/sls-block-1-upper-stage.thick.svg +1 -0
- package/dist/assets/sls-block-1.glb +0 -0
- package/dist/assets/sls-block-1.painted.svg +1 -0
- package/dist/assets/sls-block-1.svg +1 -0
- package/dist/assets/sls-block-1.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-apart.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-1.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-2.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-3.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-booster-4.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-fairing.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-fairing.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-first-stage.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.glb +0 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.svg +1 -0
- package/dist/assets/soyuz-soyuz-2-third-stage.thick.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.glb +0 -0
- package/dist/assets/soyuz-soyuz-2.painted.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.svg +1 -0
- package/dist/assets/soyuz-soyuz-2.thick.svg +1 -0
- package/dist/assets/space-shuttle-discovery.glb +0 -0
- package/dist/assets/space-shuttle-discovery.painted.svg +1 -0
- package/dist/assets/space-shuttle-discovery.svg +1 -0
- package/dist/assets/space-shuttle-discovery.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.svg +1 -0
- package/dist/assets/space-shuttle-stack-apart.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.glb +0 -0
- package/dist/assets/space-shuttle-stack-external-tank.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.svg +1 -0
- package/dist/assets/space-shuttle-stack-external-tank.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.glb +0 -0
- package/dist/assets/space-shuttle-stack-orbiter.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.svg +1 -0
- package/dist/assets/space-shuttle-stack-orbiter.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.glb +0 -0
- package/dist/assets/space-shuttle-stack-srb-left.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-left.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.glb +0 -0
- package/dist/assets/space-shuttle-stack-srb-right.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.svg +1 -0
- package/dist/assets/space-shuttle-stack-srb-right.thick.svg +1 -0
- package/dist/assets/space-shuttle-stack.glb +0 -0
- package/dist/assets/space-shuttle-stack.painted.svg +1 -0
- package/dist/assets/space-shuttle-stack.svg +1 -0
- package/dist/assets/space-shuttle-stack.thick.svg +1 -0
- package/dist/assets/starbase-build-site-apart.painted.svg +1 -0
- package/dist/assets/starbase-build-site-apart.svg +1 -0
- package/dist/assets/starbase-build-site-apart.thick.svg +1 -0
- package/dist/assets/starbase-build-site-garden.glb +0 -0
- package/dist/assets/starbase-build-site-garden.painted.svg +1 -0
- package/dist/assets/starbase-build-site-garden.svg +1 -0
- package/dist/assets/starbase-build-site-garden.thick.svg +1 -0
- package/dist/assets/starbase-build-site-ground.glb +0 -0
- package/dist/assets/starbase-build-site-ground.painted.svg +1 -0
- package/dist/assets/starbase-build-site-ground.svg +1 -0
- package/dist/assets/starbase-build-site-ground.thick.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.glb +0 -0
- package/dist/assets/starbase-build-site-mega-bays.painted.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.svg +1 -0
- package/dist/assets/starbase-build-site-mega-bays.thick.svg +1 -0
- package/dist/assets/starbase-build-site-sign.glb +0 -0
- package/dist/assets/starbase-build-site-sign.painted.svg +1 -0
- package/dist/assets/starbase-build-site-sign.svg +1 -0
- package/dist/assets/starbase-build-site-sign.thick.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.glb +0 -0
- package/dist/assets/starbase-build-site-starfactory.painted.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.svg +1 -0
- package/dist/assets/starbase-build-site-starfactory.thick.svg +1 -0
- package/dist/assets/starbase-build-site.glb +0 -0
- package/dist/assets/starbase-build-site.painted.svg +1 -0
- package/dist/assets/starbase-build-site.svg +1 -0
- package/dist/assets/starbase-build-site.thick.svg +1 -0
- package/dist/assets/starbase-city-apart.painted.svg +1 -0
- package/dist/assets/starbase-city-apart.svg +1 -0
- package/dist/assets/starbase-city-apart.thick.svg +1 -0
- package/dist/assets/starbase-city-garden.glb +0 -0
- package/dist/assets/starbase-city-garden.painted.svg +1 -0
- package/dist/assets/starbase-city-garden.svg +1 -0
- package/dist/assets/starbase-city-garden.thick.svg +1 -0
- package/dist/assets/starbase-city-ground.glb +0 -0
- package/dist/assets/starbase-city-ground.painted.svg +1 -0
- package/dist/assets/starbase-city-ground.svg +1 -0
- package/dist/assets/starbase-city-ground.thick.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.glb +0 -0
- package/dist/assets/starbase-city-mega-bays.painted.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.svg +1 -0
- package/dist/assets/starbase-city-mega-bays.thick.svg +1 -0
- package/dist/assets/starbase-city-on-pad.glb +0 -0
- package/dist/assets/starbase-city-on-pad.painted.svg +1 -0
- package/dist/assets/starbase-city-on-pad.svg +1 -0
- package/dist/assets/starbase-city-on-pad.thick.svg +1 -0
- package/dist/assets/starbase-city-pads.glb +0 -0
- package/dist/assets/starbase-city-pads.painted.svg +1 -0
- package/dist/assets/starbase-city-pads.svg +1 -0
- package/dist/assets/starbase-city-pads.thick.svg +1 -0
- package/dist/assets/starbase-city-sign.glb +0 -0
- package/dist/assets/starbase-city-sign.painted.svg +1 -0
- package/dist/assets/starbase-city-sign.svg +1 -0
- package/dist/assets/starbase-city-sign.thick.svg +1 -0
- package/dist/assets/starbase-city-starfactory.glb +0 -0
- package/dist/assets/starbase-city-starfactory.painted.svg +1 -0
- package/dist/assets/starbase-city-starfactory.svg +1 -0
- package/dist/assets/starbase-city-starfactory.thick.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.glb +0 -0
- package/dist/assets/starbase-city-tank-farm.painted.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.svg +1 -0
- package/dist/assets/starbase-city-tank-farm.thick.svg +1 -0
- package/dist/assets/starbase-city-village.glb +0 -0
- package/dist/assets/starbase-city-village.painted.svg +1 -0
- package/dist/assets/starbase-city-village.svg +1 -0
- package/dist/assets/starbase-city-village.thick.svg +1 -0
- package/dist/assets/starbase-city.glb +0 -0
- package/dist/assets/starbase-city.painted.svg +1 -0
- package/dist/assets/starbase-city.svg +1 -0
- package/dist/assets/starbase-city.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.svg +1 -0
- package/dist/assets/starbase-launch-site-apart.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.glb +0 -0
- package/dist/assets/starbase-launch-site-ground.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.svg +1 -0
- package/dist/assets/starbase-launch-site-ground.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.glb +0 -0
- package/dist/assets/starbase-launch-site-on-pad.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.svg +1 -0
- package/dist/assets/starbase-launch-site-on-pad.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.glb +0 -0
- package/dist/assets/starbase-launch-site-pads.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.svg +1 -0
- package/dist/assets/starbase-launch-site-pads.thick.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.glb +0 -0
- package/dist/assets/starbase-launch-site-tank-farm.painted.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.svg +1 -0
- package/dist/assets/starbase-launch-site-tank-farm.thick.svg +1 -0
- package/dist/assets/starbase-launch-site.glb +0 -0
- package/dist/assets/starbase-launch-site.painted.svg +1 -0
- package/dist/assets/starbase-launch-site.svg +1 -0
- package/dist/assets/starbase-launch-site.thick.svg +1 -0
- package/dist/assets/starship-2019.painted.svg +1 -1
- package/dist/assets/starship-2019.svg +1 -1
- package/dist/assets/starship-2019.thick.svg +1 -1
- package/dist/assets/starship-v1-apart.painted.svg +1 -1
- package/dist/assets/starship-v1-apart.svg +1 -1
- package/dist/assets/starship-v1-apart.thick.svg +1 -1
- package/dist/assets/starship-v1-booster.painted.svg +1 -1
- package/dist/assets/starship-v1-booster.svg +1 -1
- package/dist/assets/starship-v1-booster.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.svg +1 -1
- package/dist/assets/starship-v1-flight1-apart.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.svg +1 -1
- package/dist/assets/starship-v1-flight1-booster.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.svg +1 -1
- package/dist/assets/starship-v1-flight1-ship.thick.svg +1 -1
- package/dist/assets/starship-v1-flight1.painted.svg +1 -1
- package/dist/assets/starship-v1-flight1.svg +1 -1
- package/dist/assets/starship-v1-flight1.thick.svg +1 -1
- package/dist/assets/starship-v1-ship.painted.svg +1 -1
- package/dist/assets/starship-v1-ship.svg +1 -1
- package/dist/assets/starship-v1-ship.thick.svg +1 -1
- package/dist/assets/starship-v1.painted.svg +1 -1
- package/dist/assets/starship-v1.svg +1 -1
- package/dist/assets/starship-v1.thick.svg +1 -1
- package/dist/assets/starship-v2-apart.painted.svg +1 -1
- package/dist/assets/starship-v2-apart.svg +1 -1
- package/dist/assets/starship-v2-apart.thick.svg +1 -1
- package/dist/assets/starship-v2-booster.painted.svg +1 -1
- package/dist/assets/starship-v2-booster.svg +1 -1
- package/dist/assets/starship-v2-booster.thick.svg +1 -1
- package/dist/assets/starship-v2-ship.painted.svg +1 -1
- package/dist/assets/starship-v2-ship.svg +1 -1
- package/dist/assets/starship-v2-ship.thick.svg +1 -1
- package/dist/assets/starship-v2.painted.svg +1 -1
- package/dist/assets/starship-v2.svg +1 -1
- package/dist/assets/starship-v2.thick.svg +1 -1
- package/dist/assets/starship-v3-apart.painted.svg +1 -1
- package/dist/assets/starship-v3-apart.svg +1 -1
- package/dist/assets/starship-v3-apart.thick.svg +1 -1
- package/dist/assets/starship-v3-booster.painted.svg +1 -1
- package/dist/assets/starship-v3-booster.svg +1 -1
- package/dist/assets/starship-v3-booster.thick.svg +1 -1
- package/dist/assets/starship-v3-ship.painted.svg +1 -1
- package/dist/assets/starship-v3-ship.svg +1 -1
- package/dist/assets/starship-v3-ship.thick.svg +1 -1
- package/dist/assets/starship-v3.painted.svg +1 -1
- package/dist/assets/starship-v3.svg +1 -1
- package/dist/assets/starship-v3.thick.svg +1 -1
- package/dist/assets/starship-v4-apart.painted.svg +1 -1
- package/dist/assets/starship-v4-apart.svg +1 -1
- package/dist/assets/starship-v4-apart.thick.svg +1 -1
- package/dist/assets/starship-v4-booster.painted.svg +1 -1
- package/dist/assets/starship-v4-booster.svg +1 -1
- package/dist/assets/starship-v4-booster.thick.svg +1 -1
- package/dist/assets/starship-v4-ship.painted.svg +1 -1
- package/dist/assets/starship-v4-ship.svg +1 -1
- package/dist/assets/starship-v4-ship.thick.svg +1 -1
- package/dist/assets/starship-v4.painted.svg +1 -1
- package/dist/assets/starship-v4.svg +1 -1
- package/dist/assets/starship-v4.thick.svg +1 -1
- package/dist/attrs.d.ts +27 -0
- package/dist/attrs.js +31 -0
- package/dist/build/index.d.ts +7 -2
- package/dist/build/index.js +28 -4
- package/dist/build/lineup.js +14 -4
- package/dist/builder.d.ts +22 -0
- package/dist/builder.js +103 -0
- package/dist/data/apollosoyuz.d.ts +6 -0
- package/dist/data/apollosoyuz.js +28 -0
- package/dist/data/credits.d.ts +19 -1
- package/dist/data/credits.js +30 -1
- package/dist/data/dragon.js +35 -0
- package/dist/data/electron.d.ts +2 -0
- package/dist/data/electron.js +23 -0
- package/dist/data/falcon.js +2 -2
- package/dist/data/falcon1.d.ts +4 -0
- package/dist/data/falcon1.js +51 -0
- package/dist/data/flight-log.d.ts +18 -0
- package/dist/data/flight-log.js +23 -0
- package/dist/data/flights.d.ts +49 -0
- package/dist/data/flights.js +177 -0
- package/dist/data/gemini.d.ts +3 -0
- package/dist/data/gemini.js +22 -0
- package/dist/data/hubble.d.ts +3 -0
- package/dist/data/hubble.js +23 -0
- package/dist/data/iss.d.ts +5 -0
- package/dist/data/iss.js +25 -0
- package/dist/data/jupiterc.d.ts +3 -0
- package/dist/data/jupiterc.js +22 -0
- package/dist/data/landing.d.ts +3 -0
- package/dist/data/landing.js +51 -0
- package/dist/data/lunarmodule.d.ts +4 -0
- package/dist/data/lunarmodule.js +27 -0
- package/dist/data/makers.d.ts +16 -0
- package/dist/data/makers.js +29 -0
- package/dist/data/mercury.d.ts +3 -0
- package/dist/data/mercury.js +22 -0
- package/dist/data/newglenn.d.ts +2 -0
- package/dist/data/newglenn.js +23 -0
- package/dist/data/saturn.d.ts +2 -0
- package/dist/data/saturn.js +32 -0
- package/dist/data/shuttle.d.ts +5 -0
- package/dist/data/shuttle.js +52 -0
- package/dist/data/sls.d.ts +4 -0
- package/dist/data/sls.js +36 -0
- package/dist/data/sources.d.ts +348 -2
- package/dist/data/sources.js +45 -1
- package/dist/data/soyuz.d.ts +3 -0
- package/dist/data/soyuz.js +33 -0
- package/dist/data/starbase.d.ts +2 -0
- package/dist/data/starbase.js +30 -0
- package/dist/data/tower.d.ts +3 -0
- package/dist/data/tower.js +26 -0
- package/dist/data/types.d.ts +7 -1
- package/dist/draw/plume.d.ts +8 -0
- package/dist/draw/plume.js +71 -0
- package/dist/draw/svg.d.ts +1 -1
- package/dist/draw/svg.js +3 -3
- package/dist/element/ground.d.ts +15 -0
- package/dist/element/ground.js +95 -0
- package/dist/element/plumes.d.ts +38 -0
- package/dist/element/plumes.js +208 -0
- package/dist/element/scene.d.ts +39 -5
- package/dist/element/scene.js +250 -7
- package/dist/element.d.ts +50 -1
- package/dist/element.js +201 -13
- package/dist/embed.d.ts +26 -0
- package/dist/embed.js +135 -0
- package/dist/engines.d.ts +44 -0
- package/dist/engines.js +79 -0
- package/dist/fit.d.ts +2 -0
- package/dist/fit.js +4 -3
- package/dist/flight.d.ts +67 -0
- package/dist/flight.js +124 -0
- package/dist/flightbar.d.ts +22 -0
- package/dist/flightbar.js +176 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +9 -0
- package/dist/layout.js +1 -1
- package/dist/looks.d.ts +1 -1
- package/dist/looks.js +2 -0
- package/dist/model/apollosoyuz.d.ts +2 -0
- package/dist/model/apollosoyuz.js +46 -0
- package/dist/model/dragoninside.d.ts +2 -0
- package/dist/model/dragoninside.js +67 -0
- package/dist/model/electron.d.ts +2 -0
- package/dist/model/electron.js +35 -0
- package/dist/model/falcon.d.ts +2 -0
- package/dist/model/falcon.js +4 -0
- package/dist/model/falcon1.d.ts +2 -0
- package/dist/model/falcon1.js +53 -0
- package/dist/model/gemini.d.ts +2 -0
- package/dist/model/gemini.js +28 -0
- package/dist/model/hubble.d.ts +2 -0
- package/dist/model/hubble.js +28 -0
- package/dist/model/iss.d.ts +2 -0
- package/dist/model/iss.js +32 -0
- package/dist/model/jupiterc.d.ts +2 -0
- package/dist/model/jupiterc.js +24 -0
- package/dist/model/kit.d.ts +36 -0
- package/dist/model/kit.js +95 -0
- package/dist/model/landing.d.ts +3 -0
- package/dist/model/landing.js +81 -0
- package/dist/model/lunarmodule.d.ts +2 -0
- package/dist/model/lunarmodule.js +43 -0
- package/dist/model/materials.d.ts +42 -0
- package/dist/model/materials.js +7 -0
- package/dist/model/mercury.d.ts +2 -0
- package/dist/model/mercury.js +19 -0
- package/dist/model/newglenn.d.ts +2 -0
- package/dist/model/newglenn.js +43 -0
- package/dist/model/pieces.d.ts +2 -0
- package/dist/model/pieces.js +2 -2
- package/dist/model/registry.js +63 -0
- package/dist/model/saturn.d.ts +2 -0
- package/dist/model/saturn.js +122 -0
- package/dist/model/shuttle.d.ts +2 -0
- package/dist/model/shuttle.js +111 -0
- package/dist/model/sls.d.ts +2 -0
- package/dist/model/sls.js +83 -0
- package/dist/model/soyuz.d.ts +2 -0
- package/dist/model/soyuz.js +75 -0
- package/dist/model/stacks.d.ts +39 -0
- package/dist/model/stacks.js +1 -0
- package/dist/model/starbase.d.ts +2 -0
- package/dist/model/starbase.js +108 -0
- package/dist/model/tower.d.ts +6 -0
- package/dist/model/tower.js +89 -0
- package/dist/parts.d.ts +3 -2
- package/dist/react.d.ts +14 -6
- package/dist/rockets.d.ts +5 -0
- package/dist/rockets.js +78 -7
- package/dist/spin.d.ts +11 -0
- package/dist/spin.js +11 -0
- package/package.json +93 -18
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// The tower's 13 m footprint in this file is © OpenStreetMap contributors, under the Open Database License (ODbL 1.0, https://www.openstreetmap.org/copyright), not MIT: see NOTICE.md.
|
|
2
|
+
// The integration tower at Starbase, with its mount and arms, as sourced: the FAA's assessment gives its height. No source read here gives its width, its arms' length or the mount's size: those are judged from photographs.
|
|
3
|
+
import { STARSHIP_VARIANTS } from "./starship.js";
|
|
4
|
+
import { blank } from "./types.js";
|
|
5
|
+
const F = "faa-pea-2022";
|
|
6
|
+
const W = "wikipedia-starbase";
|
|
7
|
+
const m = (value, source, extra = {}) => ({ value, source, ...extra });
|
|
8
|
+
const said = (value, source, extra = {}) => ({ value, source, ...extra });
|
|
9
|
+
export const TOWER_HEIGHT = 146.3;
|
|
10
|
+
const v3 = STARSHIP_VARIANTS.find((variant) => variant.id === "v3");
|
|
11
|
+
const TOWER = m(TOWER_HEIGHT, F, { brief: "approximately", note: "About 480 feet, with a 10-foot lightning rod on top, as proposed in 2022.", others: [{ value: 146, source: W, note: "Wikipedia's Starbase article gives 479 feet from the FAA's 2021 determination of no hazard to air navigation." }] });
|
|
12
|
+
const JUDGED = "No source read here gives its size: it is judged from photographs.";
|
|
13
|
+
const facts = (withRocket) => ({
|
|
14
|
+
height: TOWER,
|
|
15
|
+
diameter: { value: 13, source: "openstreetmap", brief: "the tower", note: "The map's footprint of tower 1, 13 by 12 m." },
|
|
16
|
+
parts: { tower: TOWER, mount: blank(JUDGED), arms: blank(JUDGED), ...(withRocket ? { booster: v3.facts.parts.booster, ship: v3.facts.parts.ship } : {}) },
|
|
17
|
+
engines: {},
|
|
18
|
+
more: {},
|
|
19
|
+
});
|
|
20
|
+
const base = { rocket: "launch-tower", status: "support", firstWord: "Stacked" };
|
|
21
|
+
const FIRST = said("2021-07", W, { brief: "first tower fully stacked" });
|
|
22
|
+
export const TOWER_VARIANTS = [
|
|
23
|
+
{ ...base, id: "tower", name: "Integration tower and mount", firstFlight: FIRST, slots: ["mount", "tower", "arms"], note: "The tower at Starbase with its launch mount and its two arms, the chopsticks, held open. The arms' length, the mount and how far it stands from the tower are judged from photographs. No lettering or mark is drawn.", facts: facts(false) },
|
|
24
|
+
{ ...base, id: "stack", name: "Tower, with Block 3 stacked on the mount", firstFlight: FIRST, slots: ["mount", "tower", "arms", "booster", "ship"], note: "Super Heavy on the mount and the Ship on Super Heavy, as they are stacked by the arms. The rocket is Block 3's own parts, painted by this package's code here to keep the scene light. No lettering or mark is drawn.", facts: facts(true) },
|
|
25
|
+
{ ...base, id: "catch", name: "Tower, catching Super Heavy", firstFlight: said("2024-10-13", W, { brief: "first catch", note: "Flight 5: Booster 12." }), slots: ["mount", "tower", "arms", "booster"], note: "The arms closed under the grid fins, as on Flight 5, with Block 3's booster. How high it hangs is judged from photographs of that catch, which show an earlier booster. No lettering or mark is drawn.", facts: { ...facts(true), parts: { tower: TOWER, mount: blank(JUDGED), arms: blank(JUDGED), booster: v3.facts.parts.booster } } },
|
|
26
|
+
];
|
package/dist/data/types.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface Figure<T = number> {
|
|
|
17
17
|
export declare const blank: <T = number>(note?: string, brief?: string) => Figure<T>;
|
|
18
18
|
/** A figure as words for a table: its value and whatever must stay beside it; a blank says why, or that no source gives it. */
|
|
19
19
|
export declare function figureWords(figure: Figure<number | string> | undefined, unit?: string): string;
|
|
20
|
-
export type VariantStatus = "flown" | "announced" | "artist-model" | "test-vehicle";
|
|
20
|
+
export type VariantStatus = "flown" | "announced" | "artist-model" | "test-vehicle" | "support";
|
|
21
21
|
export interface VariantFacts {
|
|
22
22
|
/** Overall height with every part in place, metres. */
|
|
23
23
|
height: Figure;
|
|
@@ -28,6 +28,8 @@ export interface VariantFacts {
|
|
|
28
28
|
engines: Readonly<Record<string, Figure<string>>>;
|
|
29
29
|
/** Other facts, each with its own source. */
|
|
30
30
|
more: Readonly<Record<string, Figure<number | string>>>;
|
|
31
|
+
/** Sizes that are not a height or a width, shown as they are named here: "Deck length". */
|
|
32
|
+
sizes?: Readonly<Record<string, Figure>>;
|
|
31
33
|
}
|
|
32
34
|
export interface Variant {
|
|
33
35
|
/** "v1", "v2" and so on; a label for what is not a numbered version. */
|
|
@@ -36,6 +38,8 @@ export interface Variant {
|
|
|
36
38
|
/** What it is called, in a line: "Block 3 (V3)". */
|
|
37
39
|
name: string;
|
|
38
40
|
status: VariantStatus;
|
|
41
|
+
/** What to call its first date, when it is not a vehicle that flew: "In service". */
|
|
42
|
+
firstWord?: string;
|
|
39
43
|
/** When this variant, in this form, first flew. Its `brief` says so when the form is not the block's first. */
|
|
40
44
|
firstFlight: Figure<string>;
|
|
41
45
|
/** The parts this variant has, in stacking order from the bottom. */
|
|
@@ -45,4 +49,6 @@ export interface Variant {
|
|
|
45
49
|
partIds?: Readonly<Record<string, string>>;
|
|
46
50
|
/** What a reader should be told about it. */
|
|
47
51
|
note?: string;
|
|
52
|
+
/** The side a to-scale lineup shows of it when asked for the front, because the front hides what it is: the orbiter stands behind the Shuttle's tank. */
|
|
53
|
+
lineupView?: "back" | "side";
|
|
48
54
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Camera } from "./svg.ts";
|
|
2
|
+
import type { Vec3 } from "../framing.ts";
|
|
3
|
+
import { type Bell } from "../engines.ts";
|
|
4
|
+
import type { LookName } from "../looks.ts";
|
|
5
|
+
/** The flames for these bells, in picture coordinates. Empty when there are none. */
|
|
6
|
+
export declare function plumeMarkup(bells: readonly Bell[], at: Vec3, cam: Camera, look: LookName, prefix: string): string;
|
|
7
|
+
/** The engines of a part seen from below, each in its own place, the burning ones filled: `engine by engine`. Its words are for a screen reader. */
|
|
8
|
+
export declare function engineChart(bells: readonly Bell[], burning: readonly Bell[], label: string): string;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { PLUME_DIAMONDS, plumeLength } from "../engines.js";
|
|
2
|
+
const n = (v) => (Math.round(v * 100) / 100).toString();
|
|
3
|
+
function hull(points) {
|
|
4
|
+
const p = [...points].sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
5
|
+
if (p.length < 3)
|
|
6
|
+
return p;
|
|
7
|
+
const cross = (o, a, b) => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
|
|
8
|
+
const half = (list) => {
|
|
9
|
+
const out = [];
|
|
10
|
+
for (const q of list) {
|
|
11
|
+
while (out.length >= 2 && cross(out[out.length - 2], out[out.length - 1], q) <= 0)
|
|
12
|
+
out.pop();
|
|
13
|
+
out.push(q);
|
|
14
|
+
}
|
|
15
|
+
out.pop();
|
|
16
|
+
return out;
|
|
17
|
+
};
|
|
18
|
+
return [...half(p), ...half([...p].reverse())];
|
|
19
|
+
}
|
|
20
|
+
const pathOf = (pts) => `M${pts.map(([x, y]) => `${n(x)} ${n(y)}`).join("L")}Z`;
|
|
21
|
+
/** The flames for these bells, in picture coordinates. Empty when there are none. */
|
|
22
|
+
export function plumeMarkup(bells, at, cam, look, prefix) {
|
|
23
|
+
if (bells.length === 0)
|
|
24
|
+
return "";
|
|
25
|
+
const painted = look === "painted";
|
|
26
|
+
const stroke = look === "thick" ? 2.4 : 1.2;
|
|
27
|
+
const parts = [];
|
|
28
|
+
bells.forEach((bell, index) => {
|
|
29
|
+
const mouth = [at[0] + bell.x, at[1] + bell.y, at[2] + bell.z];
|
|
30
|
+
const tip = [mouth[0], mouth[1] - plumeLength(bell.exit), mouth[2]];
|
|
31
|
+
const rim = [];
|
|
32
|
+
for (let step = 0; step < 10; step++) {
|
|
33
|
+
const angle = (step / 10) * Math.PI * 2;
|
|
34
|
+
rim.push(cam.project([mouth[0] + Math.sin(angle) * bell.exit, mouth[1], mouth[2] + Math.cos(angle) * bell.exit]));
|
|
35
|
+
}
|
|
36
|
+
const mouthPoint = cam.project(mouth);
|
|
37
|
+
const tipPoint = cam.project(tip);
|
|
38
|
+
const shape = hull([...rim, tipPoint]);
|
|
39
|
+
const id = `uchusen-plume-${prefix}-${index}`;
|
|
40
|
+
const glow = `uchusen-glow-${prefix}-${index}`;
|
|
41
|
+
const xs = rim.map((point) => point[0]);
|
|
42
|
+
const ys = rim.map((point) => point[1]);
|
|
43
|
+
const cx = (Math.min(...xs) + Math.max(...xs)) / 2;
|
|
44
|
+
const cy = (Math.min(...ys) + Math.max(...ys)) / 2;
|
|
45
|
+
const rx = Math.max(1.2, (Math.max(...xs) - Math.min(...xs)) / 2);
|
|
46
|
+
const ry = Math.max(1.2, (Math.max(...ys) - Math.min(...ys)) / 2);
|
|
47
|
+
const defs = painted
|
|
48
|
+
? `<defs><linearGradient id="${id}" gradientUnits="userSpaceOnUse" x1="${n(mouthPoint[0])}" y1="${n(mouthPoint[1])}" x2="${n(tipPoint[0])}" y2="${n(tipPoint[1])}"><stop offset="0" stop-color="#fff4d2"/><stop offset="0.45" stop-color="#ff9a3a"/><stop offset="1" stop-color="#ff4a12" stop-opacity="0"/></linearGradient><radialGradient id="${glow}" gradientUnits="userSpaceOnUse" cx="${n(cx)}" cy="${n(cy)}" r="${n(Math.max(rx, ry))}"><stop offset="0" stop-color="#fff1c4"/><stop offset="1" stop-color="#ff7a1a" stop-opacity="0"/></radialGradient></defs>`
|
|
49
|
+
: "";
|
|
50
|
+
const flame = shape.length >= 3 ? (painted ? `<path data-plume="1" d="${pathOf(shape)}" fill="url(#${id})" stroke="none"/>` : `<path data-plume="1" d="${pathOf(shape)}" fill="none" stroke="#e7a24a" stroke-width="${stroke}"/><path d="M${n(mouthPoint[0])} ${n(mouthPoint[1])}L${n(tipPoint[0])} ${n(tipPoint[1])}" fill="none" stroke="#ffd7a1" stroke-width="${stroke * 0.6}"/>`) : "";
|
|
51
|
+
const ring = painted ? `<ellipse data-glow="1" cx="${n(cx)}" cy="${n(cy)}" rx="${n(rx * 1.35)}" ry="${n(ry * 1.35)}" fill="url(#${glow})"/>` : `<ellipse data-glow="1" cx="${n(cx)}" cy="${n(cy)}" rx="${n(rx * 1.2)}" ry="${n(ry * 1.2)}" fill="none" stroke="#e7a24a" stroke-width="${stroke}"/>`;
|
|
52
|
+
// the first few shock diamonds, as small rings down the flame: a picture
|
|
53
|
+
let diamonds = "";
|
|
54
|
+
for (let k = 1; k <= 3; k++) {
|
|
55
|
+
const along = k / PLUME_DIAMONDS;
|
|
56
|
+
const [dx, dy] = cam.project([mouth[0], mouth[1] - plumeLength(bell.exit) * along, mouth[2]]);
|
|
57
|
+
const size = n(Math.max(0.9, rx * 0.5 * (1 - along)));
|
|
58
|
+
diamonds += painted ? `<ellipse data-diamond="1" cx="${n(dx)}" cy="${n(dy)}" rx="${size}" ry="${size}" fill="#fff4d2" fill-opacity="0.7"/>` : `<ellipse data-diamond="1" cx="${n(dx)}" cy="${n(dy)}" rx="${size}" ry="${size}" fill="none" stroke="#e7a24a" stroke-width="${stroke * 0.6}"/>`;
|
|
59
|
+
}
|
|
60
|
+
if (flame !== "")
|
|
61
|
+
parts.push(`<g>${defs}${ring}${flame}${diamonds}</g>`);
|
|
62
|
+
});
|
|
63
|
+
return parts.join("");
|
|
64
|
+
}
|
|
65
|
+
/** The engines of a part seen from below, each in its own place, the burning ones filled: `engine by engine`. Its words are for a screen reader. */
|
|
66
|
+
export function engineChart(bells, burning, label) {
|
|
67
|
+
const reach = Math.max(1, ...bells.map((bell) => Math.hypot(bell.x, bell.z) + bell.exit)) * 1.06;
|
|
68
|
+
const lit = new Set(burning);
|
|
69
|
+
const dots = bells.map((bell) => `<circle cx="${n(bell.x)}" cy="${n(-bell.z)}" r="${n(bell.exit)}" ${lit.has(bell) ? 'data-lit="1" fill="#ffb25c" stroke="#fff1c4"' : 'fill="none" stroke="currentColor"'} stroke-width="${n(reach * 0.03)}"/>`);
|
|
70
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${n(-reach)} ${n(-reach)} ${n(reach * 2)} ${n(reach * 2)}" role="img" aria-label="${label.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<")}">${dots.join("")}</svg>`;
|
|
71
|
+
}
|
package/dist/draw/svg.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface DrawOptions {
|
|
|
20
20
|
weight?: number;
|
|
21
21
|
}
|
|
22
22
|
/** One part's picture at `at`, as SVG text in painter's order. */
|
|
23
|
-
export declare function drawPart(pieces: readonly Piece[], at: Vec3, cam: Camera, look: LookName, weight?: number): string;
|
|
23
|
+
export declare function drawPart(pieces: readonly Piece[], at: Vec3, cam: Camera, look: LookName, weight?: number, line?: string): string;
|
|
24
24
|
/** The picture's gradients and, on the tiled side, a mosaic of hexagons, for a look. */
|
|
25
25
|
export declare function defsOf(look: LookName): string;
|
|
26
26
|
export {};
|
package/dist/draw/svg.js
CHANGED
|
@@ -60,7 +60,7 @@ function latheItem(piece, cam, at, style, list) {
|
|
|
60
60
|
const [cx, cz] = piece.at ?? [0, 0];
|
|
61
61
|
const profile = piece.profile;
|
|
62
62
|
const steps = piece.segs > 24 ? 36 : 14;
|
|
63
|
-
const here = (r, y, a) => [at[0] + cx + r * Math.sin(a), at[1] + y, at[2] + cz + r * Math.cos(a)];
|
|
63
|
+
const here = (r, y, a) => [at[0] + cx + r * Math.sin(a) + (piece.lean?.[0] ?? 0) * y, at[1] + y, at[2] + cz + r * Math.cos(a) + (piece.lean?.[1] ?? 0) * y];
|
|
64
64
|
const middleY = (profile[0][1] + profile[profile.length - 1][1]) / 2;
|
|
65
65
|
const middle = [at[0] + cx, at[1] + middleY, at[2] + cz];
|
|
66
66
|
const axisHere = [at[0], at[1] + middleY, at[2]];
|
|
@@ -234,9 +234,9 @@ function linesItem(piece, cam, at, style, list) {
|
|
|
234
234
|
list.push({ key: -1e3, svg: `<path d="${d}" fill="none" stroke="${style.line}" stroke-width="${n(piece.weight === "feature" ? style.feature : style.weld)}"/>` });
|
|
235
235
|
}
|
|
236
236
|
/** One part's picture at `at`, as SVG text in painter's order. */
|
|
237
|
-
export function drawPart(pieces, at, cam, look, weight = 1) {
|
|
237
|
+
export function drawPart(pieces, at, cam, look, weight = 1, line) {
|
|
238
238
|
const base = LOOKS[look];
|
|
239
|
-
const style = { line: base.line, outline: base.outline * weight, feature: base.feature * weight, weld: base.weld * weight };
|
|
239
|
+
const style = { line: line ?? base.line, outline: base.outline * weight, feature: base.feature * weight, weld: base.weld * weight };
|
|
240
240
|
const items = [];
|
|
241
241
|
for (const piece of pieces) {
|
|
242
242
|
if (piece.only === "mesh")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Group } from "three";
|
|
2
|
+
export declare class GroundKit {
|
|
3
|
+
readonly group: Group<import("three").Object3DEventMap>;
|
|
4
|
+
private pad;
|
|
5
|
+
private puffs;
|
|
6
|
+
private puffShape;
|
|
7
|
+
private puffMaterial;
|
|
8
|
+
private padMaterial;
|
|
9
|
+
constructor();
|
|
10
|
+
/** How wide the smoke stands, and how far the plain ground reaches to hold everything that lands on it, in metres. */
|
|
11
|
+
fit(radius: number, reach: number): void;
|
|
12
|
+
/** Where the ground stands, and how much smoke is on it. `seconds` is the smoke's own clock, when it may move. */
|
|
13
|
+
set(y: number, smoke: number, seconds: number): void;
|
|
14
|
+
dispose(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// The ground under a flight, for the 3D view: a plain pad, and smoke and water standing on it, all a picture. One instanced draw of soft puffs, moved by numbers on the graphics card, so a flight makes it once and it costs nothing when it is out of the picture. No pad, tower or drone ship of any real place: those are to come.
|
|
2
|
+
import { BufferGeometry, CircleGeometry, DoubleSide, DynamicDrawUsage, Float32BufferAttribute, Group, InstancedMesh, Matrix4, Mesh, MeshBasicMaterial, Quaternion, ShaderMaterial, Vector3 } from "three";
|
|
3
|
+
const PUFFS = 44;
|
|
4
|
+
const WATER = 14;
|
|
5
|
+
const PUFF_VERTEX = /* glsl */ `
|
|
6
|
+
uniform float uSmoke;
|
|
7
|
+
uniform float uTime;
|
|
8
|
+
varying vec2 vCorner;
|
|
9
|
+
varying float vWater;
|
|
10
|
+
void main() {
|
|
11
|
+
vCorner = position.xy;
|
|
12
|
+
float id = float(gl_InstanceID);
|
|
13
|
+
vWater = step(${(PUFFS - WATER).toFixed(1)}, id);
|
|
14
|
+
float roll = fract(sin(id * 12.9898) * 43758.5453);
|
|
15
|
+
// each puff rolls outwards from the pad as the smoke grows; water stays low and close
|
|
16
|
+
float grow = mix(0.45 + 0.75 * uSmoke, 0.35 + 0.25 * uSmoke, vWater);
|
|
17
|
+
vec3 base = instanceMatrix[3].xyz;
|
|
18
|
+
vec3 where = vec3(base.x * grow, base.y * uSmoke + sin(uTime * 0.7 + roll * 6.28) * 0.04, base.z * grow);
|
|
19
|
+
vec4 middle = modelViewMatrix * vec4(where, 1.0);
|
|
20
|
+
middle.xy += position.xy * instanceMatrix[0][0] * (0.5 + uSmoke);
|
|
21
|
+
gl_Position = projectionMatrix * middle;
|
|
22
|
+
}`;
|
|
23
|
+
const PUFF_FRAGMENT = /* glsl */ `
|
|
24
|
+
uniform float uSmoke;
|
|
25
|
+
varying vec2 vCorner;
|
|
26
|
+
varying float vWater;
|
|
27
|
+
void main() {
|
|
28
|
+
float d = length(vCorner);
|
|
29
|
+
float alpha = smoothstep(1.0, 0.25, d) * mix(0.2, 0.3, vWater) * smoothstep(0.0, 0.25, uSmoke);
|
|
30
|
+
gl_FragColor = vec4(mix(vec3(0.78, 0.8, 0.83), vec3(0.82, 0.92, 1.0), vWater), alpha);
|
|
31
|
+
}`;
|
|
32
|
+
const scaleOf = new Vector3();
|
|
33
|
+
const atOf = new Vector3();
|
|
34
|
+
const none = new Quaternion();
|
|
35
|
+
const matrix = new Matrix4();
|
|
36
|
+
export class GroundKit {
|
|
37
|
+
group = new Group();
|
|
38
|
+
pad;
|
|
39
|
+
puffs;
|
|
40
|
+
puffShape;
|
|
41
|
+
puffMaterial;
|
|
42
|
+
padMaterial = new MeshBasicMaterial({ color: "#39424f", transparent: true, opacity: 0.55, side: DoubleSide, depthWrite: false });
|
|
43
|
+
constructor() {
|
|
44
|
+
this.group.name = "ground";
|
|
45
|
+
this.pad = new Mesh(new CircleGeometry(1, 48), this.padMaterial);
|
|
46
|
+
this.pad.rotation.x = -Math.PI / 2;
|
|
47
|
+
this.puffShape = new BufferGeometry();
|
|
48
|
+
this.puffShape.setAttribute("position", new Float32BufferAttribute([-1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0], 3));
|
|
49
|
+
this.puffShape.setIndex([0, 1, 2, 0, 2, 3]);
|
|
50
|
+
this.puffMaterial = new ShaderMaterial({ vertexShader: PUFF_VERTEX, fragmentShader: PUFF_FRAGMENT, uniforms: { uSmoke: { value: 0 }, uTime: { value: 0 } }, transparent: true, depthWrite: false });
|
|
51
|
+
this.puffs = new InstancedMesh(this.puffShape, this.puffMaterial, PUFFS);
|
|
52
|
+
this.puffs.frustumCulled = false;
|
|
53
|
+
this.puffs.renderOrder = 2;
|
|
54
|
+
this.puffs.instanceMatrix.setUsage(DynamicDrawUsage);
|
|
55
|
+
// the same puffs every time: a fixed scatter, no clock and no random number
|
|
56
|
+
for (let i = 0; i < PUFFS; i++) {
|
|
57
|
+
const water = i >= PUFFS - WATER;
|
|
58
|
+
const a = i * 2.399963;
|
|
59
|
+
const r = water ? 0.55 + 0.1 * (i % 3) : 0.35 + ((i * 37) % 11) * 0.11;
|
|
60
|
+
const y = water ? 0.06 : 0.05 + ((i * 17) % 7) * 0.05;
|
|
61
|
+
const size = water ? 0.16 : 0.3 + ((i * 13) % 5) * 0.06;
|
|
62
|
+
this.puffs.setMatrixAt(i, matrix.compose(atOf.set(Math.cos(a) * r, y, Math.sin(a) * r), none, scaleOf.setScalar(size)));
|
|
63
|
+
}
|
|
64
|
+
this.group.add(this.pad, this.puffs);
|
|
65
|
+
this.group.visible = false;
|
|
66
|
+
}
|
|
67
|
+
/** How wide the smoke stands, and how far the plain ground reaches to hold everything that lands on it, in metres. */
|
|
68
|
+
fit(radius, reach) {
|
|
69
|
+
this.group.scale.setScalar(radius);
|
|
70
|
+
this.pad.scale.setScalar(Math.max(1, reach / radius));
|
|
71
|
+
// a puff stays round to the camera, so its size is not in the group's scale
|
|
72
|
+
for (let i = 0; i < PUFFS; i++) {
|
|
73
|
+
this.puffs.getMatrixAt(i, matrix);
|
|
74
|
+
const size = i >= PUFFS - WATER ? 0.16 : 0.3 + ((i * 13) % 5) * 0.06;
|
|
75
|
+
matrix.elements[0] = size * radius;
|
|
76
|
+
this.puffs.setMatrixAt(i, matrix);
|
|
77
|
+
}
|
|
78
|
+
this.puffs.instanceMatrix.needsUpdate = true;
|
|
79
|
+
}
|
|
80
|
+
/** Where the ground stands, and how much smoke is on it. `seconds` is the smoke's own clock, when it may move. */
|
|
81
|
+
set(y, smoke, seconds) {
|
|
82
|
+
this.group.position.y = y;
|
|
83
|
+
this.puffMaterial.uniforms.uSmoke.value = smoke;
|
|
84
|
+
this.puffMaterial.uniforms.uTime.value = seconds;
|
|
85
|
+
this.puffs.visible = smoke > 0.001;
|
|
86
|
+
}
|
|
87
|
+
dispose() {
|
|
88
|
+
this.group.removeFromParent();
|
|
89
|
+
this.pad.geometry.dispose();
|
|
90
|
+
this.padMaterial.dispose();
|
|
91
|
+
this.puffs.dispose();
|
|
92
|
+
this.puffShape.dispose();
|
|
93
|
+
this.puffMaterial.dispose();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BufferGeometry, Group, PointLight, ShaderMaterial } from "three";
|
|
2
|
+
import { type Bell } from "../engines.ts";
|
|
3
|
+
/** What burns in each engine's flame, as a picture: a fuel's flame is drawn in its own colours. */
|
|
4
|
+
export type Fuel = "methane" | "kerosene";
|
|
5
|
+
/** One part's flames: at most as many as it has bells. Its buffers are made once and written when the engines that burn change. */
|
|
6
|
+
export declare class PartPlumes {
|
|
7
|
+
readonly group: Group<import("three").Object3DEventMap>;
|
|
8
|
+
readonly bells: readonly Bell[];
|
|
9
|
+
private flames;
|
|
10
|
+
private glows;
|
|
11
|
+
private key;
|
|
12
|
+
constructor(kit: PlumeKit, bells: readonly Bell[]);
|
|
13
|
+
/** The bells that burn now. Nothing is written when they are the ones that burned last. */
|
|
14
|
+
light(burning: readonly Bell[]): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
}
|
|
17
|
+
/** One set of everything a flame needs, for one viewer. */
|
|
18
|
+
export declare class PlumeKit {
|
|
19
|
+
readonly shape: BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>;
|
|
20
|
+
readonly quad: BufferGeometry<import("three").NormalBufferAttributes, import("three").BufferGeometryEventMap>;
|
|
21
|
+
readonly flame: ShaderMaterial;
|
|
22
|
+
readonly glow: ShaderMaterial;
|
|
23
|
+
/** The hull's own glow in the painted look. Always in the scene, at no strength when no engine burns, so lighting engines never makes the materials build again. */
|
|
24
|
+
readonly light: PointLight;
|
|
25
|
+
private uniforms;
|
|
26
|
+
constructor();
|
|
27
|
+
setLook(painted: boolean): void;
|
|
28
|
+
setFuel(fuel: Fuel): void;
|
|
29
|
+
/** 0 near the ground, 1 high up where a flame fans out. */
|
|
30
|
+
setAir(air: number): void;
|
|
31
|
+
/** Where the ground stands, for a flame to stop at. */
|
|
32
|
+
setFloor(y: number): void;
|
|
33
|
+
/** Many glows overlap: together they add up to about one bright ring, not a white disc. */
|
|
34
|
+
setBurning(count: number): void;
|
|
35
|
+
/** The flame's clock, in seconds, or `null` to hold it still. */
|
|
36
|
+
setTime(seconds: number | null): void;
|
|
37
|
+
dispose(): void;
|
|
38
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// Flames for the 3D view, made here and loaded only with it. One shape, one material and one instanced draw for every engine of a part, however many burn, so lighting and dousing engines changes numbers, never what the graphics card holds. The look of a flame (its shock diamonds, its length, its glow) is a picture, not a measurement.
|
|
2
|
+
import { AdditiveBlending, BufferGeometry, Color, DoubleSide, DynamicDrawUsage, Float32BufferAttribute, Group, InstancedMesh, Matrix4, PointLight, Quaternion, ShaderMaterial, Vector3 } from "three";
|
|
3
|
+
import { PLUME_DIAMONDS, plumeLength } from "../engines.js";
|
|
4
|
+
const STEPS = 28;
|
|
5
|
+
const AROUND = 12;
|
|
6
|
+
const DIAMONDS = PLUME_DIAMONDS.toFixed(1);
|
|
7
|
+
const FLAME_VERTEX = /* glsl */ `
|
|
8
|
+
uniform float uTime;
|
|
9
|
+
uniform float uMoving;
|
|
10
|
+
uniform float uAir;
|
|
11
|
+
varying float vT;
|
|
12
|
+
varying float vFace;
|
|
13
|
+
varying float vHeight;
|
|
14
|
+
void main() {
|
|
15
|
+
float t = -position.y;
|
|
16
|
+
float seed = float(gl_InstanceID) * 1.7;
|
|
17
|
+
float jitter = uMoving * 0.035 * sin(uTime * 31.0 + seed) + uMoving * 0.02 * sin(uTime * 53.0 + seed * 2.3);
|
|
18
|
+
vec3 p = position;
|
|
19
|
+
// near the ground the flame is held in and pinched at its diamonds; high up it fans out and the diamonds go
|
|
20
|
+
float pinch = 1.0 - 0.16 * pow(0.5 + 0.5 * cos(t * 6.2832 * ${DIAMONDS}), 2.0);
|
|
21
|
+
p.xz *= mix(pinch, 1.0 + 2.6 * t, uAir);
|
|
22
|
+
p.y *= 1.0 + jitter;
|
|
23
|
+
vHeight = (modelMatrix * instanceMatrix * vec4(p, 1.0)).y;
|
|
24
|
+
vec4 view = modelViewMatrix * instanceMatrix * vec4(p, 1.0);
|
|
25
|
+
vec3 n = normalize(normalMatrix * mat3(instanceMatrix) * normal);
|
|
26
|
+
vFace = abs(dot(n, normalize(-view.xyz)));
|
|
27
|
+
vT = t;
|
|
28
|
+
gl_Position = projectionMatrix * view;
|
|
29
|
+
}`;
|
|
30
|
+
const FLAME_FRAGMENT = /* glsl */ `
|
|
31
|
+
uniform vec3 uHot;
|
|
32
|
+
uniform vec3 uCool;
|
|
33
|
+
uniform float uAir;
|
|
34
|
+
uniform float uLine;
|
|
35
|
+
uniform float uFloor;
|
|
36
|
+
varying float vT;
|
|
37
|
+
varying float vFace;
|
|
38
|
+
varying float vHeight;
|
|
39
|
+
void main() {
|
|
40
|
+
// a flame stops at the ground
|
|
41
|
+
if (vHeight < uFloor) discard;
|
|
42
|
+
float fade = 1.0 - smoothstep(0.5, 1.0, vT);
|
|
43
|
+
float bands = pow(0.5 + 0.5 * cos(vT * 6.2832 * ${DIAMONDS}), 6.0) * (1.0 - vT) * (1.0 - uAir);
|
|
44
|
+
float core = pow(vFace, 1.6);
|
|
45
|
+
vec3 filled = mix(uCool, uHot, core * (1.0 - vT * 0.7)) + vec3(1.0, 0.95, 0.85) * bands * 1.1;
|
|
46
|
+
float full = (0.22 + 0.78 * core) * fade * (0.9 + bands * 0.6) * mix(1.0, 0.45, uAir);
|
|
47
|
+
// the line looks: an outline and the diamonds, nothing filled
|
|
48
|
+
float rim = 1.0 - smoothstep(0.06, 0.3, vFace);
|
|
49
|
+
float drawn = max(rim, bands * 1.4) * fade;
|
|
50
|
+
gl_FragColor = vec4(mix(filled, vec3(0.91, 0.62, 0.26), uLine), mix(full, drawn, uLine));
|
|
51
|
+
}`;
|
|
52
|
+
const GLOW_VERTEX = /* glsl */ `
|
|
53
|
+
varying vec2 vCorner;
|
|
54
|
+
void main() {
|
|
55
|
+
vCorner = position.xy;
|
|
56
|
+
vec4 middle = modelViewMatrix * vec4(instanceMatrix[3].xyz, 1.0);
|
|
57
|
+
middle.xy += position.xy * instanceMatrix[0][0];
|
|
58
|
+
gl_Position = projectionMatrix * middle;
|
|
59
|
+
}`;
|
|
60
|
+
const GLOW_FRAGMENT = /* glsl */ `
|
|
61
|
+
uniform float uLine;
|
|
62
|
+
uniform vec3 uHot;
|
|
63
|
+
uniform float uGlow;
|
|
64
|
+
varying vec2 vCorner;
|
|
65
|
+
void main() {
|
|
66
|
+
float d = length(vCorner);
|
|
67
|
+
float soft = smoothstep(1.0, 0.1, d) * uGlow;
|
|
68
|
+
float ring = smoothstep(0.62, 0.7, d) * (1.0 - smoothstep(0.7, 0.78, d)) * 0.9;
|
|
69
|
+
gl_FragColor = vec4(mix(uHot, vec3(0.91, 0.62, 0.26), uLine), mix(soft, ring, uLine));
|
|
70
|
+
}`;
|
|
71
|
+
/** A flame of one exit radius and one length, tip down from its mouth, with its radius drawing in as it goes. */
|
|
72
|
+
function flameShape() {
|
|
73
|
+
const position = [];
|
|
74
|
+
const normal = [];
|
|
75
|
+
const index = [];
|
|
76
|
+
for (let step = 0; step <= STEPS; step++) {
|
|
77
|
+
const t = step / STEPS;
|
|
78
|
+
const radius = Math.pow(1 - t, 0.72);
|
|
79
|
+
for (let i = 0; i < AROUND; i++) {
|
|
80
|
+
const a = (i / AROUND) * Math.PI * 2;
|
|
81
|
+
position.push(Math.sin(a) * radius, -t, Math.cos(a) * radius);
|
|
82
|
+
normal.push(Math.sin(a), 0.2, Math.cos(a));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
for (let step = 0; step < STEPS; step++)
|
|
86
|
+
for (let i = 0; i < AROUND; i++) {
|
|
87
|
+
const a = step * AROUND + i;
|
|
88
|
+
const b = step * AROUND + ((i + 1) % AROUND);
|
|
89
|
+
index.push(a, a + AROUND, b, b, a + AROUND, b + AROUND);
|
|
90
|
+
}
|
|
91
|
+
const geometry = new BufferGeometry();
|
|
92
|
+
geometry.setAttribute("position", new Float32BufferAttribute(position, 3));
|
|
93
|
+
geometry.setAttribute("normal", new Float32BufferAttribute(normal, 3));
|
|
94
|
+
geometry.setIndex(index);
|
|
95
|
+
return geometry;
|
|
96
|
+
}
|
|
97
|
+
function glowShape() {
|
|
98
|
+
const geometry = new BufferGeometry();
|
|
99
|
+
geometry.setAttribute("position", new Float32BufferAttribute([-1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0], 3));
|
|
100
|
+
geometry.setIndex([0, 1, 2, 0, 2, 3]);
|
|
101
|
+
return geometry;
|
|
102
|
+
}
|
|
103
|
+
const FUEL_COLOURS = {
|
|
104
|
+
methane: { hot: "#fff1e6", cool: "#6f7dff" },
|
|
105
|
+
kerosene: { hot: "#fff4d2", cool: "#ff7a1a" },
|
|
106
|
+
};
|
|
107
|
+
const place = new Matrix4();
|
|
108
|
+
const still = new Quaternion();
|
|
109
|
+
const at = new Vector3();
|
|
110
|
+
const size = new Vector3();
|
|
111
|
+
/** One part's flames: at most as many as it has bells. Its buffers are made once and written when the engines that burn change. */
|
|
112
|
+
export class PartPlumes {
|
|
113
|
+
group = new Group();
|
|
114
|
+
bells;
|
|
115
|
+
flames;
|
|
116
|
+
glows;
|
|
117
|
+
key = "";
|
|
118
|
+
constructor(kit, bells) {
|
|
119
|
+
this.bells = bells;
|
|
120
|
+
this.group.name = "plumes";
|
|
121
|
+
this.flames = new InstancedMesh(kit.shape, kit.flame, bells.length);
|
|
122
|
+
this.glows = new InstancedMesh(kit.quad, kit.glow, bells.length);
|
|
123
|
+
for (const mesh of [this.flames, this.glows]) {
|
|
124
|
+
mesh.instanceMatrix.setUsage(DynamicDrawUsage);
|
|
125
|
+
mesh.frustumCulled = false;
|
|
126
|
+
mesh.renderOrder = 3;
|
|
127
|
+
mesh.count = 0;
|
|
128
|
+
}
|
|
129
|
+
this.group.add(this.flames, this.glows);
|
|
130
|
+
}
|
|
131
|
+
/** The bells that burn now. Nothing is written when they are the ones that burned last. */
|
|
132
|
+
light(burning) {
|
|
133
|
+
const key = burning.map((bell) => `${bell.x},${bell.z}`).join("|");
|
|
134
|
+
if (key === this.key)
|
|
135
|
+
return;
|
|
136
|
+
this.key = key;
|
|
137
|
+
burning.forEach((bell, i) => {
|
|
138
|
+
this.flames.setMatrixAt(i, place.compose(at.set(bell.x, bell.y, bell.z), still, size.set(bell.exit, plumeLength(bell.exit), bell.exit)));
|
|
139
|
+
this.glows.setMatrixAt(i, place.compose(at.set(bell.x, bell.y, bell.z), still, size.setScalar(bell.exit * 2.2)));
|
|
140
|
+
});
|
|
141
|
+
this.flames.count = burning.length;
|
|
142
|
+
this.glows.count = burning.length;
|
|
143
|
+
this.flames.instanceMatrix.needsUpdate = true;
|
|
144
|
+
this.glows.instanceMatrix.needsUpdate = true;
|
|
145
|
+
}
|
|
146
|
+
dispose() {
|
|
147
|
+
this.group.removeFromParent();
|
|
148
|
+
this.flames.dispose();
|
|
149
|
+
this.glows.dispose();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** One set of everything a flame needs, for one viewer. */
|
|
153
|
+
export class PlumeKit {
|
|
154
|
+
shape = flameShape();
|
|
155
|
+
quad = glowShape();
|
|
156
|
+
flame;
|
|
157
|
+
glow;
|
|
158
|
+
/** The hull's own glow in the painted look. Always in the scene, at no strength when no engine burns, so lighting engines never makes the materials build again. */
|
|
159
|
+
light = new PointLight("#ffb56b", 0, 0, 1.6);
|
|
160
|
+
uniforms = {
|
|
161
|
+
uTime: { value: 0 },
|
|
162
|
+
uMoving: { value: 0 },
|
|
163
|
+
uAir: { value: 0 },
|
|
164
|
+
uLine: { value: 1 },
|
|
165
|
+
uFloor: { value: -1e6 },
|
|
166
|
+
uGlow: { value: 0.75 },
|
|
167
|
+
uHot: { value: new Color(FUEL_COLOURS.kerosene.hot) },
|
|
168
|
+
uCool: { value: new Color(FUEL_COLOURS.kerosene.cool) },
|
|
169
|
+
};
|
|
170
|
+
constructor() {
|
|
171
|
+
const common = { transparent: true, depthWrite: false, blending: AdditiveBlending, toneMapped: false };
|
|
172
|
+
this.flame = new ShaderMaterial({ ...common, vertexShader: FLAME_VERTEX, fragmentShader: FLAME_FRAGMENT, uniforms: this.uniforms, side: DoubleSide });
|
|
173
|
+
this.glow = new ShaderMaterial({ ...common, vertexShader: GLOW_VERTEX, fragmentShader: GLOW_FRAGMENT, uniforms: this.uniforms });
|
|
174
|
+
}
|
|
175
|
+
setLook(painted) {
|
|
176
|
+
this.uniforms.uLine.value = painted ? 0 : 1;
|
|
177
|
+
}
|
|
178
|
+
setFuel(fuel) {
|
|
179
|
+
this.uniforms.uHot.value.set(FUEL_COLOURS[fuel].hot);
|
|
180
|
+
this.uniforms.uCool.value.set(FUEL_COLOURS[fuel].cool);
|
|
181
|
+
}
|
|
182
|
+
/** 0 near the ground, 1 high up where a flame fans out. */
|
|
183
|
+
setAir(air) {
|
|
184
|
+
this.uniforms.uAir.value = air;
|
|
185
|
+
}
|
|
186
|
+
/** Where the ground stands, for a flame to stop at. */
|
|
187
|
+
setFloor(y) {
|
|
188
|
+
this.uniforms.uFloor.value = y;
|
|
189
|
+
}
|
|
190
|
+
/** Many glows overlap: together they add up to about one bright ring, not a white disc. */
|
|
191
|
+
setBurning(count) {
|
|
192
|
+
this.uniforms.uGlow.value = 0.75 * Math.min(1, 5 / Math.max(1, count));
|
|
193
|
+
}
|
|
194
|
+
/** The flame's clock, in seconds, or `null` to hold it still. */
|
|
195
|
+
setTime(seconds) {
|
|
196
|
+
this.uniforms.uMoving.value = seconds === null ? 0 : 1;
|
|
197
|
+
if (seconds !== null)
|
|
198
|
+
this.uniforms.uTime.value = seconds;
|
|
199
|
+
}
|
|
200
|
+
dispose() {
|
|
201
|
+
this.shape.dispose();
|
|
202
|
+
this.quad.dispose();
|
|
203
|
+
this.flame.dispose();
|
|
204
|
+
this.glow.dispose();
|
|
205
|
+
this.light.dispose();
|
|
206
|
+
this.light.removeFromParent();
|
|
207
|
+
}
|
|
208
|
+
}
|
package/dist/element/scene.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Built } from "../build/index.ts";
|
|
2
2
|
import { type Angle, type ViewChoice } from "../framing.ts";
|
|
3
3
|
import { type LookName } from "../looks.ts";
|
|
4
|
+
import { type FlightClock } from "../flight.ts";
|
|
5
|
+
import type { Spin } from "../spin.ts";
|
|
4
6
|
export interface ViewerOptions {
|
|
5
7
|
label: string;
|
|
6
8
|
reducedMotion: boolean;
|
|
@@ -9,11 +11,8 @@ export interface ViewerOptions {
|
|
|
9
11
|
assets: string;
|
|
10
12
|
/** Tells the page which painted parts have come in. */
|
|
11
13
|
onPainted: (state: string) => void;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/** Seconds a turn, 0 for not at all. */
|
|
15
|
-
seconds: number;
|
|
16
|
-
way: "cw" | "ccw";
|
|
14
|
+
/** Tells the page a timeline moved. */
|
|
15
|
+
onFlight?: () => void;
|
|
17
16
|
}
|
|
18
17
|
export declare class RocketViewer {
|
|
19
18
|
readonly canvas: HTMLCanvasElement;
|
|
@@ -29,6 +28,20 @@ export declare class RocketViewer {
|
|
|
29
28
|
private built;
|
|
30
29
|
private look;
|
|
31
30
|
private show;
|
|
31
|
+
private plumes;
|
|
32
|
+
private lit;
|
|
33
|
+
/** What was lit before a flight took over the engines. */
|
|
34
|
+
private litOutside;
|
|
35
|
+
private burningNow;
|
|
36
|
+
/** A flame moves until then. */
|
|
37
|
+
private flameUntil;
|
|
38
|
+
private flameDrawn;
|
|
39
|
+
private inTick;
|
|
40
|
+
private clockNow;
|
|
41
|
+
private flightOn;
|
|
42
|
+
private ground;
|
|
43
|
+
private flightKey;
|
|
44
|
+
private burnSlots;
|
|
32
45
|
private generation;
|
|
33
46
|
private materialCache;
|
|
34
47
|
private outlineMaterial;
|
|
@@ -67,6 +80,27 @@ export declare class RocketViewer {
|
|
|
67
80
|
private repeating;
|
|
68
81
|
/** One of the three looks. The camera does not move. */
|
|
69
82
|
setLook(look: LookName): void;
|
|
83
|
+
/** Which engines burn: at full thrust every one that shows, a count for each part, or none. Nothing is made or freed by this after a part's first flame: only which of its flames are drawn changes. */
|
|
84
|
+
setEngines(lit: {
|
|
85
|
+
readonly [slot: string]: number;
|
|
86
|
+
} | "full" | null): void;
|
|
87
|
+
/** The page reads reduced motion again at each change, so a view opened earlier follows the reader now. */
|
|
88
|
+
setReduced(reduced: boolean): void;
|
|
89
|
+
private relight;
|
|
90
|
+
/** The hull's glow stands under the lowest part that burns, wherever that part has got to. */
|
|
91
|
+
private placeGlow;
|
|
92
|
+
/** Starts, moves or ends a flight. While one is on, the parts stand where its timeline says, the engines are its own and the camera holds all of it. Under reduced motion it is the same, with no flames. */
|
|
93
|
+
setFlight(clock: FlightClock | null): void;
|
|
94
|
+
/** After a flight starts or ends the camera holds the new bounds, keeping its angle. */
|
|
95
|
+
private reframe;
|
|
96
|
+
/** What is showing, with the flames when they are lit, so a flame is never cut off at the foot of the picture. */
|
|
97
|
+
private litBounds;
|
|
98
|
+
/** What the picture must hold: all of a flight while one is on. */
|
|
99
|
+
private boundsNow;
|
|
100
|
+
private flightParts;
|
|
101
|
+
/** Puts everything where the timeline says now. */
|
|
102
|
+
private applyFlight;
|
|
103
|
+
private freePlumes;
|
|
70
104
|
/** Which painted parts are in: "model" when all come from a licensed model, "code" when this package's own paint, "loading" while one is on its way. */
|
|
71
105
|
private reportPainted;
|
|
72
106
|
/** The licensed model of a part, fetched the first time the painted look asks for it. Until it is in, and if it fails, this package's own paint shows. */
|