├── web ├── .gdignore ├── jupiter-144.png ├── jupiter-180.png ├── jupiter-512.png ├── pale_blue_dot_453x614.jpg ├── README.md └── godot.html ├── planetarium ├── units.gd.uid ├── universe.gd.uid ├── gui │ ├── boot_screen.gd.uid │ ├── huds_panel.gd.uid │ ├── info_panel.gd.uid │ ├── menu_panel.gd.uid │ ├── control_panel.gd.uid │ ├── boot_screen.tscn │ ├── menu_panel.gd │ ├── boot_screen.gd │ ├── huds_panel.gd │ ├── huds_panel.tscn │ ├── control_panel.gd │ ├── info_panel.tscn │ ├── info_panel.gd │ ├── nav_panel.tscn │ ├── menu_panel.tscn │ └── control_panel.tscn ├── preinitializer.gd.uid ├── view_cacher.gd.uid ├── universe.gd ├── view_cacher.gd ├── universe.tscn ├── preinitializer.gd └── units.gd ├── AUTHORS.md ├── ivoyager_override.cfg ├── CREDITS.md ├── README.md ├── project.godot ├── CHANGELOG.md ├── LICENSE.txt └── 3RD_PARTY.md /web/.gdignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /planetarium/units.gd.uid: -------------------------------------------------------------------------------- 1 | uid://ceqj2b3v48ds0 2 | -------------------------------------------------------------------------------- /planetarium/universe.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bje5fh4y4vg3s 2 | -------------------------------------------------------------------------------- /planetarium/gui/boot_screen.gd.uid: -------------------------------------------------------------------------------- 1 | uid://b6wmdnqyec275 2 | -------------------------------------------------------------------------------- /planetarium/gui/huds_panel.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dj4ammselobqx 2 | -------------------------------------------------------------------------------- /planetarium/gui/info_panel.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dwsajkolfrkre 2 | -------------------------------------------------------------------------------- /planetarium/gui/menu_panel.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cnyglo7c86jmi 2 | -------------------------------------------------------------------------------- /planetarium/preinitializer.gd.uid: -------------------------------------------------------------------------------- 1 | uid://iwlca214kmbk 2 | -------------------------------------------------------------------------------- /planetarium/view_cacher.gd.uid: -------------------------------------------------------------------------------- 1 | uid://b2xfoq0vox5p0 2 | -------------------------------------------------------------------------------- /planetarium/gui/control_panel.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bwtmii13a7exf 2 | -------------------------------------------------------------------------------- /web/jupiter-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivoyager/planetarium/HEAD/web/jupiter-144.png -------------------------------------------------------------------------------- /web/jupiter-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivoyager/planetarium/HEAD/web/jupiter-180.png -------------------------------------------------------------------------------- /web/jupiter-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivoyager/planetarium/HEAD/web/jupiter-512.png -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | # I, Voyager Authors 2 | 3 | ## Creator and Lead Programmer 4 | 5 | Charlie Whitifield 6 | -------------------------------------------------------------------------------- /web/pale_blue_dot_453x614.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivoyager/planetarium/HEAD/web/pale_blue_dot_453x614.jpg -------------------------------------------------------------------------------- /ivoyager_override.cfg: -------------------------------------------------------------------------------- 1 | ; Planetarium overrides 2 | ; 3 | ; We replace the default IVUnits singleton and add preinitializer.gd, which 4 | ; does all further plugin changes. 5 | 6 | [units_autoload] 7 | 8 | IVUnits="res://planetarium/units.gd" 9 | 10 | [core_initializer] 11 | 12 | preinitializers/PlanetariumPreinitializer="res://planetarium/preinitializer.gd" 13 | -------------------------------------------------------------------------------- /planetarium/gui/boot_screen.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://cmijnisudhq4d"] 2 | 3 | [ext_resource type="Script" uid="uid://b6wmdnqyec275" path="res://planetarium/gui/boot_screen.gd" id="1"] 4 | 5 | [node name="BootScreen" type="ColorRect"] 6 | anchors_preset = 15 7 | anchor_right = 1.0 8 | anchor_bottom = 1.0 9 | color = Color(0, 0, 0, 1) 10 | script = ExtResource("1") 11 | 12 | [node name="BootLabel" type="Label" parent="."] 13 | layout_mode = 1 14 | anchors_preset = 15 15 | anchor_right = 1.0 16 | anchor_bottom = 1.0 17 | grow_horizontal = 2 18 | grow_vertical = 2 19 | size_flags_horizontal = 3 20 | size_flags_vertical = 6 21 | theme_override_font_sizes/font_size = 32 22 | text = "Building the Solar System..." 23 | horizontal_alignment = 1 24 | vertical_alignment = 1 25 | -------------------------------------------------------------------------------- /planetarium/gui/menu_panel.gd: -------------------------------------------------------------------------------- 1 | # menu_panel.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name MenuPanel 21 | extends PanelContainer 22 | 23 | 24 | func _ready() -> void: 25 | if OS.has_feature("web"): 26 | %QuitButton.queue_free() 27 | -------------------------------------------------------------------------------- /planetarium/gui/boot_screen.gd: -------------------------------------------------------------------------------- 1 | # boot_screen.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name BootScreen 21 | extends ColorRect 22 | 23 | ## Self-freeing boot screen hides messy node construction. 24 | 25 | 26 | func _ready() -> void: 27 | IVStateManager.simulator_started.connect(queue_free) 28 | -------------------------------------------------------------------------------- /planetarium/gui/huds_panel.gd: -------------------------------------------------------------------------------- 1 | # huds_panel.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name HUDsPanel 21 | extends PanelContainer 22 | 23 | 24 | func _ready() -> void: 25 | (%HUDsBox as Control).resized.connect(_reset_size) 26 | 27 | 28 | func _reset_size() -> void: 29 | size = Vector2.ZERO 30 | -------------------------------------------------------------------------------- /planetarium/universe.gd: -------------------------------------------------------------------------------- 1 | # universe.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name Universe 21 | extends Node3D 22 | 23 | ## Main scene root for the Planetarium. 24 | ## 25 | ## This scene tree was duplicated and modified from [IVUniverseTemplate]. See 26 | ## that class for Core plugin documentation. 27 | -------------------------------------------------------------------------------- /planetarium/gui/huds_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://whpgdl66sqph"] 2 | 3 | [ext_resource type="Script" uid="uid://dj4ammselobqx" path="res://planetarium/gui/huds_panel.gd" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://bx22jigtdb8iw" path="res://addons/ivoyager_core/ui_widgets/huds_box.tscn" id="2_k0j0v"] 5 | [ext_resource type="PackedScene" uid="uid://bkcj6agxxgfw" path="res://addons/ivoyager_core/ui_helpers/control_mod_resizable.tscn" id="4_k0j0v"] 6 | 7 | [node name="HUDsPanel" type="PanelContainer"] 8 | anchors_preset = 3 9 | anchor_left = 1.0 10 | anchor_top = 1.0 11 | anchor_right = 1.0 12 | anchor_bottom = 1.0 13 | offset_left = -381.0 14 | offset_top = -105.0 15 | script = ExtResource("1") 16 | 17 | [node name="MarginContainer" type="MarginContainer" parent="."] 18 | layout_mode = 2 19 | size_flags_horizontal = 0 20 | size_flags_vertical = 0 21 | mouse_filter = 2 22 | theme_override_constants/margin_left = 10 23 | theme_override_constants/margin_top = 10 24 | theme_override_constants/margin_right = 25 25 | theme_override_constants/margin_bottom = 10 26 | 27 | [node name="HUDsBox" parent="MarginContainer" instance=ExtResource("2_k0j0v")] 28 | unique_name_in_owner = true 29 | layout_mode = 2 30 | 31 | [node name="ControlModResizable" parent="." instance=ExtResource("4_k0j0v")] 32 | -------------------------------------------------------------------------------- /planetarium/gui/control_panel.gd: -------------------------------------------------------------------------------- 1 | # control_panel.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name ControlPanel 21 | extends PanelContainer 22 | 23 | 24 | 25 | func _ready() -> void: 26 | IVStateManager.core_initialized.connect(_configure_after_core_inited, CONNECT_ONE_SHOT) 27 | 28 | 29 | func _configure_after_core_inited() -> void: 30 | # Panal expands with ViewCollection changes but does not shrink. Needs reset. 31 | (%ViewCollection as Control).resized.connect(_reset_size) 32 | _reset_size() 33 | 34 | 35 | func _reset_size() -> void: 36 | size = Vector2(size.x, 0.0) 37 | -------------------------------------------------------------------------------- /CREDITS.md: -------------------------------------------------------------------------------- 1 | # I, Voyager Credits 2 | 3 | This document is an incomplete list of contributions to I, Voyager that are not authorship nor 3rd-party copyrighted files. 4 | 5 | See list of direct contributors ("authors") [here](https://github.com/ivoyager/ivoyager_core/blob/master/AUTHORS.md). 6 | 7 | See 3rd-party copyright and licence information [here](https://github.com/ivoyager/ivoyager_core/blob/master/3RD_PARTY.md). 8 | 9 | --- 10 | 11 | **_I, Voyager is possible due to public interest in space exploration and funding of government agencies like NASA and ESA, and the scientists and engineers that they employ._** 12 | 13 | **[The Godot community](https://godotengine.org/community/)** - Much help using the open-source [Godot Engine](https://godotengine.org/), on which this project is built. 14 | 15 | **[Wikipedia](https://www.wikipedia.org/)** - The world needs Wikipedia! Here's the [donation link!](https://donate.wikimedia.org/) 16 | 17 | **[NASA, JPL Solar System Dynamics](https://ssd.jpl.nasa.gov/)** - Source data for large body orbits. 18 | 19 | **[Asteroids Dynamic Site](https://newton.spacedys.com/astdys)** - Source data for asteroid proper orbits. 20 | 21 | **[Björn Jónsson](https://bjj.mmedia.is)** - Source data used to generate shader samplers for Saturn's rings ([here](https://bjj.mmedia.is/data/s_rings/index.html)). 22 | 23 | **[Grant Sanderson, "3Blue1Brown"](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw)** - Helping us _understand_ the math. 24 | 25 | **[Scott Manley](https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-A)** - A fountain of information on space and rockets, and Kerbal! 26 | 27 | **[Tim Dodd, "Everyday Astronaut"](https://www.youtube.com/channel/UC6uKrU_WqJ1R2HMTY3LIx5Q)** - Keeping us inspired for space exploration! 28 | 29 | **[Murray & Dermott (1999), Solar System Dynamics, Cambridge Univ. Press](https://www.cambridge.org/core/books/solar-system-dynamics/108745217E4A18190CBA340ED5E477A2)** - The hard parts of making planets and asteroids go around. 30 | -------------------------------------------------------------------------------- /planetarium/gui/info_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://dglsn48wnive"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://dcy30ki8dt6lw" path="res://addons/ivoyager_core/ui_widgets/selection_data.tscn" id="3_krqkh"] 4 | [ext_resource type="Script" uid="uid://dwsajkolfrkre" path="res://planetarium/gui/info_panel.gd" id="5"] 5 | [ext_resource type="PackedScene" uid="uid://bkcj6agxxgfw" path="res://addons/ivoyager_core/ui_helpers/control_mod_resizable.tscn" id="5_krqkh"] 6 | [ext_resource type="PackedScene" uid="uid://dbmmj34clrl2a" path="res://addons/ivoyager_core/ui_widgets/selection_wiki_link.tscn" id="10"] 7 | 8 | [node name="InfoPanel" type="PanelContainer"] 9 | offset_right = 334.0 10 | offset_bottom = 1200.0 11 | script = ExtResource("5") 12 | 13 | [node name="MarginContainer" type="MarginContainer" parent="."] 14 | layout_mode = 2 15 | mouse_filter = 2 16 | theme_override_constants/margin_left = 10 17 | theme_override_constants/margin_top = 10 18 | theme_override_constants/margin_right = 25 19 | theme_override_constants/margin_bottom = 10 20 | 21 | [node name="VBox" type="VBoxContainer" parent="MarginContainer"] 22 | layout_mode = 2 23 | mouse_filter = 2 24 | 25 | [node name="SelectionWikiLink" parent="MarginContainer/VBox" instance=ExtResource("10")] 26 | layout_mode = 2 27 | 28 | [node name="Spacer" type="Control" parent="MarginContainer/VBox"] 29 | layout_mode = 2 30 | size_flags_horizontal = 4 31 | size_flags_vertical = 4 32 | mouse_filter = 2 33 | 34 | [node name="ControlModResizable" parent="MarginContainer/VBox/Spacer" instance=ExtResource("5_krqkh")] 35 | base_size = Vector2(0, 12) 36 | 37 | [node name="DataScroll" type="ScrollContainer" parent="MarginContainer/VBox"] 38 | layout_mode = 2 39 | size_flags_vertical = 3 40 | 41 | [node name="SelectionData" parent="MarginContainer/VBox/DataScroll" instance=ExtResource("3_krqkh")] 42 | unique_name_in_owner = true 43 | layout_mode = 2 44 | 45 | [node name="ControlModResizable" parent="." instance=ExtResource("5_krqkh")] 46 | base_size = Vector2(390, -1) 47 | resize_again_delay = 2 48 | panel_under_spacing = 50.0 49 | -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | # Progressive Web App (PWA) Deployment 2 | 3 | Note: As of Godot 4.3, most PWA functionality seems to be broken. There is no caching or offline operation. 4 | 5 | Godot 3.4.1 introduced [PWA](https://web.dev/what-are-pwas/) functionality, but it's still a little rough to deploy as of Godot 4.2.1. 6 | 7 | These files are referenced in export_presets.config and used to generate the HTML5 export: 8 | * godot.html - Custom Html Shell used to generate our loading page. 9 | * jupiter-xxx.png - Icon images (3 sizes) included in PWA export. 10 | 11 | We've opted not to set Boot Splash in Project Settings because if forces us to use a .png file, which is slow to load in web browsers. Instead, we add the following file manually to the web server directory **AND** to planetarium.service.worker.js CACHED_FILES array. 12 | * pale_blue_dot_453x614.jpg 13 | 14 | File to remove from export: 15 | * planetarium.png - Boot splash is off in Project Settings and isn't referenced anywhere in the export. 16 | 17 | #### Godot 4.x Notes: 18 | Server must be set up to use .htaccess file! Add .htaccess with these lines: 19 | ``` 20 | Header set Cross-Origin-Opener-Policy: same-origin 21 | Header set Cross-Origin-Embedder-Policy: require-corp 22 | ``` 23 | 24 | Lighting is all screwed up in HTML5 export using normal world scale (METER = 1.0) as of Godot 4.2.1. See notes and change this value in res://planetarium/units.gd. METER = 1e-8 seem to work ok for HTML5 export (but this value screws up lighting in editor run or Windows export). 25 | 26 | #### Export Settings 27 | * Resources/Filters to export... `*.ivbinary, *.cfg` (for any export!) 28 | * Options/HTML/Export Icon `On` 29 | * Options/HTML/Custom HTML Shell `res://web/godot.html` 30 | * Options/HTML/Canvas Resize Policy `Adaptive` 31 | * Options/HTML/Focus Canvas on Start `On` 32 | * Options/Progressive Web App/Enabled `On` 33 | * Options/Progressive Web App/Display `Standalone` 34 | * Options/Progressive Web App/Orientation `Any` 35 | * Options/Progressive Web App/Icon 144x144 `res://web/jupiter-144.png` 36 | * Options/Progressive Web App/Icon 180x180 `res://web/jupiter-180.png` 37 | * Options/Progressive Web App/Icon 512x512 `res://web/jupiter-512.png` 38 | * Options/Progressive Web App/Background Color `` 39 | -------------------------------------------------------------------------------- /planetarium/gui/info_panel.gd: -------------------------------------------------------------------------------- 1 | # info_panel.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name InfoPanel 21 | extends PanelContainer 22 | 23 | # This panel changes its own vertical size in response to SelectionData size 24 | # changes. Note that $ControlModResizable will override this an truncate y 25 | # if there is a PanelContainer below (from "panel_under_spacing" property). 26 | 27 | const NONDATA_BASE_SIZE := 85.0 28 | 29 | var _gui_size_multipliers := IVCoreSettings.gui_size_multipliers 30 | 31 | @onready var _selection_data: VBoxContainer = %SelectionData 32 | 33 | 34 | func _ready() -> void: 35 | IVStateManager.core_initialized.connect(_configure_after_core_inited, CONNECT_ONE_SHOT) 36 | 37 | 38 | func _configure_after_core_inited() -> void: 39 | _selection_data.minimum_size_changed.connect(_resize) 40 | get_viewport().size_changed.connect(_resize) 41 | _resize() 42 | 43 | 44 | func _resize() -> void: 45 | # Note: IVControlModResizable is set to truncate for panel below whenever 46 | # this panel resizes. There shouldn't be any recursion danger here. 47 | var data_height := _selection_data.get_minimum_size().y 48 | var gui_size: int = IVSettingsManager.get_setting(&"gui_size") 49 | var nondata_height := NONDATA_BASE_SIZE * _gui_size_multipliers[gui_size] 50 | var new_height := data_height + nondata_height 51 | if size.y == new_height: 52 | new_height += 1 # need an actual resize to trigger IVControlModResizable 53 | size.y = new_height 54 | -------------------------------------------------------------------------------- /planetarium/view_cacher.gd: -------------------------------------------------------------------------------- 1 | # view_cacher.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | class_name ViewCacher 21 | extends Timer 22 | 23 | # Caches current View (camera, HUDs and time state) and restores on start. 24 | # 25 | # We don't currently have a way to intercept app quit for HTML5 export. Hence, 26 | # set cache_interval for HTML5 exports. 27 | # 28 | # For non-HTML5 exports, cache will be written on quit and cache_interval 29 | # should not be set. The Timer functionality will not be used. 30 | 31 | const ViewFlags := IVView.ViewFlags 32 | 33 | var cache_interval := 0.0 # s; set >0.0 to enable Timer (HTML5 only!) 34 | var cache_name := &"current" 35 | var cach_set := &"view_cacher" 36 | var view_flags := ViewFlags.VIEWFLAGS_ALL 37 | 38 | var _view_manager: IVViewManager 39 | 40 | 41 | func _ready() -> void: 42 | _view_manager = IVGlobal.program[&"ViewManager"] 43 | IVStateManager.about_to_start_simulator.connect(_on_about_to_start_simulator) 44 | IVStateManager.about_to_stop_before_quit.connect(_cache_now.bind(false)) 45 | 46 | 47 | func _notification(what: int) -> void: 48 | if what == NOTIFICATION_WM_CLOSE_REQUEST: # desktop only! 49 | if IVStateManager.started_or_about_to_start: 50 | _cache_now(false) 51 | 52 | 53 | func _on_about_to_start_simulator(_is_new_game: bool) -> void: 54 | if cache_interval > 0.0: 55 | timeout.connect(_on_timeout) 56 | wait_time = cache_interval 57 | start() 58 | else: 59 | paused = true 60 | if _view_manager.has_view(cache_name, cach_set, true): 61 | _view_manager.set_view(cache_name, cach_set, true, true) 62 | else: 63 | _view_manager.set_table_view(&"VIEW_HOME", true) 64 | 65 | 66 | func _on_timeout() -> void: 67 | _cache_now() 68 | start() 69 | 70 | 71 | func _cache_now(allow_threaded_cache_write := true) -> void: 72 | _view_manager.save_view(cache_name, cach_set, true, view_flags, allow_threaded_cache_write) 73 | -------------------------------------------------------------------------------- /planetarium/gui/nav_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://diafd62ta13cn"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://t13lvtablxvu" path="res://addons/ivoyager_core/ui_widgets/nav_button.tscn" id="1_rujde"] 4 | [ext_resource type="PackedScene" uid="uid://cjtauq7kev3vl" path="res://addons/ivoyager_core/ui_widgets/nav_buttons_system.tscn" id="2_vibof"] 5 | [ext_resource type="PackedScene" uid="uid://3ofokqme2067" path="res://addons/ivoyager_core/ui_widgets/nav_buttons_box.tscn" id="4_yp30r"] 6 | [ext_resource type="PackedScene" uid="uid://bk1wcjtaqcyyd" path="res://addons/ivoyager_core/ui_widgets/selection_buttons.tscn" id="7"] 7 | [ext_resource type="PackedScene" uid="uid://bkcj6agxxgfw" path="res://addons/ivoyager_core/ui_helpers/control_mod_resizable.tscn" id="7_vibof"] 8 | 9 | [node name="NavPanel" type="PanelContainer"] 10 | anchors_preset = 2 11 | anchor_top = 1.0 12 | anchor_bottom = 1.0 13 | offset_top = -338.0 14 | offset_right = 414.0 15 | grow_vertical = 0 16 | 17 | [node name="HBox" type="HBoxContainer" parent="."] 18 | layout_mode = 2 19 | mouse_filter = 2 20 | 21 | [node name="SunButton" parent="HBox" instance=ExtResource("1_rujde")] 22 | layout_mode = 2 23 | body_name = &"STAR_SUN" 24 | use_texture_slice = true 25 | focus_selected_on_sim_start = true 26 | 27 | [node name="RightContent" type="MarginContainer" parent="HBox"] 28 | layout_mode = 2 29 | size_flags_horizontal = 3 30 | size_flags_vertical = 3 31 | size_flags_stretch_ratio = 9.0 32 | mouse_filter = 2 33 | 34 | [node name="VBox" type="VBoxContainer" parent="HBox/RightContent"] 35 | layout_mode = 2 36 | mouse_filter = 2 37 | 38 | [node name="NavButtonsSystem" parent="HBox/RightContent/VBox" instance=ExtResource("2_vibof")] 39 | layout_mode = 2 40 | moon_scroll_proportion = 100.0 41 | focus_selected_on_sim_start = true 42 | 43 | [node name="AsteroidsScroll" type="ScrollContainer" parent="HBox/RightContent/VBox"] 44 | layout_mode = 2 45 | size_flags_vertical = 3 46 | follow_focus = true 47 | draw_focus_border = true 48 | vertical_scroll_mode = 0 49 | 50 | [node name="AsteroidsBox" parent="HBox/RightContent/VBox/AsteroidsScroll" instance=ExtResource("4_yp30r")] 51 | layout_mode = 2 52 | size_flags_vertical = 3 53 | body_tables = Array[StringName]([&"asteroids"]) 54 | focus_selected_on_sim_start = true 55 | 56 | [node name="SpacecraftsScroll" type="ScrollContainer" parent="HBox/RightContent/VBox"] 57 | layout_mode = 2 58 | size_flags_vertical = 3 59 | follow_focus = true 60 | draw_focus_border = true 61 | vertical_scroll_mode = 0 62 | 63 | [node name="SpacecraftsBox" parent="HBox/RightContent/VBox/SpacecraftsScroll" instance=ExtResource("4_yp30r")] 64 | layout_mode = 2 65 | size_flags_vertical = 3 66 | body_tables = Array[StringName]([&"spacecrafts"]) 67 | focus_selected_on_sim_start = true 68 | 69 | [node name="SelectionButtons" parent="." instance=ExtResource("7")] 70 | layout_mode = 2 71 | 72 | [node name="ControlModResizable" parent="." instance=ExtResource("7_vibof")] 73 | base_size = Vector2(575, 336) 74 | -------------------------------------------------------------------------------- /planetarium/gui/menu_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=9 format=3 uid="uid://bevu554s76x0f"] 2 | 3 | [ext_resource type="Script" uid="uid://cnyglo7c86jmi" path="res://planetarium/gui/menu_panel.gd" id="1"] 4 | [ext_resource type="PackedScene" uid="uid://cvv4u4ctix3v5" path="res://addons/ivoyager_core/ui_widgets/full_screen_button.tscn" id="2_spw6t"] 5 | [ext_resource type="PackedScene" uid="uid://boc2r4d0eomdr" path="res://addons/ivoyager_core/ui_widgets/options_button.tscn" id="3_4hcos"] 6 | [ext_resource type="PackedScene" uid="uid://pjw4ki1qswq0" path="res://addons/ivoyager_core/ui_widgets/hotkeys_button.tscn" id="4_1edhr"] 7 | [ext_resource type="PackedScene" uid="uid://dqwafuo72wscj" path="res://addons/ivoyager_core/ui_widgets/link_label.tscn" id="5"] 8 | [ext_resource type="PackedScene" uid="uid://dcw1843unaohr" path="res://addons/ivoyager_core/ui_widgets/quit_button.tscn" id="5_caym3"] 9 | [ext_resource type="PackedScene" uid="uid://bkokwngymmnyk" path="res://addons/ivoyager_core/ui_widgets/version_label.tscn" id="6"] 10 | [ext_resource type="PackedScene" uid="uid://bkcj6agxxgfw" path="res://addons/ivoyager_core/ui_helpers/control_mod_resizable.tscn" id="9_xhnrs"] 11 | 12 | [node name="MenuPanel" type="PanelContainer"] 13 | anchors_preset = 1 14 | anchor_left = 1.0 15 | anchor_right = 1.0 16 | offset_left = -108.0 17 | offset_bottom = 182.0 18 | script = ExtResource("1") 19 | 20 | [node name="MarginContainer" type="MarginContainer" parent="."] 21 | layout_mode = 2 22 | mouse_filter = 2 23 | theme_override_constants/margin_left = 10 24 | theme_override_constants/margin_top = 25 25 | theme_override_constants/margin_right = 25 26 | theme_override_constants/margin_bottom = 10 27 | 28 | [node name="VBox" type="VBoxContainer" parent="MarginContainer"] 29 | layout_mode = 2 30 | theme_override_constants/separation = 6 31 | 32 | [node name="FullScreenButton" parent="MarginContainer/VBox" instance=ExtResource("2_spw6t")] 33 | layout_mode = 2 34 | 35 | [node name="OptionsButton" parent="MarginContainer/VBox" instance=ExtResource("3_4hcos")] 36 | layout_mode = 2 37 | 38 | [node name="HotkeysButton" parent="MarginContainer/VBox" instance=ExtResource("4_1edhr")] 39 | layout_mode = 2 40 | 41 | [node name="QuitButton" parent="MarginContainer/VBox" instance=ExtResource("5_caym3")] 42 | unique_name_in_owner = true 43 | layout_mode = 2 44 | force_quit = true 45 | 46 | [node name="Spacer" type="Control" parent="MarginContainer/VBox"] 47 | layout_mode = 2 48 | 49 | [node name="ControlModResizable" parent="MarginContainer/VBox/Spacer" instance=ExtResource("9_xhnrs")] 50 | base_size = Vector2(0, 4) 51 | 52 | [node name="HomePage" parent="MarginContainer/VBox" instance=ExtResource("5")] 53 | unique_name_in_owner = true 54 | layout_mode = 2 55 | text = "[url=\"https://ivoyager.dev\"]I, Voyager[/url]" 56 | open_external_url = true 57 | 58 | [node name="Credits" parent="MarginContainer/VBox" instance=ExtResource("5")] 59 | unique_name_in_owner = true 60 | layout_mode = 2 61 | text = "[url=\"https://github.com/ivoyager/ivoyager_core/blob/master/CREDITS.md\"]Credits[/url]" 62 | open_external_url = true 63 | 64 | [node name="Feedback" parent="MarginContainer/VBox" instance=ExtResource("5")] 65 | unique_name_in_owner = true 66 | layout_mode = 2 67 | text = "[url=\"https://github.com/orgs/ivoyager/discussions\"]Feedback[/url]" 68 | open_external_url = true 69 | 70 | [node name="SupportUs" parent="MarginContainer/VBox" instance=ExtResource("5")] 71 | unique_name_in_owner = true 72 | layout_mode = 2 73 | text = "[url=\"https://github.com/sponsors/ivoyager\"]Support Us![/url]" 74 | open_external_url = true 75 | 76 | [node name="Spacer2" type="Control" parent="MarginContainer/VBox"] 77 | layout_mode = 2 78 | 79 | [node name="ControlModResizable" parent="MarginContainer/VBox/Spacer2" instance=ExtResource("9_xhnrs")] 80 | base_size = Vector2(0, 4) 81 | 82 | [node name="VersionLabel" parent="MarginContainer/VBox" instance=ExtResource("6")] 83 | layout_mode = 2 84 | prepend = "v" 85 | 86 | [node name="ControlModResizable" parent="." instance=ExtResource("9_xhnrs")] 87 | -------------------------------------------------------------------------------- /planetarium/universe.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=17 format=3 uid="uid://mcxrmcs1puig"] 2 | 3 | [ext_resource type="Script" uid="uid://bje5fh4y4vg3s" path="res://planetarium/universe.gd" id="1_5y20p"] 4 | [ext_resource type="PackedScene" uid="uid://b15j2rbaf1c4j" path="res://addons/ivoyager_core/tree/world_environment.tscn" id="2_8fbd1"] 5 | [ext_resource type="PackedScene" uid="uid://0r58al8slcnw" path="res://addons/ivoyager_core/ui/fragment_identifier.tscn" id="2_xfut5"] 6 | [ext_resource type="PackedScene" uid="uid://dd1xhk38f1jmf" path="res://addons/ivoyager_core/ui/top_ui.tscn" id="3_1ms6d"] 7 | [ext_resource type="PackedScene" uid="uid://cij2gsmtnwhcb" path="res://addons/ivoyager_core/ui/world_controller.tscn" id="4_s5sjs"] 8 | [ext_resource type="PackedScene" uid="uid://c6yqdxh0igm7a" path="res://addons/ivoyager_core/ui/mouse_target_label.tscn" id="5_c74a8"] 9 | [ext_resource type="PackedScene" uid="uid://cgv7mkfok4nux" path="res://addons/ivoyager_core/ui/show_hide_ui.tscn" id="6_ncrjh"] 10 | [ext_resource type="PackedScene" uid="uid://bevu554s76x0f" path="res://planetarium/gui/menu_panel.tscn" id="7_5y20p"] 11 | [ext_resource type="PackedScene" uid="uid://dglsn48wnive" path="res://planetarium/gui/info_panel.tscn" id="8_e3u8q"] 12 | [ext_resource type="PackedScene" uid="uid://diafd62ta13cn" path="res://planetarium/gui/nav_panel.tscn" id="9_8fbd1"] 13 | [ext_resource type="PackedScene" uid="uid://ba7271tsjvr4o" path="res://planetarium/gui/control_panel.tscn" id="10_nbyhj"] 14 | [ext_resource type="PackedScene" uid="uid://whpgdl66sqph" path="res://planetarium/gui/huds_panel.tscn" id="11_twnux"] 15 | [ext_resource type="PackedScene" uid="uid://cmijnisudhq4d" path="res://planetarium/gui/boot_screen.tscn" id="12_e3u8q"] 16 | [ext_resource type="PackedScene" uid="uid://do6i0el4c00jr" path="res://addons/ivoyager_core/ui/options_popup.tscn" id="12_uvir0"] 17 | [ext_resource type="PackedScene" uid="uid://b2fdgq3tjd8wq" path="res://addons/ivoyager_core/ui/hotkeys_popup.tscn" id="13_5m8w2"] 18 | [ext_resource type="PackedScene" uid="uid://bq5sg1c26wm60" path="res://addons/ivoyager_core/ui/confirmation_dialog.tscn" id="14_ip80n"] 19 | 20 | [node name="Universe" type="Node3D"] 21 | process_mode = 3 22 | script = ExtResource("1_5y20p") 23 | 24 | [node name="WorldEnvironment" parent="." instance=ExtResource("2_8fbd1")] 25 | 26 | [node name="FragmentIdentifier" parent="." instance=ExtResource("2_xfut5")] 27 | 28 | [node name="TopUI" parent="." instance=ExtResource("3_1ms6d")] 29 | mouse_filter = 1 30 | enable_huds_hbox_links = true 31 | enable_selection_data_label_links = true 32 | enable_selection_data_value_links = true 33 | 34 | [node name="WorldController" parent="TopUI" instance=ExtResource("4_s5sjs")] 35 | layout_mode = 1 36 | 37 | [node name="MouseTargetLabel" parent="TopUI" instance=ExtResource("5_c74a8")] 38 | layout_mode = 0 39 | offset_right = 1.0 40 | offset_bottom = 23.0 41 | 42 | [node name="ShowHideGUI" parent="TopUI" instance=ExtResource("6_ncrjh")] 43 | layout_mode = 1 44 | 45 | [node name="MenuPanel" parent="TopUI/ShowHideGUI" instance=ExtResource("7_5y20p")] 46 | layout_mode = 1 47 | offset_left = -182.0 48 | offset_bottom = 298.0 49 | grow_horizontal = 0 50 | 51 | [node name="InfoPanel" parent="TopUI/ShowHideGUI" instance=ExtResource("8_e3u8q")] 52 | layout_mode = 1 53 | 54 | [node name="NavPanel" parent="TopUI/ShowHideGUI" instance=ExtResource("9_8fbd1")] 55 | layout_mode = 1 56 | 57 | [node name="ControlPanel" parent="TopUI/ShowHideGUI" instance=ExtResource("10_nbyhj")] 58 | layout_mode = 1 59 | offset_left = -412.0 60 | offset_right = 412.0 61 | grow_horizontal = 2 62 | grow_vertical = 0 63 | 64 | [node name="HUDsPanel" parent="TopUI/ShowHideGUI" instance=ExtResource("11_twnux")] 65 | layout_mode = 1 66 | offset_left = -570.0 67 | offset_top = -282.0 68 | grow_horizontal = 0 69 | grow_vertical = 0 70 | 71 | [node name="BootScreen" parent="TopUI" instance=ExtResource("12_e3u8q")] 72 | layout_mode = 1 73 | grow_horizontal = 2 74 | grow_vertical = 2 75 | 76 | [node name="OptionsPopup" parent="TopUI" instance=ExtResource("12_uvir0")] 77 | 78 | [node name="HotkeysPopup" parent="TopUI" instance=ExtResource("13_5m8w2")] 79 | 80 | [node name="ConfirmationDialog" parent="TopUI" instance=ExtResource("14_ip80n")] 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Planetarium 2 | 3 | I, Voyager's free, open-source software planetarium built on the free, open-source [Godot Engine](https://godotengine.org). 4 | 5 | Runnable Windows and Web apps can be accessed from our [Planetarium](https://www.ivoyager.dev/planetarium/) page. 6 | 7 | I, Voyager software is designed to be improved, modified and extended by the community. See [About](https://www.ivoyager.dev/about/), [News](https://www.ivoyager.dev/), [Developers](https://www.ivoyager.dev/developers/), and [Forum](https://github.com/orgs/ivoyager/discussions). 8 | 9 | 10 | ### Installation 11 | 12 | Find detailed instructions at our [Developers](https://www.ivoyager.dev/developers/) page. 13 | 14 | This repository uses submodules! To clone using git: 15 | 16 | `git clone --recursive git://github.com/ivoyager/planetarium.git` 17 | 18 | The editor plugin will manage assets download and version updates (assets are not Git-tracked). Just press 'Download' at the editor prompt. 19 | 20 | After above steps, your addons directory will contain three subdirectories: `ivoyager_assets`, `ivoyager_core`, `ivoyager_tables` and `ivoyager_units`. 21 | 22 | ### Screen captures! 23 | 24 | ![](https://www.ivoyager.dev/wp-content/uploads/2020/01/europa-jupiter-io-ivoyager.jpg) 25 | Jupiter and Io viewed from Europa. Also featured in our [homepage](https://www.ivoyager.dev/) header. 26 | 27 | ![](https://www.ivoyager.dev/wp-content/uploads/2025/03/saturn-rings-shadows-ivoyager-0.0.24.jpg) 28 | Saturn and its rings. **New!** Just in time for our beta release, we have shadows! Semi-transparent shadows from Saturn’s rings are visible here. After considerable effort, we have shadows working at both planetary and spacecraft distance scales (see ISS below). 29 | 30 | ![](https://www.ivoyager.dev/wp-content/uploads/2025/03/iss-shadows-ivoyager-0.0.24.jpg) 31 | The International Space Station. This is one of three spacecraft at this time. We would like to add more with historical flight paths or representative orbits. We [need more 3D models](https://github.com/ivoyager/ivoyager_core/issues/2) to do that… 32 | 33 | ![](https://www.ivoyager.dev/wp-content/uploads/2025/09/ivoyager-planetarium-gui-0.1.jpg) 34 | The Planetarium’s user interface provides easy navigation and tons of information. Links in the panels open Wikepedia.org pages for more than a hundred solar system bodies and dozens of astronomy concepts. 35 | 36 | ![](https://www.ivoyager.dev/wp-content/uploads/2025/10/ivoyager-asteroids-0.1.jpg) 37 | Positions of ~70,000 asteroids. Here, the Main Belt asteroids are cyan, with the Hilda subset in yellow. The Trojans at Jupiter’s L4 and L5 are magenta. (For programmers: Each point is a GPU vertex shader that knows its own orbital elements and calculates its own position.) 38 | 39 | ![](https://t2civ.com/wp-content/uploads/2023/03/astropolis-abstract.jpg) 40 | Asteroid orbits. Or is it an abstract painting? The “wheel” at the center are the Trojans (yellow) encompassing the Main Belt (reddish). The outer orbit lines are the sparse Centaurs (cyan) and Trans-Neptune Objects (orangish). 41 | 42 | ![](https://www.ivoyager.dev/wp-content/uploads/2020/01/uranus-moons-ivoyager.jpg) 43 | Uranus’ moons are an interesting cast of characters (literally). The planet’s 98° axial tilt puts the inner solar system almost due south in this image. 44 | 45 | ![](https://www.ivoyager.dev/wp-content/uploads/2020/01/solar-system-pluto-flyby-ivoyager.jpg) 46 | Here’s the solar system on July 14, 2015, the day New Horizons flew by the dwarf planet Pluto (♇). Not coincidentally, Pluto was near the plane of the ecliptic at this time. 47 | 48 | ![](https://www.ivoyager.dev/wp-content/uploads/2020/01/pluto-charon-ivoyager.jpg) 49 | Pluto and its moon Charon. Both are tidally locked so their facing sides never change. 50 | 51 | ![](https://www.ivoyager.dev/wp-content/uploads/2025/10/ivoyager-widgets-0.1.jpg) 52 | For developers, you can quickly build GUI from a [large set of widgets](https://github.com/ivoyager/ivoyager_core/tree/master/ui_widgets). These widgets communicate with simulator internals and in some cases build themselves from simulator data (e.g., the planet/moon navigator widget above/left). See also the Planetarium GUI above, which is composed entirely of existing widgets in the Core plugin. 53 | -------------------------------------------------------------------------------- /planetarium/preinitializer.gd: -------------------------------------------------------------------------------- 1 | # preinitializer.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | extends RefCounted 21 | 22 | # This file modifies operation if plugins ivoyager_core & ivoyager_units. 23 | 24 | const USE_THREADS := true # set false for debugging 25 | const DISABLE_THREADS_IF_WEB := true # override for browser compatibility 26 | #const VERBOSE_GLOBAL_SIGNALS := false 27 | #const VERBOSE_STATEMANAGER_SIGNALS := false 28 | 29 | 30 | func _init() -> void: 31 | 32 | var version: String = ProjectSettings.get_setting("application/config/version") 33 | print("Planetarium v%s - https://ivoyager.dev" % version) 34 | 35 | #if VERBOSE_GLOBAL_SIGNALS and OS.is_debug_build: 36 | #IVDebug.signal_verbosely_all(IVGlobal, "Global") 37 | 38 | IVStateManager.core_init_program_objects_instantiated.connect( 39 | _on_core_init_program_objects_instantiated) 40 | IVStateManager.simulator_started.connect(_on_simulator_started) 41 | var is_web := OS.has_feature("web") 42 | IVCoreSettings.use_threads = USE_THREADS and !(is_web and DISABLE_THREADS_IF_WEB) 43 | print("web = %s, threads = %s" % [is_web, IVCoreSettings.use_threads]) 44 | 45 | IVCoreSettings.allow_fullscreen_toggle = true 46 | IVCoreSettings.allow_time_setting = true 47 | IVCoreSettings.allow_time_reversal = true 48 | IVCoreSettings.disable_exit = true 49 | IVCoreSettings.enable_precisions = true 50 | IVCoreSettings.popops_can_stop_sim = false 51 | 52 | if is_web: 53 | IVCoreSettings.disable_quit = true 54 | IVCoreSettings.vertecies_per_orbit = 200 55 | IVSettingsManager.set_default(&"gui_size", IVGlobal.GUISize.GUI_LARGE) 56 | 57 | # class changes 58 | IVCoreInitializer.program_nodes["FullScreenManager"] = IVFullScreenManager 59 | IVCoreInitializer.program_refcounteds["WikiManager"] = IVWikiManager 60 | IVCoreInitializer.program_nodes["ViewCacher"] = ViewCacher 61 | 62 | # other singleton changes 63 | IVQFormat.exponent_str = " ×10^" 64 | 65 | # static class changes 66 | IVTableInitializer.wiki_page_title_fields.append(&"en.wikipedia") 67 | 68 | # User settings/options 69 | IVSettingsManager.set_default(&"terrestrial_time_clock", false) 70 | var options_popup: IVOptionsPopup = IVGlobal.get_node("/root/Universe/TopUI/OptionsPopup") 71 | options_popup.add_section(&"LABEL_TIME", 1, 1) 72 | options_popup.add_option(&"LABEL_TIME", &"LABEL_TERRESTRIAL_TIME_CLOCK", 73 | &"terrestrial_time_clock") 74 | 75 | 76 | func _on_core_init_program_objects_instantiated() -> void: 77 | 78 | #if OS.is_debug_build and VERBOSE_STATEMANAGER_SIGNALS: 79 | #var state_manager: IVStateManager = IVGlobal.program[&"StateManager"] 80 | #IVDebug.signal_verbosely_all(state_manager, "StateManager") 81 | 82 | # FIXME: ????? 83 | IVGlobal.get_viewport().gui_embed_subwindows = true # root default is true, contrary to docs 84 | 85 | var timekeeper: IVTimekeeper = IVGlobal.program[&"Timekeeper"] 86 | timekeeper.operating_system_time_sync = true 87 | timekeeper.terrestrial_time_clock_user_setting = true 88 | timekeeper.recalculate_universal_time_offset = true 89 | 90 | var view_manager: IVViewManager = IVGlobal.program[&"ViewManager"] 91 | view_manager.set_view_on_start = &"" # ViewCacher does initial camera move 92 | var table_orbit_builder: IVTableOrbitBuilder = IVGlobal.program[&"TableOrbitBuilder"] 93 | table_orbit_builder.use_real_planet_orbits = true 94 | var wiki_manager: IVWikiManager = IVGlobal.program[&"WikiManager"] 95 | wiki_manager.open_external_page = true 96 | 97 | if OS.has_feature("web"): 98 | var view_cacher: ViewCacher = IVGlobal.program.ViewCacher 99 | view_cacher.cache_interval = 2.0 100 | 101 | 102 | func _on_simulator_started() -> void: 103 | if OS.has_feature("web"): 104 | # progressive web app (PWA) updating 105 | var pwa_needs_update := JavaScriptBridge.pwa_needs_update() 106 | print("PWA nees update: ", pwa_needs_update) 107 | if pwa_needs_update: 108 | _on_pwa_update_available() 109 | return 110 | JavaScriptBridge.pwa_update_available.connect(_on_pwa_update_available) 111 | 112 | 113 | func _on_pwa_update_available() -> void: 114 | print("PWA update available!") 115 | IVGlobal.confirmation_required.emit("TXT_PWA_UPDATE_AVAILABLE", _update_pwa, true, 116 | "LABEL_UPDATE_RESTART_Q", "BUTTON_UPDATE", "BUTTON_RUN_WITHOUT_UPDATE") 117 | 118 | 119 | func _update_pwa() -> void: 120 | print("Updating PWA!") 121 | JavaScriptBridge.pwa_update() 122 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=5 10 | 11 | [application] 12 | 13 | config/name="I, Voyager - Planetarium" 14 | config/version="0.1.1.dev" 15 | run/main_scene="uid://mcxrmcs1puig" 16 | config/features=PackedStringArray("4.5") 17 | run/max_fps=59 18 | boot_splash/bg_color=Color(0, 0, 0, 1) 19 | boot_splash/show_image=false 20 | boot_splash/fullsize=false 21 | boot_splash/use_filter=false 22 | config/icon="res://web/jupiter-144.png" 23 | icon="res://jupiter-icon-128.png" 24 | main_scene="res://addons/ivoyager_core/tree_nodes/universe.tscn" 25 | name="I, Voyager - Planetarium" 26 | 27 | [autoload] 28 | 29 | IVUnits="*res://planetarium/units.gd" 30 | IVQConvert="*res://addons/ivoyager_units/qconvert.gd" 31 | IVQFormat="*res://addons/ivoyager_units/qformat.gd" 32 | IVTableData="*res://addons/ivoyager_tables/table_data.gd" 33 | IVGlobal="*res://addons/ivoyager_core/editor/../singletons/global.gd" 34 | IVCoreSettings="*res://addons/ivoyager_core/editor/../singletons/core_settings.gd" 35 | IVCoreInitializer="*res://addons/ivoyager_core/editor/../singletons/core_initializer.gd" 36 | IVAstronomy="*res://addons/ivoyager_core/editor/../singletons/astronomy.gd" 37 | IVSettingsManager="*res://addons/ivoyager_core/editor/../singletons/settings_manager.gd" 38 | IVStateManager="*res://addons/ivoyager_core/editor/../singletons/state_manager.gd" 39 | 40 | [debug] 41 | 42 | file_logging/enable_file_logging=true 43 | gdscript/warnings/exclude_addons=false 44 | gdscript/warnings/unused_signal=false 45 | gdscript/warnings/untyped_declaration=1 46 | gdscript/warnings/unsafe_property_access=1 47 | gdscript/warnings/unsafe_method_access=1 48 | gdscript/warnings/unsafe_cast=1 49 | gdscript/warnings/unsafe_call_argument=true 50 | gdscript/warnings/return_value_discarded=false 51 | gdscript/warnings/static_called_on_instance=0 52 | 53 | [display] 54 | 55 | window/size/viewport_width=2500 56 | window/size/viewport_height=1200 57 | 58 | [editor_plugins] 59 | 60 | enabled=PackedStringArray("res://addons/ivoyager_core/plugin.cfg", "res://addons/ivoyager_tables/plugin.cfg", "res://addons/ivoyager_units/plugin.cfg") 61 | 62 | [filesystem] 63 | 64 | import/blender/enabled=false 65 | 66 | [gui] 67 | 68 | theme/custom="uid://c1ce75roeyk17" 69 | theme/custom_font="uid://btl3ian81yhn4" 70 | 71 | [importer_defaults] 72 | 73 | texture={ 74 | "compress/hdr_mode": 0, 75 | "compress/lossy_quality": 0.7, 76 | "compress/mode": 2, 77 | "compress/normal_map": 0, 78 | "detect_3d": false, 79 | "flags/anisotropic": false, 80 | "flags/filter": true, 81 | "flags/mipmaps": true, 82 | "flags/repeat": true, 83 | "flags/srgb": 1, 84 | "process/HDR_as_SRGB": false, 85 | "process/fix_alpha_border": true, 86 | "process/premult_alpha": false, 87 | "size_limit": 0, 88 | "stream": false, 89 | "svg/scale": 1.0 90 | } 91 | 92 | [input] 93 | 94 | ui_accept={ 95 | "deadzone": 0.5, 96 | "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 97 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 98 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) 99 | ] 100 | } 101 | ui_left={ 102 | "deadzone": 0.5, 103 | "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null) 104 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 105 | ] 106 | } 107 | ui_right={ 108 | "deadzone": 0.5, 109 | "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null) 110 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 111 | ] 112 | } 113 | ui_up={ 114 | "deadzone": 0.5, 115 | "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null) 116 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 117 | ] 118 | } 119 | ui_down={ 120 | "deadzone": 0.5, 121 | "events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null) 122 | , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) 123 | ] 124 | } 125 | 126 | [internationalization] 127 | 128 | locale/translations=PackedStringArray("res://addons/ivoyager_units/text/units_numbers_text.en.translation") 129 | 130 | [locale] 131 | 132 | test="en" 133 | translations=PackedStringArray() 134 | 135 | [logging] 136 | 137 | file_logging/enable_file_logging=true 138 | 139 | [physics_2d] 140 | 141 | motion_fix_enabled=true 142 | 143 | [rendering] 144 | 145 | lights_and_shadows/directional_shadow/size=16384 146 | lights_and_shadows/directional_shadow/16_bits=false 147 | lights_and_shadows/positional_shadow/soft_shadow_filter_quality=3 148 | environment/defaults/default_clear_color=Color(0, 0, 0, 1) 149 | 150 | [shader_globals] 151 | 152 | iv_time={ 153 | "type": "float", 154 | "value": 0.0 155 | } 156 | iv_mouse_fragcoord={ 157 | "type": "vec2", 158 | "value": Vector2(0, 0) 159 | } 160 | iv_fragment_id_cycler={ 161 | "type": "float", 162 | "value": 0.0 163 | } 164 | iv_fragment_id_range={ 165 | "type": "float", 166 | "value": 0.0 167 | } 168 | -------------------------------------------------------------------------------- /planetarium/gui/control_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=20 format=3 uid="uid://ba7271tsjvr4o"] 2 | 3 | [ext_resource type="Script" uid="uid://bwtmii13a7exf" path="res://planetarium/gui/control_panel.gd" id="1_jbnqr"] 4 | [ext_resource type="PackedScene" uid="uid://b8lhpum4e5tps" path="res://addons/ivoyager_core/ui_widgets/date_time_label.tscn" id="2"] 5 | [ext_resource type="PackedScene" uid="uid://b7a02wvmqua4q" path="res://addons/ivoyager_core/ui_widgets/sync_os_time_checkbox.tscn" id="3"] 6 | [ext_resource type="PackedScene" uid="uid://c71yn7f8ovhrl" path="res://addons/ivoyager_core/ui_widgets/selection_label.tscn" id="4"] 7 | [ext_resource type="PackedScene" uid="uid://b5k2m7jen3jwm" path="res://addons/ivoyager_core/ui_widgets/range_label.tscn" id="5"] 8 | [ext_resource type="PackedScene" uid="uid://bk1wcjtaqcyyd" path="res://addons/ivoyager_core/ui_widgets/selection_buttons.tscn" id="7"] 9 | [ext_resource type="PackedScene" uid="uid://bhbsnekxvq6le" path="res://addons/ivoyager_core/ui_widgets/pause_button.tscn" id="8_16kaf"] 10 | [ext_resource type="PackedScene" uid="uid://cps3q0poas3ff" path="res://addons/ivoyager_core/ui_widgets/time_reverse_button.tscn" id="8_jbnqr"] 11 | [ext_resource type="PackedScene" uid="uid://drl4tb0hbqhl" path="res://addons/ivoyager_core/ui_widgets/speed_buttons.tscn" id="9"] 12 | [ext_resource type="PackedScene" uid="uid://welwpw4boyv8" path="res://addons/ivoyager_core/ui_widgets/lat_long_label.tscn" id="10"] 13 | [ext_resource type="PackedScene" uid="uid://chl27l6aiico8" path="res://addons/ivoyager_core/ui_widgets/focal_length_control.tscn" id="11_13kj6"] 14 | [ext_resource type="PackedScene" uid="uid://cwnvxi44ijkr4" path="res://addons/ivoyager_core/ui_widgets/up_lock_ckbx.tscn" id="12"] 15 | [ext_resource type="PackedScene" uid="uid://cr2k471sfa7fd" path="res://addons/ivoyager_core/ui_widgets/view_collection.tscn" id="13_jbnqr"] 16 | [ext_resource type="PackedScene" uid="uid://b1mkm7ajlvvm0" path="res://addons/ivoyager_core/ui_widgets/track_ckbxs.tscn" id="15"] 17 | [ext_resource type="PackedScene" uid="uid://bgk3lju7s35t" path="res://addons/ivoyager_core/ui_widgets/time_set_button.tscn" id="16"] 18 | [ext_resource type="PackedScene" uid="uid://do2jvg01jte0i" path="res://addons/ivoyager_core/ui_widgets/view_save_button.tscn" id="17"] 19 | [ext_resource type="PackedScene" uid="uid://bkcj6agxxgfw" path="res://addons/ivoyager_core/ui_components/control_mod_resizable.tscn" id="17_jbnqr"] 20 | [ext_resource type="PackedScene" uid="uid://bcl70ysl6yces" path="res://addons/ivoyager_core/ui_widgets/view_button.tscn" id="19"] 21 | 22 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jbnqr"] 23 | bg_color = Color(0, 0, 0, 1) 24 | 25 | [node name="ControlPanel" type="PanelContainer"] 26 | anchors_preset = 7 27 | anchor_left = 0.5 28 | anchor_top = 1.0 29 | anchor_right = 0.5 30 | anchor_bottom = 1.0 31 | offset_left = -207.0 32 | offset_top = -338.0 33 | offset_right = 207.0 34 | script = ExtResource("1_jbnqr") 35 | 36 | [node name="VBox" type="VBoxContainer" parent="."] 37 | layout_mode = 2 38 | size_flags_vertical = 4 39 | 40 | [node name="SelectionLabel" parent="VBox" instance=ExtResource("4")] 41 | layout_mode = 2 42 | horizontal_alignment = 1 43 | 44 | [node name="HBox1" type="HBoxContainer" parent="VBox"] 45 | layout_mode = 2 46 | size_flags_horizontal = 4 47 | 48 | [node name="RangeLabel" parent="VBox/HBox1" instance=ExtResource("5")] 49 | layout_mode = 2 50 | size_flags_horizontal = 0 51 | 52 | [node name="Spacer" type="Control" parent="VBox/HBox1"] 53 | custom_minimum_size = Vector2(15, 0) 54 | layout_mode = 2 55 | 56 | [node name="LatLongLabel" parent="VBox/HBox1" instance=ExtResource("10")] 57 | layout_mode = 2 58 | size_flags_horizontal = 0 59 | 60 | [node name="HBox2" type="HBoxContainer" parent="VBox"] 61 | layout_mode = 2 62 | 63 | [node name="SyncOSTimeCheckBox" parent="VBox/HBox2" instance=ExtResource("3")] 64 | layout_mode = 2 65 | size_flags_horizontal = 3 66 | 67 | [node name="DateTimeLabel" parent="VBox/HBox2" instance=ExtResource("2")] 68 | layout_mode = 2 69 | suffix_ut_tt = true 70 | 71 | [node name="SpeedButtons" parent="VBox/HBox2" instance=ExtResource("9")] 72 | layout_mode = 2 73 | size_flags_horizontal = 3 74 | alignment = 2 75 | 76 | [node name="PauseButton" parent="VBox/HBox2/SpeedButtons" instance=ExtResource("8_16kaf")] 77 | layout_mode = 2 78 | paused_text = "||" 79 | 80 | [node name="TimeReverseButton" parent="VBox/HBox2/SpeedButtons" instance=ExtResource("8_jbnqr")] 81 | layout_mode = 2 82 | 83 | [node name="TimeSetButton" parent="VBox/HBox2/SpeedButtons" instance=ExtResource("16")] 84 | layout_mode = 2 85 | popup_stylebox_override = SubResource("StyleBoxFlat_jbnqr") 86 | 87 | [node name="HBox3" type="HBoxContainer" parent="VBox"] 88 | layout_mode = 2 89 | 90 | [node name="UpLockCkbx" parent="VBox/HBox3" instance=ExtResource("12")] 91 | layout_mode = 2 92 | 93 | [node name="TrackCkbxs" parent="VBox/HBox3" instance=ExtResource("15")] 94 | layout_mode = 2 95 | size_flags_horizontal = 3 96 | alignment = 1 97 | 98 | [node name="FocalLengthControl" parent="VBox/HBox3" instance=ExtResource("11_13kj6")] 99 | layout_mode = 2 100 | 101 | [node name="DefaultViewsHBox" type="HBoxContainer" parent="VBox"] 102 | layout_mode = 2 103 | 104 | [node name="Home" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 105 | layout_mode = 2 106 | text = "VIEW_HOME" 107 | default_view = &"VIEW_HOME" 108 | 109 | [node name="Cislunar" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 110 | layout_mode = 2 111 | text = "VIEW_CISLUNAR" 112 | default_view = &"VIEW_CISLUNAR" 113 | 114 | [node name="System" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 115 | layout_mode = 2 116 | text = "VIEW_SYSTEM" 117 | default_view = &"VIEW_SYSTEM" 118 | 119 | [node name="Asteroids" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 120 | layout_mode = 2 121 | text = "VIEW_ASTEROIDS" 122 | default_view = &"VIEW_ASTEROIDS" 123 | 124 | [node name="Spacer" type="Control" parent="VBox/DefaultViewsHBox"] 125 | layout_mode = 2 126 | size_flags_horizontal = 3 127 | 128 | [node name="Zoom" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 129 | layout_mode = 2 130 | text = "VIEW_ZOOM" 131 | default_view = &"VIEW_ZOOM" 132 | 133 | [node name="Fortyfive" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 134 | layout_mode = 2 135 | text = "VIEW_FORTYFIVE" 136 | default_view = &"VIEW_FORTYFIVE" 137 | 138 | [node name="Top" parent="VBox/DefaultViewsHBox" instance=ExtResource("19")] 139 | layout_mode = 2 140 | text = "VIEW_TOP" 141 | default_view = &"VIEW_TOP" 142 | 143 | [node name="ViewCollection" parent="VBox" instance=ExtResource("13_jbnqr")] 144 | unique_name_in_owner = true 145 | layout_mode = 2 146 | collection_name = "CP" 147 | external_button_containers = Array[NodePath]([NodePath("../DefaultViewsHBox")]) 148 | 149 | [node name="ViewSaveButton" parent="VBox/ViewCollection" instance=ExtResource("17")] 150 | layout_mode = 2 151 | 152 | [node name="SelectionButtons" parent="." instance=ExtResource("7")] 153 | layout_mode = 2 154 | 155 | [node name="ControlModResizable" parent="." instance=ExtResource("17_jbnqr")] 156 | base_size = Vector2(600, 0) 157 | -------------------------------------------------------------------------------- /web/godot.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | $GODOT_PROJECT_NAME 7 | 117 | $GODOT_HEAD_INCLUDE 118 | 119 | 120 | 121 | Your browser does not support the canvas tag. 122 | 123 | 124 | 127 | 128 |
129 | 133 | Pale Blue Dot 134 |
135 |
136 |

137 | I, Voyager - Planetarium
138 | v0.1

139 | Loading... 140 |

141 | 142 |
143 |

144 |
You can install the Planetarium!
145 |

146 |

147 | After download, look for the install icon in the URL bar of your browser.
148 |

149 |

150 | Please consider supporting us at our GitHub 151 | Sponsor's Page! 152 |

153 |
154 | 155 | Pale Blue Dot

156 | Earth as seen by Voyager 1 from 6.4 billion kilometers. 157 |
158 |
159 |
160 | 161 | 162 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /planetarium/units.gd: -------------------------------------------------------------------------------- 1 | # units.gd 2 | # This file is part of I, Voyager 3 | # https://ivoyager.dev 4 | # ***************************************************************************** 5 | # Copyright 2017-2025 Charlie Whitfield 6 | # I, Voyager is a registered trademark of Charlie Whitfield in the US 7 | # 8 | # Licensed under the Apache License, Version 2.0 (the "License"); 9 | # you may not use this file except in compliance with the License. 10 | # You may obtain a copy of the License at 11 | # 12 | # http://www.apache.org/licenses/LICENSE-2.0 13 | # 14 | # Unless required by applicable law or agreed to in writing, software 15 | # distributed under the License is distributed on an "AS IS" BASIS, 16 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 | # See the License for the specific language governing permissions and 18 | # limitations under the License. 19 | # ***************************************************************************** 20 | extends Node 21 | 22 | ## Replacement IVUnits singleton 23 | ## 24 | ## This file replaces the "Units" plugin template file at 25 | ## [code]addons/ivoyager_units/units.gd[/code] as set in res://ivoyager_override.cfg. 26 | ## 27 | ## It is unchanged except for comments and sim scale ([constant METER]).[br][br] 28 | ## 29 | ## WARNING: Lighting and shadows are EXTREMELY sensitive to scale, and the 30 | ## specific issues (and best setting) vary with Godot versions. See class file 31 | ## comments in the Planetarium's 32 | ## [url=https://github.com/ivoyager/planetarium/blob/master/planetarium/units.gd] 33 | ## units.gd[/url] for a running record of issues and the current recommended 34 | ## METER value. 35 | 36 | # Scale notes: 37 | # 38 | # Godot 4.5 update: 39 | # METER = 1e-3 looks good in editor and Windows export (lighting and shadows) 40 | # and HTML5 export (lighting) at all target object scales. Did not test other 41 | # values. 42 | # 43 | # Godot 4.4 update after shadows work (v0.0.24.dev): 44 | # For the IVDynamicLight system, we need METER ~ 1e-3. Larger breaks moon 45 | # shadows on Jupiter. Self-shadow quality on ISS is already affected at 1e-3 46 | # but gets much worse at smaller values. Needs testing in HTML5 export. 47 | # 48 | # Godot 4.3 update. Problems for HTML5 as below. However, Windows now appears 49 | # ok at 1e-10. Perhaps smaller value should be our base value (again)? 50 | # 51 | # COMMENTS BELOW ARE OBSOLETE, but keeping for reference. 52 | # 53 | # As of Godot 4.2.beta4, there are lighting bugs related to scale that are 54 | # platform specific. We have to manually update METER here for export platform. 55 | # 56 | # Windows [these notes are OBSOLETE]: 57 | # METER = 1.0 works great. 58 | # METER = 1e-3 looks ok for all existing bodies. 59 | # METER = 1e-4 causes 'lights out' when approaching smallest object (Juno). 60 | # METER = 1e-10 caues 'lights out' for Moon & smaller. 61 | # 62 | # HTML5 [these notes are OBSOLETE]: 63 | # METER = 1.0 causes unlit everywhere with irregular light 'patches'. 64 | # METER = 1e-3 causes above but only when at larger planets. 65 | # METER = 1e-4 causes shadow edge issue at larger planets. (But no hint of Windows issue above.) 66 | # METER = 1e-5 as above but less. Self-shadowing artifact? 67 | # METER = 1e-7 lighting ok for all tested. (Harsh shadow border? Need to compare w/ below.) 68 | # METER = 1e-10 lighting ok for all tested. 69 | 70 | 71 | # SI base units 72 | const SECOND := 1.0 73 | const METER := 1e-3 # see notes above 74 | const KG := 1.0 75 | const AMPERE := 1.0 76 | const KELVIN := 1.0 77 | const CANDELA := 1.0 78 | 79 | # derived units & constants 80 | const DEG := PI / 180.0 # radians 81 | const MINUTE := 60.0 * SECOND 82 | const HOUR := 3600.0 * SECOND 83 | const DAY := 86400.0 * SECOND # exact Julian day 84 | const YEAR := 365.25 * DAY # exact Julian year 85 | const CENTURY := 36525.0 * DAY 86 | const MM := 1e-3 * METER 87 | const CM := 1e-2 * METER 88 | const KM := 1e3 * METER 89 | const AU := 149597870700.0 * METER 90 | const PARSEC := 648000.0 * AU / PI 91 | const SPEED_OF_LIGHT := 299792458.0 * METER / SECOND 92 | const LIGHT_YEAR := SPEED_OF_LIGHT * YEAR 93 | const STANDARD_GRAVITY := 9.80665 * METER / SECOND ** 2 94 | const GRAM := 1e-3 * KG 95 | const TONNE := 1e3 * KG 96 | const HECTARE := 1e4 * METER ** 2 97 | const LITER := 1e-3 * METER ** 3 98 | const NEWTON := KG * METER / SECOND ** 2 99 | const PASCAL := NEWTON / METER ** 2 100 | const BAR := 1e5 * PASCAL 101 | const ATM := 101325.0 * PASCAL 102 | const JOULE := NEWTON * METER 103 | const ELECTRONVOLT := 1.602176634e-19 * JOULE 104 | const WATT := NEWTON / SECOND 105 | const VOLT := WATT / AMPERE 106 | const COULOMB := SECOND * AMPERE 107 | const WEBER := VOLT * SECOND 108 | const TESLA := WEBER / METER ** 2 109 | const GRAVITATIONAL_CONSTANT := 6.67430e-11 * METER ** 3 / (KG * SECOND ** 2) 110 | 111 | 112 | ## Conversion multipliers for units that are linear with zero-intersect. 113 | ## Internal unit symbols must be unique. However, redundant symbol usage can 114 | ## be specified for display in [IVQFormat] (e.g., &"g" for gram and &"g0" for 115 | ## g-force both display as "g"). 116 | ## Default units are mostly (but not all) SI units that follow: 117 | ## [url]https://en.wikipedia.org/wiki/International_System_of_Units[/url]. 118 | var unit_multipliers: Dictionary[StringName, float] = { 119 | # time 120 | &"s" : SECOND, 121 | &"min" : MINUTE, 122 | &"h" : HOUR, 123 | &"d" : DAY, 124 | &"a" : YEAR, # Julian year symbol 125 | &"y" : YEAR, 126 | &"yr" : YEAR, 127 | &"Cy" : CENTURY, 128 | # length 129 | &"mm" : MM, 130 | &"cm" : CM, 131 | &"m" : METER, 132 | &"km" : KM, 133 | &"au" : AU, 134 | &"AU" : AU, 135 | &"ly" : LIGHT_YEAR, 136 | &"pc" : PARSEC, 137 | &"Mpc" : 1e6 * PARSEC, 138 | # mass 139 | &"g" : GRAM, 140 | &"kg" : KG, 141 | &"t" : TONNE, 142 | # angle 143 | &"rad" : 1.0, 144 | &"deg" : DEG, # IVQFormat displays as ° 145 | # temperature 146 | &"K" : KELVIN, 147 | # frequency 148 | &"Hz" : 1.0 / SECOND, 149 | &"1/Cy" : 1.0 / CENTURY, 150 | # area 151 | &"m^2" : METER ** 2, 152 | &"km^2" : KM ** 2, 153 | &"ha" : HECTARE, 154 | # volume 155 | &"l" : LITER, 156 | &"L" : LITER, 157 | &"m^3" : METER ** 3, 158 | # velocity 159 | &"m/s" : METER / SECOND, 160 | &"km/s" : KM / SECOND, 161 | &"au/Cy" : AU / CENTURY, 162 | &"c" : SPEED_OF_LIGHT, 163 | # acceleration/gravity 164 | &"m/s^2" : METER / SECOND ** 2, 165 | &"g0" : STANDARD_GRAVITY, # IVQFormat displays as g 166 | # angular velocity 167 | &"rad/s" : 1.0 / SECOND, 168 | &"deg/d" : DEG / DAY, 169 | &"deg/Cy" : DEG / CENTURY, 170 | # particle density 171 | &"m^-3" : 1.0 / METER ** 3, 172 | # density 173 | &"g/cm^3" : GRAM / CM ** 3, 174 | # force 175 | &"N" : NEWTON, 176 | # pressure 177 | &"Pa" : PASCAL, 178 | &"bar" : BAR, 179 | &"atm" : ATM, 180 | # energy 181 | &"J" : JOULE, 182 | &"kJ" : 1e3 * JOULE, 183 | &"MJ" : 1e6 * JOULE, 184 | &"GJ" : 1e9 * JOULE, 185 | &"Wh" : WATT * HOUR, 186 | &"kWh" : 1e3 * WATT * HOUR, 187 | &"MWh" : 1e6 * WATT * HOUR, 188 | &"GWh" : 1e9 * WATT * HOUR, 189 | &"eV" : ELECTRONVOLT, 190 | # power 191 | &"W" : WATT, 192 | &"kW" : 1e3 * WATT, 193 | &"MW" : 1e6 * WATT, 194 | &"GW" : 1e9 * WATT, 195 | # luminous intensity / luminous flux 196 | &"cd" : CANDELA, 197 | &"lm" : CANDELA, # 1 lm = 1 cd·sr, but sr is dimensionless 198 | # luminance 199 | &"cd/m^2" : CANDELA / METER ** 2, 200 | # electric potential 201 | &"V" : VOLT, 202 | # electric charge 203 | &"C" : COULOMB, 204 | # magnetic flux 205 | &"Wb" : WEBER, 206 | # magnetic flux density 207 | &"T" : TESLA, 208 | # information 209 | &"bit" : 1.0, 210 | &"B" : 8.0, 211 | # information (base 10) 212 | &"kbit" : 1e3, 213 | &"Mbit" : 1e6, 214 | &"Gbit" : 1e9, 215 | &"Tbit" : 1e12, 216 | &"kB" : 8e3, 217 | &"MB" : 8e6, 218 | &"GB" : 8e9, 219 | &"TB" : 8e12, 220 | # information (base 2) 221 | &"Kibit" : 1024.0, 222 | &"Mibit" : 1024.0 ** 2, 223 | &"Gibit" : 1024.0 ** 3, 224 | &"Tibit" : 1024.0 ** 4, 225 | &"KiB" : 8.0 * 1024.0, 226 | &"MiB" : 8.0 * 1024.0 ** 2, 227 | &"GiB" : 8.0 * 1024.0 ** 3, 228 | &"TiB" : 8.0 * 1024.0 ** 4, 229 | # misc 230 | &"percent" : 100.0, # e.g., display x = 0.55 as "55%" (see IVQFormat) 231 | &"ppm" : 1e6, 232 | &"ppb" : 1e9, 233 | } 234 | 235 | ## Conversion lambdas for units that are nonlinear or have non-zero intersect 236 | ## (e.g., celsius and fahrenheit). All lambdas must have method signature 237 | ## [code](x: float, to_internal: bool)[/code] where [param x] is the quantity 238 | ## and [param to_internal] specifies conversion to internal (true) or from 239 | ## internal (false). 240 | var unit_lambdas: Dictionary[StringName, Callable] = { 241 | &"degC" : func convert_celsius(x: float, to_internal := true) -> float: 242 | return x + 273.15 if to_internal else x - 273.15, 243 | &"degF" : func convert_fahrenheit(x: float, to_internal := true) -> float: 244 | return (x + 459.67) / 1.8 if to_internal else x * 1.8 - 459.67, 245 | } 246 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | This file documents changes to the Planetarium "shell" project only. For changes to the core simulator code, go [here](https://github.com/ivoyager/ivoyager_core/blob/master/CHANGELOG.md). 4 | 5 | File format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). 6 | 7 | See cloning and downloading instructions [here](https://www.ivoyager.dev/developers/). 8 | 9 | ## [v0.1.1] - UNRELEASED 10 | 11 | Under development using Godot 4.5.1. We'll be moving on to 4.6 betas soon! Everything looked ok in a brief test. 12 | 13 | ### Changed 14 | * Removed unneeded/unmaintained website text in README.md. 15 | * Updated plugin ivoyager_core to v0.1.1.dev 16 | 17 | 18 | ## [v0.1] - 2025-12-13 19 | 20 | Beta release! 21 | 22 | Developed using Godot 4.5.1. 23 | 24 | ### Changed 25 | * Updated GUI for new Core plugin widgets. 26 | * Replaced 3RD_PARTY.txt with updated and more human-readable 3RD_PARTY.md, and updated CREDITS.md. 27 | * Code updates for plugin API changes. 28 | * Updated plugin ivoyager_core to v0.1. 29 | * Updated plugin ivoyager_tables to v0.1. 30 | * Updated plugin ivoyager_units to v0.1. 31 | 32 | ## [v0.0.25] - 2025-06-12 33 | 34 | Developed using Godot 4.4.1. 35 | 36 | ### Changed 37 | * Updated plugin ivoyager_core to v0.0.25. 38 | * Updated plugin ivoyager_tables to v0.0.4. 39 | * Updated plugin ivoyager_units to v0.0.4. 40 | 41 | ## [v0.0.24] - 2025-03-31 42 | 43 | Developed using Godot 4.4. 44 | 45 | ### Changed 46 | * Changed scale and various Rendering settings to support shadows. 47 | * Updated plugin ivoyager_core to v0.0.24. 48 | * Updated plugin ivoyager_tables to v0.0.3. 49 | * Updated plugin ivoyager_units to v0.0.3. 50 | 51 | ## [v0.0.23] - 2025-03-20 52 | 53 | Developed using Godot 4.4. 54 | 55 | ### Changed 56 | * Typed all dictionaries. 57 | * Many code updates for plugin changes. 58 | * Updated plugin ivoyager_core to v0.0.23. 59 | * Updated plugin ivoyager_tables to v0.0.2. 60 | * Updated plugin ivoyager_units to v0.0.2. 61 | 62 | ## [v0.0.22] - 2025-03-07 63 | 64 | Under development using Godot 4.3. **We will update to 4.4 in the next release!** 65 | 66 | ### Changed 67 | * Updated plugin "ivoyager_core" to v0.0.22. This moves game save/load functionality out to a separate plugin, which doesn't affect the Planetarium except to remove unused code. 68 | 69 | 70 | ## [v0.0.21] - 2025-01-07 71 | 72 | Developed using Godot 4.3. 73 | 74 | ### Changed 75 | * Updated plugin 'ivoyager_core' to v0.0.21. 76 | * Replaced depreciated plugin 'ivoyager_table_importer' with two plugins from split: 'ivoyager_tables' and 'ivoyager_units' (both v0.0.1). 77 | 78 | ## [v0.0.20] - 2024-12-20 79 | 80 | Developed using Godot 4.3. 81 | 82 | ### Changed 83 | * Updated custom godot.html shell using Godot 4.3's current master. 84 | * Updated plugin 'ivoyager_core' to v0.0.20. 85 | * Updated plugin 'ivoyager_table_importer' to v0.0.9. 86 | 87 | ## [v0.0.19] - 2024-12-16 88 | 89 | Developed using Godot 4.3. 90 | 91 | ### Changed 92 | * Updated plugin 'ivoyager_core' to v0.0.19. 93 | * Updated plugin 'ivoyager_table_importer' to v0.0.8. 94 | 95 | 96 | ## [v0.0.18] - 2024-03-15 97 | 98 | Developmed using Godot 4.2.1. _Has backward breaking changes!_ 99 | 100 | **NEW!** ivoyager_core editor plugin will download and add (or replace) assets for you. Just press 'Download' if prompted. 101 | 102 | ### Changed 103 | * Gets project version from project.godot. 104 | * Updated plugin 'ivoyager_core' to v0.0.18. 105 | * Updated plugin 'ivoyager_table_importer' to v0.0.7. 106 | 107 | ## [v0.0.17] - 2023-10-03 108 | 109 | Developed for Godot 4.1.1. 110 | 111 | Requires non-Git-tracked **ivoyager_assets-0.0.17**. Download from ivoyager_core [releases](https://github.com/ivoyager/ivoyager_core/releases) and add as res://addons/ivoyager_assets. 112 | 113 | ### Changed 114 | * Replaced submodule [ivoyager](https://github.com/ivoyager/ivoyager) with addons/[ivoyager_core](https://github.com/ivoyager/ivoyager_core), which now operates as an editor plugin. 115 | * All code now expects ivoyager_assets to be in the 'addons' directory. 116 | 117 | 118 | ## [v0.0.16] - 2023-09-25 119 | 120 | **We've migrated to Godot 4!** 121 | 122 | Developed for Godot 4.1.1. 123 | 124 | Requires non-Git-tracked **ivoyager_assets-0.0.16**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 125 | 126 | ### Added 127 | * Table Reader [ivoyager_table_reader](https://github.com/ivoyager/ivoyager_table_importer) added as editor plugin. (Functionality was previously in core 'ivoyager'.) 128 | 129 | ### Changed 130 | * Many migration changes. See core ivoyager [migration changes](https://github.com/ivoyager/ivoyager/blob/master/CHANGELOG.md). 131 | 132 | ## [v0.0.15] - 2023-07-24 133 | 134 | Developed for Godot 3.5.2. **This is the final release using Godot 3.x!** 135 | 136 | Requires non-Git-tracked **ivoyager_assets-0.0.14**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 137 | 138 | ### Changed 139 | * Updated submodule 'ivoyager' to v0.0.15. 140 | 141 | ## [v0.0.14] - 2023-03-15 142 | 143 | Developed for Godot 3.5.2. 144 | 145 | Requires non-Git-tracked **ivoyager_assets-0.0.14**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 146 | 147 | ### Changed 148 | * Overhauled GUI to interact with new content and systems in core ivoyager. 149 | * Updated submodule 'ivoyager' to v0.0.14. 150 | 151 | ### Fixed 152 | * Excessive calls to _resize() causing info_panel.gd crash (visible as info display corruption) 153 | 154 | ## [v0.0.13] - 2022-09-28 155 | 156 | Developed for Godot 3.5.1. 157 | 158 | Requires non-Git-tracked **ivoyager_assets-0.0.10**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 159 | 160 | ### Added 161 | * Added ViewCacher to Planetarium (moved from 'ivoyager' submodule) 162 | * Added dialog for Progressive Web App version update. 163 | 164 | ### Changed 165 | * Cached view now includes HUDs visibility states (orbits, names, icons, and asteroid points). 166 | * Updated submodule 'ivoyager' to v0.0.13. 167 | 168 | ## [v0.0.12] - 2022-01-20 169 | 170 | Developed using Godot 3.4.2.stable AND a custom Godot build that fixes PWA caching (Faless' [3.x_pwa_prefer_cache branch](https://github.com/godotengine/godot/compare/3.x...Faless:js/3.x_pwa_prefer_cache), commit bf61f9c). 171 | 172 | Requires non-Git-tracked **ivoyager_assets-0.0.10**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 173 | 174 | ### Added 175 | * Update in ivoyager v0.0.12 allows caching of time info (time, speed, reverse time) when not in 'present' time. 176 | 177 | ### Changed 178 | * Updated submodule 'ivoyager' to v0.0.12. 179 | 180 | ### Fixed 181 | * Update in ivoyager v0.0.12 fixes GUI for cached body start. 182 | 183 | ## [v0.0.11] - 2022-01-19 184 | 185 | Developed using Godot 3.4.2.stable AND a custom Godot build that fixes PWA caching (Faless' [3.x_pwa_prefer_cache branch](https://github.com/godotengine/godot/compare/3.x...Faless:js/3.x_pwa_prefer_cache), commit bf61f9c). 186 | 187 | Requires non-Git-tracked **ivoyager_assets-0.0.10**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). 188 | 189 | ### Added 190 | * (Re-)Enabled view caching. Caches current camera view every 1 sec (for HTML5 export) or on quit (all other platforms). 191 | 192 | ### Changed 193 | * Added project-level si_base_unit.gd static class and removed universe.tscn & universe.gd to support 'ivoyager' submodule changes. 194 | * Removed FullScreenManager from planetarium. Moved functionality to new IVWindowManager in core ivoyager. 195 | * Updated submodule 'ivoyager' to v0.0.11. 196 | 197 | ## [v0.0.10] - 2022-01-09 198 | 199 | Planetarium v0.0.10 is now deployed as a [Progressive Web App (PWA)!](https://godotengine.org/article/godot-web-progress-report-8) Try it at https://ivoyager.dev/planetarium! 200 | 201 | Developed using Godot 3.4.2.stable AND a custom Godot build that fixes PWA caching (Faless' [3.x_pwa_prefer_cache branch](https://github.com/godotengine/godot/compare/3.x...Faless:js/3.x_pwa_prefer_cache), commit bf61f9c). 202 | 203 | Requires non-Git-tracked **ivoyager_assets-0.0.10**; find in [ivoyager releases](https://github.com/ivoyager/ivoyager/releases). For web deployment we use the "-web" version. 204 | 205 | ### Added 206 | * Project-level 'web' directory containing assets for PWA deployment. See [web/README.md](https://github.com/ivoyager/planetarium/tree/master/web). 207 | * A project-level CHANGELOG.md! 208 | 209 | ### Changed 210 | * 'Boot' scene greatly simplified; previous content is now in html loading page. 211 | * Updated submodule 'ivoyager' to v0.0.10. 212 | 213 | 214 | [v0.1.1]: https://github.com/ivoyager/planetarium/compare/v0.1...HEAD 215 | [v0.1]: https://github.com/ivoyager/planetarium/compare/v0.0.25...v0.1 216 | [v0.0.25]: https://github.com/ivoyager/planetarium/compare/v0.0.24...v0.0.25 217 | [v0.0.24]: https://github.com/ivoyager/planetarium/compare/v0.0.23...v0.0.24 218 | [v0.0.23]: https://github.com/ivoyager/planetarium/compare/v0.0.22...v0.0.23 219 | [v0.0.22]: https://github.com/ivoyager/planetarium/compare/v0.0.21...v0.0.22 220 | [v0.0.21]: https://github.com/ivoyager/planetarium/compare/v0.0.20...v0.0.21 221 | [v0.0.20]: https://github.com/ivoyager/planetarium/compare/v0.0.19...v0.0.20 222 | [v0.0.19]: https://github.com/ivoyager/planetarium/compare/v0.0.18...v0.0.19 223 | [v0.0.18]: https://github.com/ivoyager/planetarium/compare/v0.0.17...v0.0.18 224 | [v0.0.17]: https://github.com/ivoyager/planetarium/compare/v0.0.16...v0.0.17 225 | [v0.0.16]: https://github.com/ivoyager/planetarium/compare/v0.0.15...v0.0.16 226 | [v0.0.15]: https://github.com/ivoyager/planetarium/compare/v0.0.14...v0.0.15 227 | [v0.0.14]: https://github.com/ivoyager/planetarium/compare/v0.0.13...v0.0.14 228 | [v0.0.13]: https://github.com/ivoyager/planetarium/compare/v0.0.12...v0.0.13 229 | [v0.0.12]: https://github.com/ivoyager/planetarium/compare/v0.0.11...v0.0.12 230 | [v0.0.11]: https://github.com/ivoyager/planetarium/compare/v0.0.10...v0.0.11 231 | [v0.0.10]: https://github.com/ivoyager/planetarium/compare/v0.0.9-alpha...v0.0.10 232 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2017-2025 Charlie Whitfield; I, Voyager is a registered trademark of Charlie Whitfield in the US 2 | 3 | Apache License 4 | Version 2.0, January 2004 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, 12 | and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by 15 | the copyright owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all 18 | other entities that control, are controlled by, or are under common 19 | control with that entity. For the purposes of this definition, 20 | "control" means (i) the power, direct or indirect, to cause the 21 | direction or management of such entity, whether by contract or 22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 23 | outstanding shares, or (iii) beneficial ownership of such entity. 24 | 25 | "You" (or "Your") shall mean an individual or Legal Entity 26 | exercising permissions granted by this License. 27 | 28 | "Source" form shall mean the preferred form for making modifications, 29 | including but not limited to software source code, documentation 30 | source, and configuration files. 31 | 32 | "Object" form shall mean any form resulting from mechanical 33 | transformation or translation of a Source form, including but 34 | not limited to compiled object code, generated documentation, 35 | and conversions to other media types. 36 | 37 | "Work" shall mean the work of authorship, whether in Source or 38 | Object form, made available under the License, as indicated by a 39 | copyright notice that is included in or attached to the work 40 | (an example is provided in the Appendix below). 41 | 42 | "Derivative Works" shall mean any work, whether in Source or Object 43 | form, that is based on (or derived from) the Work and for which the 44 | editorial revisions, annotations, elaborations, or other modifications 45 | represent, as a whole, an original work of authorship. For the purposes 46 | of this License, Derivative Works shall not include works that remain 47 | separable from, or merely link (or bind by name) to the interfaces of, 48 | the Work and Derivative Works thereof. 49 | 50 | "Contribution" shall mean any work of authorship, including 51 | the original version of the Work and any modifications or additions 52 | to that Work or Derivative Works thereof, that is intentionally 53 | submitted to Licensor for inclusion in the Work by the copyright owner 54 | or by an individual or Legal Entity authorized to submit on behalf of 55 | the copyright owner. For the purposes of this definition, "submitted" 56 | means any form of electronic, verbal, or written communication sent 57 | to the Licensor or its representatives, including but not limited to 58 | communication on electronic mailing lists, source code control systems, 59 | and issue tracking systems that are managed by, or on behalf of, the 60 | Licensor for the purpose of discussing and improving the Work, but 61 | excluding communication that is conspicuously marked or otherwise 62 | designated in writing by the copyright owner as "Not a Contribution." 63 | 64 | "Contributor" shall mean Licensor and any individual or Legal Entity 65 | on behalf of whom a Contribution has been received by Licensor and 66 | subsequently incorporated within the Work. 67 | 68 | 2. Grant of Copyright License. Subject to the terms and conditions of 69 | this License, each Contributor hereby grants to You a perpetual, 70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 71 | copyright license to reproduce, prepare Derivative Works of, 72 | publicly display, publicly perform, sublicense, and distribute the 73 | Work and such Derivative Works in Source or Object form. 74 | 75 | 3. Grant of Patent License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | (except as stated in this section) patent license to make, have made, 79 | use, offer to sell, sell, import, and otherwise transfer the Work, 80 | where such license applies only to those patent claims licensable 81 | by such Contributor that are necessarily infringed by their 82 | Contribution(s) alone or by combination of their Contribution(s) 83 | with the Work to which such Contribution(s) was submitted. If You 84 | institute patent litigation against any entity (including a 85 | cross-claim or counterclaim in a lawsuit) alleging that the Work 86 | or a Contribution incorporated within the Work constitutes direct 87 | or contributory patent infringement, then any patent licenses 88 | granted to You under this License for that Work shall terminate 89 | as of the date such litigation is filed. 90 | 91 | 4. Redistribution. You may reproduce and distribute copies of the 92 | Work or Derivative Works thereof in any medium, with or without 93 | modifications, and in Source or Object form, provided that You 94 | meet the following conditions: 95 | 96 | (a) You must give any other recipients of the Work or 97 | Derivative Works a copy of this License; and 98 | 99 | (b) You must cause any modified files to carry prominent notices 100 | stating that You changed the files; and 101 | 102 | (c) You must retain, in the Source form of any Derivative Works 103 | that You distribute, all copyright, patent, trademark, and 104 | attribution notices from the Source form of the Work, 105 | excluding those notices that do not pertain to any part of 106 | the Derivative Works; and 107 | 108 | (d) If the Work includes a "NOTICE" text file as part of its 109 | distribution, then any Derivative Works that You distribute must 110 | include a readable copy of the attribution notices contained 111 | within such NOTICE file, excluding those notices that do not 112 | pertain to any part of the Derivative Works, in at least one 113 | of the following places: within a NOTICE text file distributed 114 | as part of the Derivative Works; within the Source form or 115 | documentation, if provided along with the Derivative Works; or, 116 | within a display generated by the Derivative Works, if and 117 | wherever such third-party notices normally appear. The contents 118 | of the NOTICE file are for informational purposes only and 119 | do not modify the License. You may add Your own attribution 120 | notices within Derivative Works that You distribute, alongside 121 | or as an addendum to the NOTICE text from the Work, provided 122 | that such additional attribution notices cannot be construed 123 | as modifying the License. 124 | 125 | You may add Your own copyright statement to Your modifications and 126 | may provide additional or different license terms and conditions 127 | for use, reproduction, or distribution of Your modifications, or 128 | for any such Derivative Works as a whole, provided Your use, 129 | reproduction, and distribution of the Work otherwise complies with 130 | the conditions stated in this License. 131 | 132 | 5. Submission of Contributions. Unless You explicitly state otherwise, 133 | any Contribution intentionally submitted for inclusion in the Work 134 | by You to the Licensor shall be under the terms and conditions of 135 | this License, without any additional terms or conditions. 136 | Notwithstanding the above, nothing herein shall supersede or modify 137 | the terms of any separate license agreement you may have executed 138 | with Licensor regarding such Contributions. 139 | 140 | 6. Trademarks. This License does not grant permission to use the trade 141 | names, trademarks, service marks, or product names of the Licensor, 142 | except as required for reasonable and customary use in describing the 143 | origin of the Work and reproducing the content of the NOTICE file. 144 | 145 | 7. Disclaimer of Warranty. Unless required by applicable law or 146 | agreed to in writing, Licensor provides the Work (and each 147 | Contributor provides its Contributions) on an "AS IS" BASIS, 148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 149 | implied, including, without limitation, any warranties or conditions 150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 151 | PARTICULAR PURPOSE. You are solely responsible for determining the 152 | appropriateness of using or redistributing the Work and assume any 153 | risks associated with Your exercise of permissions under this License. 154 | 155 | 8. Limitation of Liability. In no event and under no legal theory, 156 | whether in tort (including negligence), contract, or otherwise, 157 | unless required by applicable law (such as deliberate and grossly 158 | negligent acts) or agreed to in writing, shall any Contributor be 159 | liable to You for damages, including any direct, indirect, special, 160 | incidental, or consequential damages of any character arising as a 161 | result of this License or out of the use or inability to use the 162 | Work (including but not limited to damages for loss of goodwill, 163 | work stoppage, computer failure or malfunction, or any and all 164 | other commercial damages or losses), even if such Contributor 165 | has been advised of the possibility of such damages. 166 | 167 | 9. Accepting Warranty or Additional Liability. While redistributing 168 | the Work or Derivative Works thereof, You may choose to offer, 169 | and charge a fee for, acceptance of support, warranty, indemnity, 170 | or other liability obligations and/or rights consistent with this 171 | License. However, in accepting such obligations, You may act only 172 | on Your own behalf and on Your sole responsibility, not on behalf 173 | of any other Contributor, and only if You agree to indemnify, 174 | defend, and hold each Contributor harmless for any liability 175 | incurred by, or claims asserted against, such Contributor by reason 176 | of your accepting any such warranty or additional liability. 177 | 178 | END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following 183 | boilerplate notice, with the fields enclosed by brackets "[]" 184 | replaced with your own identifying information. (Don't include 185 | the brackets!) The text should be enclosed in the appropriate 186 | comment syntax for the file format. We also recommend that a 187 | file or class name and description of purpose be included on the 188 | same "printed page" as the copyright notice for easier 189 | identification within third-party archives. 190 | 191 | Copyright [yyyy] [name of copyright owner] 192 | 193 | Licensed under the Apache License, Version 2.0 (the "License"); 194 | you may not use this file except in compliance with the License. 195 | You may obtain a copy of the License at 196 | 197 | http://www.apache.org/licenses/LICENSE-2.0 198 | 199 | Unless required by applicable law or agreed to in writing, software 200 | distributed under the License is distributed on an "AS IS" BASIS, 201 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 202 | See the License for the specific language governing permissions and 203 | limitations under the License. 204 | -------------------------------------------------------------------------------- /3RD_PARTY.md: -------------------------------------------------------------------------------- 1 | # Third-Party Copyright and License Information 2 | 3 | This document provides copyright and license information for third-party software and files used in "I, Voyager" software distributed from https://www.ivoyager.dev and https://github.com/ivoyager. 4 | 5 | The master version of this file is maintained [here](https://github.com/ivoyager/ivoyager_core/blob/master/3RD_PARTY.md). 6 | 7 | **Contact:** Charlie Whitfield (mail@ivoyager.dev) 8 | 9 | --- 10 | 11 | ## Software 12 | 13 | ### Godot Engine 14 | 15 | I, Voyager software distributions run on the [Godot Engine](https://godotengine.org/) and were developed using the Godot Engine editor. Licencing information for files used in Godot Engine can be found [here](https://github.com/godotengine/godot/blob/master/COPYRIGHT.txt). 16 | 17 | - **Copyright:** 2014-present, Godot Engine [contributors](https://github.com/godotengine/godot/blob/master/AUTHORS.md); 2007-2014, Juan Linietsky, Ariel Manzur 18 | - **License:** [MIT](#mit) 19 | 20 | 21 | ## Files 22 | 23 | These files are located in subdirectories of `/addons/ivoyager_assets/` in project development builds and distributed from [this repository](https://github.com/ivoyager/asset_downloads), except where noted otherwise. Many of the images here were modified by Charlie Whitfield. 24 | 25 | 26 | ### World maps by Björn Jónsson (from Planetary Society) 27 | 28 | Files were downloaded from https://www.planetary.org/space-images, and reduced in size from much larger file images. 29 | 30 | Subdirectory `/2d_bodies/` contains derived images (flat projections of wrapped globes). 31 | 32 | - **Files:** 33 | - `/maps/Europa.albedo.8192.jpg` 34 | - `/maps/Jupiter.albedo.8192.jpg` 35 | - **Copyright:** Björn Jónsson 36 | - **License:** [CC-BY-3.0](#cc-by-30) 37 | 38 | 39 | ### World maps by Björn Jónsson (from bjj.mmedia.is) 40 | 41 | Files were downloaded from https://bjj.mmedia.is/data/planetary_maps.html. 42 | 43 | Neptune color was significantly adjusted by Charlie Whitfield to match published images [here](https://academic.oup.com/mnras/article/527/4/11521/7511973). 44 | 45 | Subdirectory `/2d_bodies/` contains derived images (flat projections of wrapped globes). 46 | 47 | - **Files:** 48 | - `/maps/Callisto.albedo.1800.jpg` 49 | - `/maps/Ganymede.albedo.1800.jpg` 50 | - `/maps/Io.albedo.3600.jpg` 51 | - `/maps/Neptune.albedo.4096.jpg` 52 | - `/maps/Rhea.albedo.1800.jpg` 53 | - `/maps/Saturn.albedo.2880.jpg` 54 | - `/maps/Venus.albedo.4096.jpg` 55 | - **Copyright:** Björn Jónsson 56 | - **License:** See full website notice [here](https://bjj.mmedia.is/data/planetary_maps.html). Excerpt: 57 | ``` 58 | All the planetary maps available on these pages are publicly available. 59 | You do not need a special permission to use them but if you do then 60 | please mention their origin in your work, e.g. "created by Björn 61 | Jónsson" or something equivalent. 62 | ``` 63 | 64 | 65 | ### Sun map by James Hastings-Trew 66 | 67 | File downloaded from https://planetpixelemporium.com/sun.html. 68 | 69 | Subdirectory `/2d_bodies/` contains derived images (flat projections of wrapped globes). 70 | 71 | - **File:** `/maps/Sun.emission.4096.jpg` 72 | - **Copyright:** James Hastings-Trew 73 | - **License:** See full website notice [here](https://planetpixelemporium.com/planets.html). Excerpt: 74 | ``` 75 | The maps are free to download and use as source material or resource in 76 | artwork or rendering (CGI or real time) in any kind of project - personal, 77 | commercial, broadcast, or display. You are not free to redistribute the 78 | maps "as is" in any medium - online, CD, for sale, etc. where the primary 79 | intent is to distribute the maps themselves and not the result of using 80 | the maps, without my permission. 81 | ``` 82 | 83 | 84 | ### NASA images and models 85 | 86 | Most NASA images and models are in the public domain. Use is governed by [NASA Images and Media Usage Guidelines](https://www.nasa.gov/nasa-brand-center/images-and-media/). 87 | 88 | Many world maps were modified by Charlie Whitfield. These modifications include substantial color adjustments to Mercury, Mars, Ceres and Uranus. Grid lines were added to unimaged areas of the moons of Uranus and Neptune. 89 | 90 | Starmaps were downloaded from https://svs.gsfc.nasa.gov/4851/ ("Deep Star Maps 2020"). Some image processing was applied by Charlie Whitfield. 91 | 92 | All 3D models were downloaded from https://science.nasa.gov/3d-resources/. Model subdirectories each contain the downloaded file (usually *.glb extension) and files extracted from the model by Godot's importer. 93 | 94 | Subdirectory `/2d_bodies/` contains derived images (flat projections of wrapped globes and 3D models). 95 | 96 | - **Files:** 97 | - `/maps/Ariel.albedo.2048.jpg` 98 | - `/maps/Ceres.albedo.4096.jpg` 99 | - `/maps/Charon.albedo.4096.jpg` 100 | - `/maps/Dione.albedo.4096.jpg` 101 | - `/maps/Earth.albedo.8192.jpg` 102 | - `/maps/Enceladus.albedo.4096.jpg` 103 | - `/maps/Iapetus.albedo.4096.jpg` 104 | - `/maps/Mars.albedo.4096.jpg` 105 | - `/maps/Mercury.albedo.4096.jpg` 106 | - `/maps/Miranda.albedo.2048.jpg` 107 | - `/maps/Moon.albedo.4096.jpg` 108 | - `/maps/Oberon.albedo.2048.jpg` 109 | - `/maps/Phoebe.albedo.2048.jpg` 110 | - `/maps/Pluto.albedo.4096.jpg` 111 | - `/maps/Tethys.albedo.4096.jpg` 112 | - `/maps/Titania.albedo.2048.jpg` 113 | - `/maps/Triton.albedo.4096.jpg` 114 | - `/maps/Umbriel.albedo.2048.jpg` 115 | - `/starmaps/starmap_8k.jpg` 116 | - `/starmaps/starmap_16k.jpg` 117 | - `pale_blue_dot.png` is distributed in the [Project Template repository](https://github.com/ivoyager/project_template). 118 | - `pale_blue_dot_453x614.jpg` is distributed in web-based deployments of the [Planetarium app](https://www.ivoyager.dev/planetarium/). 119 | - **Model subdirectories:** 120 | - `/models/arrokoth/*` 121 | - `/models/bennu/*` 122 | - `/models/deimos/*` 123 | - `/models/eros/*` 124 | - `/models/hubble/*` 125 | - `/models/hyperion/*` 126 | - `/models/iss/*` 127 | - `/models/itokawa/*` 128 | - `/models/juno/*` 129 | - `/models/mimas/*` 130 | - `/models/phobos/*` 131 | - `/models/vesta/*` 132 | - **Copyright:** Public Domain 133 | - **License:** Public Domain; see [NASA Images and Media Usage Guidelines](https://www.nasa.gov/nasa-brand-center/images-and-media/). 134 | 135 | 136 | ### Blue noise by Christoph Peters 137 | 138 | File downloaded from https://momentsingraphics.de/BlueNoise.html. 139 | 140 | - **File:** `/noise/blue_noise_1024.png` 141 | - **Copyright:** Public domain 142 | - **License:** [CC0 1.0 Universal](#cc0-10) 143 | 144 | 145 | ### Roboto / Noto Sans Symbols fonts 146 | 147 | The font file used is a merge of Roboto and Noto Sans Symbols, both [Google Fonts](https://fonts.google.com/). 148 | 149 | - **File:** `/fonts/Roboto-NotoSansSymbols-merged.ttf` 150 | - **Copyright:** Google LLC 151 | - **License:** [SIL OPEN FONT LICENSE Version 1.1](#sil-open-font-licence-version-10) 152 | 153 | 154 | --- 155 | 156 | ## Licenses in Detail 157 | 158 | ### MIT 159 | 160 | ``` 161 | Permission is hereby granted, free of charge, to any person obtaining 162 | a copy of this software and associated documentation files (the 163 | "Software"), to deal in the Software without restriction, including 164 | without limitation the rights to use, copy, modify, merge, publish, 165 | distribute, sublicense, and/or sell copies of the Software, and to 166 | permit persons to whom the Software is furnished to do so, subject to 167 | the following conditions: 168 | 169 | The above copyright notice and this permission notice shall be 170 | included in all copies or substantial portions of the Software. 171 | 172 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 173 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 174 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 175 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 176 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 177 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 178 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 179 | ``` 180 | 181 | ### CC-BY-3.0 182 | 183 | [Creative Commons Attribution 3.0 Unported](http://creativecommons.org/licenses/by/3.0/) 184 | 185 | ``` 186 | Creative Commons Attribution 3.0 Unported 187 | 188 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 189 | LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN 190 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION 191 | ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE 192 | INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 193 | ITS USE. 194 | 195 | License 196 | 197 | THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE 198 | COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY 199 | COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS 200 | AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. 201 | 202 | BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE 203 | TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY 204 | BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS 205 | CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND 206 | CONDITIONS. 207 | 208 | 1. Definitions 209 | 210 | a. "Adaptation" means a work based upon the Work, or upon the Work and 211 | other pre-existing works, such as a translation, adaptation, derivative 212 | work, arrangement of music or other alterations of a literary or 213 | artistic work, or phonogram or performance and includes cinematographic 214 | adaptations or any other form in which the Work may be recast, 215 | transformed, or adapted including in any form recognizably derived from 216 | the original, except that a work that constitutes a Collection will not 217 | be considered an Adaptation for the purpose of this License. For the 218 | avoidance of doubt, where the Work is a musical work, performance or 219 | phonogram, the synchronization of the Work in timed-relation with a 220 | moving image ("synching") will be considered an Adaptation for the 221 | purpose of this License. 222 | 223 | b. "Collection" means a collection of literary or artistic works, such 224 | as encyclopedias and anthologies, or performances, phonograms or 225 | broadcasts, or other works or subject matter other than works listed in 226 | Section 1(f) below, which, by reason of the selection and arrangement of 227 | their contents, constitute intellectual creations, in which the Work is 228 | included in its entirety in unmodified form along with one or more other 229 | contributions, each constituting separate and independent works in 230 | themselves, which together are assembled into a collective whole. A work 231 | that constitutes a Collection will not be considered an Adaptation (as 232 | defined above) for the purposes of this License. 233 | 234 | c. "Distribute" means to make available to the public the original and 235 | copies of the Work or Adaptation, as appropriate, through sale or other 236 | transfer of ownership. 237 | 238 | d. "Licensor" means the individual, individuals, entity or entities that 239 | offer(s) the Work under the terms of this License. 240 | 241 | e. "Original Author" means, in the case of a literary or artistic work, 242 | the individual, individuals, entity or entities who created the Work or 243 | if no individual or entity can be identified, the publisher; and in 244 | addition (i) in the case of a performance the actors, singers, 245 | musicians, dancers, and other persons who act, sing, deliver, declaim, 246 | play in, interpret or otherwise perform literary or artistic works or 247 | expressions of folklore; (ii) in the case of a phonogram the producer 248 | being the person or legal entity who first fixes the sounds of a 249 | performance or other sounds; and, (iii) in the case of broadcasts, the 250 | organization that transmits the broadcast. 251 | 252 | f. "Work" means the literary and/or artistic work offered under the 253 | terms of this License including without limitation any production in the 254 | literary, scientific and artistic domain, whatever may be the mode or 255 | form of its expression including digital form, such as a book, pamphlet 256 | and other writing; a lecture, address, sermon or other work of the same 257 | nature; a dramatic or dramatico-musical work; a choreographic work or 258 | entertainment in dumb show; a musical composition with or without words; 259 | a cinematographic work to which are assimilated works expressed by a 260 | process analogous to cinematography; a work of drawing, painting, 261 | architecture, sculpture, engraving or lithography; a photographic work 262 | to which are assimilated works expressed by a process analogous to 263 | photography; a work of applied art; an illustration, map, plan, sketch 264 | or three-dimensional work relative to geography, topography, 265 | architecture or science; a performance; a broadcast; a phonogram; a 266 | compilation of data to the extent it is protected as a copyrightable 267 | work; or a work performed by a variety or circus performer to the extent 268 | it is not otherwise considered a literary or artistic work. 269 | 270 | g. "You" means an individual or entity exercising rights under this 271 | License who has not previously violated the terms of this License with 272 | respect to the Work, or who has received express permission from the 273 | Licensor to exercise rights under this License despite a previous 274 | violation. 275 | 276 | h. "Publicly Perform" means to perform public recitations of the Work 277 | and to communicate to the public those public recitations, by any means 278 | or process, including by wire or wireless means or public digital 279 | performances; to make available to the public Works in such a way that 280 | members of the public may access these Works from a place and at a place 281 | individually chosen by them; to perform the Work to the public by any 282 | means or process and the communication to the public of the performances 283 | of the Work, including by public digital performance; to broadcast and 284 | rebroadcast the Work by any means including signs, sounds or images. 285 | 286 | i. "Reproduce" means to make copies of the Work by any means including 287 | without limitation by sound or visual recordings and the right of 288 | fixation and reproducing fixations of the Work, including storage of a 289 | protected performance or phonogram in digital form or other electronic 290 | medium. 291 | 292 | 2. Fair Dealing Rights. Nothing in this License is intended to reduce, 293 | limit, or restrict any uses free from copyright or rights arising from 294 | limitations or exceptions that are provided for in connection with the 295 | copyright protection under copyright law or other applicable laws. 296 | 297 | 3. License Grant. Subject to the terms and conditions of this License, 298 | Licensor hereby grants You a worldwide, royalty-free, non-exclusive, 299 | perpetual (for the duration of the applicable copyright) license to 300 | exercise the rights in the Work as stated below: 301 | 302 | a. to Reproduce the Work, to incorporate the Work into one or more 303 | Collections, and to Reproduce the Work as incorporated in the 304 | Collections; 305 | 306 | b. to create and Reproduce Adaptations provided that any such 307 | Adaptation, including any translation in any medium, takes reasonable 308 | steps to clearly label, demarcate or otherwise identify that changes 309 | were made to the original Work. For example, a translation could be 310 | marked "The original work was translated from English to Spanish," or a 311 | modification could indicate "The original work has been modified."; 312 | 313 | c. to Distribute and Publicly Perform the Work including as incorporated 314 | in Collections; and, 315 | 316 | d. to Distribute and Publicly Perform Adaptations. 317 | 318 | e. For the avoidance of doubt: 319 | 320 | i. Non-waivable Compulsory License Schemes. In those jurisdictions in 321 | which the right to collect royalties through any statutory or compulsory 322 | licensing scheme cannot be waived, the Licensor reserves the exclusive 323 | right to collect such royalties for any exercise by You of the rights 324 | granted under this License; 325 | 326 | ii. Waivable Compulsory License Schemes. In those jurisdictions in which 327 | the right to collect royalties through any statutory or compulsory 328 | licensing scheme can be waived, the Licensor waives the exclusive right 329 | to collect such royalties for any exercise by You of the rights granted 330 | under this License; and, 331 | 332 | iii. Voluntary License Schemes. The Licensor waives the right to collect 333 | royalties, whether individually or, in the event that the Licensor is a 334 | member of a collecting society that administers voluntary licensing 335 | schemes, via that society, from any exercise by You of the rights 336 | granted under this License. 337 | 338 | The above rights may be exercised in all media and formats whether now 339 | known or hereafter devised. The above rights include the right to make 340 | such modifications as are technically necessary to exercise the rights 341 | in other media and formats. Subject to Section 8(f), all rights not 342 | expressly granted by Licensor are hereby reserved. 343 | 344 | 4. Restrictions. The license granted in Section 3 above is expressly 345 | made subject to and limited by the following restrictions: 346 | 347 | a. You may Distribute or Publicly Perform the Work only under the terms 348 | of this License. You must include a copy of, or the Uniform Resource 349 | Identifier (URI) for, this License with every copy of the Work You 350 | Distribute or Publicly Perform. You may not offer or impose any terms on 351 | the Work that restrict the terms of this License or the ability of the 352 | recipient of the Work to exercise the rights granted to that recipient 353 | under the terms of the License. You may not sublicense the Work. You 354 | must keep intact all notices that refer to this License and to the 355 | disclaimer of warranties with every copy of the Work You Distribute or 356 | Publicly Perform. When You Distribute or Publicly Perform the Work, You 357 | may not impose any effective technological measures on the Work that 358 | restrict the ability of a recipient of the Work from You to exercise the 359 | rights granted to that recipient under the terms of the License. This 360 | Section 4(a) applies to the Work as incorporated in a Collection, but 361 | this does not require the Collection apart from the Work itself to be 362 | made subject to the terms of this License. If You create a Collection, 363 | upon notice from any Licensor You must, to the extent practicable, 364 | remove from the Collection any credit as required by Section 4(b), as 365 | requested. If You create an Adaptation, upon notice from any Licensor 366 | You must, to the extent practicable, remove from the Adaptation any 367 | credit as required by Section 4(b), as requested. 368 | 369 | b. If You Distribute, or Publicly Perform the Work or any Adaptations or 370 | Collections, You must, unless a request has been made pursuant to 371 | Section 4(a), keep intact all copyright notices for the Work and 372 | provide, reasonable to the medium or means You are utilizing: (i) the 373 | name of the Original Author (or pseudonym, if applicable) if supplied, 374 | and/or if the Original Author and/or Licensor designate another party or 375 | parties (e.g., a sponsor institute, publishing entity, journal) for 376 | attribution ("Attribution Parties") in Licensor's copyright notice, 377 | terms of service or by other reasonable means, the name of such party or 378 | parties; (ii) the title of the Work if supplied; (iii) to the extent 379 | reasonably practicable, the URI, if any, that Licensor specifies to be 380 | associated with the Work, unless such URI does not refer to the 381 | copyright notice or licensing information for the Work; and (iv) , 382 | consistent with Section 3(b), in the case of an Adaptation, a credit 383 | identifying the use of the Work in the Adaptation (e.g., "French 384 | translation of the Work by Original Author," or "Screenplay based on 385 | original Work by Original Author"). The credit required by this Section 386 | 4 (b) may be implemented in any reasonable manner; provided, however, 387 | that in the case of a Adaptation or Collection, at a minimum such credit 388 | will appear, if a credit for all contributing authors of the Adaptation 389 | or Collection appears, then as part of these credits and in a manner at 390 | least as prominent as the credits for the other contributing authors. 391 | For the avoidance of doubt, You may only use the credit required by this 392 | Section for the purpose of attribution in the manner set out above and, 393 | by exercising Your rights under this License, You may not implicitly or 394 | explicitly assert or imply any connection with, sponsorship or 395 | endorsement by the Original Author, Licensor and/or Attribution Parties, 396 | as appropriate, of You or Your use of the Work, without the separate, 397 | express prior written permission of the Original Author, Licensor and/or 398 | Attribution Parties. 399 | 400 | c. Except as otherwise agreed in writing by the Licensor or as may be 401 | otherwise permitted by applicable law, if You Reproduce, Distribute or 402 | Publicly Perform the Work either by itself or as part of any Adaptations 403 | or Collections, You must not distort, mutilate, modify or take other 404 | derogatory action in relation to the Work which would be prejudicial to 405 | the Original Author's honor or reputation. Licensor agrees that in those 406 | jurisdictions (e.g. Japan), in which any exercise of the right granted 407 | in Section 3(b) of this License (the right to make Adaptations) would be 408 | deemed to be a distortion, mutilation, modification or other derogatory 409 | action prejudicial to the Original Author's honor and reputation, the 410 | Licensor will waive or not assert, as appropriate, this Section, to the 411 | fullest extent permitted by the applicable national law, to enable You 412 | to reasonably exercise Your right under Section 3(b) of this License 413 | (right to make Adaptations) but not otherwise. 414 | 415 | 5. Representations, Warranties and Disclaimer 416 | 417 | UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR 418 | OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY 419 | KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, 420 | INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, 421 | FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF 422 | LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, 423 | WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE 424 | EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 425 | 426 | 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE 427 | LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR 428 | ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES 429 | ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS 430 | BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 431 | 432 | 7. Termination 433 | 434 | a. This License and the rights granted hereunder will terminate 435 | automatically upon any breach by You of the terms of this License. 436 | Individuals or entities who have received Adaptations or Collections 437 | from You under this License, however, will not have their licenses 438 | terminated provided such individuals or entities remain in full 439 | compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will 440 | survive any termination of this License. 441 | 442 | b. Subject to the above terms and conditions, the license granted here 443 | is perpetual (for the duration of the applicable copyright in the Work). 444 | Notwithstanding the above, Licensor reserves the right to release the 445 | Work under different license terms or to stop distributing the Work at 446 | any time; provided, however that any such election will not serve to 447 | withdraw this License (or any other license that has been, or is 448 | required to be, granted under the terms of this License), and this 449 | License will continue in full force and effect unless terminated as 450 | stated above. 451 | 452 | 8. Miscellaneous 453 | 454 | a. Each time You Distribute or Publicly Perform the Work or a 455 | Collection, the Licensor offers to the recipient a license to the Work 456 | on the same terms and conditions as the license granted to You under 457 | this License. 458 | 459 | b. Each time You Distribute or Publicly Perform an Adaptation, Licensor 460 | offers to the recipient a license to the original Work on the same terms 461 | and conditions as the license granted to You under this License. 462 | 463 | c. If any provision of this License is invalid or unenforceable under 464 | applicable law, it shall not affect the validity or enforceability of 465 | the remainder of the terms of this License, and without further action 466 | by the parties to this agreement, such provision shall be reformed to 467 | the minimum extent necessary to make such provision valid and 468 | enforceable. 469 | 470 | d. No term or provision of this License shall be deemed waived and no 471 | breach consented to unless such waiver or consent shall be in writing 472 | and signed by the party to be charged with such waiver or consent. This 473 | License constitutes the entire agreement between the parties with 474 | respect to the Work licensed here. There are no understandings, 475 | agreements or representations with respect to the Work not specified 476 | here. Licensor shall not be bound by any additional provisions that may 477 | appear in any communication from You. 478 | 479 | e. This License may not be modified without the mutual written agreement 480 | of the Licensor and You. 481 | 482 | f. The rights granted under, and the subject matter referenced, in this 483 | License were drafted utilizing the terminology of the Berne Convention 484 | for the Protection of Literary and Artistic Works (as amended on 485 | September 28, 1979), the Rome Convention of 1961, the WIPO Copyright 486 | Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and 487 | the Universal Copyright Convention (as revised on July 24, 1971). These 488 | rights and subject matter take effect in the relevant jurisdiction in 489 | which the License terms are sought to be enforced according to the 490 | corresponding provisions of the implementation of those treaty 491 | provisions in the applicable national law. If the standard suite of 492 | rights granted under applicable copyright law includes additional rights 493 | not granted under this License, such additional rights are deemed to be 494 | included in the License; this License is not intended to restrict the 495 | license of any rights under applicable law. 496 | 497 | Creative Commons Notice 498 | 499 | Creative Commons is not a party to this License, and makes no warranty 500 | whatsoever in connection with the Work. Creative Commons will not be 501 | liable to You or any party on any legal theory for any damages 502 | whatsoever, including without limitation any general, special, 503 | incidental or consequential damages arising in connection to this 504 | license. Notwithstanding the foregoing two (2) sentences, if Creative 505 | Commons has expressly identified itself as the Licensor hereunder, it 506 | shall have all rights and obligations of Licensor. 507 | . 508 | Except for the limited purpose of indicating to the public that the Work 509 | is licensed under the CCPL, Creative Commons does not authorize the use 510 | by either party of the trademark "Creative Commons" or any related 511 | trademark or logo of Creative Commons without the prior written consent 512 | of Creative Commons. Any permitted use will be in compliance with 513 | Creative Commons' then-current trademark usage guidelines, as may be 514 | published on its website or otherwise made available upon request from 515 | time to time. For the avoidance of doubt, this trademark restriction 516 | does not form part of this License. 517 | 518 | Creative Commons may be contacted at http://creativecommons.org/. 519 | ``` 520 | 521 | ### CC0 1.0 522 | 523 | [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/) 524 | 525 | 526 | ``` 527 | Creative Commons Legal Code 528 | 529 | CC0 1.0 Universal 530 | 531 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 532 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 533 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 534 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 535 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 536 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 537 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 538 | HEREUNDER. 539 | 540 | Statement of Purpose 541 | 542 | The laws of most jurisdictions throughout the world automatically confer 543 | exclusive Copyright and Related Rights (defined below) upon the creator 544 | and subsequent owner(s) (each and all, an "owner") of an original work of 545 | authorship and/or a database (each, a "Work"). 546 | 547 | Certain owners wish to permanently relinquish those rights to a Work for 548 | the purpose of contributing to a commons of creative, cultural and 549 | scientific works ("Commons") that the public can reliably and without fear 550 | of later claims of infringement build upon, modify, incorporate in other 551 | works, reuse and redistribute as freely as possible in any form whatsoever 552 | and for any purposes, including without limitation commercial purposes. 553 | These owners may contribute to the Commons to promote the ideal of a free 554 | culture and the further production of creative, cultural and scientific 555 | works, or to gain reputation or greater distribution for their Work in 556 | part through the use and efforts of others. 557 | 558 | For these and/or other purposes and motivations, and without any 559 | expectation of additional consideration or compensation, the person 560 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 561 | is an owner of Copyright and Related Rights in the Work, voluntarily 562 | elects to apply CC0 to the Work and publicly distribute the Work under its 563 | terms, with knowledge of his or her Copyright and Related Rights in the 564 | Work and the meaning and intended legal effect of CC0 on those rights. 565 | 566 | 1. Copyright and Related Rights. A Work made available under CC0 may be 567 | protected by copyright and related or neighboring rights ("Copyright and 568 | Related Rights"). Copyright and Related Rights include, but are not 569 | limited to, the following: 570 | 571 | i. the right to reproduce, adapt, distribute, perform, display, 572 | communicate, and translate a Work; 573 | ii. moral rights retained by the original author(s) and/or performer(s); 574 | iii. publicity and privacy rights pertaining to a person's image or 575 | likeness depicted in a Work; 576 | iv. rights protecting against unfair competition in regards to a Work, 577 | subject to the limitations in paragraph 4(a), below; 578 | v. rights protecting the extraction, dissemination, use and reuse of data 579 | in a Work; 580 | vi. database rights (such as those arising under Directive 96/9/EC of the 581 | European Parliament and of the Council of 11 March 1996 on the legal 582 | protection of databases, and under any national implementation 583 | thereof, including any amended or successor version of such 584 | directive); and 585 | vii. other similar, equivalent or corresponding rights throughout the 586 | world based on applicable law or treaty, and any national 587 | implementations thereof. 588 | 589 | 2. Waiver. To the greatest extent permitted by, but not in contravention 590 | of, applicable law, Affirmer hereby overtly, fully, permanently, 591 | irrevocably and unconditionally waives, abandons, and surrenders all of 592 | Affirmer's Copyright and Related Rights and associated claims and causes 593 | of action, whether now known or unknown (including existing as well as 594 | future claims and causes of action), in the Work (i) in all territories 595 | worldwide, (ii) for the maximum duration provided by applicable law or 596 | treaty (including future time extensions), (iii) in any current or future 597 | medium and for any number of copies, and (iv) for any purpose whatsoever, 598 | including without limitation commercial, advertising or promotional 599 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 600 | member of the public at large and to the detriment of Affirmer's heirs and 601 | successors, fully intending that such Waiver shall not be subject to 602 | revocation, rescission, cancellation, termination, or any other legal or 603 | equitable action to disrupt the quiet enjoyment of the Work by the public 604 | as contemplated by Affirmer's express Statement of Purpose. 605 | 606 | 3. Public License Fallback. Should any part of the Waiver for any reason 607 | be judged legally invalid or ineffective under applicable law, then the 608 | Waiver shall be preserved to the maximum extent permitted taking into 609 | account Affirmer's express Statement of Purpose. In addition, to the 610 | extent the Waiver is so judged Affirmer hereby grants to each affected 611 | person a royalty-free, non transferable, non sublicensable, non exclusive, 612 | irrevocable and unconditional license to exercise Affirmer's Copyright and 613 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 614 | maximum duration provided by applicable law or treaty (including future 615 | time extensions), (iii) in any current or future medium and for any number 616 | of copies, and (iv) for any purpose whatsoever, including without 617 | limitation commercial, advertising or promotional purposes (the 618 | "License"). The License shall be deemed effective as of the date CC0 was 619 | applied by Affirmer to the Work. Should any part of the License for any 620 | reason be judged legally invalid or ineffective under applicable law, such 621 | partial invalidity or ineffectiveness shall not invalidate the remainder 622 | of the License, and in such case Affirmer hereby affirms that he or she 623 | will not (i) exercise any of his or her remaining Copyright and Related 624 | Rights in the Work or (ii) assert any associated claims and causes of 625 | action with respect to the Work, in either case contrary to Affirmer's 626 | express Statement of Purpose. 627 | 628 | 4. Limitations and Disclaimers. 629 | 630 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 631 | surrendered, licensed or otherwise affected by this document. 632 | b. Affirmer offers the Work as-is and makes no representations or 633 | warranties of any kind concerning the Work, express, implied, 634 | statutory or otherwise, including without limitation warranties of 635 | title, merchantability, fitness for a particular purpose, non 636 | infringement, or the absence of latent or other defects, accuracy, or 637 | the present or absence of errors, whether or not discoverable, all to 638 | the greatest extent permissible under applicable law. 639 | c. Affirmer disclaims responsibility for clearing rights of other persons 640 | that may apply to the Work or any use thereof, including without 641 | limitation any person's Copyright and Related Rights in the Work. 642 | Further, Affirmer disclaims responsibility for obtaining any necessary 643 | consents, permissions or other rights required for any use of the 644 | Work. 645 | d. Affirmer understands and acknowledges that Creative Commons is not a 646 | party to this document and has no duty or obligation with respect to 647 | this CC0 or use of the Work. 648 | ``` 649 | 650 | 651 | ### SIL OPEN FONT LICENSE Version 1.1 652 | 653 | [SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007](https://openfontlicense.org/open-font-license-official-text/) 654 | ``` 655 | PREAMBLE 656 | The goals of the Open Font License (OFL) are to stimulate worldwide 657 | development of collaborative font projects, to support the font creation 658 | efforts of academic and linguistic communities, and to provide a free and 659 | open framework in which fonts may be shared and improved in partnership 660 | with others. 661 | 662 | The OFL allows the licensed fonts to be used, studied, modified and 663 | redistributed freely as long as they are not sold by themselves. The 664 | fonts, including any derivative works, can be bundled, embedded, 665 | redistributed and/or sold with any software provided that any reserved 666 | names are not used by derivative works. The fonts and derivatives, 667 | however, cannot be released under any other type of license. The 668 | requirement for fonts to remain under this license does not apply 669 | to any document created using the fonts or their derivatives. 670 | 671 | DEFINITIONS 672 | "Font Software" refers to the set of files released by the Copyright 673 | Holder(s) under this license and clearly marked as such. This may 674 | include source files, build scripts and documentation. 675 | 676 | "Reserved Font Name" refers to any names specified as such after the 677 | copyright statement(s). 678 | 679 | "Original Version" refers to the collection of Font Software components as 680 | distributed by the Copyright Holder(s). 681 | 682 | "Modified Version" refers to any derivative made by adding to, deleting, 683 | or substituting -- in part or in whole -- any of the components of the 684 | Original Version, by changing formats or by porting the Font Software to a 685 | new environment. 686 | 687 | "Author" refers to any designer, engineer, programmer, technical 688 | writer or other person who contributed to the Font Software. 689 | 690 | PERMISSION & CONDITIONS 691 | Permission is hereby granted, free of charge, to any person obtaining 692 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 693 | redistribute, and sell modified and unmodified copies of the Font 694 | Software, subject to the following conditions: 695 | 696 | 1) Neither the Font Software nor any of its individual components, 697 | in Original or Modified Versions, may be sold by itself. 698 | 699 | 2) Original or Modified Versions of the Font Software may be bundled, 700 | redistributed and/or sold with any software, provided that each copy 701 | contains the above copyright notice and this license. These can be 702 | included either as stand-alone text files, human-readable headers or 703 | in the appropriate machine-readable metadata fields within text or 704 | binary files as long as those fields can be easily viewed by the user. 705 | 706 | 3) No Modified Version of the Font Software may use the Reserved Font 707 | Name(s) unless explicit written permission is granted by the corresponding 708 | Copyright Holder. This restriction only applies to the primary font name as 709 | presented to the users. 710 | 711 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 712 | Software shall not be used to promote, endorse or advertise any 713 | Modified Version, except to acknowledge the contribution(s) of the 714 | Copyright Holder(s) and the Author(s) or with their explicit written 715 | permission. 716 | 717 | 5) The Font Software, modified or unmodified, in part or in whole, 718 | must be distributed entirely under this license, and must not be 719 | distributed under any other license. The requirement for fonts to 720 | remain under this license does not apply to any document created 721 | using the Font Software. 722 | 723 | TERMINATION 724 | This license becomes null and void if any of the above conditions are 725 | not met. 726 | 727 | DISCLAIMER 728 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 729 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 730 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 731 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 732 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 733 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 734 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 735 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 736 | OTHER DEALINGS IN THE FONT SOFTWARE. 737 | ``` 738 | --------------------------------------------------------------------------------