@johnmorrisdotca/uchusen-rockets 0.2.2 → 0.4.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 +55 -5
- package/LICENSES/ODbL-1.0.txt +540 -0
- package/NOTICE.md +56 -6
- package/README.md +288 -16
- 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 +93 -0
- package/dist/attrs.js +86 -0
- package/dist/build/glb.d.ts +25 -0
- package/dist/build/glb.js +14 -0
- package/dist/build/index.d.ts +96 -6
- package/dist/build/index.js +83 -8
- package/dist/build/lineup.d.ts +56 -2
- package/dist/build/lineup.js +37 -6
- package/dist/builder.d.ts +68 -0
- package/dist/builder.js +116 -0
- package/dist/crossfade.d.ts +44 -2
- package/dist/crossfade.js +44 -2
- package/dist/data/apollosoyuz.d.ts +6 -0
- package/dist/data/apollosoyuz.js +28 -0
- package/dist/data/credits.d.ts +63 -2
- package/dist/data/credits.js +52 -2
- 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 +50 -0
- package/dist/data/flight-log.js +44 -0
- package/dist/data/flights.d.ts +101 -0
- package/dist/data/flights.js +187 -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 +37 -0
- package/dist/data/makers.js +39 -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 +380 -2
- package/dist/data/sources.js +55 -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 +88 -2
- package/dist/data/types.js +26 -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 +111 -4
- package/dist/element.js +251 -16
- package/dist/embed.d.ts +131 -0
- package/dist/embed.js +218 -0
- package/dist/engines.d.ts +126 -0
- package/dist/engines.js +150 -0
- package/dist/fit.d.ts +70 -0
- package/dist/fit.js +17 -3
- package/dist/flight.d.ts +192 -0
- package/dist/flight.js +237 -0
- package/dist/flightbar.d.ts +34 -0
- package/dist/flightbar.js +188 -0
- package/dist/framing.d.ts +182 -8
- package/dist/framing.js +127 -6
- package/dist/index.d.ts +17 -0
- package/dist/index.js +9 -0
- package/dist/layout.d.ts +65 -1
- package/dist/layout.js +44 -2
- package/dist/looks.d.ts +65 -2
- package/dist/looks.js +44 -1
- 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 +74 -0
- package/dist/model/materials.js +17 -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.d.ts +22 -0
- package/dist/model/registry.js +85 -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 +36 -3
- package/dist/pixels.d.ts +44 -4
- package/dist/pixels.js +44 -4
- package/dist/react.d.ts +38 -6
- package/dist/react.js +13 -0
- package/dist/rockets.d.ts +96 -3
- package/dist/rockets.js +136 -9
- package/dist/spin.d.ts +66 -0
- package/dist/spin.js +44 -0
- package/dist/tilt.d.ts +48 -4
- package/dist/tilt.js +26 -4
- package/package.json +99 -19
|
@@ -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. */
|
package/dist/element/scene.js
CHANGED
|
@@ -7,11 +7,15 @@ import { LineMaterial } from "three/addons/lines/LineMaterial.js";
|
|
|
7
7
|
import { LineSegments2 } from "three/addons/lines/LineSegments2.js";
|
|
8
8
|
import { LineSegmentsGeometry } from "three/addons/lines/LineSegmentsGeometry.js";
|
|
9
9
|
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
|
10
|
+
import { bellsOf, FLAME_GAP_MS, FLAME_SETTLE_MS, pickBells } from "../engines.js";
|
|
10
11
|
import { directionOf, FOV_DEG, frameFor, PICTURE_H, turnedBy } from "../framing.js";
|
|
11
12
|
import { LOOKS } from "../looks.js";
|
|
12
13
|
import { pixelRatioFor } from "../pixels.js";
|
|
13
14
|
import { MATERIALS } from "../model/materials.js";
|
|
14
15
|
import { paintGlow, paintSky, paintSteel, paintTiles } from "./paint.js";
|
|
16
|
+
import { flightBounds, frameAt } from "../flight.js";
|
|
17
|
+
import { GroundKit } from "./ground.js";
|
|
18
|
+
import { PartPlumes, PlumeKit } from "./plumes.js";
|
|
15
19
|
const IDLE_STOP_MS = 90_000;
|
|
16
20
|
const MOVE_MS = 1400;
|
|
17
21
|
const VIEW_MS = 700;
|
|
@@ -73,6 +77,8 @@ void main() {
|
|
|
73
77
|
/** The materials of an engine's bell, in this package's own meshes. */
|
|
74
78
|
const NOZZLE_MATERIALS = new Set(["bell", "bell-inside", "engine-metal"]);
|
|
75
79
|
const asVec = (v) => [v.x, v.y, v.z];
|
|
80
|
+
/** A flame's colours, a picture: Raptor burns methane, Merlin kerosene. */
|
|
81
|
+
const fuelOf = (built) => (built.report.parts.some(({ part }) => part.rocket === "starship") ? "methane" : "kerosene");
|
|
76
82
|
/** The pictures a licensed model's material may hold (the shared sky it reflects is not one of them). */
|
|
77
83
|
const MODEL_PICTURES = ["map", "normalMap", "roughnessMap", "metalnessMap", "aoMap", "emissiveMap"];
|
|
78
84
|
export class RocketViewer {
|
|
@@ -89,6 +95,20 @@ export class RocketViewer {
|
|
|
89
95
|
built = null;
|
|
90
96
|
look = "line";
|
|
91
97
|
show = "together";
|
|
98
|
+
plumes;
|
|
99
|
+
lit = null;
|
|
100
|
+
/** What was lit before a flight took over the engines. */
|
|
101
|
+
litOutside = null;
|
|
102
|
+
burningNow = 0;
|
|
103
|
+
/** A flame moves until then. */
|
|
104
|
+
flameUntil = 0;
|
|
105
|
+
flameDrawn = 0;
|
|
106
|
+
inTick = false;
|
|
107
|
+
clockNow = null;
|
|
108
|
+
flightOn = false;
|
|
109
|
+
ground = null;
|
|
110
|
+
flightKey = "";
|
|
111
|
+
burnSlots = null;
|
|
92
112
|
generation = 0;
|
|
93
113
|
materialCache = new Map();
|
|
94
114
|
outlineMaterial;
|
|
@@ -148,7 +168,8 @@ export class RocketViewer {
|
|
|
148
168
|
rim.position.set(-4, 1, -5);
|
|
149
169
|
const low = new DirectionalLight("#ffffff", 0.35);
|
|
150
170
|
low.position.set(1, -4, 2);
|
|
151
|
-
this.
|
|
171
|
+
this.plumes = new PlumeKit();
|
|
172
|
+
this.scene.add(key, rim, low, new HemisphereLight("#d7e6ff", "#22252b", 0.35), this.plumes.light, this.root);
|
|
152
173
|
this.outlineMaterial = new ShaderMaterial({
|
|
153
174
|
vertexShader: OUTLINE_VERTEX,
|
|
154
175
|
fragmentShader: OUTLINE_FRAGMENT,
|
|
@@ -220,6 +241,7 @@ export class RocketViewer {
|
|
|
220
241
|
from: [0, 0, 0],
|
|
221
242
|
to: [0, 0, 0],
|
|
222
243
|
hideAtEnd: false,
|
|
244
|
+
plumes: null,
|
|
223
245
|
};
|
|
224
246
|
this.takeMeshes(source, code, view);
|
|
225
247
|
const place = places.find((p) => p.slot === part.slot);
|
|
@@ -230,7 +252,13 @@ export class RocketViewer {
|
|
|
230
252
|
}
|
|
231
253
|
this.addGlow();
|
|
232
254
|
this.setLook(look);
|
|
255
|
+
this.plumes.setFuel(fuelOf(built));
|
|
233
256
|
this.frameTo(angle ?? this.currentAngle(), false);
|
|
257
|
+
if (this.clockNow) {
|
|
258
|
+
this.flightKey = "";
|
|
259
|
+
this.flightOn = false;
|
|
260
|
+
this.setFlight(this.clockNow);
|
|
261
|
+
}
|
|
234
262
|
this.canvas.dataset.ready = "true";
|
|
235
263
|
this.canvas.dataset.parts = this.parts.map((part) => part.slot).join(" ");
|
|
236
264
|
this.drivenDirty = this.driven !== null;
|
|
@@ -385,9 +413,200 @@ export class RocketViewer {
|
|
|
385
413
|
if (this.glow)
|
|
386
414
|
this.glow.visible = !painted;
|
|
387
415
|
this.canvas.dataset.look = look;
|
|
416
|
+
this.plumes.setLook(painted);
|
|
417
|
+
this.relight();
|
|
388
418
|
this.reportPainted();
|
|
389
419
|
this.wake();
|
|
390
420
|
}
|
|
421
|
+
/** 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. */
|
|
422
|
+
setEngines(lit) {
|
|
423
|
+
// a flight keeps its own, and what was asked for comes back after it
|
|
424
|
+
if (this.clockNow) {
|
|
425
|
+
this.litOutside = lit;
|
|
426
|
+
this.flightKey = "";
|
|
427
|
+
this.applyFlight();
|
|
428
|
+
this.wake();
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
const framed = this.lit === "full";
|
|
432
|
+
this.lit = lit;
|
|
433
|
+
this.relight();
|
|
434
|
+
if (framed !== (lit === "full") && this.built && !this.pose)
|
|
435
|
+
this.reframe();
|
|
436
|
+
this.wake();
|
|
437
|
+
}
|
|
438
|
+
/** The page reads reduced motion again at each change, so a view opened earlier follows the reader now. */
|
|
439
|
+
setReduced(reduced) {
|
|
440
|
+
this.options.reducedMotion = reduced;
|
|
441
|
+
}
|
|
442
|
+
relight() {
|
|
443
|
+
if (!this.built)
|
|
444
|
+
return;
|
|
445
|
+
const counts = new Map();
|
|
446
|
+
if (this.lit === "full") {
|
|
447
|
+
for (const bell of this.built.flamesOf(this.show))
|
|
448
|
+
counts.set(bell.slot, (counts.get(bell.slot) ?? 0) + 1);
|
|
449
|
+
}
|
|
450
|
+
else if (this.lit)
|
|
451
|
+
for (const [slot, count] of Object.entries(this.lit))
|
|
452
|
+
counts.set(slot, count);
|
|
453
|
+
let burning = 0;
|
|
454
|
+
let lowest = null;
|
|
455
|
+
for (const view of this.parts) {
|
|
456
|
+
const count = counts.get(view.slot) ?? 0;
|
|
457
|
+
if (count > 0 && !view.plumes) {
|
|
458
|
+
const bells = bellsOf(this.built.parts.find((part) => part.slot === view.slot)?.pieces ?? []);
|
|
459
|
+
if (bells.length === 0)
|
|
460
|
+
continue;
|
|
461
|
+
view.plumes = new PartPlumes(this.plumes, bells);
|
|
462
|
+
view.holder.add(view.plumes.group);
|
|
463
|
+
}
|
|
464
|
+
if (!view.plumes)
|
|
465
|
+
continue;
|
|
466
|
+
const fired = pickBells(view.plumes.bells, count);
|
|
467
|
+
view.plumes.light(fired);
|
|
468
|
+
burning += fired.length;
|
|
469
|
+
if (fired.length > 0 && !lowest)
|
|
470
|
+
lowest = { view, y: fired[0].y - 1 };
|
|
471
|
+
}
|
|
472
|
+
this.burningNow = burning;
|
|
473
|
+
this.burnSlots = lowest;
|
|
474
|
+
this.plumes.setBurning(burning);
|
|
475
|
+
this.plumes.light.intensity = burning === 0 || this.look !== "painted" ? 0 : Math.min(900, 120 + burning * 40);
|
|
476
|
+
this.placeGlow();
|
|
477
|
+
this.canvas.dataset.engines = burning > 0 ? "on" : "off";
|
|
478
|
+
this.canvas.dataset.plumes = String(burning);
|
|
479
|
+
}
|
|
480
|
+
/** The hull's glow stands under the lowest part that burns, wherever that part has got to. */
|
|
481
|
+
placeGlow() {
|
|
482
|
+
const lowest = this.burnSlots;
|
|
483
|
+
if (!lowest)
|
|
484
|
+
return;
|
|
485
|
+
lowest.view.holder.updateMatrix();
|
|
486
|
+
this.plumes.light.position.set(0, lowest.y, 0).applyMatrix4(lowest.view.holder.matrix);
|
|
487
|
+
}
|
|
488
|
+
/** 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. */
|
|
489
|
+
setFlight(clock) {
|
|
490
|
+
this.clockNow = clock;
|
|
491
|
+
if (!this.built)
|
|
492
|
+
return;
|
|
493
|
+
const before = this.flightOn;
|
|
494
|
+
this.flightOn = clock !== null;
|
|
495
|
+
if (!clock) {
|
|
496
|
+
if (!before)
|
|
497
|
+
return;
|
|
498
|
+
this.flightKey = "";
|
|
499
|
+
if (this.ground)
|
|
500
|
+
this.ground.group.visible = false;
|
|
501
|
+
for (const part of this.parts)
|
|
502
|
+
if (part.model)
|
|
503
|
+
this.showCode(part, this.look === "painted");
|
|
504
|
+
const places = this.built.placesOf(this.show);
|
|
505
|
+
for (const part of this.parts) {
|
|
506
|
+
const place = places.find((one) => one.slot === part.slot);
|
|
507
|
+
part.holder.position.set(...(place?.at ?? [0, 0, 0]));
|
|
508
|
+
part.holder.rotation.set(0, 0, 0);
|
|
509
|
+
part.holder.visible = place?.shown ?? false;
|
|
510
|
+
}
|
|
511
|
+
this.plumes.setAir(0);
|
|
512
|
+
this.plumes.setFloor(-1e6);
|
|
513
|
+
this.reframe();
|
|
514
|
+
this.lit = this.litOutside;
|
|
515
|
+
this.relight();
|
|
516
|
+
this.wake();
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (!before) {
|
|
520
|
+
this.litOutside = this.lit;
|
|
521
|
+
this.pose = null;
|
|
522
|
+
if (!this.ground) {
|
|
523
|
+
this.ground = new GroundKit();
|
|
524
|
+
this.scene.add(this.ground.group);
|
|
525
|
+
}
|
|
526
|
+
const { min, max } = this.boundsNow();
|
|
527
|
+
this.ground.fit(this.built.boundsOf("together").max[0] * 2.4 + 4, Math.max(Math.abs(min[0]), Math.abs(max[0])));
|
|
528
|
+
this.ground.group.visible = true;
|
|
529
|
+
for (const part of this.parts)
|
|
530
|
+
if (part.model)
|
|
531
|
+
this.showCode(part, this.look === "painted");
|
|
532
|
+
this.reframe();
|
|
533
|
+
}
|
|
534
|
+
this.applyFlight();
|
|
535
|
+
this.wake();
|
|
536
|
+
}
|
|
537
|
+
/** After a flight starts or ends the camera holds the new bounds, keeping its angle. */
|
|
538
|
+
reframe() {
|
|
539
|
+
if (this.driven)
|
|
540
|
+
this.applyDriven();
|
|
541
|
+
else
|
|
542
|
+
this.applyFraming(this.framingFor(this.currentAngle()));
|
|
543
|
+
}
|
|
544
|
+
/** What is showing, with the flames when they are lit, so a flame is never cut off at the foot of the picture. */
|
|
545
|
+
litBounds() {
|
|
546
|
+
const built = this.built;
|
|
547
|
+
return this.lit === "full" ? built.boundsOf(this.show, true) : built.boundsOf(this.show);
|
|
548
|
+
}
|
|
549
|
+
/** What the picture must hold: all of a flight while one is on. */
|
|
550
|
+
boundsNow() {
|
|
551
|
+
if (!this.built)
|
|
552
|
+
throw new Error("nothing is loaded");
|
|
553
|
+
if (!this.clockNow)
|
|
554
|
+
return this.litBounds();
|
|
555
|
+
const { height, parts } = this.flightParts();
|
|
556
|
+
const { min, max } = flightBounds(this.clockNow.flight, parts, height);
|
|
557
|
+
return { min, max };
|
|
558
|
+
}
|
|
559
|
+
flightParts() {
|
|
560
|
+
const built = this.built;
|
|
561
|
+
const places = built.placesOf("together");
|
|
562
|
+
const height = built.boundsOf("together").max[1];
|
|
563
|
+
return {
|
|
564
|
+
height,
|
|
565
|
+
parts: built.parts.map((part) => {
|
|
566
|
+
const at = places.find((place) => place.slot === part.slot)?.at ?? [0, 0, 0];
|
|
567
|
+
return { slot: part.slot, baseY: at[1], height: part.record.height, radius: Math.max(part.record.diameter / 2, Math.abs(at[0]) + part.record.diameter / 2) };
|
|
568
|
+
}),
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
/** Puts everything where the timeline says now. */
|
|
572
|
+
applyFlight() {
|
|
573
|
+
const clock = this.clockNow;
|
|
574
|
+
if (!clock || !this.built)
|
|
575
|
+
return;
|
|
576
|
+
const { height, parts } = this.flightParts();
|
|
577
|
+
const frame = frameAt(clock.flight, clock.position, parts, height);
|
|
578
|
+
const places = this.built.placesOf("together");
|
|
579
|
+
for (const part of this.parts) {
|
|
580
|
+
const pose = frame.poses[part.slot];
|
|
581
|
+
const place = places.find((one) => one.slot === part.slot);
|
|
582
|
+
if (!pose || !place)
|
|
583
|
+
continue;
|
|
584
|
+
const turn = MathUtils.degToRad(pose.pitch);
|
|
585
|
+
const middle = (parts.find((one) => one.slot === part.slot)?.height ?? 0) / 2;
|
|
586
|
+
part.holder.visible = !pose.gone;
|
|
587
|
+
part.holder.rotation.set(0, 0, turn);
|
|
588
|
+
part.holder.position.set(place.at[0] + pose.dx + Math.sin(turn) * middle, place.at[1] + pose.dy + middle - Math.cos(turn) * middle, place.at[2]);
|
|
589
|
+
}
|
|
590
|
+
this.plumes.setAir(frame.air);
|
|
591
|
+
this.plumes.setFloor(frame.groundY);
|
|
592
|
+
this.ground?.set(frame.groundY, this.options.reducedMotion ? 0 : frame.smoke, performance.now() / 1000);
|
|
593
|
+
const key = `${clock.flight.id}/${frame.index}/${this.options.reducedMotion}`;
|
|
594
|
+
if (key !== this.flightKey) {
|
|
595
|
+
this.flightKey = key;
|
|
596
|
+
this.lit = this.options.reducedMotion ? null : frame.burns;
|
|
597
|
+
this.relight();
|
|
598
|
+
this.canvas.dataset.phase = frame.phase.id;
|
|
599
|
+
}
|
|
600
|
+
else
|
|
601
|
+
this.placeGlow();
|
|
602
|
+
this.needsDraw = true;
|
|
603
|
+
}
|
|
604
|
+
freePlumes() {
|
|
605
|
+
for (const view of this.parts) {
|
|
606
|
+
view.plumes?.dispose();
|
|
607
|
+
view.plumes = null;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
391
610
|
/** 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. */
|
|
392
611
|
reportPainted() {
|
|
393
612
|
if (this.look !== "painted") {
|
|
@@ -445,7 +664,8 @@ export class RocketViewer {
|
|
|
445
664
|
showCode(part, painted) {
|
|
446
665
|
const nozzleOnly = painted && part.ownNozzle;
|
|
447
666
|
part.code.visible = !painted || nozzleOnly;
|
|
448
|
-
|
|
667
|
+
// in a flight a stage leaves the one below, so its nozzle shows then too
|
|
668
|
+
const nozzle = nozzleOnly && (this.show !== "together" || this.flightOn);
|
|
449
669
|
for (const { mesh, name } of part.faces)
|
|
450
670
|
mesh.visible = !nozzleOnly || (nozzle && NOZZLE_MATERIALS.has(name));
|
|
451
671
|
for (const lines of [...part.feature, ...part.weld])
|
|
@@ -455,7 +675,7 @@ export class RocketViewer {
|
|
|
455
675
|
}
|
|
456
676
|
/** Together, apart, or one part alone: an animated move, or a cut under reduced motion. */
|
|
457
677
|
setShow(show) {
|
|
458
|
-
if (!this.built || show === this.show)
|
|
678
|
+
if (!this.built || show === this.show || this.clockNow)
|
|
459
679
|
return;
|
|
460
680
|
this.show = show;
|
|
461
681
|
for (const part of this.parts)
|
|
@@ -474,6 +694,7 @@ export class RocketViewer {
|
|
|
474
694
|
}
|
|
475
695
|
this.pose = null;
|
|
476
696
|
this.applyFraming(framing);
|
|
697
|
+
this.relight();
|
|
477
698
|
this.wake();
|
|
478
699
|
return;
|
|
479
700
|
}
|
|
@@ -500,11 +721,12 @@ export class RocketViewer {
|
|
|
500
721
|
}
|
|
501
722
|
}
|
|
502
723
|
this.startPose(framing, MOVE_MS, true);
|
|
724
|
+
this.relight();
|
|
503
725
|
}
|
|
504
726
|
framingFor(angle) {
|
|
505
727
|
if (!this.built)
|
|
506
728
|
throw new Error("nothing is loaded");
|
|
507
|
-
const { min, max } = this.
|
|
729
|
+
const { min, max } = this.boundsNow();
|
|
508
730
|
return frameFor(min, max, angle, this.camera.aspect);
|
|
509
731
|
}
|
|
510
732
|
applyFraming(framing) {
|
|
@@ -674,6 +896,8 @@ export class RocketViewer {
|
|
|
674
896
|
this.resize.disconnect();
|
|
675
897
|
this.controls.dispose();
|
|
676
898
|
this.disposeParts();
|
|
899
|
+
this.plumes.dispose();
|
|
900
|
+
this.ground?.dispose();
|
|
677
901
|
this.glow?.geometry.dispose();
|
|
678
902
|
this.glow?.material?.dispose();
|
|
679
903
|
for (const material of this.materialCache.values())
|
|
@@ -688,6 +912,7 @@ export class RocketViewer {
|
|
|
688
912
|
}
|
|
689
913
|
/** Lets the graphics card have back what the parts took: geometries, the thick lines' materials and a licensed model's own materials and pictures. */
|
|
690
914
|
disposeParts() {
|
|
915
|
+
this.freePlumes();
|
|
691
916
|
for (const part of this.parts) {
|
|
692
917
|
part.holder.traverse((node) => {
|
|
693
918
|
node.geometry?.dispose();
|
|
@@ -738,7 +963,11 @@ export class RocketViewer {
|
|
|
738
963
|
this.wake();
|
|
739
964
|
}
|
|
740
965
|
wake() {
|
|
741
|
-
this
|
|
966
|
+
// the view's own spin is not someone touching it: without this a spin would never settle
|
|
967
|
+
if (!this.inTick) {
|
|
968
|
+
this.lastActive = performance.now();
|
|
969
|
+
this.flameUntil = this.lastActive + FLAME_SETTLE_MS;
|
|
970
|
+
}
|
|
742
971
|
this.needsDraw = true;
|
|
743
972
|
if (!this.frame && this.visible && !document.hidden && !this.disposed)
|
|
744
973
|
this.frame = requestAnimationFrame(this.tick);
|
|
@@ -747,6 +976,7 @@ export class RocketViewer {
|
|
|
747
976
|
this.frame = 0;
|
|
748
977
|
if (!this.visible || document.hidden || this.disposed)
|
|
749
978
|
return;
|
|
979
|
+
this.inTick = true;
|
|
750
980
|
this.clock.update(now);
|
|
751
981
|
const dt = Math.min(this.clock.getDelta(), 0.1);
|
|
752
982
|
const ambient = !this.options.reducedMotion && now - this.lastActive < IDLE_STOP_MS;
|
|
@@ -804,6 +1034,18 @@ export class RocketViewer {
|
|
|
804
1034
|
}
|
|
805
1035
|
if (!ambient)
|
|
806
1036
|
this.controls.autoRotate = false;
|
|
1037
|
+
const flying = this.clockNow?.playing ?? false;
|
|
1038
|
+
if (flying && this.clockNow) {
|
|
1039
|
+
this.clockNow.advance(dt);
|
|
1040
|
+
this.applyFlight();
|
|
1041
|
+
this.options.onFlight?.();
|
|
1042
|
+
}
|
|
1043
|
+
const flaming = this.burningNow > 0 && !this.options.reducedMotion && (flying || performance.now() < this.flameUntil);
|
|
1044
|
+
if (flaming && now - this.flameDrawn >= FLAME_GAP_MS) {
|
|
1045
|
+
this.flameDrawn = now;
|
|
1046
|
+
this.plumes.setTime(now / 1000);
|
|
1047
|
+
this.needsDraw = true;
|
|
1048
|
+
}
|
|
807
1049
|
const changed = this.controls.update(dt);
|
|
808
1050
|
if (this.needsDraw || changed || this.pose) {
|
|
809
1051
|
this.syncSizes();
|
|
@@ -820,11 +1062,12 @@ export class RocketViewer {
|
|
|
820
1062
|
this.canvas.dataset.pan = `${Math.round(this.driven.panX)},${Math.round(this.driven.panY)}`;
|
|
821
1063
|
}
|
|
822
1064
|
if (this.glow)
|
|
823
|
-
this.glow.visible = this.look !== "painted" && this.camera.position.y > 0;
|
|
1065
|
+
this.glow.visible = this.look !== "painted" && this.camera.position.y > 0 && !this.clockNow;
|
|
824
1066
|
}
|
|
825
1067
|
// the controls' own change event may already have asked for the next frame (wake): one frame is asked for, never two, or each frame would double the next
|
|
826
|
-
if (!this.frame && ((ambient && this.controls.autoRotate) || changed || this.pose || this.needsDraw || Math.abs(dA) > 1e-5))
|
|
1068
|
+
if (!this.frame && ((ambient && this.controls.autoRotate) || changed || this.pose || this.needsDraw || Math.abs(dA) > 1e-5 || flaming || flying))
|
|
827
1069
|
this.frame = requestAnimationFrame(this.tick);
|
|
1070
|
+
this.inTick = false;
|
|
828
1071
|
};
|
|
829
1072
|
syncSizes() {
|
|
830
1073
|
const size = this.renderer.getDrawingBufferSize(new Vector2());
|