diff --git a/apps/OpenSpace/CMakeLists.txt b/apps/OpenSpace/CMakeLists.txt index 81a1c51d8b..9fd276ac9c 100644 --- a/apps/OpenSpace/CMakeLists.txt +++ b/apps/OpenSpace/CMakeLists.txt @@ -77,7 +77,7 @@ endif () ##### if (APPLE) set(MACOSX_BUNDLE_ICON_FILE openspace.icns) - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) + set(CMAKE_OSX_DEPLOYMENT_TARGET "13.3" CACHE STRING "Minimum OS X deployment version" FORCE) set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--deep" CACHE STRING "Other Code Signing Flags" FORCE) endif () diff --git a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp index 092ff5b379..df2a0a37dc 100644 --- a/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp +++ b/apps/OpenSpace/ext/launcher/src/launcherwindow.cpp @@ -503,7 +503,7 @@ void LauncherWindow::editConfiguration() { assert(cluster.generator); std::string err = sgct::validateConfigAgainstSchema( - path, + std::filesystem::path(path), _configPath / "schema/sgct.schema.json" ); if (!err.empty()) { diff --git a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp index 06e6baa82a..bb250d98d1 100644 --- a/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp +++ b/apps/OpenSpace/ext/launcher/src/profile/assettreemodel.cpp @@ -298,7 +298,9 @@ QVariant AssetTreeModel::data(const QModelIndex& index, int role) const { } if (role == Qt::ForegroundRole) { - return item->doesExistInFilesystem() ? QColor(Qt::black) : QColor(Qt::red); + // Returning an empty variant will cause Qt to use the theme-appropriate color for + // the item + return item->doesExistInFilesystem() ? QVariant() : QColor(Qt::red); } else if (role == Qt::DisplayRole) { return item->data(index.column()); diff --git a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp index 5e16fa9314..733dc087b6 100644 --- a/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp +++ b/apps/OpenSpace/ext/launcher/src/sgctedit/sgctedit.cpp @@ -68,6 +68,19 @@ namespace { return false; } + bool hasMultipleGuiWindows(const sgct::config::Cluster& cluster) { + bool foundGui = false; + for (const sgct::config::Window& window : cluster.nodes.front().windows) { + if (window.draw2D) { + if (foundGui) { + return true; + } + foundGui = true; + } + } + return false; + } + std::vector createMonitorInfoSet() { std::vector monitorSizes; for (QScreen* screen : qApp->screens()) { @@ -317,6 +330,21 @@ void SgctEdit::saveCluster() { } } + if (hasMultipleGuiWindows(_cluster)) { + const int ret = QMessageBox::warning( + this, + "Multiple Windows with GUI Rendering", + "Multiple windows have 2D/GUI rendering enabled. Note that the interactable " + "user interface will only be shows on the first window with such a setting " + "if you proceed. Dashboards and other 2D elements will be shown on all " + "windows.\n\nAre you sure you want to continue?", + QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No) + ); + if (ret == QMessageBox::No) { + return; + } + } + if (_configurationFilename.empty()) { const QString fileName = QFileDialog::getSaveFileName( this, diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index a332b1691d..37a9673a1e 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit a332b1691dd9a849b2a1d1d309ef18312b3f976c +Subproject commit 37a9673a1e12494d71e8d20117060d392402d1af diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 7e84e5db3b..65dde147e3 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -56,7 +56,6 @@ #include #include #include -#include #include #include #include @@ -747,6 +746,16 @@ void setSgctDelegateFunctions() { return currentWindow->isWindowResized(); }; + sgctDelegate.anyWindowHasResized = []() { + ZoneScoped; + + for (const std::unique_ptr& window : Engine::instance().windows()) { + if (window->isWindowResized()) { + return true; + } + } + return false; + }; sgctDelegate.averageDeltaTime = []() { ZoneScoped; @@ -1480,7 +1489,10 @@ int main(int argc, char* argv[]) { config = launcher.selectedWindowConfig(); if (config.find(labelFromCfgFile) != std::string::npos) { if (config.find("sgct.config") == std::string::npos) { - config = config.substr(0, config.length() - labelFromCfgFile.length()); + config = config.substr( + 0, + config.length() - labelFromCfgFile.length() + ); } else { config = windowConfiguration; @@ -1501,7 +1513,6 @@ int main(int argc, char* argv[]) { { openspace::Settings settings = loadSettings(); - settings.hasStartedBefore = true; const std::filesystem::path profile = global::configuration->profile; @@ -1539,15 +1550,6 @@ int main(int argc, char* argv[]) { settings.configuration = isGeneratedWindowConfig ? "" : global::configuration->windowConfiguration; - const date::year_month_day now = date::year_month_day( - floor(std::chrono::system_clock::now()) - ); - settings.lastStartedDate = std::format( - "{}-{:0>2}-{:0>2}", - static_cast(now.year()), - static_cast(now.month()), - static_cast(now.day()) - ); saveSettings(settings, findSettings()); } diff --git a/data/assets/actions/default_actions.asset b/data/assets/actions/default_actions.asset index 9440f4db70..25a3ce9f8b 100644 --- a/data/assets/actions/default_actions.asset +++ b/data/assets/actions/default_actions.asset @@ -47,7 +47,20 @@ local ToggleRollFriction = { local ToggleMainGui = { Identifier = "os.ToggleMainGui", Name = "Toggle main GUI", - Command = [[openspace.invertBooleanProperty("Modules.CefWebGui.Visible")]], + Command = [[ + openspace.invertBooleanProperty("Modules.CefWebGui.Visible") + + if not openspace.propertyValue("Modules.CefWebGui.Visible") then + local action_id = "os.ToggleMainGui" + local keys = openspace.keyBindingsForAction(action_id) + if #keys > 0 then + local key = keys[1] + openspace.printInfo( + "Hiding the user interface. You can restore it with the '" .. key .. "' key" + ) + end + end + ]], Documentation = "Toggles the main GUI", GuiPath = "/System/GUI", IsLocal = true diff --git a/data/assets/actions/nightsky/misc.asset b/data/assets/actions/nightsky/misc.asset index a6e685ff54..97064c93ac 100644 --- a/data/assets/actions/nightsky/misc.asset +++ b/data/assets/actions/nightsky/misc.asset @@ -46,7 +46,7 @@ local HideAllMarkings = { openspace.fadeOut("{nightsky_marking}") openspace.fadeOut("{du_grid}") openspace.fadeOut("{du_grid_labels}") - openspace.fadeOut("{ImageConstellation}") + openspace.fadeOut("{image_constellation}") ]], Documentation = "Hides all markings in the night sky", GuiPath = "/Night Sky/Markings", diff --git a/data/assets/customization/gui.asset b/data/assets/customization/gui.asset index 7f49e78549..d981cc4a3c 100644 --- a/data/assets/customization/gui.asset +++ b/data/assets/customization/gui.asset @@ -3,9 +3,9 @@ asset.export("webguiDevelopmentMode", false) -- To make changes to the webgui: -- 1) Set the above `webguiDevelopmentMode` to true --- 2) Clone the repository: https://github.com/OpenSpace/OpenSpace-WebGuiFrontend +-- 2) Clone the repository: https://github.com/OpenSpace/OpenSpace-WebGui -- 3) Install nodejs (including npm) --- 4) Within the repository, run `npm install` and `npm start` +-- 4) Within the repository, run `npm install` and `npm run dev` asset.meta = { diff --git a/data/assets/scene/digitaluniverse/2dF.asset b/data/assets/scene/digitaluniverse/2dF.asset index 0297cc93db..aa61f71135 100644 --- a/data/assets/scene/digitaluniverse/2dF.asset +++ b/data/assets/scene/digitaluniverse/2dF.asset @@ -42,6 +42,7 @@ local Object = { GUI = { Name = "2dF Galaxies", Path = "/Universe/Deep Sky Surveys", + Focusable = false, Description = [[The Two-degree Field (2dF) Survey was a project designed to map portions of the extragalactic universe. The 2dF survey has three main components: the North Galactic Pole strip, the South Galactic Pole strip, and the random fields diff --git a/data/assets/scene/digitaluniverse/2mass.asset b/data/assets/scene/digitaluniverse/2mass.asset index f05c1d84d0..f48d163da2 100644 --- a/data/assets/scene/digitaluniverse/2mass.asset +++ b/data/assets/scene/digitaluniverse/2mass.asset @@ -43,6 +43,7 @@ local Object = { GUI = { Name = "2MASS Galaxies", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[The Two Micron All-Sky Survey (2MASS) is an infrared survey of the sky published in 2003. Taken from two telescopes in Arizona and Chile, it offers an all-sky view of galaxies beyond the Milky Way. Because it is infrared, the light diff --git a/data/assets/scene/digitaluniverse/6dF.asset b/data/assets/scene/digitaluniverse/6dF.asset index a927733972..ae1cc7c4cd 100644 --- a/data/assets/scene/digitaluniverse/6dF.asset +++ b/data/assets/scene/digitaluniverse/6dF.asset @@ -43,6 +43,7 @@ local Object = { GUI = { Name = "6dF Galaxies", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[The Six-degree Field (6dF) Galaxy Survey mapped nearly half the sky from the Anglo-Australian Observatory. Because it's a southern hemisphere survey, there is no coverage in these data for the northern hemisphere's sky. As with all diff --git a/data/assets/scene/digitaluniverse/abell.asset b/data/assets/scene/digitaluniverse/abell.asset index a7282aaac8..9c37cc52b7 100644 --- a/data/assets/scene/digitaluniverse/abell.asset +++ b/data/assets/scene/digitaluniverse/abell.asset @@ -51,6 +51,7 @@ local Object = { GUI = { Name = "Abell Galaxy Clusters", Path = "/Universe/Deep Sky Surveys", + Focusable = false, Description = [[The Abell catalog includes all the nearby, and not so nearby, galaxy clusters. The northern hemisphere survey, published in 1958, was compiled by George Abell from the Palomar Sky Survey plates. A subsequent southern hemisphere catalog diff --git a/data/assets/scene/digitaluniverse/allsky_hydrogenalpha.asset b/data/assets/scene/digitaluniverse/allsky_hydrogenalpha.asset index 8989c734c2..501e7b4876 100644 --- a/data/assets/scene/digitaluniverse/allsky_hydrogenalpha.asset +++ b/data/assets/scene/digitaluniverse/allsky_hydrogenalpha.asset @@ -30,6 +30,7 @@ local Object = { GUI = { Name = "Hydrogen-alpha All-sky", Path = "/Milky Way/All Sky Images", + Focusable = false, Description = [[Hydrogen-alpha is a term that describes light from the ground state of the hydrogen atom. When an electron in an atom moves from one energy level to a higher one, we say the atom is excited. When the electron moves back down to the diff --git a/data/assets/scene/digitaluniverse/allsky_visible.asset b/data/assets/scene/digitaluniverse/allsky_visible.asset index 306dd8ce05..f88c4344a7 100644 --- a/data/assets/scene/digitaluniverse/allsky_visible.asset +++ b/data/assets/scene/digitaluniverse/allsky_visible.asset @@ -31,6 +31,7 @@ local Object = { GUI = { Name = "Visible All-sky", Path = "/Milky Way/All Sky Images", + Focusable = false, Description = [[An all-sky image of the night sky as our eye sees it (in the visible spectrum), with the stars removed. You will see the brightest part of the Galaxy if you look toward Galactic center toward the constellations Scorpius and Sagittarius. diff --git a/data/assets/scene/digitaluniverse/alternatestarlabels.asset b/data/assets/scene/digitaluniverse/alternatestarlabels.asset index 04e2dff18c..f0a371ac15 100644 --- a/data/assets/scene/digitaluniverse/alternatestarlabels.asset +++ b/data/assets/scene/digitaluniverse/alternatestarlabels.asset @@ -25,6 +25,7 @@ local Object = { GUI = { Name = "Stars Labels - Alternate", Path = "/Milky Way/Stars", + Focusable = false, Description = [[Alternate star labels for the stars. Priority goes to Bayer IDs (Greek designations, like Alpha Orionis), then to Flamsteed numbers (like 1 Orionis).]] diff --git a/data/assets/scene/digitaluniverse/brown_dwarfs.asset b/data/assets/scene/digitaluniverse/brown_dwarfs.asset index 1f89b76d93..5970cc5c25 100644 --- a/data/assets/scene/digitaluniverse/brown_dwarfs.asset +++ b/data/assets/scene/digitaluniverse/brown_dwarfs.asset @@ -48,6 +48,7 @@ local Object = { GUI = { Name = "Brown Dwarfs", Path = "/Milky Way/Substellar Objects", + Focusable = false, Description = [[For decades it was believed that M stars were the coolest stars in the Galaxy. Some M stars, called red dwarfs, make up 70% of the stars in the Galaxy. However, a new class of objects, even cooler than M stars, was recently diff --git a/data/assets/scene/digitaluniverse/constellationbounds.asset b/data/assets/scene/digitaluniverse/constellationbounds.asset index 0a18cd6b12..af3fe956ac 100644 --- a/data/assets/scene/digitaluniverse/constellationbounds.asset +++ b/data/assets/scene/digitaluniverse/constellationbounds.asset @@ -39,6 +39,7 @@ local Object = { GUI = { Name = "Constellation Boundaries", Path = "/Milky Way/Constellations", + Focusable = false, Description = [[As a continent is divided into countries, astronomers divide the sky into 88 regions called constellations. Every object falls into one of these 88 regions. The boundaries of these regions are shown in this asset. Use these in diff --git a/data/assets/scene/digitaluniverse/constellations.asset b/data/assets/scene/digitaluniverse/constellations.asset index bf1957ef16..5aaa5f1208 100644 --- a/data/assets/scene/digitaluniverse/constellations.asset +++ b/data/assets/scene/digitaluniverse/constellations.asset @@ -56,6 +56,7 @@ local Constellations = { GUI = { Name = "Constellation Lines", Path = "/Milky Way/Constellations", + Focusable = false, Description = [[Lines connecting the stars that make up the constellation figures. We represent the constellations by connecting the main stars that make up the constellation "stick figures," as seen from Earth. Colors: most constellations diff --git a/data/assets/scene/digitaluniverse/deepsky.asset b/data/assets/scene/digitaluniverse/deepsky.asset index d2fcb3a23e..9661feb681 100644 --- a/data/assets/scene/digitaluniverse/deepsky.asset +++ b/data/assets/scene/digitaluniverse/deepsky.asset @@ -15,6 +15,12 @@ local speck = asset.resource({ local DeepSkyObjects = { Identifier = "DeepSkyObjects", + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { 0, 0, math.pi } + } + }, Renderable = { Type = "RenderablePointCloud", Enabled = false, @@ -41,21 +47,22 @@ local DeepSkyObjects = { EnableMaxSizeControl = true } }, - Transform = { - Rotation = { - Type = "StaticRotation", - Rotation = { 0, 0, math.pi } - } - }, GUI = { Name = "Deep Sky Objects Points", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = "Point cloud and labels for Deep Sky Objects" } } local DeepSkyObjectsImages = { Identifier = "DeepSkyObjectsImages", + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { math.pi, math.pi, 0 } + } + }, Renderable = { Type = "RenderablePointCloud", Enabled = false, @@ -79,15 +86,10 @@ local DeepSkyObjectsImages = { ScaleExponent = 0.0 } }, - Transform = { - Rotation = { - Type = "StaticRotation", - Rotation = { math.pi, math.pi, 0 } - } - }, GUI = { Name = "Deep Sky Objects Images", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[Census: 63 images and labels. DU Version 1.3.
These data are 2-D images of Messier objects placed in 3-D space. Not only do we place these images at the proper location and give them the correct orientation, we also diff --git a/data/assets/scene/digitaluniverse/exoplanets.asset b/data/assets/scene/digitaluniverse/exoplanets.asset index a8c5a3f34e..8892a640ec 100644 --- a/data/assets/scene/digitaluniverse/exoplanets.asset +++ b/data/assets/scene/digitaluniverse/exoplanets.asset @@ -40,6 +40,7 @@ local Object = { GUI = { Name = "Exoplanet Systems", Path = "/Milky Way/Exoplanets", + Focusable = false, Description = [[Extrasolar planets, or exoplanets, are a relatively new phenomenon in astronomy - no observational evidence was available until 1995. To the eye, exoplanets are lost in the glare of their host star. Unconventional techniques are diff --git a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset index 153b276dc9..937f742521 100644 --- a/data/assets/scene/digitaluniverse/exoplanets_candidates.asset +++ b/data/assets/scene/digitaluniverse/exoplanets_candidates.asset @@ -42,6 +42,7 @@ local Object = { GUI = { Name = "Exoplanet Candidates", Path = "/Milky Way/Exoplanets", + Focusable = false, Description = [[The exoplanet candidate stars are likely hosts for exoplanets. These are stars plucked from NASA's Kepler and TESS space telescopes. Further observations are needed to confirm a planet's existence. Rather than represent them diff --git a/data/assets/scene/digitaluniverse/galaxy_clusters.asset b/data/assets/scene/digitaluniverse/galaxy_clusters.asset index bd7fda1509..4fa281e82d 100644 --- a/data/assets/scene/digitaluniverse/galaxy_clusters.asset +++ b/data/assets/scene/digitaluniverse/galaxy_clusters.asset @@ -31,6 +31,7 @@ local Object = { GUI = { Name = "Galaxy Cluster Labels", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[The galaxy clusters dataset is a series of labels that mark where the large clusters of galaxies are in the nearby universe. These labels must be used in conjunction with the Tully galaxy group. Census: 15 galaxy cluster labels.]] diff --git a/data/assets/scene/digitaluniverse/galaxy_groups.asset b/data/assets/scene/digitaluniverse/galaxy_groups.asset index e051227eee..17046d9f6b 100644 --- a/data/assets/scene/digitaluniverse/galaxy_groups.asset +++ b/data/assets/scene/digitaluniverse/galaxy_groups.asset @@ -31,6 +31,7 @@ local Object = { GUI = { Name = "Galaxy Group Labels", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[The Galaxy Groups data are a set of labels that mark the nearby galaxy groups. The Milky Way is in the Local Group, and we are surrounded by many other groups delineated by these labels. Census: 62 galaxy group labels.]] diff --git a/data/assets/scene/digitaluniverse/globularclusters.asset b/data/assets/scene/digitaluniverse/globularclusters.asset index c2f97e6a63..39e970e411 100644 --- a/data/assets/scene/digitaluniverse/globularclusters.asset +++ b/data/assets/scene/digitaluniverse/globularclusters.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "Globular Clusters", Path = "/Milky Way/Star Clusters", + Focusable = false, Description = [[Globular star clusters are gravitationally bound groups of 100,000 to 1 million stars. They are compact, spherical "balls" of stars with very high stellar densities. These clusters are typically 30 to 100 light years in diameter. diff --git a/data/assets/scene/digitaluniverse/grids.asset b/data/assets/scene/digitaluniverse/grids.asset index 0a87f0b185..78db5edd2d 100644 --- a/data/assets/scene/digitaluniverse/grids.asset +++ b/data/assets/scene/digitaluniverse/grids.asset @@ -68,6 +68,7 @@ local RadioSphere = { GUI = { Name = "Radio Sphere", Path = "/Milky Way/Grids", + Focusable = false, Description = [[The radio sphere describes the theoretical extent of Earth's radio signals in space. Before television carrier waves, early-warning radar first used in World War II, and the detonation of atomic weapons, Earth was radio-quiet to the @@ -110,6 +111,7 @@ local EquatorialSphere = { GUI = { Name = "Equatorial Coordinates", Path = "/Night Sky/Coordinate Systems/Equatorial", + Focusable = false, Description = [[An 80-light-year sphere representing equatorial coordinates (right ascension and declination).]] } @@ -138,6 +140,7 @@ local EquatorialSphereLabels = { GUI = { Name = "Equatorial Coordinates Labels", Path = "/Night Sky/Coordinate Systems/Equatorial", + Focusable = false, Description = [[Labels on a sphere representing right ascension in hours and declination in degrees.]] } @@ -167,6 +170,7 @@ local EclipticSphere = { GUI = { Name = "Ecliptic Coordinates", Path = "/Night Sky/Coordinate Systems/Ecliptic", + Focusable = false, Description = [[A 100-light-year sphere representing ecliptic coordinates (ecliptic longitude and latitude).]] } @@ -195,6 +199,7 @@ local EclipticSphereLabels = { GUI = { Name = "Ecliptic Coordinates Labels", Path = "/Night Sky/Coordinate Systems/Ecliptic", + Focusable = false, Description = [[Labels on a sphere representing ecliptic longitude and latitude in degrees.]] } @@ -220,6 +225,7 @@ local GalacticSphere = { GUI = { Name = "Galactic Coordinates", Path = "/Night Sky/Coordinate Systems/Galactic", + Focusable = false, Description = [[A 1000-light-year sphere representing galactic coordinates (galactic longitude and latitude).]] } @@ -246,6 +252,7 @@ local GalacticSphereLabels = { GUI = { Name = "Galactic Coordinates Labels", Path = "/Night Sky/Coordinate Systems/Galactic", + Focusable = false, Description = [[Labels on a sphere representing galactic longitude and latitude in degrees.]] } @@ -280,7 +287,9 @@ local Plane1lh = { GUI = { Name = "1-light-hour Grid", Path = "/Solar System/Grids", - Description = [[A 1-light-hour Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 1-light-hour Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = LightHour } } @@ -314,7 +323,9 @@ local Plane1ld = { GUI = { Name = "1-light-day Grid", Path = "/Solar System/Grids", - Description = [[A 1-light-day Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 1-light-day Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = LightDay } } @@ -348,7 +359,9 @@ local Plane1lm = { GUI = { Name = "1-light-month Grid", Path = "/Solar System/Grids", - Description = [[A 1-light-month Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 1-light-month Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = LightMonth } } @@ -382,7 +395,9 @@ local Plane1ly = { GUI = { Name = "1-light-year Grid", Path = "/Solar System/Grids", - Description = [[A 1-light-year Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 1-light-year Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = LightYear } } @@ -416,7 +431,9 @@ local Plane10ly = { GUI = { Name = "10-light-year Grid", Path = "/Milky Way/Grids", - Description = [[A 10-light-year Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 10-light-year Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = 10 * LightYear } } @@ -450,7 +467,9 @@ local Plane100ly = { GUI = { Name = "100-light-year Grid", Path = "/Milky Way/Grids", - Description = [[A 100-light-year Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 100-light-year Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = 100 * LightYear } } @@ -484,7 +503,9 @@ local Plane1kly = { GUI = { Name = "1,000-light-year Grid", Path = "/Milky Way/Grids", - Description = [[A 1,000-light-year Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 1,000-light-year Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = 1000 * LightYear } } @@ -518,7 +539,9 @@ local Plane10kly = { GUI = { Name = "10,000-light-year Grid", Path = "/Milky Way/Grids", - Description = [[A 10,000-light-year Cartesian grid aligned on the plane of the Solar System.]], + Focusable = false, + Description = [[A 10,000-light-year Cartesian grid aligned on the plane of the Solar + System.]], OrderingNumber = 10000 * LightYear } } @@ -547,7 +570,9 @@ local Plane100kly = { GUI = { Name = "100,000-light-year Grid", Path = "/Universe/Grids", - Description = [[A 100,000-light-year Cartesian grid aligned on the plane of the Milky Way.]], + Focusable = false, + Description = [[A 100,000-light-year Cartesian grid aligned on the plane of the Milky + Way.]], OrderingNumber = 100000 * LightYear } } @@ -576,7 +601,9 @@ local Plane1Mly = { GUI = { Name = "1-million-light-year Grid", Path = "/Universe/Grids", - Description = [[A 1-million-light-year Cartesian grid aligned on the plane of the Milky Way.]], + Focusable = false, + Description = [[A 1-million-light-year Cartesian grid aligned on the plane of the + Milky Way.]], OrderingNumber = 1E6 * LightYear } } @@ -605,7 +632,9 @@ local Plane10Mly = { GUI = { Name = "10-million-light-year Grid", Path = "/Universe/Grids", - Description = [[A 10-million-light-year Cartesian grid aligned on the plane of the Milky Way.]], + Focusable = false, + Description = [[A 10-million-light-year Cartesian grid aligned on the plane of the + Milky Way.]], OrderingNumber = 10E6 * LightYear } } @@ -634,7 +663,9 @@ local Plane100Mly = { GUI = { Name = "100-million-light-year Grid", Path = "/Universe/Grids", - Description = [[A 100-million-light-year Cartesian grid aligned on the plane of the Milky Way.]], + Focusable = false, + Description = [[A 100-million-light-year Cartesian grid aligned on the plane of the + Milky Way.]], OrderingNumber = 100E6 * LightYear } } @@ -663,7 +694,9 @@ local Plane20Gly = { GUI = { Name = "20-billion-light-year Grid", Path = "/Universe/Grids", - Description = [[A 20-billion-light-year Cartesian grid aligned on the plane of the Milky Way.]], + Focusable = false, + Description = [[A 20-billion-light-year Cartesian grid aligned on the plane of the + Milky Way.]], OrderingNumber = 20E9 * LightYear } } diff --git a/data/assets/scene/digitaluniverse/h2regions.asset b/data/assets/scene/digitaluniverse/h2regions.asset index 21f88f9a7f..bfecc087a4 100644 --- a/data/assets/scene/digitaluniverse/h2regions.asset +++ b/data/assets/scene/digitaluniverse/h2regions.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "HII Regions", Path = "/Milky Way/Nebulae", + Focusable = false, Description = [[HII (pronounced "H-two") regions are stellar nurseries for newborn stars. Stars are born from condensing clouds of hydrogen gas. As these clouds condense, the densities become high enough to form stars. An HII region is the diff --git a/data/assets/scene/digitaluniverse/hdf.asset b/data/assets/scene/digitaluniverse/hdf.asset index 68585a4aa7..ba2921785b 100644 --- a/data/assets/scene/digitaluniverse/hdf.asset +++ b/data/assets/scene/digitaluniverse/hdf.asset @@ -43,6 +43,7 @@ local Object = { GUI = { Name = "Hubble Deep Field", Path = "/Universe/Galaxies", + Focusable = false, Description = [[ Hubble Ultra Deep Field galaxy survey

Data Reference: Hubble Ultra Deep Field 2012 program (Ellis+, Koekemoer+, 2013) diff --git a/data/assets/scene/digitaluniverse/local_group_dwarfs.asset b/data/assets/scene/digitaluniverse/local_group_dwarfs.asset index 4535910ce0..e1f96526d2 100644 --- a/data/assets/scene/digitaluniverse/local_group_dwarfs.asset +++ b/data/assets/scene/digitaluniverse/local_group_dwarfs.asset @@ -47,6 +47,7 @@ local Object = { GUI = { Name = "Local Group", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[A group of galaxies is typically composed of a small number of large galaxies that are surrounded by a large number of small galaxies. The Milky Way belongs to the Local Group, and is one of roughly 100 galaxies in that group. The diff --git a/data/assets/scene/digitaluniverse/milkyway.asset b/data/assets/scene/digitaluniverse/milkyway.asset index 023a4260ad..b8c8daf176 100644 --- a/data/assets/scene/digitaluniverse/milkyway.asset +++ b/data/assets/scene/digitaluniverse/milkyway.asset @@ -40,6 +40,7 @@ local Object = { GUI = { Name = "Milky Way Image", Path = "/Milky Way/Galaxy", + Focusable = false, Description = [[The exterior view of the Milky Way is represented here by a two-dimensional image. The image is that of NGC 1232, a galaxy thought to resemble our Milky Way. The image has been properly sized and approximately oriented to diff --git a/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset b/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset index 873810096f..2474e6a1f0 100644 --- a/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset +++ b/data/assets/scene/digitaluniverse/milkyway_arm_labels.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "Milky Way Arm Labels", Path = "/Milky Way/Galaxy", + Focusable = false, Description = [[This is an image that contains labels for the Milky Way's spiral arms. We label them in this manner--"hard-coding" the labels into an image rather than having native labels--so that they can retain their size, shape, and location diff --git a/data/assets/scene/digitaluniverse/milkyway_label.asset b/data/assets/scene/digitaluniverse/milkyway_label.asset index 5393556afc..6a198fd6ce 100644 --- a/data/assets/scene/digitaluniverse/milkyway_label.asset +++ b/data/assets/scene/digitaluniverse/milkyway_label.asset @@ -28,8 +28,9 @@ local Object = { GUI = { Name = "Home Label", Path = "/Universe/Nearby Surveys", - Description = [[Label for the Milky Way titled 'Home', sized for viewing outside - the Milky Way Galaxy.]] + Focusable = false, + Description = [[Label for the Milky Way titled 'Home', sized for viewing outside the + Milky Way Galaxy.]] } } diff --git a/data/assets/scene/digitaluniverse/obassociations.asset b/data/assets/scene/digitaluniverse/obassociations.asset index ad3a01a619..05df72c9c8 100644 --- a/data/assets/scene/digitaluniverse/obassociations.asset +++ b/data/assets/scene/digitaluniverse/obassociations.asset @@ -49,6 +49,7 @@ local Object = { GUI = { Name = "OB Associations", Path = "/Milky Way/Star Clusters", + Focusable = false, Description = [[Stellar associations are loose agglomerations of stars that form from the same gas cloud. OB associations typically have on the order of dozens of O and B stars in them (hotter, massive, younger stars) in addition to cooler stars. Over diff --git a/data/assets/scene/digitaluniverse/oort_cloud.asset b/data/assets/scene/digitaluniverse/oort_cloud.asset index 82e71f9d60..2d3268fa0c 100644 --- a/data/assets/scene/digitaluniverse/oort_cloud.asset +++ b/data/assets/scene/digitaluniverse/oort_cloud.asset @@ -40,6 +40,7 @@ local Object = { GUI = { Name = "Oort Sphere", Path = "/Solar System/Comets/Oort Cloud", + Focusable = false, Description = [[The Oort cloud is a region of space surrounding the Sun where comets are believed to originate. It is believed to extend from 20,000-100,000 Astronomical Units (AU), with its greatest concentration around 50,000 AU (1 AU is the average diff --git a/data/assets/scene/digitaluniverse/openclusters.asset b/data/assets/scene/digitaluniverse/openclusters.asset index 035b42cda3..045da77825 100644 --- a/data/assets/scene/digitaluniverse/openclusters.asset +++ b/data/assets/scene/digitaluniverse/openclusters.asset @@ -41,12 +41,13 @@ local Object = { GUI = { Name = "Open Star Clusters", Path = "/Milky Way/Star Clusters", + Focusable = false, Description = [[An open star cluster is a loose assemblage of stars numbering from hundreds to thousands that are bound by their mutual gravitation. Because these are young stars, we expect to see them in the star-forming regions of our Galaxy, namely in the spiral arms. For this reason, open clusters exist, for the most part, in the - plane of the Galaxy and indicate relatively recent star formation. Census: 1,867 star - clusters.]] + plane of the Galaxy and indicate relatively recent star formation. Census: 1,867 + star clusters.]] } } diff --git a/data/assets/scene/digitaluniverse/planetarynebulae.asset b/data/assets/scene/digitaluniverse/planetarynebulae.asset index 68ce205538..9e6ee8f5ff 100644 --- a/data/assets/scene/digitaluniverse/planetarynebulae.asset +++ b/data/assets/scene/digitaluniverse/planetarynebulae.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "Planetary Nebulae", Path = "/Milky Way/Nebulae", + Focusable = false, Description = [[A planetary nebula is an expanding shell of gas ejected from an average-sized star late in its life cycle. Appearing like greenish disks to a telescopic observer, planetary nebulae received their name from their resemblance to diff --git a/data/assets/scene/digitaluniverse/pulsars.asset b/data/assets/scene/digitaluniverse/pulsars.asset index 82be71fa9b..0459a2aa76 100644 --- a/data/assets/scene/digitaluniverse/pulsars.asset +++ b/data/assets/scene/digitaluniverse/pulsars.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "Pulsars", Path = "/Milky Way/Stellar Remnants", + Focusable = false, Description = [[A pulsar is a spinning neutron star, an ultra-dense stellar remnant resulting from a supernova-driven collapse of the stellar core. Upon death, stars leave behind one of three possible remnants: a white dwarf, a neutron star, or a diff --git a/data/assets/scene/digitaluniverse/quasars.asset b/data/assets/scene/digitaluniverse/quasars.asset index d9482df27a..17f60fbe15 100644 --- a/data/assets/scene/digitaluniverse/quasars.asset +++ b/data/assets/scene/digitaluniverse/quasars.asset @@ -53,6 +53,7 @@ local Object = { GUI = { Name = "Quasars", Path = "/Universe/Deep Sky Surveys", + Focusable = false, Description = [[Quasars are the most distant objects we see. They are extremely active galaxies that contain supermassive black holes which gobble up material at a furious rate. As the material falls into the black hole, it forms a disk and emits diff --git a/data/assets/scene/digitaluniverse/sdss.asset b/data/assets/scene/digitaluniverse/sdss.asset index 920b4f9c15..01516a3450 100644 --- a/data/assets/scene/digitaluniverse/sdss.asset +++ b/data/assets/scene/digitaluniverse/sdss.asset @@ -45,6 +45,7 @@ local Object = { GUI = { Name = "Sloan Galaxies", Path = "/Universe/Deep Sky Surveys", + Focusable = false, Description = [[The Sloan Digital Sky Survey (SDSS) is an ambitious project to image about 35% of the sky, deep into the universe. The SDSS galaxies form triangular wedges, revealing those parts of the sky observed by the telescope. If the entire diff --git a/data/assets/scene/digitaluniverse/star_uncertainty.asset b/data/assets/scene/digitaluniverse/star_uncertainty.asset index 2273022321..4cce63a172 100644 --- a/data/assets/scene/digitaluniverse/star_uncertainty.asset +++ b/data/assets/scene/digitaluniverse/star_uncertainty.asset @@ -31,6 +31,7 @@ local Object = { GUI = { Name = "Star Distance Uncertainty", Path = "/Milky Way/Stars", + Focusable = false, Description = [[The uncertainty of a star's position is derived from the uncertainty in its parallax measurement. This results in a range in distance where the star could exist. Here we draw lines on top of select stars which give us a visual cue diff --git a/data/assets/scene/digitaluniverse/starlabels.asset b/data/assets/scene/digitaluniverse/starlabels.asset index 368ec4a330..21f951c5c5 100644 --- a/data/assets/scene/digitaluniverse/starlabels.asset +++ b/data/assets/scene/digitaluniverse/starlabels.asset @@ -25,6 +25,7 @@ local Object = { GUI = { Name = "Stars Labels", Path = "/Milky Way/Stars", + Focusable = false, Description = [[Common name labels for nearby stars in the Milky Way. See 'Stars' for more information.]] } diff --git a/data/assets/scene/digitaluniverse/starorbits.asset b/data/assets/scene/digitaluniverse/starorbits.asset index 4efbe36beb..283e5e5aff 100644 --- a/data/assets/scene/digitaluniverse/starorbits.asset +++ b/data/assets/scene/digitaluniverse/starorbits.asset @@ -24,6 +24,7 @@ local SunOrbit = { GUI = { Name = "Sun Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of the Sun around the Milky Way over the next 1 billion years.]] } @@ -42,6 +43,7 @@ local BarnardsOrbit = { GUI = { Name = "Barnards Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of Barnard's Star around the Milky Way over the next 1 billion years.]] } @@ -60,6 +62,7 @@ local KapteynsOrbit = { GUI = { Name = "Kapteyns Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of Kapteyn's Star around the Milky Way over the next 1 billion years.]] } @@ -78,6 +81,7 @@ local Lacaille9352Orbit = { GUI = { Name = "Lacaille 9352 Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of Lacaille9352 around the Milky Way over the next 1 billion years.]] } @@ -96,6 +100,7 @@ local LSR1826Orbit = { GUI = { Name = "LSR1826+3014 Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of LSR1826+3014 around the Milky Way over the next 1 billion years.]] } @@ -114,6 +119,7 @@ local LSRJ0822Orbit = { GUI = { Name = "LSRJ0822+1700 Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of LSRJ0822+1700 around the Milky Way over the next 1 billion years.]] } @@ -132,6 +138,7 @@ local PM_J13420Orbit = { GUI = { Name = "PM_J13420-3415 Orbit", Path = "/Milky Way/Stars/Stars Orbits", + Focusable = false, Description = [[Projected orbit of PM_J13420-3415 around the Milky Way over the next 1 billion years.]] } diff --git a/data/assets/scene/digitaluniverse/stars.asset b/data/assets/scene/digitaluniverse/stars.asset index ef29bce444..9534074eff 100644 --- a/data/assets/scene/digitaluniverse/stars.asset +++ b/data/assets/scene/digitaluniverse/stars.asset @@ -62,6 +62,7 @@ local Stars = { GUI = { Name = "Stars", Path = "/Milky Way/Stars", + Focusable = false, Description = [[These are the nearby stars that surround the Sun and are close enough to get accurate distances. These include all the stars we see with the unaided eye and many stars dimmer than that. Over the entire night sky, all year round, and in @@ -107,6 +108,7 @@ local SunStar = { GUI = { Name = "Sun", Path = "/Milky Way/Stars", + Focusable = false, Description = [[Individual star to represent the Sun when outside of the Solar System.]] } diff --git a/data/assets/scene/digitaluniverse/superclusters.asset b/data/assets/scene/digitaluniverse/superclusters.asset index 71c50f95ad..7f720a4a8c 100644 --- a/data/assets/scene/digitaluniverse/superclusters.asset +++ b/data/assets/scene/digitaluniverse/superclusters.asset @@ -42,6 +42,7 @@ local Object = { GUI = { Name = "Supercluster Labels", Path = "/Universe/Deep Sky Surveys", + Focusable = false, Description = [[The superclusters dataset is a set of labels that mark the major galaxy superclusters in the local universe. They correspond to, and should be viewed with, the Abell clusters. Astronomers estimate there are 10 million superclusters in diff --git a/data/assets/scene/digitaluniverse/supernovaremnants.asset b/data/assets/scene/digitaluniverse/supernovaremnants.asset index 3b890d0858..ae552e275b 100644 --- a/data/assets/scene/digitaluniverse/supernovaremnants.asset +++ b/data/assets/scene/digitaluniverse/supernovaremnants.asset @@ -41,6 +41,7 @@ local Object = { GUI = { Name = "Supernova Remnants", Path = "/Milky Way/Nebulae", + Focusable = false, Description = [[A supernova remnant is the nebulous gas left over from a supernova explosion. This gas expands at great speeds and rams into the surrounding interstellar gas. This excites the surrounding gas and causes it to glow, producing diff --git a/data/assets/scene/digitaluniverse/tully.asset b/data/assets/scene/digitaluniverse/tully.asset index 5c94f59938..c9527825fc 100644 --- a/data/assets/scene/digitaluniverse/tully.asset +++ b/data/assets/scene/digitaluniverse/tully.asset @@ -59,6 +59,7 @@ local TullyGalaxies = { GUI = { Name = "Tully Galaxies", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[The Tully Catalog is the most polished, accurate catalog of nearby galaxies. It includes over 30,000 galaxies in the local universe that surround the Milky Way. This catalog demonstrates the large-scale structure of the universe @@ -104,6 +105,7 @@ local TullyGalaxiesImages = { GUI = { Name = "Tully Galaxy Images", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[Each Tully galaxy is represented by an image that represents its morphological type (spiral, elliptical, etc.). Most of these come from The Galaxy Catalog. A handful of nearby galaxies are represented by their actual images, which diff --git a/data/assets/scene/digitaluniverse/voids.asset b/data/assets/scene/digitaluniverse/voids.asset index 66dfd12df0..347d448fd4 100644 --- a/data/assets/scene/digitaluniverse/voids.asset +++ b/data/assets/scene/digitaluniverse/voids.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Voids", Path = "/Universe/Nearby Surveys", + Focusable = false, Description = [[Cosmic voids are vast, empty spaces where there are either no galaxies, or very few galaxies. They are associated with cold spots in the cosmic microwave background (CMB) light, the earliest picture we have of the universe. diff --git a/data/assets/scene/digitaluniverse/white_dwarfs.asset b/data/assets/scene/digitaluniverse/white_dwarfs.asset index 4d0813d4e3..c8cbd920a2 100644 --- a/data/assets/scene/digitaluniverse/white_dwarfs.asset +++ b/data/assets/scene/digitaluniverse/white_dwarfs.asset @@ -35,6 +35,7 @@ local Object = { GUI = { Name = "White Dwarfs", Path = "/Milky Way/Stellar Remnants", + Focusable = false, Description = [[A white dwarf is the core of a dying star. These are dim objects that are roughly the size of Earth but with the desity of a sunlike star. Stars that are not massive enough to end in a neutraon star or black hole will evolve into a white diff --git a/data/assets/scene/milkyway/constellations/big_dipper.asset b/data/assets/scene/milkyway/constellations/big_dipper.asset index 1df644491b..08ef4de159 100644 --- a/data/assets/scene/milkyway/constellations/big_dipper.asset +++ b/data/assets/scene/milkyway/constellations/big_dipper.asset @@ -30,6 +30,7 @@ local BigDipper = { GUI = { Name = "Big Dipper", Path = "/Milky Way/Constellations", + Focusable = false, Description = [[This item only draws the big dipper, and not the rest of the lines of the Ursa Major constellation.]] } diff --git a/data/assets/scene/milkyway/constellations/constellation_art.asset b/data/assets/scene/milkyway/constellations/constellation_art.asset index 9a0ec35623..b2ced6af18 100644 --- a/data/assets/scene/milkyway/constellations/constellation_art.asset +++ b/data/assets/scene/milkyway/constellations/constellation_art.asset @@ -89,7 +89,7 @@ local function createConstellations(baseIdentifier, guiPath, constellationfile) Opacity = 0.1, DimInAtmosphere = true }, - Tag = { "ImageConstellation", group, "daytime_hidden" }, + Tag = { "image_constellation", "zodiac_" .. group, "daytime_hidden" }, GUI = { Name = name .. " Image", Path = "/Milky Way/Constellations/" .. guiPath, diff --git a/data/assets/scene/milkyway/gaia/apogee.asset b/data/assets/scene/milkyway/gaia/apogee.asset index 9aee4bcc6b..74756cd390 100644 --- a/data/assets/scene/milkyway/gaia/apogee.asset +++ b/data/assets/scene/milkyway/gaia/apogee.asset @@ -53,6 +53,7 @@ local GaiaAbundanceApogee = { GUI = { Path = "/Milky Way/Gaia", Name = "Gaia Abundance Apogee", + Focusable = false, Description = "Data set of stars color coded by metallicity" } } diff --git a/data/assets/scene/milkyway/gaia/gaiastars.asset b/data/assets/scene/milkyway/gaia/gaiastars.asset index 4c2a2992f1..af1e29c59f 100644 --- a/data/assets/scene/milkyway/gaia/gaiastars.asset +++ b/data/assets/scene/milkyway/gaia/gaiastars.asset @@ -60,6 +60,7 @@ local GaiaStars = { GUI = { Name = "Gaia Stars", Path = "/Milky Way", + Focusable = false, Description = "Radial Velocity subset of GaiaDR2" } } diff --git a/data/assets/scene/milkyway/gaia/galah.asset b/data/assets/scene/milkyway/gaia/galah.asset index 2c7c3069ea..efb6815f58 100644 --- a/data/assets/scene/milkyway/gaia/galah.asset +++ b/data/assets/scene/milkyway/gaia/galah.asset @@ -53,6 +53,7 @@ local GaiaAbundanceGalah = { GUI = { Path = "/Milky Way/Gaia", Name = "Gaia Abundance Galah", + Focusable = false, Description = "Data set of stars color coded by metallicity" } } diff --git a/data/assets/scene/milkyway/milkyway/eso.asset b/data/assets/scene/milkyway/milkyway/eso.asset index bc86af0c8f..7c9315b25f 100644 --- a/data/assets/scene/milkyway/milkyway/eso.asset +++ b/data/assets/scene/milkyway/milkyway/eso.asset @@ -29,6 +29,7 @@ local Object = { GUI = { Name = "Milky Way (ESO)", Path = "/Milky Way/Milky Way", + Focusable = false, Description = "Milky Way Galaxy image (alternate)" } } diff --git a/data/assets/scene/milkyway/stars/denver.asset b/data/assets/scene/milkyway/stars/denver.asset index 270ebda755..61bdb4af16 100644 --- a/data/assets/scene/milkyway/stars/denver.asset +++ b/data/assets/scene/milkyway/stars/denver.asset @@ -44,7 +44,8 @@ local Object = { }, GUI = { Name = "Stars (Denver)", - Path = "/Milky Way/Stars" + Path = "/Milky Way/Stars", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/ceres.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/ceres.asset index 66a6ab71ae..f6be8f3d83 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/ceres.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/ceres.asset @@ -9,7 +9,7 @@ local Ceres = { Type = "RenderableGlobe", Radii = { 487300, 487300, 454700 } }, - Tag = { "planet_solarSystem", "planet_terrestrial", "dwarf_planet" }, + Tag = { "planet_terrestrial", "dwarf_planet" }, GUI = { Path = "/Solar System/Dwarf Planets/Ceres" } @@ -32,6 +32,7 @@ local CeresLabel = { GUI = { Name = "Ceres Label", Path = "/Solar System/Dwarf Planets/Ceres", + Focusable = false, Description = "Label for Ceres, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/trail.asset index 9d5d66e6de..6cf9d4e5c7 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/trail.asset @@ -18,10 +18,11 @@ local CeresTrail = { Period = 1680, Resolution = 1000 }, - Tag = { "planetTrail_solarSystem", "planetTrail_dwarf" }, + Tag = { "planetTrail_dwarf" }, GUI = { Name = "Ceres Trail", - Path = "/Solar System/Dwarf Planets/Ceres" + Path = "/Solar System/Dwarf Planets/Ceres", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/ceres/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/ceres/transforms.asset index 0770c7e4fb..782932524e 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/ceres/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/ceres/transforms.asset @@ -22,6 +22,7 @@ local CeresPosition = { GUI = { Name = "Ceres Position", Path = "/Solar System/Dwarf Planets/Ceres", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/eris/label.asset b/data/assets/scene/solarsystem/dwarf_planets/eris/label.asset index f3022672b7..cc209c2198 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/eris/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/eris/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Eris Label", Path = "/Solar System/Dwarf Planets/Eris", + Focusable = false, Description = "Label for Eris, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/eris/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/eris/trail.asset index 418a202e70..79666f51db 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/eris/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/eris/trail.asset @@ -18,7 +18,8 @@ local Trail = { Tag = { "planetTrail_dwarf" }, GUI = { Name = "Eris Trail", - Path = "/Solar System/Dwarf Planets/Eris" + Path = "/Solar System/Dwarf Planets/Eris", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/eris/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/eris/transforms.asset index 4370649bc3..1b7fceda9a 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/eris/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/eris/transforms.asset @@ -24,6 +24,7 @@ local Position = { GUI = { Name = "Eris Position", Path = "/Solar System/Dwarf Planets/Eris", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/gonggong/label.asset b/data/assets/scene/solarsystem/dwarf_planets/gonggong/label.asset index 4f9849681c..9f2db95226 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/gonggong/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/gonggong/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Gonggong Label", Path = "/Solar System/Dwarf Planets/Gonggong", + Focusable = false, Description = "Label for Gonggong, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/gonggong/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/gonggong/trail.asset index 940fde7b9e..0b6126f4dc 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/gonggong/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/gonggong/trail.asset @@ -18,7 +18,8 @@ local Trail = { Tag = { "planetTrail_dwarf" }, GUI = { Name = "Gonggong Trail", - Path = "/Solar System/Dwarf Planets/Gonggong" + Path = "/Solar System/Dwarf Planets/Gonggong", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/gonggong/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/gonggong/transforms.asset index 32c3ecd36d..87710921a2 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/gonggong/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/gonggong/transforms.asset @@ -24,6 +24,7 @@ local Position = { GUI = { Name = "Gonggong Position", Path = "/Solar System/Dwarf Planets/Gonggong", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/haumea/label.asset b/data/assets/scene/solarsystem/dwarf_planets/haumea/label.asset index 931bc317c2..4783516bad 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/haumea/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/haumea/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Haumea Label", Path = "/Solar System/Dwarf Planets/Haumea", + Focusable = false, Description = "Label for Haumea, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/haumea/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/haumea/trail.asset index 4d06f318ab..51b0a1b099 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/haumea/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/haumea/trail.asset @@ -19,6 +19,7 @@ local Trail = { GUI = { Name = "Haumea Trail", Path = "/Solar System/Dwarf Planets/Haumea", + Focusable = false, Description = "Trail of Haumea" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/haumea/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/haumea/transforms.asset index b2e7bbddbc..c43b45531c 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/haumea/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/haumea/transforms.asset @@ -25,6 +25,7 @@ local Position = { GUI = { Name = "Haumea Position", Path = "/Solar System/Dwarf Planets/Haumea", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/makemake/label.asset b/data/assets/scene/solarsystem/dwarf_planets/makemake/label.asset index e97d8eab3f..eda00397ff 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/makemake/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/makemake/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Makemake Label", Path = "/Solar System/Dwarf Planets/Makemake", + Focusable = false, Description = "Label for Makemake, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/makemake/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/makemake/trail.asset index d9f8506ee1..569de3ad49 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/makemake/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/makemake/trail.asset @@ -18,7 +18,8 @@ local Trail = { Tag = { "planetTrail_dwarf" }, GUI = { Name = "Makemake Trail", - Path = "/Solar System/Dwarf Planets/Makemake" + Path = "/Solar System/Dwarf Planets/Makemake", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/makemake/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/makemake/transforms.asset index ebc89a82d6..d3fa8db238 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/makemake/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/makemake/transforms.asset @@ -25,6 +25,7 @@ local Position = { GUI = { Name = "Makemake Position", Path = "/Solar System/Dwarf Planets/Makemake", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/orcus/label.asset b/data/assets/scene/solarsystem/dwarf_planets/orcus/label.asset index d27fc95cd9..ef933cbed0 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/orcus/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/orcus/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Orcus Label", Path = "/Solar System/Dwarf Planets/Orcus", + Focusable = false, Description = "Label for Orcus, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/orcus/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/orcus/trail.asset index 185e661178..41100371e2 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/orcus/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/orcus/trail.asset @@ -18,6 +18,7 @@ local Trail = { Tag = { "planetTrail_dwarf" }, GUI = { Name = "Orcus Trail", + Focusable = false, Path = "/Solar System/Dwarf Planets/Orcus" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/orcus/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/orcus/transforms.asset index 388d13f9e9..0253fc2806 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/orcus/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/orcus/transforms.asset @@ -25,6 +25,7 @@ local Position = { GUI = { Name = "Orcus Position", Path = "/Solar System/Dwarf Planets/Orcus", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset index 6c7c0079c5..15280be863 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon.asset @@ -43,9 +43,16 @@ local Charon = { Color = { 1.0, 1.0, 0.0 } } }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_major", "moon_major_pluto" }, + Tag = { + "moon_solarSystem", + "moon_dwarf", + "moon_pluto", + "moon_major", + "moon_major_pluto" + }, GUI = { - Path = "/Solar System/Dwarf Planets/Pluto/Charon" + Path = "/Solar System/Dwarf Planets/Pluto/Charon", + Focusable = false } } @@ -70,6 +77,7 @@ local CharonLabel = { GUI = { Name = "Charon Label", Path = "/Solar System/Dwarf Planets/Pluto/Charon", + Focusable = false, Description = "Label for Pluto's moon Charon" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon_trail.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon_trail.asset index c700e2d00f..168bc9b1dc 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon_trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/charon/charon_trail.asset @@ -25,7 +25,8 @@ local CharonBarycentricTrail = { }, GUI = { Name = "Charon Barycentric Trail", - Path = "/Solar System/Dwarf Planets/Pluto/Charon" + Path = "/Solar System/Dwarf Planets/Pluto/Charon", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset index afd8d52428..de2cc2bdc3 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/hydra.asset @@ -46,7 +46,8 @@ local HydraTrail = { }, GUI = { Name = "Hydra Trail", - Path = "/Solar System/Dwarf Planets/Pluto/Moons/Hydra" + Path = "/Solar System/Dwarf Planets/Pluto/Moons/Hydra", + Focusable = false } } @@ -71,6 +72,7 @@ local HydraLabel = { GUI = { Name = "Hydra Label", Path = "/Solar System/Dwarf Planets/Pluto/Moons/Hydra", + Focusable = false, Description = "Label for Pluto's moon Hydra" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset index cfea0f7392..ffb5a2f4e4 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/kerberos.asset @@ -17,7 +17,13 @@ local Kerberos = { Type = "RenderableGlobe", Radii = { 10000, 10000, 10000 } }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, + Tag = { + "moon_solarSystem", + "moon_dwarf", + "moon_pluto", + "moon_minor", + "moon_minor_pluto" + }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Kerberos" } @@ -46,7 +52,8 @@ local KerberosTrail = { }, GUI = { Name = "Kerberos Trail", - Path = "/Solar System/Dwarf Planets/Pluto/Moons/Kerberos" + Path = "/Solar System/Dwarf Planets/Pluto/Moons/Kerberos", + Focusable = false } } @@ -71,6 +78,7 @@ local KerberosLabel = { GUI = { Name = "Kerberos Label", Path = "/Solar System/Dwarf Planets/Pluto/Moons/Kerberos", + Focusable = false, Description = "Label for Pluto's moon Kerberos" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset index 4ca7c37417..7ef0ed4e4e 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/nix.asset @@ -17,7 +17,13 @@ local Nix = { Type = "RenderableGlobe", Radii = { 45000, 45000, 45000 } }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, + Tag = { + "moon_solarSystem", + "moon_dwarf", + "moon_pluto", + "moon_minor", + "moon_minor_pluto" + }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Nix" } @@ -46,7 +52,8 @@ local NixTrail = { }, GUI = { Name = "Nix Trail", - Path = "/Solar System/Dwarf Planets/Pluto/Moons/Nix" + Path = "/Solar System/Dwarf Planets/Pluto/Moons/Nix", + Focusable = false } } @@ -71,6 +78,7 @@ local NixLabel = { GUI = { Name = "Nix Label", Path = "/Solar System/Dwarf Planets/Pluto/Moons/Nix", + Focusable = false, Description = "Label for Pluto's moon Nix" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset index ecb06af177..b410ff557c 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/minor/styx.asset @@ -17,7 +17,13 @@ local Styx = { Type = "RenderableGlobe", Radii = { 45000, 45000, 45000 } }, - Tag = { "moon_solarSystem", "moon_dwarf", "moon_pluto", "moon_minor", "moon_minor_pluto" }, + Tag = { + "moon_solarSystem", + "moon_dwarf", + "moon_pluto", + "moon_minor", + "moon_minor_pluto" + }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto/Moons/Styx" } @@ -46,7 +52,8 @@ local StyxTrail = { }, GUI = { Name = "Styx Trail", - Path = "/Solar System/Dwarf Planets/Pluto/Moons/Styx" + Path = "/Solar System/Dwarf Planets/Pluto/Moons/Styx", + Focusable = false } } @@ -71,6 +78,7 @@ local StyxLabel = { GUI = { Name = "Styx Label", Path = "/Solar System/Dwarf Planets/Pluto/Moons/Styx", + Focusable = false, Description = "Label for Pluto's moon Styx" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset index 33cb68425d..8034f03b96 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto.asset @@ -43,7 +43,7 @@ local Pluto = { Color = { 1.0, 1.0, 0.0 } } }, - Tag = { "planet_solarSystem", "planet_terrestrial", "dwarf_planet" }, + Tag = { "planet_terrestrial", "dwarf_planet" }, GUI = { Path = "/Solar System/Dwarf Planets/Pluto" } @@ -70,6 +70,7 @@ local PlutoLabel = { GUI = { Name = "Pluto Label", Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false, Description = "Label for Pluto, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail.asset index c755a54906..9fdc396bd0 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail.asset @@ -17,10 +17,11 @@ local PlutoTrailBarycentric = { Period = 6.38723, Resolution = 1000 }, - Tag = { "planetTrail_solarSystem", "planetTrail_dwarf" }, + Tag = { "planetTrail_dwarf" }, GUI = { Name = "Pluto Barycentric Trail", Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false, Description = "Orbit of Pluto around its Barycenter" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail_kepler.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail_kepler.asset index e0ff0f1342..e2fd2fad7e 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail_kepler.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/pluto_trail_kepler.asset @@ -28,6 +28,7 @@ local PlutoKeplerianTrail = { GUI = { Name = "Pluto Keplerian Trail", Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false, Description = "Keplerian trail of Pluto. Contains full orbit" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/pluto/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/pluto/trail.asset index 18209e1341..e1917ab5d3 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/pluto/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/pluto/trail.asset @@ -17,10 +17,11 @@ local PlutoBarycenterTrail = { Period = 365.25, Resolution = 1000 }, - Tag = { "planetTrail_solarSystem", "planetTrail_dwarf" }, + Tag = { "planetTrail_dwarf" }, GUI = { Name = "Pluto Barycenter Trail", Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false, Description = [[Precise trail of Pluto from NASA SPICE data. Not containing full orbit]] } diff --git a/data/assets/scene/solarsystem/dwarf_planets/quaoar/label.asset b/data/assets/scene/solarsystem/dwarf_planets/quaoar/label.asset index 42ed67349d..c380de600b 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/quaoar/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/quaoar/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Quaoar Label", Path = "/Solar System/Dwarf Planets/Quaoar", + Focusable = false, Description = "Label for Quaoar, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/quaoar/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/quaoar/trail.asset index 8ee5bcc0fc..7c5d7d13f0 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/quaoar/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/quaoar/trail.asset @@ -19,6 +19,7 @@ local Trail = { GUI = { Name = "Quaoar Trail", Path = "/Solar System/Dwarf Planets/Quaoar", + Focusable = false, Description = "Trail of Quaoar" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/quaoar/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/quaoar/transforms.asset index a4ad4ec616..2913310fb7 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/quaoar/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/quaoar/transforms.asset @@ -25,6 +25,7 @@ local Position = { GUI = { Name = "Quaoar Position", Path = "/Solar System/Dwarf Planets/Quaoar", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/sedna/label.asset b/data/assets/scene/solarsystem/dwarf_planets/sedna/label.asset index 5e7f34382d..5588556b7c 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/sedna/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/sedna/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Sedna Label", Path = "/Solar System/Dwarf Planets/Sedna", + Focusable = false, Description = "Label for Sedna, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/sedna/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/sedna/trail.asset index bbaa6de828..03274f22e1 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/sedna/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/sedna/trail.asset @@ -19,6 +19,7 @@ local Trail = { GUI = { Name = "Sedna Trail", Path = "/Solar System/Dwarf Planets/Sedna", + Focusable = false, Description = "Trail of Sedna" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/sedna/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/sedna/transforms.asset index ab99f667b7..2d075432c3 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/sedna/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/sedna/transforms.asset @@ -25,6 +25,7 @@ local Position = { GUI = { Name = "Sedna Position", Path = "/Solar System/Dwarf Planets/Sedna", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/vesta/label.asset b/data/assets/scene/solarsystem/dwarf_planets/vesta/label.asset index 400036ae5c..ec66a23932 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/vesta/label.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/vesta/label.asset @@ -23,6 +23,7 @@ local Label = { GUI = { Name = "Vesta Label", Path = "/Solar System/Dwarf Planets/Vesta", + Focusable = false, Description = "Label for Vesta, visible at the solarsystem overview zoom level" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/vesta/trail.asset b/data/assets/scene/solarsystem/dwarf_planets/vesta/trail.asset index 230c86c856..7460c4cfa7 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/vesta/trail.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/vesta/trail.asset @@ -19,6 +19,7 @@ local Trail = { GUI = { Name = "Vesta Trail", Path = "/Solar System/Dwarf Planets/Vesta", + Focusable = false, Description = "Trail of Vesta" } } diff --git a/data/assets/scene/solarsystem/dwarf_planets/vesta/transforms.asset b/data/assets/scene/solarsystem/dwarf_planets/vesta/transforms.asset index 9280fc674f..4e597818f3 100644 --- a/data/assets/scene/solarsystem/dwarf_planets/vesta/transforms.asset +++ b/data/assets/scene/solarsystem/dwarf_planets/vesta/transforms.asset @@ -5,28 +5,29 @@ local transforms = asset.require("scene/solarsystem/sun/transforms") local AU = 1.496e+8 local Translation = { - Type = "KeplerTranslation", - Eccentricity = 0.08875750498598881, - SemiMajorAxis = 2.363038212561438 * AU, - Inclination = 7.139257981928672, - AscendingNode = 103.7573001493549, - ArgumentOfPeriapsis = 151.5991639880173, - MeanAnomaly = 115.1329895974862, - Epoch = "2021 04 13 11:15:57", - Period = 1326.797192349944 * 60 * 60 * 24 + Type = "KeplerTranslation", + Eccentricity = 0.08875750498598881, + SemiMajorAxis = 2.363038212561438 * AU, + Inclination = 7.139257981928672, + AscendingNode = 103.7573001493549, + ArgumentOfPeriapsis = 151.5991639880173, + MeanAnomaly = 115.1329895974862, + Epoch = "2021 04 13 11:15:57", + Period = 1326.797192349944 * 60 * 60 * 24 } local Position = { - Identifier = "VestaPosition", - Parent = transforms.SunEclipJ2000.Identifier, - Transform = { - Translation = Translation - }, - GUI = { - Name = "Vesta Position", - Path = "/Solar System/Dwarf Planets/Vesta", - Hidden = true - } + Identifier = "VestaPosition", + Parent = transforms.SunEclipJ2000.Identifier, + Transform = { + Translation = Translation + }, + GUI = { + Name = "Vesta Position", + Path = "/Solar System/Dwarf Planets/Vesta", + Focusable = false, + Hidden = true + } } diff --git a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_batsrus.asset b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_batsrus.asset index 6a34d700e4..acf6983973 100644 --- a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_batsrus.asset +++ b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_batsrus.asset @@ -65,8 +65,9 @@ local BatsrusJ12OpenClosed = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.openClosed, InputFileType = "Osfls", - Color = { 0.7, 0.4, 0.0, 0.6 }, -- Default color - ColorMethod = "By Quantity", -- Color by Quantity + ShowAtAllTimes = false, + Color = { 0.7, 0.4, 0.0, 0.6 }, + ColorMethod = "By Quantity", ColorQuantity = 0, -- Temperature ColorTablePaths = { batsrusTemperatureColorTable, @@ -78,7 +79,7 @@ local BatsrusJ12OpenClosed = { ColorTableRanges = colorRanges, MaskingEnabled = true, MaskingQuantity = 4, -- Topology - MaskingRanges = { {2.5, 3.0} } -- Corresponds to closed fieldlines only + MaskingRanges = { { 2.5, 3.0 } } -- Corresponds to closed fieldlines only }, GUI = { Name = "Fieldlines BATSRUS J12 Open/Closed", @@ -95,9 +96,10 @@ local BatsrusJ12FlowLines = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.velocityFlow, InputFileType = "Osfls", - ColorMethod = "By Quantity", -- Color by Quantity + ShowAtAllTimes = false, + ColorMethod = "By Quantity", ColorQuantity = 3, -- Velocity - Color = { 0.7, 0.4, 0.0, 0.12 }, -- Default color + Color = { 0.7, 0.4, 0.0, 0.12 }, ColorTablePaths = { batsrusTemperatureColorTable, batsrusDensityColorTable, @@ -123,6 +125,7 @@ local BatsrusAsherStaticSeedsFlowLines = { Enabled = false, SourceFolder = unzippedDataDestination.asherStatic, InputFileType = "Osfls", + ShowAtAllTimes = false, ColorTablePaths = { batsrusTemperatureColorTable, batsrusDensityColorTable, diff --git a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_enlil.asset b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_enlil.asset index 336ec6d658..dd8d173ff9 100644 --- a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_enlil.asset +++ b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_enlil.asset @@ -1,5 +1,5 @@ asset.require("scene/solarsystem/heliosphere/2012/reset_loop_action") -local transforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") +local transforms = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") @@ -61,8 +61,9 @@ local ENLILSliceEqPlane11AU1 = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.EqPlane011AU1, InputFileType = "Osfls", + ShowAtAllTimes = false, Color = { 0.4, 0.15, 0.4, 0.6 }, - ColorMethod = "By Quantity", -- Color by Quantity + ColorMethod = "By Quantity", ColorQuantity = 1, -- Velocity ColorTablePaths = { enlilDensityColorTable, @@ -84,8 +85,9 @@ local ENLILSliceEqPlane11AU2 = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.EqPlane011AU2, InputFileType = "Osfls", + ShowAtAllTimes = false, Color = { 0.4, 0.15, 0.4, 0.6 }, - ColorMethod = "By Quantity", -- Color by Quantity + ColorMethod = "By Quantity", ColorQuantity = 1, -- Velocity ColorTablePaths = { enlilDensityColorTable, @@ -107,9 +109,9 @@ local ENLILSliceLat411AU1 = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.Lat4011AU1, InputFileType = "Osfls", - + ShowAtAllTimes = false, Color = { 0.4, 0.15, 0.4, 0.6 }, - ColorMethod = "By Quantity", -- Color by Quantity + ColorMethod = "By Quantity", ColorQuantity = 1, -- Velocity ColorTablePaths = { enlilDensityColorTable, @@ -131,9 +133,9 @@ local ENLILSliceLat411AU2 = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.Lat4011AU2, InputFileType = "Osfls", - + ShowAtAllTimes = false, Color = { 0.4, 0.15, 0.4, 0.6 }, - ColorMethod = "By Quantity", -- Color by Quantity + ColorMethod = "By Quantity", ColorQuantity = 1, -- Velocity ColorTablePaths = { enlilDensityColorTable, @@ -155,6 +157,7 @@ local ENLILEarth = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.Earth, InputFileType = "Osfls", + ShowAtAllTimes = false, Color = { 1.0, 1.0, 1.0, 0.6 }, ColorTablePaths = { enlilDensityColorTable, @@ -176,6 +179,7 @@ local ENLILStereoA = { Type = "RenderableFieldlinesSequence", SourceFolder = unzippedDataDestination.StereoA, InputFileType = "Osfls", + ShowAtAllTimes = false, Color = { 1.0, 1.0, 1.0, 0.6 }, ColorTablePaths = { enlilDensityColorTable, diff --git a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_pfss.asset b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_pfss.asset index b0d83cae39..168938bf40 100644 --- a/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_pfss.asset +++ b/data/assets/scene/solarsystem/heliosphere/2012/sun_earth_2012_fieldlines_pfss.asset @@ -1,4 +1,4 @@ -local transforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") +local transforms = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") @@ -53,6 +53,7 @@ local PFSS = { Type = "RenderableFieldlinesSequence", SourceFolder = PFSSPaths.SolarSoft, InputFileType = "Osfls", + ShowAtAllTimes = true, Color = { 0.35, 0.51, 0.875, 0.22 }, FlowEnabled = true, ReversedFlow = true, diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/carrington_to_heeq_rotation.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/carrington_to_heeq_rotation.asset deleted file mode 100644 index c4607f4f9f..0000000000 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/carrington_to_heeq_rotation.asset +++ /dev/null @@ -1,26 +0,0 @@ -local CarringtonLongitudeToHEEQ180Rotation = { - -- This is a rotation matrix to go from the Carrington longitude reference frame to the - -- HEEQ180 reference frame. At the reference time, MAS_seq = 0, 2000-07-14T08:33:37.105 - -- the Carrington longitude was 309.3 degrees. - -- Difference from HEEQ => 360-309.3=50.7 (or 0-309.3 = -309.3). However this leads to - -- the same rotation matrix in the end) - -- Since OpenSpace supports HEEQ180 and not HEEQ, 180 was added or subtracted - -- => a1 = -129.3 and a2 = 230.7 - -- Rotation matrix: (cos a, -sin a, 0)(sin a, cos a, 0)(0, 0, 1) leads to the result. - Type = "FixedRotation", - XAxis = { -0.63338087262755016203262119192353, -0.77384020972650618518999944537717, 0.0 }, - YAxis = { 0.77384020972650618518999944537717, -0.63338087262755016203262119192353, 0.0 }, - ZAxis = { 0.0, 0.0, 1.0 } -} - -asset.export("CarringtonLongitudeToHEEQ180Rotation", CarringtonLongitudeToHEEQ180Rotation) - - - -asset.meta = { - Name = "Carrington Longitude To HEEQ180 Rotation", - Description = "Contains a rotation for HEEQ180 to be used by another file", - Author = "OpenSpace Team", - URL = "http://openspaceproject.com", - License = "MIT license" -} diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset index 402f770e1b..729e4360ac 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fieldlines.asset @@ -1,5 +1,4 @@ -local heliosphereTransforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") -local rot = asset.require("./carrington_to_heeq_rotation") +local sunTransforms = asset.require("scene/solarsystem/sun/transforms") @@ -16,12 +15,11 @@ local SunRadius = 695700000 -- Fieldlies from binaries local Fieldlines = { Identifier = "MAS-MHD-Fieldlines-bastille-day-2000", - Parent = heliosphereTransforms.HeliocentricEarthEquatorial180.Identifier, + Parent = sunTransforms.SunIAU.Identifier, -- TODO Elon: 21 April 2022. Interaction sphere should not depend on the transform scale. -- InteractionSphere = sunAsset.Sun.Renderable.Radii[1] * 1.05, InteractionSphere = 1 / SunRadius, Transform = { - Rotation = rot.CarringtonLongitudeToHEEQ180Rotation, Scale = { Type = "StaticScale", Scale = SunRadius @@ -30,17 +28,14 @@ local Fieldlines = { Renderable = { Type = "RenderableFieldlinesSequence", SourceFolder = fieldlinesDirectory, - AlphaBlendlingEnabled = false, InputFileType = "Osfls", + LineWidth = 1.0, + ShowAtAllTimes = false, + ColorQuantity = 0, ColorTablePaths = { - asset.resource("transferfunctions/density-fieldlines.txt"), - asset.resource("transferfunctions/velocity-fieldlines.txt") + asset.resource("transferfunctions/density-fieldlines.txt") }, - ColorTableRanges = { - { 0, 1000000 }, - { 100, 2000 } - }, - SimulationModel = "mas" + ColorMinMaxRange = { 0, 1000000 } }, GUI = { Path = "/Solar System/Heliosphere/Bastille Day 2000", diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset index bfa8853ccd..17c1cca52d 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodes.asset @@ -1,5 +1,4 @@ -local heliosphereTransforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") -local rot = asset.require("./carrington_to_heeq_rotation") +local sunTransforms = asset.require("scene/solarsystem/sun/transforms") @@ -14,13 +13,10 @@ local fluxNodesBinaries = asset.resource({ -- FluxNodes from binaries local Fluxnodes = { Identifier = "MAS-MHD-FluxNodes-bastille-day-2000", - Parent = heliosphereTransforms.HeliocentricEarthEquatorial180.Identifier, + Parent = sunTransforms.SunIAU.Identifier, -- TODO Elon: 21 April 2022. Interaction sphere should not depend on the transform scale. -- InteractionSphere = sunAsset.Sun.Renderable.Radii[1] * 1.05, InteractionSphere = 695700000.0, - Transform = { - Rotation = rot.CarringtonLongitudeToHEEQ180Rotation - }, Renderable = { Type = "RenderableFluxNodes", SourceFolder = fluxNodesBinaries, diff --git a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset index 4d0bf11e2d..e213f3306f 100644 --- a/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset +++ b/data/assets/scene/solarsystem/heliosphere/bastille_day/fluxnodescutplane.asset @@ -1,5 +1,5 @@ -local transforms = asset.require("scene/solarsystem/sun/transforms_heliosphere") -local rot = asset.require("./carrington_to_heeq_rotation") +local transforms = asset.require("scene/solarsystem/sun/transforms") +local transformsHelio = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") @@ -20,13 +20,10 @@ local TexturesPathMeridial = asset.resource({ local EquatorialCutplane = { Identifier = "EquatorialCutplane-bastille-day-2000", - Parent = transforms.HeliocentricEarthEquatorial180.Identifier, + Parent = transforms.SunIAU.Identifier, -- TODO Elon: 21 April 2022. Interaction sphere should not depend on the transform scale. -- InteractionSphere = sunAsset.Sun.Renderable.Radii[1] * 1.05, InteractionSphere = 695700000.0, - Transform = { - Rotation = rot.CarringtonLongitudeToHEEQ180Rotation - }, Renderable = { Type = "RenderablePlaneTimeVaryingImage", Size = 157000000000, @@ -46,7 +43,7 @@ local EquatorialCutplane = { local MeridialCutplane = { Identifier = "MeridialCutplane-bastille-day-2000", - Parent = transforms.HeliocentricEarthEquatorial180.Identifier, + Parent = transformsHelio.HeliocentricEarthEquatorial180.Identifier, -- TODO Elon: 21 April 2022. Interaction sphere should not depend on the transform scale. -- InteractionSphere = sunAsset.Sun.Renderable.Radii[1] * 1.05, InteractionSphere = 695700000, diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/fieldlines.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/fieldlines.asset new file mode 100644 index 0000000000..bfd6792633 --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/fieldlines.asset @@ -0,0 +1,203 @@ +local transforms = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") + + + +local transferFunctions = asset.resource({ + Type = "HttpSynchronization", + Name = "Today's Sun Transfer Functions", + Identifier = "todayssun_transferfunctions", + Version = 1 +}) + + +local windSpeedPolarityColorTable = transferFunctions .. "polarity_spec.txt" +local subEarthLevelColorTable = transferFunctions .. "subearth_spec.txt" +local currentSheetColorTable = transferFunctions .. "currentsheet_spec.txt" +local opennessColorTable = transferFunctions .."openness_spec.txt" + +local infoURL = "https://iswaa-webservice1.ccmc.gsfc.nasa.gov/IswaSystemWebApp/DataInfoServlet?id=" +local dataURL = "https://iswaa-webservice1.ccmc.gsfc.nasa.gov/IswaSystemWebApp/FilesInRangeServlet?dataID=" + +local sunRadius = 695700000.0 + +local fieldlinesSCS = { + Identifier = "WSA_54_Fieldlines_SCS_OI", + Parent = transforms.WSAOffset60.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + Scale = sunRadius + }, + }, + Renderable = { + Type = "RenderableFieldlinesSequence", + InputFileType = "Osfls", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2286, + ShowAtAllTimes = false, + ColorMethod = "By Quantity", + ColorQuantity = 0, -- Polarity & solar wind speed + ColorTablePaths = { + windSpeedPolarityColorTable, + currentSheetColorTable + }, + ColorTableRanges = { + { -1.0, 1.0 }, + { 0.0, 1.0 } + } + }, + GUI = { + Name = "Fieldlines: Corona SCS (Out-In Tracing)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[WSA 5.4 real-time output of the fieldline trace from the Schatten + Current Sheet model (SCS) outer boundary at 21.5 Rs to the source surface at 2.5 Rs + using GONGZ as input. SCS is the , a part of WSA.]], + Focusable = false + } +} + +local fieldlinesOI = { + Identifier = "WSA_54_Fieldlines_PFSS_OI", + Parent = transforms.WSAOffset60.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + Scale = sunRadius + }, + }, + Renderable = { + Type = "RenderableFieldlinesSequence", + InputFileType = "Osfls", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2285, + ShowAtAllTimes = false, + ColorMethod = "By Quantity", + ColorQuantity = 0, -- Polarity & solar wind speed + ColorTablePaths = { + windSpeedPolarityColorTable, + currentSheetColorTable + }, + ColorTableRanges = { + { -1.0, 1.0 }, + { 0.0, 1.0 } + }, + }, + GUI = { + Name = "Fieldlines: Corona PFSS (Out-In Tracing)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[WSA 5.4 real-time output of the fieldline trace from the source + surface to the solar surface using GONGZ as input. PFSS is the Potential Field + Source Surface model, a part of WSA.]], + Focusable = false + } +} + +local fieldlinesIO = { + Identifier = "WSA_54_Fieldlines_PFSS_IO", + Parent = transforms.WSAOffset60.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + Scale = sunRadius + }, + }, + Renderable = { + Type = "RenderableFieldlinesSequence", + InputFileType = "Osfls", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2284, + ShowAtAllTimes = false, + ColorMethod = "By Quantity", + ColorQuantity = 0, -- Open/closed lines + ColorTablePaths = { + opennessColorTable + }, + ColorTableRanges = { + { 0.0, 2.0 } + }, + }, + GUI = { + Name = "Fieldlines: Corona PFSS (In-Out Tracing)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[WSA 5.4 real-time output of the fieldline trace from the solar surface + outwards using GONGZ as input. PFSS is the Potential Field Source Surface model, a + part of WSA.]], + Focusable = false + } +} + +local fieldlinesEarth = { + Identifier = "WSA_54_Fieldlines_Earth", + Parent = transforms.WSAOffset60.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + Scale = sunRadius + }, + }, + Renderable = { + Type = "RenderableFieldlinesSequence", + InputFileType = "Osfls", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2287, + ShowAtAllTimes = false, + ColorMethod = "By Quantity", + ColorQuantity = 0, -- Polarity + ColorTablePaths = { + windSpeedPolarityColorTable, + subEarthLevelColorTable + }, + ColorTableRanges = { + { 0.0, 1.0 }, + { 0.0, 2.0 } + }, + }, + GUI = { + Name = "Fieldlines: Tracing from Earth", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[WSA 5.4 real-time output of the field line trace from Earth using GONGZ + as input.]], + Focusable = false + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(fieldlinesSCS) + openspace.addSceneGraphNode(fieldlinesOI) + openspace.addSceneGraphNode(fieldlinesIO) + openspace.addSceneGraphNode(fieldlinesEarth) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(fieldlinesEarth) + openspace.removeSceneGraphNode(fieldlinesIO) + openspace.removeSceneGraphNode(fieldlinesOI) + openspace.removeSceneGraphNode(fieldlinesSCS) +end) + +asset.export(fieldlinesSCS) +asset.export(fieldlinesOI) +asset.export(fieldlinesIO) +asset.export(fieldlinesEarth) + + + +asset.meta = { + Name = "WSA 5.4. Streaming Field Line Data Dynamically", + Version = "1.0", + Description = [[Downloading data from the WSA 5.4 simulation model, showing the dynamic + Sun at any point. It includes .osfls files (OpenSpace FieldLine Sequence) for field + lines.]], + Author = "CCMC", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset new file mode 100644 index 0000000000..b083d82a6b --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/grid.asset @@ -0,0 +1,128 @@ +local transforms = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") +local sunTransforms = asset.require("scene/solarsystem/sun/transforms") + + + +-- Slightly bigger size than the sphere radius to allow grid lines to not clip into sphere +-- since the lines themselfs are not curved +local gridSizeRadius = 7.0E8 + +local CarringtonPrimeMeridian = { + Identifier = "CarringtonPrimeMeridian", + Parent = sunTransforms.SunIAU.Identifier, + Transform = { + Translation = { + Type = "StaticTranslation", + -- A shift to only show an arc on one side of the sun + Position = { 3500000.0, 0.0, 0.0 } + }, + Rotation = { + Type = "StaticRotation", + Rotation = { 0.0, 0.0, -math.rad(90) } + }, + Scale = { + Type = "StaticScale", + -- Slightly smaller than grid size, to make the arc look better together with the + -- translation in x + Scale = 6.98E8 + } + }, + Renderable = { + Type = "RenderableSphericalGrid", + Size = gridSizeRadius, + Color = { 1.0, 0.0, 0.0 }, + LineWidth = 2.0, + LongSegments = 2, + LatSegments = 64 + }, + GUI = { + Name = "Carrington Prime Meridian", + Path = "/Solar System/Heliosphere", + Description = [[An arc showing the Carrington prime meridian of the Sun. + The line from pole to pole at 0 degree longitude.]], + Focusable = false + } +} + +local WSA_GridSlice = { + Identifier = "WSA_GridSlice", + Parent = transforms.HeliocentricEarthEquatorial.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { 0.0, 0.0, -math.rad(90) } + }, + Scale = { + Type = "StaticScale", + Scale = gridSizeRadius + } + }, + Renderable = { + Type = "RenderableSphericalGrid", + Size = gridSizeRadius, + Color = { 0.8, 0.8, 0.8 }, + LineWidth = 2.0, + LongSegments = 2, + LatSegments = 64 + }, + GUI = { + Name = "Solar Longitude Facing the Earth", + Path = "/Solar System/Heliosphere", + Description = [[An arc on the Sun surface from pole to pole that always faces Earth.]], + Focusable = false + } +} + +local WSA_Grid10Degrees = { + Identifier = "WSA_Grid10Degrees", + Parent = transforms.HeliocentricEarthEquatorial.Identifier, + Transform = { + Scale = { + Type = "StaticScale", + Scale = gridSizeRadius + } + }, + Renderable = { + Type = "RenderableSphericalGrid", + Size = gridSizeRadius, + Color = { 0.035, 0.675, 0.255 }, + LineWidth = 1.0, + Segments = 36 + }, + GUI = { + Name = "Grid on Sun", + Path = "/Solar System/Heliosphere", + Description = [[A grid aligned with the Sun-Earth line, with a 10-degree + separation between line segments by default.]], + Focusable = false + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(CarringtonPrimeMeridian) + openspace.addSceneGraphNode(WSA_GridSlice) + openspace.addSceneGraphNode(WSA_Grid10Degrees) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(WSA_Grid10Degrees) + openspace.removeSceneGraphNode(WSA_GridSlice) + openspace.removeSceneGraphNode(CarringtonPrimeMeridian) +end) + +asset.export(CarringtonPrimeMeridian) +asset.export(WSA_GridSlice) +asset.export(WSA_Grid10Degrees) + + + +asset.meta = { + Name = "Real-time Sun Grid Lines", + Version = "1.0", + Description = [[Grids that help show the Sun's orientation and rotation in relation to + Earth, including the Carrington prime meridian and Earth-facing longitudes.]], + Author = "CCMC", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/mission.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/mission.asset new file mode 100644 index 0000000000..67f4e67eb6 --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/mission.asset @@ -0,0 +1,65 @@ +local timeNow = openspace.time.currentWallTime() +local Mission = { + Identifier = "WSA", + Name = "The WSA Simulation Model", + TimeRange = { Start = "2022 DEC 09 16:14:00", End = timeNow }, + Description = [[ + This profile shows the Sun and its magnetic polarities, using data from the WSA + (Wang-Sheeley-Arge) simulation model version 5.4. The solar coronal portion of WSA is + comprised of two potential field type models. The inner model is Potential Field + Source Surface (PFSS) which specifies the coronal field from the inner, photospheric + boundary at 1 solar radii (Rs) to its outer boundary or source surface at 2.5Rs. The + outer model is the Schatten Current Sheet (SCS) model. The radial magnetic field + components of the PFSS magnetic field solution at 2.5Rs are used as the inner boundary + condition to the SCS model. All data is downloaded dynamically, bringing you the + latest data from the model. You can find these assets in the Scene menu under + "Solar System/Heliosphere". Under the "WSA Coronal Model" submenu, you will find extra + options for the solar field lines and surface features. The four different sets of + field lines are all following the magnetic fields but traced from different locations. + They can be colored by their different parameters in the data, for example polarity or + open or closed field lines. The two elements named "Solar Surface" show the magnetic + polarities, but have other options in the settings under "Texture Layer Options". The + same goes for the two named "Velocity at Outer Boundary". However, the two named + "Magnetic Field at 5Rs" do not have other options. Each asset includes settings for + appearance. If field lines are looking too bright against a bright background, try + changing the setting for additive blending. Additionally there is an option to save + the downloaded data for future use (by default, the data is not cached). Each data + file remains active until the next one in the sequence becomes available. To see which + file is currently being used, check the "Texture Source" field for each asset in the + GUI. In the visualization, the white line shooting out from the Sun, along with the + white arc, always points in the direction of Earth. The red arc is the Carrington + prime meridian which is longitude 0 of the Sun, and the green grid shows lines with a + 10-degree separation. If no data is showing, most likely the selected time is outside + of the data range (e.g., too far in the future or the past for the dynamic data to be + available). Alternatively, the files failed to download. For more information on the + simulation model, see https://ccmc.gsfc.nasa.gov/models/WSA~5.4. + ]], + Milestones = { + { + Name = "Version 5.4", + Date = "2022 DEC 09 16:14:00", + Description = [[For version 5.4 of WSA fieldline data and solar surfaces from end of + 2022 until today.]] + } + } +} + + +asset.onInitialize(function() + openspace.loadMission(Mission) +end) + +asset.onDeinitialize(function() + openspace.unloadMission(Mission) +end) + + + +asset.meta = { + Name = "Overview information panel - Mission panel", + Description = [[This mission file provides information about the simulation model + WSA.]], + Author = "CCMC", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/sun_earth_line.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/sun_earth_line.asset new file mode 100644 index 0000000000..d136f57209 --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/sun_earth_line.asset @@ -0,0 +1,43 @@ +local earth = asset.require("scene/solarsystem/planets/earth/earth") +local sun = asset.require("scene/solarsystem/sun/sun") + + + +local SunEarthLine = { + Identifier = "RenderableNodeLine_Sun_Earth", + Renderable = { + Type = "RenderableNodeLine", + StartNode = sun.Sun.Identifier, + EndNode = earth.Earth.Identifier + }, + GUI = { + Name = "Sun-Earth Line", + Path = "/Solar System/Heliosphere", + Description = [[A line between the Sun and the Earth to help with spatial + orientation.]], + Focusable = false + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(SunEarthLine) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(SunEarthLine) +end) + +asset.export("NodeLine", SunEarthLine) + + + +asset.meta = { + Name = "Sun-Earth Line", + Version = "1.0", + Description = [[A line between the Sun and the Earth to help with spatial + orientation.]], + Author = "CCMC", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/heliosphere/todayssun/surfaces.asset b/data/assets/scene/solarsystem/heliosphere/todayssun/surfaces.asset new file mode 100644 index 0000000000..619f50d616 --- /dev/null +++ b/data/assets/scene/solarsystem/heliosphere/todayssun/surfaces.asset @@ -0,0 +1,283 @@ +local transforms = asset.require("scene/solarsystem/heliosphere/transforms_heliosphere") + + + +local transferFunctions = asset.resource({ + Type = "HttpSynchronization", + Name = "Today's Sun Transfer Functions", + Identifier = "todayssun_transferfunctions", + Version = 1 +}) + + +local blueBlackRed = transferFunctions .. "blue-black-red.txt" + +local infoURL = "https://iswaa-webservice1.ccmc.gsfc.nasa.gov/IswaSystemWebApp/DataInfoServlet?id=" +local dataURL = "https://iswaa-webservice1.ccmc.gsfc.nasa.gov/IswaSystemWebApp/FilesInRangeServlet?dataID=" + +local sunRadius = 695700000 +-- This small 0.2% increase is an arbitrary number but necessary to make sure it is not +-- within the Sun sphere +local extendedRadius = sunRadius * 1.002 +local fiveSunRadius = sunRadius * 5 +local outerBoundary = sunRadius * 21.5 +-- Slightly bigger radii to prevent z fighting rendering artifact compared to GONG-Z +local extendedRadiusAdapt = extendedRadius * 1.00002 +local fiveSunRadiusAdapt = fiveSunRadius * 1.00002 +local outerBoundaryAdapt = outerBoundary * 1.00002 + +local WSA_54_Magnetic_Field_GONGZ_5_Rs = { + Identifier = "WSA_54_Magnetic_Field_GONGZ_5_Rs", + Parent = transforms.WSAOffset60.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = fiveSunRadius, + Orientation = "Both", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2148, + FitsLayer = 0, + LayerNames = { + ['0'] = "Coronal Magnetic Field at 5 Solar Radii (nT)" + }, + LayerMinMaxCapValues = { + ['0'] = { -5000.0, 5000.0 } + }, + ColorMap = blueBlackRed, + UseColorMap = false, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Magnetic Field at 5Rs (GONG-Z)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing the coronal + magnetic field on a sphere at 5 solar radii. Output: FITS files using GONG-Z Maps + (RADOUT = 5.0).]], + Focusable = false + } +} + +local WSA_54_Magnetic_Field_ADAPT_5_Rs = { + Identifier = "WSA_54_Magnetic_Field_ADAPT_5_Rs", + Parent = transforms.HeliocentricEarthEquatorial180.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = fiveSunRadiusAdapt, + Orientation = "Both", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2149, + FitsLayer = 0, + LayerNames = { + ['0'] = "Coronal Magnetic Field at 5 Solar Radii (nT)" + }, + LayerMinMaxCapValues = { + ['0'] = { -5000.0, 5000.0 } + }, + ColorMap = blueBlackRed, + UseColorMap = false, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Magnetic Field at 5Rs (GONG ADAPT)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing the coronal + magnetic field on a sphere at 5 solar radii. Output: FITS file using + ADAPT GONG realization 000 to 011 Maps (RADOUT = 5.0).]], + Focusable = false + } +} + +local WSA_54_Magnetograms_GONGZ = { + Identifier = "WSA_54_Magnetograms_GONGZ", + Parent = transforms.WSAOffset60.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = extendedRadius, + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2148, + FitsLayer = 4, + LayerNames = { + ['1'] = "Flux tube expansion factor evaluated at the source surface", + ['4'] = "Observed Photospheric Field (Gauss)", + ['5'] = "Distance from open field footpoint to nearest coronal boundary (deg)", + ['6'] = "Open (1,2,3) and closed (0) regions on the photosphere [1=in-to-out tracing; 2=out-to-in tracing; 3=both] (no units)", + ['7'] = "Distance to current sheet at outer boundary (degrees)" + }, + LayerMinMaxCapValues = { + ['1'] = { 0.0, 50.0 }, + ['4'] = { -50.0, 50.0 }, + ['5'] = { 0.0, 30.0 }, + ['6'] = { 0.0, 4.0 }, + ['7'] = { 0.0, 90.0 } + }, + ColorMap = blueBlackRed, + UseColorMap = false, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Solar Surface (GONG-Z)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing data on the + solar surface with multiple options in the list under Texture Layer Options. Output: + FITS files using GONG-Z Maps (RADOUT = 5.0).]], + Focusable = false + } +} + +local WSA_54_Magnetograms_ADAPT = { + Identifier = "WSA_54_Magnetograms_ADAPT", + Parent = transforms.HeliocentricEarthEquatorial180.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = extendedRadiusAdapt, + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2149, + FitsLayer = 4, + LayerNames = { + ['1'] = "Flux tube expansion factor evaluated at the source surface", + ['4'] = "Observed Photospheric Field (Gauss)", + ['5'] = "Distance from open field footpoint to nearest coronal boundary (deg)", + ['6'] = "Open (1,2,3) and closed (0) regions on the photosphere [1=in-to-out tracing; 2=out-to-in tracing; 3=both] (no units)", + ['7'] = "Distance to current sheet at outer boundary (degrees)" + }, + LayerMinMaxCapValues = { + ['1'] = { 0.0, 50.0 }, + ['4'] = { -50.0, 50.0 }, + ['5'] = { 0.0, 30.0 }, + ['6'] = { 0.0, 4.0 }, + ['7'] = { 0.0, 90.0 } + }, + ColorMap = blueBlackRed, + UseColorMap = false, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Solar Surface (GONG ADAPT)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing data on the + solar surface with multiple options in the list under Texture Layer Options. Output: + FITS file using ADAPT GONG realization 000 to 011 Maps (RADOUT = 5.0).]], + Focusable = false + } +} + +local WSA_Velocity_Adapt_Outer_Boundary = { + Identifier = "WSA_54_velocity_ADAPT_Outer_Boundary", + Parent = transforms.HeliocentricEarthEquatorial180.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = outerBoundaryAdapt, + LoadingType = "DynamicDownloading", + Orientation = "Both", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2218, + FitsLayer = 1, + LayerNames = { + ['0'] = "Coronal Magnetic Field at 21.5 Solar Radii (nT)", + ['1'] = "Solar Wind Speed at 21.5 Solar Radii (km/s)" + }, + LayerMinMaxCapValues = { + ['0'] = { -200.0, 200.0 }, + ['1'] = { 200.0, 850.0 } + }, + ColorMap = blueBlackRed, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Velocity at Outer Boundary (GONG-ADAPT)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing data on a sphere + at the outer boundary of the simulation model, either solar wind speed or coronal + magnetic field. Output: FITS file using ADAPT GONG realization 000-011 Maps + (RADOUT = 21.5).]], + Focusable = false + } +} + +local WSA_Velocity_Gongz_Outer_Boundary = { + Identifier = "WSA_54_velocity_GONGZ_Outer_Boundary", + Parent = transforms.WSAOffset60.Identifier, + Renderable = { + Type = "RenderableTimeVaryingFitsSphere", + Size = outerBoundary, + Orientation = "Both", + LoadingType = "DynamicDownloading", + InfoURL = infoURL, + DataURL = dataURL, + DataID = 2217, + FitsLayer = 1, + LayerNames = { + ['0'] = "Coronal Magnetic Field at 21.5 Solar Radii (nT)", + ['1'] = "Solar Wind Speed at 21.5 Solar Radii (km/s)" + }, + LayerMinMaxCapValues = { + ['0'] = { -200.0, 200.0 }, + ['1'] = { 200.0, 850.0 } + }, + ColorMap = blueBlackRed, + ShowPastFirstAndLastFile = false, + Segments = 132 + }, + GUI = { + Name = "Velocity at Outer Boundary (GONG-Z)", + Path = "/Solar System/Heliosphere/WSA Coronal Model", + Description = [[Texture sequence of simulation model WSA 5.4, showing data on a sphere + at the outer boundary of the simulation model, either solar wind speed or coronal + magnetic field. Output: FITS file using GONG-Z Maps (RADOUT = 21.5).]], + Focusable = false + } +} + + +asset.onInitialize(function() + openspace.addSceneGraphNode(WSA_54_Magnetic_Field_GONGZ_5_Rs) + openspace.addSceneGraphNode(WSA_54_Magnetic_Field_ADAPT_5_Rs) + openspace.addSceneGraphNode(WSA_54_Magnetograms_GONGZ) + openspace.addSceneGraphNode(WSA_54_Magnetograms_ADAPT) + openspace.addSceneGraphNode(WSA_Velocity_Adapt_Outer_Boundary) + openspace.addSceneGraphNode(WSA_Velocity_Gongz_Outer_Boundary) +end) + +asset.onDeinitialize(function() + openspace.removeSceneGraphNode(WSA_Velocity_Gongz_Outer_Boundary) + openspace.removeSceneGraphNode(WSA_Velocity_Adapt_Outer_Boundary) + openspace.removeSceneGraphNode(WSA_54_Magnetograms_ADAPT) + openspace.removeSceneGraphNode(WSA_54_Magnetograms_GONGZ) + openspace.removeSceneGraphNode(WSA_54_Magnetic_Field_ADAPT_5_Rs) + openspace.removeSceneGraphNode(WSA_54_Magnetic_Field_GONGZ_5_Rs) +end) + +asset.export(WSA_54_Magnetic_Field_GONGZ_5_Rs) +asset.export(WSA_54_Magnetic_Field_ADAPT_5_Rs) +asset.export(WSA_54_Magnetograms_GONGZ) +asset.export(WSA_54_Magnetograms_ADAPT) +asset.export(WSA_Velocity_Adapt_Outer_Boundary) +asset.export(WSA_Velocity_Gongz_Outer_Boundary) + + + +asset.meta = { + Name = "WSA 5.4. Streaming Surface Data Dynamically", + Version = "1.0", + Description = [[Downloading data from the WSA 5.4 simulation model, showing the dynamic + Sun at any point. It includes .fits files for solar surface data. GONG-Z is the + zero-corrected synoptic surface magnetic maps from the Global Oscillation Network + Group, while GONG-ADAPT is a model based on GONG, where ADAPT stands for Air Force + Data Assimilative Photospheric Flux Transport.]], + Author = "CCMC", + URL = "http://openspaceproject.com", + License = "MIT license" +} diff --git a/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset b/data/assets/scene/solarsystem/heliosphere/transforms_heliosphere.asset similarity index 84% rename from data/assets/scene/solarsystem/sun/transforms_heliosphere.asset rename to data/assets/scene/solarsystem/heliosphere/transforms_heliosphere.asset index 45e9828964..c7ac379bf0 100644 --- a/data/assets/scene/solarsystem/sun/transforms_heliosphere.asset +++ b/data/assets/scene/solarsystem/heliosphere/transforms_heliosphere.asset @@ -23,6 +23,8 @@ local HeliocentricEarthEquatorial180 = { GUI = { Name = "Heliocentric Earth Equatorial 180", Path = "/Solar System/Sun", + Focusable = false, + Hidden = true, Description = [[ - X-Y plane is the solar equator of date, therefore, the +Z axis is the primary vector and it is aligned to the Sun's north pole of date. @@ -35,8 +37,7 @@ local HeliocentricEarthEquatorial180 = { - +Y axis completes the right-handed system. - - the origin of this frame is the Sun's center of mass.]], - Hidden = true + - the origin of this frame is the Sun's center of mass.]] } } @@ -53,6 +54,8 @@ local HeliocentricEarthEquatorial = { GUI = { Name = "Heliocentric Earth Equatorial", Path = "/Solar System/Sun", + Focusable = false, + Hidden = true, Description = [[ - X-Y plane is the solar equator of date, therefore, the +Z axis is the primary vector and it is aligned to the Sun's north pole of date. @@ -65,8 +68,7 @@ local HeliocentricEarthEquatorial = { - +Y axis completes the right-handed system. - - the origin of this frame is the Sun's center of mass.]], - Hidden = true + - the origin of this frame is the Sun's center of mass.]] } } @@ -83,6 +85,8 @@ local HeliocentricEarthEcliptic = { GUI = { Name = "Heliocentric Earth Ecliptic", Path = "/Solar System/Sun", + Focusable = false, + Hidden = true, Description = [[ - X-Y plane is defined by the Earth Mean Ecliptic plane of date, therefore, the +Z axis is the primary vector,and it defined as the normal vector to the Ecliptic plane that points toward the @@ -93,7 +97,24 @@ local HeliocentricEarthEcliptic = { - +Y axis completes the right-handed system. - - the origin of this frame is the Sun's center of mass.]], + - the origin of this frame is the Sun's center of mass.]] + } +} + +local WSAOffset60 = { + Identifier = "WSAOffset60", + Parent = HeliocentricEarthEquatorial.Identifier, + Transform = { + Rotation = { + Type = "StaticRotation", + Rotation = { 0, 0, -math.rad(60) } + } + }, + GUI = { + Name = "WSA Data Offset 60 Degrees", + Path = "/Solar System/Sun", + Description = [[WSA outputs (FITS files) have the Sun-Earth line 60 degrees shifted + from the edge. This scene graph node handles that transformation.]], Hidden = true } } @@ -106,9 +127,11 @@ asset.onInitialize(function() openspace.addSceneGraphNode(HeliocentricEarthEquatorial180) openspace.addSceneGraphNode(HeliocentricEarthEquatorial) openspace.addSceneGraphNode(HeliocentricEarthEcliptic) + openspace.addSceneGraphNode(WSAOffset60) end) asset.onDeinitialize(function() + openspace.removeSceneGraphNode(WSAOffset60) openspace.removeSceneGraphNode(HeliocentricEarthEcliptic) openspace.removeSceneGraphNode(HeliocentricEarthEquatorial) openspace.removeSceneGraphNode(HeliocentricEarthEquatorial180) @@ -120,12 +143,14 @@ end) asset.export(HeliocentricEarthEquatorial180) asset.export(HeliocentricEarthEquatorial) asset.export(HeliocentricEarthEcliptic) +asset.export(WSAOffset60) asset.meta = { Name = "Sun Transform, HEE, HEEQ and HEEQ180", - Description = "Sun transform: HEE, HEEQ and HEEQ180", + Description = [[Sun transform: HEE, HEEQ, HEEQ180 and a 60-degree fixed rotation that WSA + is using.]], Author = "CCMC", URL = "http://openspaceproject.com", License = "MIT license" diff --git a/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset b/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset index 63179278e5..a3c50ba619 100644 --- a/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset +++ b/data/assets/scene/solarsystem/interstellar/c-2019_q4_borisov.asset @@ -32,6 +32,7 @@ local C2019Q4BorisovTrail = { GUI = { Name = "C/2019 Q4 Borisov Trail", Path = "/Solar System/Interstellar", + Focusable = false, Description = [[Trail of C-2019 Q4 Borisov from 2015 JAN 01 00:00:00 to 2050 JAN 01 00:00:00. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/interstellar/oumuamua.asset b/data/assets/scene/solarsystem/interstellar/oumuamua.asset index 28ba280136..cef6c697d8 100644 --- a/data/assets/scene/solarsystem/interstellar/oumuamua.asset +++ b/data/assets/scene/solarsystem/interstellar/oumuamua.asset @@ -32,6 +32,7 @@ local OumuamuaTrail = { GUI = { Name = "'Oumuamua Trail", Path = "/Solar System/Interstellar", + Focusable = false, Description = [[Trail of 'Oumuamua from 2014 JAN 01 00:00:00 to 2050 JAN 01 00:00:00. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset index 45970fee0d..2a620933ab 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/apollo11.asset @@ -1,7 +1,7 @@ asset.require("../actions") asset.require("./actions") local sun = asset.require("scene/solarsystem/sun/transforms") -local moonTransforms = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") local descentKeyframes = asset.require("./lem_descent") local descentRotationKeyframes = asset.require("./lem_descent_rotation") local kernels = asset.require("./kernels") @@ -28,7 +28,7 @@ local lemModel = asset.resource({ local Apollo11Position = { Identifier = "Apollo11Position", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, TimeFrame = { Type = "TimeFrameInterval", Start = "1969 JUL 19 19:38:29.183", @@ -83,7 +83,7 @@ local Apollo11Model = { local Apollo11MoonTrail = { Identifier = "Apollo11MoonTrail", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, Renderable = { Type = "RenderableTrailTrajectory", Enabled = false, @@ -93,7 +93,7 @@ local Apollo11MoonTrail = { Observer = coreKernels.ID.Moon, Frame = coreKernels.Frame.Moon }, - Color = { 0.180000,0.510000,0.750000 }, + Color = { 0.18, 0.51, 0.75 }, StartTime = "1969 JUL 19 19:38:29.183", EndTime = "1969 JUL 22 04:55:35.183", SampleInterval = 60, @@ -101,7 +101,8 @@ local Apollo11MoonTrail = { }, GUI = { Name = "Apollo 11 Moon Orbits", - Path = "/Solar System/Missions/Apollo/11" + Path = "/Solar System/Missions/Apollo/11", + Focusable = false } } @@ -131,12 +132,12 @@ local lemRotation = { local Apollo11LemTrail = { Identifier = "Apollo11LemTrail", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, Renderable = { Type = "RenderableTrailTrajectory", Enabled = false, Translation = lemTranslation, - Color = { 0.780000,0.940000,0.340000 }, + Color = { 0.78, 0.94, 0.34 }, StartTime = "1969 JUL 20 19:10:25.183", EndTime = "1969 JUL 20 20:17:46.183", SampleInterval = 2, @@ -144,13 +145,14 @@ local Apollo11LemTrail = { }, GUI = { Name = "Apollo 11 Lunar Lander Trail", - Path = "/Solar System/Missions/Apollo/11" + Path = "/Solar System/Missions/Apollo/11", + Focusable = false } } local Apollo11LemPosition = { Identifier = "Apollo11LemPosition", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, TimeFrame = { Type = "TimeFrameInterval", Start = "1969 JUL 20 19:10:25.183" diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset index 834e205889..3cc16d0f15 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem.asset @@ -1,5 +1,5 @@ local sun = asset.require("scene/solarsystem/sun/transforms") -local moon_asset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -13,11 +13,11 @@ local lem_model = asset.resource({ local Apollo11Lem = { Identifier = "Apollo11Lem", - Parent = moon_asset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moon_asset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = 23.47306, Latitude = 0.67402, Altitude = -1927.65, @@ -25,7 +25,7 @@ local Apollo11Lem = { }, Rotation = { Type = "GlobeRotation", - Globe = moon_asset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = 23.47306, Latitude = 0.67402 } diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem_descent.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem_descent.asset index ef35e23bb2..20a6119d26 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem_descent.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem_descent.asset @@ -1,3 +1,4 @@ +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") -- The following keyframe data was converted from the_last_four_minutes_2019-06-09.kml, -- which is available at http://apollo.mem-tek.com/GoogleMoonKMZ.html @@ -15,7 +16,7 @@ In the conversion, some assumptions and simplifications were made: local keyframes = { ["1969-07-20T20:13:40"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.64480784327766, Latitude = 0.6899960896998255, Altitude = -1546.3568594681615, @@ -23,7 +24,7 @@ local keyframes = { }, ["1969-07-20T20:13:41"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.64371058653857, Latitude = 0.6878218095380976, Altitude = -1565.4215164947534, @@ -31,7 +32,7 @@ local keyframes = { }, ["1969-07-20T20:13:42"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.64182673932963, Latitude = 0.6868724573827948, Altitude = -1565.4215164947534, @@ -39,7 +40,7 @@ local keyframes = { }, ["1969-07-20T20:13:43"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.64054706630478, Latitude = 0.6858670898943581, Altitude = -1579.0391286566048, @@ -47,7 +48,7 @@ local keyframes = { }, ["1969-07-20T20:13:44"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.63636509003987, Latitude = 0.6869318608730292, Altitude = -1579.0391286566048, @@ -55,7 +56,7 @@ local keyframes = { }, ["1969-07-20T20:13:45"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.63333610553231, Latitude = 0.6875049989808152, Altitude = -1584.4861735213453, @@ -63,7 +64,7 @@ local keyframes = { }, ["1969-07-20T20:13:46"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.630258198415152, Latitude = 0.6879251024075629, Altitude = -1587.2096959537155, @@ -71,7 +72,7 @@ local keyframes = { }, ["1969-07-20T20:13:47"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.62944534804935, Latitude = 0.6868614912680597, Altitude = -1592.656740818456, @@ -79,7 +80,7 @@ local keyframes = { }, ["1969-07-20T20:13:48"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.62679291745059, Latitude = 0.6859161360075229, Altitude = -1604.9125917641222, @@ -87,7 +88,7 @@ local keyframes = { }, ["1969-07-20T20:13:49"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.624085315638872, Latitude = 0.685126212476227, Altitude = -1619.8919651421588, @@ -95,7 +96,7 @@ local keyframes = { }, ["1969-07-20T20:13:50"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.62142772795633, Latitude = 0.6848656185526153, Altitude = -1630.7860548716399, @@ -103,7 +104,7 @@ local keyframes = { }, ["1969-07-20T20:13:51"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.617193313827283, Latitude = 0.6849603490017026, Altitude = -1630.7860548716399, @@ -111,7 +112,7 @@ local keyframes = { }, ["1969-07-20T20:13:52"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.61543137875974, Latitude = 0.68523470439912, Altitude = -1629.4242936554547, @@ -119,7 +120,7 @@ local keyframes = { }, ["1969-07-20T20:13:53"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.61158202958536, Latitude = 0.6853852597026965, Altitude = -1633.5095773040102, @@ -127,7 +128,7 @@ local keyframes = { }, ["1969-07-20T20:13:54"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.60991413189263, Latitude = 0.6852537398149626, Altitude = -1643.041905817306, @@ -135,7 +136,7 @@ local keyframes = { }, ["1969-07-20T20:13:55"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.607915527643012, Latitude = 0.6853963551830907, Altitude = -1662.106562843898, @@ -143,7 +144,7 @@ local keyframes = { }, ["1969-07-20T20:13:56"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.605996916437142, Latitude = 0.6830167672762936, Altitude = -1663.4683240600832, @@ -151,7 +152,7 @@ local keyframes = { }, ["1969-07-20T20:13:57"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.6027345854584, Latitude = 0.6824580715414034, Altitude = -1671.09418687072, @@ -159,7 +160,7 @@ local keyframes = { }, ["1969-07-20T20:13:58"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.60047452065999, Latitude = 0.6837230890353062, Altitude = -1671.638891357194, @@ -167,7 +168,7 @@ local keyframes = { }, ["1969-07-20T20:13:59"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.598006245556462, Latitude = 0.6851039272779041, Altitude = -1670.277130141009, @@ -175,7 +176,7 @@ local keyframes = { }, ["1969-07-20T20:14:00"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.594980604909782, Latitude = 0.6859011120513393, Altitude = -1683.8947423028603, @@ -183,7 +184,7 @@ local keyframes = { }, ["1969-07-20T20:14:01"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.595085912567033, Latitude = 0.685405665002322, Altitude = -1698.874115680897, @@ -191,7 +192,7 @@ local keyframes = { }, ["1969-07-20T20:14:02"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.5930664955042, Latitude = 0.6852493785380211, Altitude = -1701.597638113267, @@ -199,7 +200,7 @@ local keyframes = { }, ["1969-07-20T20:14:03"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.591385100243283, Latitude = 0.6848676328581234, Altitude = -1709.768205410378, @@ -207,7 +208,7 @@ local keyframes = { }, ["1969-07-20T20:14:04"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.58888799865371, Latitude = 0.6847945134519827, Altitude = -1717.9387727074889, @@ -215,7 +216,7 @@ local keyframes = { }, ["1969-07-20T20:14:05"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.58707895840121, Latitude = 0.6847997274847563, Altitude = -1720.662295139859, @@ -223,7 +224,7 @@ local keyframes = { }, ["1969-07-20T20:14:06"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.585134523523262, Latitude = 0.6844679679748537, Altitude = -1726.1093400045995, @@ -231,7 +232,7 @@ local keyframes = { }, ["1969-07-20T20:14:07"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.58309233633901, Latitude = 0.6845115405154798, Altitude = -1730.194623653155, @@ -239,7 +240,7 @@ local keyframes = { }, ["1969-07-20T20:14:08"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.581800658763132, Latitude = 0.6837790677972603, Altitude = -1737.0034297340808, @@ -247,7 +248,7 @@ local keyframes = { }, ["1969-07-20T20:14:09"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.580055660445762, Latitude = 0.6831436064664251, Altitude = -1741.0887133826361, @@ -255,7 +256,7 @@ local keyframes = { }, ["1969-07-20T20:14:10"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.57863282556605, Latitude = 0.6828140286921376, Altitude = -1749.259280679747, @@ -263,7 +264,7 @@ local keyframes = { }, ["1969-07-20T20:14:11"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.57640031861404, Latitude = 0.6825176811105468, Altitude = -1751.9828031121174, @@ -271,7 +272,7 @@ local keyframes = { }, ["1969-07-20T20:14:12"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.57398679174075, Latitude = 0.6826876185178852, Altitude = -1750.6210418959322, @@ -279,7 +280,7 @@ local keyframes = { }, ["1969-07-20T20:14:13"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.57156483164977, Latitude = 0.6825035088375115, Altitude = -1758.7916091930429, @@ -287,7 +288,7 @@ local keyframes = { }, ["1969-07-20T20:14:14"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.568805614344672, Latitude = 0.6825830127392937, Altitude = -1764.2386540577836, @@ -295,7 +296,7 @@ local keyframes = { }, ["1969-07-20T20:14:15"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.56712274763365, Latitude = 0.6821390846562359, Altitude = -1764.2386540577836, @@ -303,7 +304,7 @@ local keyframes = { }, ["1969-07-20T20:14:16"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.56530723506546, Latitude = 0.6815597518028071, Altitude = -1772.4092213548943, @@ -311,7 +312,7 @@ local keyframes = { }, ["1969-07-20T20:14:17"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.56412162578659, Latitude = 0.6811736246098009, Altitude = -1773.7709825710795, @@ -319,7 +320,7 @@ local keyframes = { }, ["1969-07-20T20:14:18"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.56276962682385, Latitude = 0.6808738576281527, Altitude = -1779.2180274358202, @@ -327,7 +328,7 @@ local keyframes = { }, ["1969-07-20T20:14:19"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.560994966586822, Latitude = 0.6806433210749815, Altitude = -1781.9415498681901, @@ -335,7 +336,7 @@ local keyframes = { }, ["1969-07-20T20:14:20"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.55943927760013, Latitude = 0.680762500394614, Altitude = -1788.7503559491158, @@ -343,7 +344,7 @@ local keyframes = { }, ["1969-07-20T20:14:21"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.55808185917876, Latitude = 0.6806932677701746, Altitude = -1788.205651462642, @@ -351,7 +352,7 @@ local keyframes = { }, ["1969-07-20T20:14:22"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.556393791415733, Latitude = 0.6811207130416086, Altitude = -1791.4738783814862, @@ -359,7 +360,7 @@ local keyframes = { }, ["1969-07-20T20:14:23"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.55496480157647, Latitude = 0.6814204204715102, Altitude = -1792.8356395976714, @@ -367,7 +368,7 @@ local keyframes = { }, ["1969-07-20T20:14:24"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.55306742293409, Latitude = 0.6817752241315425, Altitude = -1795.5591620300418, @@ -375,7 +376,7 @@ local keyframes = { }, ["1969-07-20T20:14:25"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.55137129589691, Latitude = 0.6815869620825672, Altitude = -1802.3679681109675, @@ -383,7 +384,7 @@ local keyframes = { }, ["1969-07-20T20:14:26"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54977453252549, Latitude = 0.681089420496018, Altitude = -1805.0914905433376, @@ -391,7 +392,7 @@ local keyframes = { }, ["1969-07-20T20:14:27"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.548083879890072, Latitude = 0.6807962459602379, Altitude = -1807.8150129757078, @@ -399,7 +400,7 @@ local keyframes = { }, ["1969-07-20T20:14:28"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.546540200146502, Latitude = 0.6805000865197504, Altitude = -1810.5385354080781, @@ -407,7 +408,7 @@ local keyframes = { }, ["1969-07-20T20:14:29"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54516644867878, Latitude = 0.6804026508636472, Altitude = -1815.9855802728187, @@ -415,7 +416,7 @@ local keyframes = { }, ["1969-07-20T20:14:30"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54408346592703, Latitude = 0.6805503084088244, Altitude = -1817.3473414890038, @@ -423,7 +424,7 @@ local keyframes = { }, ["1969-07-20T20:14:31"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54339758182375, Latitude = 0.6804859303352504, Altitude = -1818.709102705189, @@ -431,7 +432,7 @@ local keyframes = { }, ["1969-07-20T20:14:32"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54194570925206, Latitude = 0.6803064377127922, Altitude = -1821.4326251375592, @@ -439,7 +440,7 @@ local keyframes = { }, ["1969-07-20T20:14:33"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.54085221251783, Latitude = 0.6801546546560774, Altitude = -1824.9732042996407, @@ -447,7 +448,7 @@ local keyframes = { }, ["1969-07-20T20:14:34"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.53954140597472, Latitude = 0.6797325898259152, Altitude = -1827.696726732011, @@ -455,7 +456,7 @@ local keyframes = { }, ["1969-07-20T20:14:35"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.537934104316932, Latitude = 0.679569186740729, Altitude = -1831.7820103805664, @@ -463,7 +464,7 @@ local keyframes = { }, ["1969-07-20T20:14:36"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.53689199133522, Latitude = 0.6794114031790662, Altitude = -1833.6884760832256, @@ -471,7 +472,7 @@ local keyframes = { }, ["1969-07-20T20:14:37"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.53536814560564, Latitude = 0.6791732992510942, Altitude = -1836.9567030020698, @@ -479,7 +480,7 @@ local keyframes = { }, ["1969-07-20T20:14:38"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.53395331216349, Latitude = 0.6792039275673737, Altitude = -1839.4078731912032, @@ -487,7 +488,7 @@ local keyframes = { }, ["1969-07-20T20:14:39"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.53275788877434, Latitude = 0.6790059399149831, Altitude = -1840.497282164151, @@ -495,7 +496,7 @@ local keyframes = { }, ["1969-07-20T20:14:40"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.531279977460432, Latitude = 0.6788794363528592, Altitude = -1844.5825658127067, @@ -503,7 +504,7 @@ local keyframes = { }, ["1969-07-20T20:14:41"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.52959475512685, Latitude = 0.6788906739797406, Altitude = -1845.9443270288918, @@ -511,7 +512,7 @@ local keyframes = { }, ["1969-07-20T20:14:42"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.52769228385669, Latitude = 0.6787279693068425, Altitude = -1848.123144974788, @@ -519,7 +520,7 @@ local keyframes = { }, ["1969-07-20T20:14:43"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.52685377337869, Latitude = 0.6787634478561919, Altitude = -1850.8466674071583, @@ -527,7 +528,7 @@ local keyframes = { }, ["1969-07-20T20:14:44"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.526284004538702, Latitude = 0.6785694853441325, Altitude = -1853.0254853530546, @@ -535,7 +536,7 @@ local keyframes = { }, ["1969-07-20T20:14:45"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.5258419320743, Latitude = 0.6784720829848033, Altitude = -1852.2084286233435, @@ -543,7 +544,7 @@ local keyframes = { }, ["1969-07-20T20:14:46"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.524906401275462, Latitude = 0.6784174518581257, Altitude = -1855.7490077854247, @@ -551,7 +552,7 @@ local keyframes = { }, ["1969-07-20T20:14:47"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.52349915098792, Latitude = 0.6782893729810321, Altitude = -1857.383121244847, @@ -559,7 +560,7 @@ local keyframes = { }, ["1969-07-20T20:14:48"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.522315823805602, Latitude = 0.6780556991046269, Altitude = -1859.5619391907433, @@ -567,7 +568,7 @@ local keyframes = { }, ["1969-07-20T20:14:49"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.52101739233993, Latitude = 0.6779647310824661, Altitude = -1862.2854616231134, @@ -575,7 +576,7 @@ local keyframes = { }, ["1969-07-20T20:14:50"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.51994166433182, Latitude = 0.6778711676787862, Altitude = -1864.7366318122467, @@ -583,7 +584,7 @@ local keyframes = { }, ["1969-07-20T20:14:51"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.51898851685442, Latitude = 0.6778817565177891, Altitude = -1866.643097514906, @@ -591,7 +592,7 @@ local keyframes = { }, ["1969-07-20T20:14:52"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.51808183367586, Latitude = 0.6778718533214779, Altitude = -1868.821915460802, @@ -599,7 +600,7 @@ local keyframes = { }, ["1969-07-20T20:14:53"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.517315195124922, Latitude = 0.6777409244088132, Altitude = -1869.6389721905132, @@ -607,7 +608,7 @@ local keyframes = { }, ["1969-07-20T20:14:54"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.516423288093712, Latitude = 0.6776383502937863, Altitude = -1872.0901423796465, @@ -615,7 +616,7 @@ local keyframes = { }, ["1969-07-20T20:14:55"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.515618488386473, Latitude = 0.6775904175972421, Altitude = -1873.7242558390685, @@ -623,7 +624,7 @@ local keyframes = { }, ["1969-07-20T20:14:56"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.514931748492103, Latitude = 0.677451729714544, Altitude = -1875.0860170552537, @@ -631,7 +632,7 @@ local keyframes = { }, ["1969-07-20T20:14:57"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.5141592094038, Latitude = 0.6774090469390076, Altitude = -1876.1754260282019, @@ -639,7 +640,7 @@ local keyframes = { }, ["1969-07-20T20:14:58"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.513268517407862, Latitude = 0.677380792748438, Altitude = -1878.3542439740982, @@ -647,7 +648,7 @@ local keyframes = { }, ["1969-07-20T20:14:59"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.51249864236425, Latitude = 0.6773301671802587, Altitude = -1878.8989484605722, @@ -655,7 +656,7 @@ local keyframes = { }, ["1969-07-20T20:15:00"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.511670817073732, Latitude = 0.6773498341149018, Altitude = -1879.9883574335202, @@ -663,7 +664,7 @@ local keyframes = { }, ["1969-07-20T20:15:01"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.510927468201952, Latitude = 0.6773124695718212, Altitude = -1881.0777664064683, @@ -671,7 +672,7 @@ local keyframes = { }, ["1969-07-20T20:15:02"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.510140364179833, Latitude = 0.6772452153026853, Altitude = -1882.9842321091276, @@ -679,7 +680,7 @@ local keyframes = { }, ["1969-07-20T20:15:03"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50940612514804, Latitude = 0.6772084204274821, Altitude = -1884.3459933253127, @@ -687,7 +688,7 @@ local keyframes = { }, ["1969-07-20T20:15:04"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.508556629045042, Latitude = 0.6771417022964165, Altitude = -1885.1630500550239, @@ -695,7 +696,7 @@ local keyframes = { }, ["1969-07-20T20:15:05"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.5078270022667, Latitude = 0.6770996409435569, Altitude = -1885.707754541498, @@ -703,7 +704,7 @@ local keyframes = { }, ["1969-07-20T20:15:06"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50712374883535, Latitude = 0.6770942256987497, Altitude = -1886.7971635144459, @@ -711,7 +712,7 @@ local keyframes = { }, ["1969-07-20T20:15:07"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50638631083077, Latitude = 0.6770208020089364, Altitude = -1888.158924730631, @@ -719,7 +720,7 @@ local keyframes = { }, ["1969-07-20T20:15:08"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50572166907488, Latitude = 0.6769421116864789, Altitude = -1888.431276973868, @@ -727,7 +728,7 @@ local keyframes = { }, ["1969-07-20T20:15:09"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.505080467779102, Latitude = 0.6769068207439769, Altitude = -1889.5206859468162, @@ -735,7 +736,7 @@ local keyframes = { }, ["1969-07-20T20:15:10"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.504394828536693, Latitude = 0.6768437996516232, Altitude = -1890.6100949197644, @@ -743,7 +744,7 @@ local keyframes = { }, ["1969-07-20T20:15:11"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50370057106609, Latitude = 0.6767452474349132, Altitude = -1891.9718561359496, @@ -751,7 +752,7 @@ local keyframes = { }, ["1969-07-20T20:15:12"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.503056349392182, Latitude = 0.6766723806693259, Altitude = -1893.3336173521345, @@ -759,7 +760,7 @@ local keyframes = { }, ["1969-07-20T20:15:13"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50246925266341, Latitude = 0.6766252349202276, Altitude = -1893.8783218386086, @@ -767,7 +768,7 @@ local keyframes = { }, ["1969-07-20T20:15:14"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50184956306549, Latitude = 0.6765535257068991, Altitude = -1894.9677308115567, @@ -775,7 +776,7 @@ local keyframes = { }, ["1969-07-20T20:15:15"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.501422630419572, Latitude = 0.6765112802947014, Altitude = -1894.1506740818456, @@ -783,7 +784,7 @@ local keyframes = { }, ["1969-07-20T20:15:16"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50104221348722, Latitude = 0.676487362071662, Altitude = -1893.8783218386086, @@ -791,7 +792,7 @@ local keyframes = { }, ["1969-07-20T20:15:17"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50076948252455, Latitude = 0.6764658967447386, Altitude = -1892.2442083791866, @@ -799,7 +800,7 @@ local keyframes = { }, ["1969-07-20T20:15:18"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.50013364513089, Latitude = 0.6764482060496164, Altitude = -1893.3336173521345, @@ -807,7 +808,7 @@ local keyframes = { }, ["1969-07-20T20:15:19"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.499460285339502, Latitude = 0.6764309028737, Altitude = -1894.9677308115567, @@ -815,7 +816,7 @@ local keyframes = { }, ["1969-07-20T20:15:20"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.498899330647752, Latitude = 0.6763755753041285, Altitude = -1896.057139784505, @@ -823,7 +824,7 @@ local keyframes = { }, ["1969-07-20T20:15:21"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49826864115494, Latitude = 0.6763489810183512, Altitude = -1896.601844270979, @@ -831,7 +832,7 @@ local keyframes = { }, ["1969-07-20T20:15:22"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49765193973772, Latitude = 0.6763177659437667, Altitude = -1897.41890100069, @@ -839,7 +840,7 @@ local keyframes = { }, ["1969-07-20T20:15:23"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49706547748806, Latitude = 0.6762368192356724, Altitude = -1898.2359577304012, @@ -847,7 +848,7 @@ local keyframes = { }, ["1969-07-20T20:15:24"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.496489420526313, Latitude = 0.676209886695223, Altitude = -1899.053014460112, @@ -855,7 +856,7 @@ local keyframes = { }, ["1969-07-20T20:15:25"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.495878153012562, Latitude = 0.6761763249034947, Altitude = -1900.1424234330602, @@ -863,7 +864,7 @@ local keyframes = { }, ["1969-07-20T20:15:26"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.4953425244022, Latitude = 0.6761311089575274, Altitude = -1901.5041846492454, @@ -871,7 +872,7 @@ local keyframes = { }, ["1969-07-20T20:15:27"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.494725217962213, Latitude = 0.6761017566851846, Altitude = -1902.5935936221936, @@ -879,7 +880,7 @@ local keyframes = { }, ["1969-07-20T20:15:28"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.494112443564592, Latitude = 0.6760842983575135, Altitude = -1903.4106503519047, @@ -887,7 +888,7 @@ local keyframes = { }, ["1969-07-20T20:15:29"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.493537644480202, Latitude = 0.6760386448926926, Altitude = -1903.9553548383788, @@ -895,7 +896,7 @@ local keyframes = { }, ["1969-07-20T20:15:30"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49299719757025, Latitude = 0.6760147528943234, Altitude = -1903.9553548383788, @@ -903,7 +904,7 @@ local keyframes = { }, ["1969-07-20T20:15:31"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.492415313069813, Latitude = 0.6759919962423392, Altitude = -1904.2277070816158, @@ -911,7 +912,7 @@ local keyframes = { }, ["1969-07-20T20:15:32"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.491877755110142, Latitude = 0.6759640721591937, Altitude = -1904.2277070816158, @@ -919,7 +920,7 @@ local keyframes = { }, ["1969-07-20T20:15:33"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49128819308786, Latitude = 0.6759491077295323, Altitude = -1904.2277070816158, @@ -927,7 +928,7 @@ local keyframes = { }, ["1969-07-20T20:15:34"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.49073158429634, Latitude = 0.6759379383686839, Altitude = -1904.2277070816158, @@ -935,7 +936,7 @@ local keyframes = { }, ["1969-07-20T20:15:35"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.490174891596332, Latitude = 0.6759054634588104, Altitude = -1904.2277070816158, @@ -943,7 +944,7 @@ local keyframes = { }, ["1969-07-20T20:15:36"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.489635065407523, Latitude = 0.6758939648884956, Altitude = -1904.5000593248528, @@ -951,7 +952,7 @@ local keyframes = { }, ["1969-07-20T20:15:37"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.4891060535486, Latitude = 0.6759004097281942, Altitude = -1904.2277070816158, @@ -959,7 +960,7 @@ local keyframes = { }, ["1969-07-20T20:15:38"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48855436619652, Latitude = 0.6758862600165565, Altitude = -1904.2277070816158, @@ -967,7 +968,7 @@ local keyframes = { }, ["1969-07-20T20:15:39"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.488052711552413, Latitude = 0.6758544116957282, Altitude = -1904.5000593248528, @@ -975,7 +976,7 @@ local keyframes = { }, ["1969-07-20T20:15:40"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48754943516269, Latitude = 0.6758316193430558, Altitude = -1904.2277070816158, @@ -983,7 +984,7 @@ local keyframes = { }, ["1969-07-20T20:15:41"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.487094304824993, Latitude = 0.6758175052522961, Altitude = -1904.2277070816158, @@ -991,7 +992,7 @@ local keyframes = { }, ["1969-07-20T20:15:42"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.486618165034592, Latitude = 0.6757757367756437, Altitude = -1904.7724115680899, @@ -999,7 +1000,7 @@ local keyframes = { }, ["1969-07-20T20:15:43"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48604740534131, Latitude = 0.675733428263931, Altitude = -1905.3171160545637, @@ -1007,7 +1008,7 @@ local keyframes = { }, ["1969-07-20T20:15:44"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48548248435554, Latitude = 0.6756797157749009, Altitude = -1905.8618205410378, @@ -1015,7 +1016,7 @@ local keyframes = { }, ["1969-07-20T20:15:45"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48494957486896, Latitude = 0.6756120527881188, Altitude = -1905.8618205410378, @@ -1023,7 +1024,7 @@ local keyframes = { }, ["1969-07-20T20:15:46"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.484598386683622, Latitude = 0.675584857481579, Altitude = -1907.49593400046, @@ -1031,7 +1032,7 @@ local keyframes = { }, ["1969-07-20T20:15:47"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.4841269963268, Latitude = 0.6755482784409179, Altitude = -1908.040638486934, @@ -1039,7 +1040,7 @@ local keyframes = { }, ["1969-07-20T20:15:48"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48373390336955, Latitude = 0.6754890811171497, Altitude = -1908.8576952166452, @@ -1047,7 +1048,7 @@ local keyframes = { }, ["1969-07-20T20:15:49"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48325134882829, Latitude = 0.6754258626149947, Altitude = -1908.4491668517896, @@ -1055,7 +1056,7 @@ local keyframes = { }, ["1969-07-20T20:15:50"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48284574619883, Latitude = 0.6753753196460469, Altitude = -1909.1300474598822, @@ -1063,7 +1064,7 @@ local keyframes = { }, ["1969-07-20T20:15:51"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48245362823393, Latitude = 0.6753264776464533, Altitude = -1909.4023997031193, @@ -1071,7 +1072,7 @@ local keyframes = { }, ["1969-07-20T20:15:52"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.482060114185842, Latitude = 0.6752749804130574, Altitude = -1909.6747519463563, @@ -1079,7 +1080,7 @@ local keyframes = { }, ["1969-07-20T20:15:53"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.481698202127482, Latitude = 0.675223605520775, Altitude = -1909.6747519463563, @@ -1087,7 +1088,7 @@ local keyframes = { }, ["1969-07-20T20:15:54"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48129046365451, Latitude = 0.6751730022703166, Altitude = -1909.6747519463563, @@ -1095,7 +1096,7 @@ local keyframes = { }, ["1969-07-20T20:15:55"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.480893026154902, Latitude = 0.6751376710849429, Altitude = -1909.6747519463563, @@ -1103,7 +1104,7 @@ local keyframes = { }, ["1969-07-20T20:15:56"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48059324160945, Latitude = 0.6750772226256051, Altitude = -1909.6747519463563, @@ -1111,7 +1112,7 @@ local keyframes = { }, ["1969-07-20T20:15:57"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48034984354739, Latitude = 0.6750430267458865, Altitude = -1909.6747519463563, @@ -1119,7 +1120,7 @@ local keyframes = { }, ["1969-07-20T20:15:58"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.48005268645993, Latitude = 0.6750019848756621, Altitude = -1909.6747519463563, @@ -1127,7 +1128,7 @@ local keyframes = { }, ["1969-07-20T20:15:59"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47978070153665, Latitude = 0.6749655364121049, Altitude = -1909.9471041895933, @@ -1135,7 +1136,7 @@ local keyframes = { }, ["1969-07-20T20:16:00"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47951311851127, Latitude = 0.6749420304945992, Altitude = -1909.9471041895933, @@ -1143,7 +1144,7 @@ local keyframes = { }, ["1969-07-20T20:16:01"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47927978098579, Latitude = 0.6748989409040068, Altitude = -1909.9471041895933, @@ -1151,7 +1152,7 @@ local keyframes = { }, ["1969-07-20T20:16:02"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47904250519933, Latitude = 0.6748472712728636, Altitude = -1910.4918086760674, @@ -1159,7 +1160,7 @@ local keyframes = { }, ["1969-07-20T20:16:03"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47879202998348, Latitude = 0.674809514541568, Altitude = -1910.7641609193045, @@ -1167,7 +1168,7 @@ local keyframes = { }, ["1969-07-20T20:16:04"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.478567222437622, Latitude = 0.6747692774477394, Altitude = -1910.7641609193045, @@ -1175,7 +1176,7 @@ local keyframes = { }, ["1969-07-20T20:16:05"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47836548542964, Latitude = 0.6747160116119115, Altitude = -1910.7641609193045, @@ -1183,7 +1184,7 @@ local keyframes = { }, ["1969-07-20T20:16:06"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47818769774975, Latitude = 0.6746866473279819, Altitude = -1911.3088654057785, @@ -1191,7 +1192,7 @@ local keyframes = { }, ["1969-07-20T20:16:07"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.477896613823983, Latitude = 0.6746547793250971, Altitude = -1913.2153311084376, @@ -1199,7 +1200,7 @@ local keyframes = { }, ["1969-07-20T20:16:08"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47781195503974, Latitude = 0.6746276583132307, Altitude = -1913.2153311084376, @@ -1207,7 +1208,7 @@ local keyframes = { }, ["1969-07-20T20:16:09"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.477664452707373, Latitude = 0.6746112868414526, Altitude = -1914.0323878381487, @@ -1215,7 +1216,7 @@ local keyframes = { }, -- ["1969-07-20T20:16:10"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.477750217762413, -- Latitude = 0.6745910947360472, -- Altitude = -1912.6706266219635, @@ -1223,7 +1224,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:11"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.477590925415402, -- Latitude = 0.6745598993839581, -- Altitude = -1912.6706266219635, @@ -1231,7 +1232,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:12"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47745952757753, -- Latitude = 0.6745298610932787, -- Altitude = -1912.6706266219635, @@ -1239,7 +1240,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:13"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.477271343369093, -- Latitude = 0.6745166392893209, -- Altitude = -1913.2153311084376, @@ -1247,7 +1248,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:14"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.477100932665042, -- Latitude = 0.6744937499451563, -- Altitude = -1914.3047400813857, @@ -1255,7 +1256,7 @@ local keyframes = { -- }, ["1969-07-20T20:16:15"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47697690593997, Latitude = 0.6744644602883288, Altitude = -1914.8494445678598, @@ -1263,7 +1264,7 @@ local keyframes = { }, ["1969-07-20T20:16:16"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.476842953277412, Latitude = 0.6744457159538018, Altitude = -1915.1217968110968, @@ -1271,7 +1272,7 @@ local keyframes = { }, ["1969-07-20T20:16:17"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.476774052091812, Latitude = 0.6744243634139203, Altitude = -1914.8494445678598, @@ -1279,7 +1280,7 @@ local keyframes = { }, ["1969-07-20T20:16:18"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47665204889191, Latitude = 0.6743981221140924, Altitude = -1915.1217968110968, @@ -1287,7 +1288,7 @@ local keyframes = { }, ["1969-07-20T20:16:19"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47657652039885, Latitude = 0.6743808573601865, Altitude = -1915.1217968110968, @@ -1295,7 +1296,7 @@ local keyframes = { }, ["1969-07-20T20:16:20"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.476475036022492, Latitude = 0.6743552389834175, Altitude = -1914.8494445678598, @@ -1303,7 +1304,7 @@ local keyframes = { }, ["1969-07-20T20:16:21"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47638671770867, Latitude = 0.6743412077411113, Altitude = -1915.3941490543339, @@ -1311,7 +1312,7 @@ local keyframes = { }, ["1969-07-20T20:16:22"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.476286834646782, Latitude = 0.6743241644041175, Altitude = -1915.3941490543339, @@ -1319,7 +1320,7 @@ local keyframes = { }, ["1969-07-20T20:16:23"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47623840477727, Latitude = 0.6743121023448013, Altitude = -1915.3941490543339, @@ -1327,7 +1328,7 @@ local keyframes = { }, ["1969-07-20T20:16:24"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.476125794037742, Latitude = 0.6743019779643423, Altitude = -1915.938853540808, @@ -1335,7 +1336,7 @@ local keyframes = { }, ["1969-07-20T20:16:25"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47604582826371, Latitude = 0.6742984062330349, Altitude = -1916.211205784045, @@ -1343,7 +1344,7 @@ local keyframes = { }, ["1969-07-20T20:16:26"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47599605084473, Latitude = 0.6742864748966985, Altitude = -1916.211205784045, @@ -1351,7 +1352,7 @@ local keyframes = { }, ["1969-07-20T20:16:27"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47598166921822, Latitude = 0.6742856341308172, Altitude = -1916.755910270519, @@ -1359,7 +1360,7 @@ local keyframes = { }, -- ["1969-07-20T20:16:28"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47600003592791, -- Latitude = 0.6742816108377042, -- Altitude = -1916.211205784045, @@ -1367,7 +1368,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:29"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47593990066764, -- Latitude = 0.6742699316275284, -- Altitude = -1916.483558027282, @@ -1375,7 +1376,7 @@ local keyframes = { -- }, ["1969-07-20T20:16:30"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47587957412098, Latitude = 0.6742661771136219, Altitude = -1916.755910270519, @@ -1383,7 +1384,7 @@ local keyframes = { }, ["1969-07-20T20:16:31"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47579282136856, Latitude = 0.6742214263433656, Altitude = -1917.028262513756, @@ -1391,7 +1392,7 @@ local keyframes = { }, ["1969-07-20T20:16:32"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47571834266516, Latitude = 0.6741885448706321, Altitude = -1917.5729670002302, @@ -1399,7 +1400,7 @@ local keyframes = { }, -- ["1969-07-20T20:16:33"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47569457676149, -- Latitude = 0.6741859152655852, -- Altitude = -1917.3006147569931, @@ -1407,7 +1408,7 @@ local keyframes = { -- }, ["1969-07-20T20:16:34"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47557041293751, Latitude = 0.6741798073326593, Altitude = -1918.117671486704, @@ -1415,7 +1416,7 @@ local keyframes = { }, ["1969-07-20T20:16:35"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.475475681892203, Latitude = 0.6741822414281841, Altitude = -1918.117671486704, @@ -1423,7 +1424,7 @@ local keyframes = { }, ["1969-07-20T20:16:36"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47541533097675, Latitude = 0.6742009046793005, Altitude = -1918.390023729941, @@ -1431,7 +1432,7 @@ local keyframes = { }, ["1969-07-20T20:16:37"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47532207549478, Latitude = 0.6742269926054295, Altitude = -1918.662375973178, @@ -1439,7 +1440,7 @@ local keyframes = { }, ["1969-07-20T20:16:38"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47522251798864, Latitude = 0.6742695236577596, Altitude = -1918.662375973178, @@ -1447,7 +1448,7 @@ local keyframes = { }, ["1969-07-20T20:16:39"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47513564425997, Latitude = 0.6742809051574165, Altitude = -1918.662375973178, @@ -1455,7 +1456,7 @@ local keyframes = { }, ["1969-07-20T20:16:40"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47498810518855, Latitude = 0.6743095342428154, Altitude = -1920.2964894326003, @@ -1463,7 +1464,7 @@ local keyframes = { }, -- ["1969-07-20T20:16:41"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47489523759891, -- Latitude = 0.6743154022599566, -- Altitude = -1920.0241371893633, @@ -1471,7 +1472,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:42"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47479438729774, -- Latitude = 0.6743324078003049, -- Altitude = -1920.2964894326003, @@ -1479,7 +1480,7 @@ local keyframes = { -- }, -- ["1969-07-20T20:16:43"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47475788126512, -- Latitude = 0.674345583979325, -- Altitude = -1920.0241371893633, @@ -1487,7 +1488,7 @@ local keyframes = { -- }, ["1969-07-20T20:16:44"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.474678823712882, Latitude = 0.6743691203511213, Altitude = -1920.2964894326003, @@ -1495,7 +1496,7 @@ local keyframes = { }, ["1969-07-20T20:16:45"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47460302474115, Latitude = 0.6743890347121807, Altitude = -1920.2964894326003, @@ -1503,7 +1504,7 @@ local keyframes = { }, ["1969-07-20T20:16:46"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47450130965027, Latitude = 0.6744202280781089, Altitude = -1920.8411939190744, @@ -1511,7 +1512,7 @@ local keyframes = { }, ["1969-07-20T20:16:47"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.474379586340042, Latitude = 0.6744490653475903, Altitude = -1921.1135461623114, @@ -1519,7 +1520,7 @@ local keyframes = { }, ["1969-07-20T20:16:48"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47431921657337, Latitude = 0.6745028925523043, Altitude = -1921.1135461623114, @@ -1527,7 +1528,7 @@ local keyframes = { }, ["1969-07-20T20:16:49"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47424698504895, Latitude = 0.6745115395661241, Altitude = -1921.1135461623114, @@ -1535,7 +1536,7 @@ local keyframes = { }, ["1969-07-20T20:16:50"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.474158028620153, Latitude = 0.6745268900936557, Altitude = -1921.6582506487855, @@ -1543,7 +1544,7 @@ local keyframes = { }, ["1969-07-20T20:16:51"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47408003386958, Latitude = 0.674531434078838, Altitude = -1921.6582506487855, @@ -1551,7 +1552,7 @@ local keyframes = { }, ["1969-07-20T20:16:52"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473993195514502, Latitude = 0.6745434127092755, Altitude = -1921.9306028920225, @@ -1559,7 +1560,7 @@ local keyframes = { }, -- ["1969-07-20T20:16:53"] = { -- Type = "GlobeTranslation", - -- Globe = "Moon", + -- Globe = moon.Moon.Identifier, -- Longitude = 23.47392353665608, -- Latitude = 0.6745464032805983, -- Altitude = -1922.2029551352596, @@ -1567,7 +1568,7 @@ local keyframes = { -- }, ["1969-07-20T20:16:54"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47388537487237, Latitude = 0.674552865152663, Altitude = -1921.9306028920225, @@ -1575,7 +1576,7 @@ local keyframes = { }, ["1969-07-20T20:16:55"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47382957912373, Latitude = 0.6745443566727537, Altitude = -1921.9306028920225, @@ -1583,7 +1584,7 @@ local keyframes = { }, ["1969-07-20T20:16:56"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47378652829031, Latitude = 0.6745361955127924, Altitude = -1921.6582506487855, @@ -1591,7 +1592,7 @@ local keyframes = { }, ["1969-07-20T20:16:57"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473741159081282, Latitude = 0.6745139398577651, Altitude = -1921.6582506487855, @@ -1599,7 +1600,7 @@ local keyframes = { }, ["1969-07-20T20:16:58"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473674434325403, Latitude = 0.6745046665169872, Altitude = -1922.2029551352596, @@ -1607,7 +1608,7 @@ local keyframes = { }, ["1969-07-20T20:16:59"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47366202033169, Latitude = 0.6744553774680945, Altitude = -1922.2029551352596, @@ -1615,7 +1616,7 @@ local keyframes = { }, ["1969-07-20T20:17:00"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47360771579434, Latitude = 0.6744345598586292, Altitude = -1922.7476596217336, @@ -1623,7 +1624,7 @@ local keyframes = { }, ["1969-07-20T20:17:01"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47357090816817, Latitude = 0.6744054827778567, Altitude = -1923.0200118649707, @@ -1631,7 +1632,7 @@ local keyframes = { }, ["1969-07-20T20:17:02"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47354290217646, Latitude = 0.6743765403194303, Altitude = -1923.2923641082077, @@ -1639,7 +1640,7 @@ local keyframes = { }, ["1969-07-20T20:17:03"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47354640286736, Latitude = 0.6743332580785223, Altitude = -1923.5647163514448, @@ -1647,7 +1648,7 @@ local keyframes = { }, ["1969-07-20T20:17:04"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473541367503802, Latitude = 0.6742974556070759, Altitude = -1923.8370685946818, @@ -1655,7 +1656,7 @@ local keyframes = { }, ["1969-07-20T20:17:05"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47350854369485, Latitude = 0.6742858449512636, Altitude = -1924.1094208379188, @@ -1663,7 +1664,7 @@ local keyframes = { }, ["1969-07-20T20:17:06"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47347424911663, Latitude = 0.6742611487873781, Altitude = -1924.6541253243927, @@ -1671,7 +1672,7 @@ local keyframes = { }, ["1969-07-20T20:17:07"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473503629496022, Latitude = 0.6742462694505276, Altitude = -1924.6541253243927, @@ -1679,7 +1680,7 @@ local keyframes = { }, ["1969-07-20T20:17:08"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473512768546712, Latitude = 0.6742384048959066, Altitude = -1924.6541253243927, @@ -1687,7 +1688,7 @@ local keyframes = { }, ["1969-07-20T20:17:09"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47353343175876, Latitude = 0.6742241072273591, Altitude = -1924.3817730811559, @@ -1695,7 +1696,7 @@ local keyframes = { }, ["1969-07-20T20:17:10"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47353316391657, Latitude = 0.6742142580747189, Altitude = -1925.4711820541038, @@ -1703,7 +1704,7 @@ local keyframes = { }, ["1969-07-20T20:17:11"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47355774790429, Latitude = 0.6742015107317392, Altitude = -1924.9264775676297, @@ -1711,7 +1712,7 @@ local keyframes = { }, ["1969-07-20T20:17:12"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.4735540335665, Latitude = 0.6741800864866416, Altitude = -1924.9264775676297, @@ -1719,7 +1720,7 @@ local keyframes = { }, ["1969-07-20T20:17:13"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47353500681606, Latitude = 0.6741617950501063, Altitude = -1925.1988298108668, @@ -1727,7 +1728,7 @@ local keyframes = { }, ["1969-07-20T20:17:14"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47350664772458, Latitude = 0.6741447111551033, Altitude = -1925.4711820541038, @@ -1735,7 +1736,7 @@ local keyframes = { }, ["1969-07-20T20:17:15"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473494757982273, Latitude = 0.6741430011390509, Altitude = -1925.4711820541038, @@ -1743,7 +1744,7 @@ local keyframes = { }, ["1969-07-20T20:17:16"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473485349949943, Latitude = 0.6741431504511513, Altitude = -1925.4711820541038, @@ -1751,7 +1752,7 @@ local keyframes = { }, ["1969-07-20T20:17:17"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473464448566723, Latitude = 0.674141681840806, Altitude = -1925.4711820541038, @@ -1759,7 +1760,7 @@ local keyframes = { }, ["1969-07-20T20:17:18"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47344203973089, Latitude = 0.6741518055278933, Altitude = -1925.4711820541038, @@ -1767,7 +1768,7 @@ local keyframes = { }, ["1969-07-20T20:17:19"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473416197134252, Latitude = 0.6741705280217748, Altitude = -1925.7435342973408, @@ -1775,7 +1776,7 @@ local keyframes = { }, ["1969-07-20T20:17:20"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47339416150648, Latitude = 0.6741799656622618, Altitude = -1925.7435342973408, @@ -1783,7 +1784,7 @@ local keyframes = { }, ["1969-07-20T20:17:21"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.4733232813815, Latitude = 0.6741727841821631, Altitude = -1926.288238783815, @@ -1791,7 +1792,7 @@ local keyframes = { }, ["1969-07-20T20:17:24"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47324174890097, Latitude = 0.6742091863213222, Altitude = -1926.288238783815, @@ -1799,7 +1800,7 @@ local keyframes = { }, ["1969-07-20T20:17:27"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47317556908458, Latitude = 0.6742072669430229, Altitude = -1926.560591027052, @@ -1807,7 +1808,7 @@ local keyframes = { }, ["1969-07-20T20:17:30"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47310752310149, Latitude = 0.6742134078571678, Altitude = -1926.832943270289, @@ -1815,7 +1816,7 @@ local keyframes = { }, ["1969-07-20T20:17:32"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.473074792306253, Latitude = 0.6741925230045956, Altitude = -1927.105295513526, @@ -1823,7 +1824,7 @@ local keyframes = { }, ["1969-07-20T20:17:40"] = { Type = "GlobeTranslation", - Globe = "Moon", + Globe = moon.Moon.Identifier, Longitude = 23.47306, Latitude = 0.67402, Altitude = -1927.65, diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem_descent_rotation.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem_descent_rotation.asset index cfef924a62..b01fa75349 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem_descent_rotation.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem_descent_rotation.asset @@ -1,4 +1,4 @@ -asset.export("keyframes", { +local keyframes = { -- ["1969-7-20T20:9:53"] = { -- Type = "StaticRotation", -- Rotation = { -1.3815, -0.0048, -0.4891 } @@ -1583,7 +1583,9 @@ asset.export("keyframes", { Type = "StaticRotation", Rotation = { -0.0794, -0.0088, -0.2447 } } -}) +} + +asset.export("keyframes", keyframes) diff --git a/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset b/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset index 840c2e6607..07b8fa824b 100644 --- a/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset +++ b/data/assets/scene/solarsystem/missions/apollo/11/lem_flipbook.asset @@ -1,10 +1,10 @@ local helper = asset.require("util/vrt_flipbook_helper") -local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") local assetPrefix = "A11flip" -local assetGlobe = moonAsset.Moon.Identifier +local assetGlobe = moon.Moon.Identifier local flipbookCount = 19 local flipbook = nil diff --git a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset index 89c5319e5a..df6a113a29 100644 --- a/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset +++ b/data/assets/scene/solarsystem/missions/apollo/15/apollo15.asset @@ -1,5 +1,5 @@ asset.require("../actions") -local moonTransforms = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") local sun = asset.require("scene/solarsystem/sun/transforms") local kernels = asset.require("./kernels") local coreKernels = asset.require("spice/core") @@ -16,7 +16,7 @@ local models = asset.resource({ local Apollo15 = { Identifier = "Apollo15", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, TimeFrame = { Type = "TimeFrameInterval", Start = "1971-07-30T02:22:00.00", @@ -52,7 +52,7 @@ local Apollo15 = { local Apollo15Trail = { Identifier = "Apollo15Trail", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, Renderable = { Type = "RenderableTrailTrajectory", Translation = { @@ -68,7 +68,8 @@ local Apollo15Trail = { }, GUI = { Name = "Apollo 15 Trail", - Path = "/Solar System/Missions/Apollo/15" + Path = "/Solar System/Missions/Apollo/15", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset index 0ab8953395..86dced27e9 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation2.asset @@ -1,5 +1,5 @@ local sun = asset.require("scene/solarsystem/sun/transforms") -local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -13,11 +13,11 @@ local models = asset.resource({ local Station2Boulder1Holder = { Identifier = "Station_2_Boulder1", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.5294692, Latitude = 20.098824, Altitude = -2442.8, @@ -62,11 +62,11 @@ local Station2Boulder1Model = { local Station2Boulder2Holder = { Identifier = "Station_2_Boulder2", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.5287892, Latitude = 20.098240, Altitude = -2434.6, @@ -111,11 +111,11 @@ local Station2Boulder2Model = { local Station2Boulder3Holder = { Identifier = "Station_2_Boulder3", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.5294692, Latitude = 20.098610, Altitude = -2441.55, diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset index 6ab860bef6..e4e0f4e00a 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation6.asset @@ -1,5 +1,5 @@ local sun = asset.require("scene/solarsystem/sun/transforms") -local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -13,11 +13,11 @@ local models = asset.resource({ local Station6Frag1Holder = { Identifier = "Station_6_Fragment1", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.80068, Latitude = 20.2903, Altitude = -2562.6, @@ -36,7 +36,7 @@ local Station6Frag1Model = { Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.8007, Latitude = 20.2903, Altitude = -2562.6, @@ -70,7 +70,7 @@ local Station6Frag1Model = { local Station6Frag23Holder = { Identifier = "Station_6_Fragments_2_3", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, GUI = { Name = "Station 6 Fragments 2 & 3 Holder", Path = "/Solar System/Missions/Apollo/17/Station 6" @@ -87,7 +87,7 @@ local Station6Frag2Model = { }, Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.80055, Latitude = 20.289808, Altitude = -2566.5, @@ -125,7 +125,7 @@ local Station6Frag3Model = { }, Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.80053, Latitude = 20.29030, Altitude = -2563.0, diff --git a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset index 9e4dcf37e5..2c85eabfce 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/bouldersstation7.asset @@ -1,5 +1,5 @@ local sun = asset.require("scene/solarsystem/sun/transforms") -local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -13,11 +13,11 @@ local models = asset.resource({ local Station7BoulderHolder = { Identifier = "Station_7_Boulder", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = -360 + 30.8165882, Latitude = 20.2908556, Altitude = -2593.5, diff --git a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset index 8d33affaac..a2bce9dd7f 100644 --- a/data/assets/scene/solarsystem/missions/apollo/17/lem.asset +++ b/data/assets/scene/solarsystem/missions/apollo/17/lem.asset @@ -1,5 +1,5 @@ local sun = asset.require("scene/solarsystem/sun/transforms") -local moonAsset = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") @@ -13,18 +13,18 @@ local model = asset.resource({ local Apollo17Lem = { Identifier = "Apollo17Lem", - Parent = moonAsset.Moon.Identifier, + Parent = moon.Moon.Identifier, Transform = { Translation = { Type = "GlobeTranslation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = 30.77167, Latitude = 20.19092, UseHeightmap = true }, Rotation = { Type = "GlobeRotation", - Globe = moonAsset.Moon.Identifier, + Globe = moon.Moon.Identifier, Longitude = 30.77167, Latitude = 20.19092 } diff --git a/data/assets/scene/solarsystem/missions/apollo/8/trails.asset b/data/assets/scene/solarsystem/missions/apollo/8/trails.asset index 7e6046763f..f6dff794ba 100644 --- a/data/assets/scene/solarsystem/missions/apollo/8/trails.asset +++ b/data/assets/scene/solarsystem/missions/apollo/8/trails.asset @@ -1,5 +1,5 @@ local earth_transforms = asset.require("scene/solarsystem/planets/earth/transforms") -local moon_transforms = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") local kernels = asset.require("./kernels") local coreKernels = asset.require("spice/core") @@ -24,13 +24,14 @@ local LaunchTrail = { }, GUI = { Name = "Apollo 8 Launch Trail", - Path = "/Solar System/Missions/Apollo/8" + Path = "/Solar System/Missions/Apollo/8", + Focusable = false } } local MoonTrail = { Identifier = "Apollo8MoonTrail", - Parent = moon_transforms.Moon.Identifier, + Parent = moon.Moon.Identifier, Renderable = { Type = "RenderableTrailTrajectory", Enabled = false, @@ -47,7 +48,8 @@ local MoonTrail = { }, GUI = { Name = "Apollo 8 Moon Trail", - Path = "/Solar System/Missions/Apollo/8" + Path = "/Solar System/Missions/Apollo/8", + Focusable = false } } @@ -70,7 +72,8 @@ local EarthBarycenterTrail = { }, GUI = { Name = "Apollo 8 Earth Barycenter Trail", - Path = "/Solar System/Missions/Apollo/8" + Path = "/Solar System/Missions/Apollo/8", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/apollo/mission.asset b/data/assets/scene/solarsystem/missions/apollo/mission.asset index eb72af88da..30849f80d2 100644 --- a/data/assets/scene/solarsystem/missions/apollo/mission.asset +++ b/data/assets/scene/solarsystem/missions/apollo/mission.asset @@ -1,21 +1,21 @@ local Mission = { Identifier = "Apollo", Name = "The Apollo Missions", - Image = "https://solarsystem.nasa.gov/system/downloadable_items/2962_s65-55202.jpg", + Image = "https://data.openspaceproject.com/missions/apollo/2962_s65-55202.jpg", Description = "Apollo was the NASA program that resulted in American astronauts' making a total of 11 spaceflights and walking on the moon. The first four flights tested the equipment used in the Apollo Program. Six of the other seven flights landed on the moon. The first Apollo flight happened in 1968. The first moon landing took place in 1969. The last moon landing was in 1972. A total of 12 astronauts walked on the moon. The astronauts conducted scientific research there. They studied the lunar surface. They collected moon rocks to bring back to Earth.", Actions = { "os.apollo.moon.ToggleKaguyaLayer", "os.apollo.ToggleMoonShading", "os.apollo.ShowInsignias", "os.apollo.HideInsignias" }, Milestones = { { Name = "First image of Earthrise", Date = "1968 DEC 24 12:20:00", - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/apollo_8_earthrise_1968_as08-14-2383.jpg", + Image = "https://data.openspaceproject.com/missions/apollo/apollo_8_earthrise_1968_as08-14-2383.png", Description = "On Dec. 24, 1968, Apollo 8 astronauts Frank Borman, Jim Lovell, and Bill Anders became the first humans to orbit the Moon, and the first to witness the magnificent sight called 'Earthrise'. As the spacecraft was in the process of rotating, Anders took this iconic picture showing Earth rising over the Moon's horizon." }, { Name = "One giant leap for mankind", Date = "1969 JUL 20 02:56:00", Description = "At 02:56 a.m. UTC Neil Armstrong is ready to plant the first human foot on another world. With more than half a billion people watching on television, he climbs down the ladder and proclaims: 'That's one small step for a man, one giant leap for mankind'. Aldrin joins him shortly, and offers a simple but powerful description of the lunar surface: 'magnificent desolation'. They explore the surface for two and a half hours, collecting samples and taking photographs. They leave behind an American flag, a patch honoring the fallen Apollo 1 crew, and a plaque on one of Eagle's legs. It reads, 'Here men from the planet Earth first set foot upon the moon. July 1969 A.D. We came in peace for all mankind.'", - Image = "https://www.nasa.gov/sites/default/files/images/464487main_AS11-40-5886_full.jpg" + Image = "https://data.openspaceproject.com/missions/apollo/464487main_AS11-40-5886_full.jpg" } }, Phases = { @@ -23,13 +23,13 @@ local Mission = { Name = "Apollo flight 8", TimeRange = { Start = "1968 DEC 21 12:51:00", End = "1968 DEC 27 15:51:42" }, Description = "Apollo 8 was the first crewed spacecraft to successfully orbit the Moon and return to Earth. The Apollo 8 crew were also the first to witness and photograph an Earthrise.", - Image = "https://upload.wikimedia.org/wikipedia/commons/4/47/Ap8-S68-56531.jpg" + Image = "https://data.openspaceproject.com/missions/apollo/Ap8-S68-56531.jpg" }, { Name = "Apollo flight 11", TimeRange = { Start = "1969 JUL 16 13:32:00", End = "1969 JUL 24 16:50:35" }, Description = "Apollo 11 was the first mission to land on the moon. The crew consisted of Neil Armstrong, Commander, Edwin E. 'Buzz' Aldrin Jr., Lunar Module Pilot, and Michael Collins, Command Module Pilot", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/s69-31739orig.jpg", + Image = "https://data.openspaceproject.com/missions/apollo/s69-31739orig.jpg", Link = "https://www.nasa.gov/mission_pages/apollo/missions/apollo11.html", Actions = { "os.apollo11.setup.LandingSite", "os.apollo.DisableApolloSites" } }, @@ -37,13 +37,13 @@ local Mission = { Name = "Apollo Flight 15", TimeRange = { Start = "1971 JUL 26 13:34:00", End = "1971 AUG 07 20:45:53" }, Description = "Apollo 15 was the first of the Apollo missions capable of a longer stay time on the moon and greater surface mobility. The crew was the first to use the Lunar Roving Vehicle.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width/public/thumbnails/image/apollo_15_moon_landing_29_eva3_irwin_w_us_flag_as15-88-11866hr.jpg?itok=oA8gldMa" + Image = "https://data.openspaceproject.com/missions/apollo/apollo_15_moon_landing_29_eva3_irwin_w_us_flag_as15-88-11866hr.jpgitok=oA8gldMa.jpg" }, { Name = "Apollo Flight 17", TimeRange = { Start = "1972 DEC 07 05:33:00", End = "1972 DEC 19 19:54:58" }, Description = "Apollo 17 was the last mission in which humans traveled to the Moon. It was distinguished by extended hardware capability, larger scientific payload capacity and the use of the battery-powered Lunar Roving Vehicle.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/as17-147-22526_orig_1.jpg", + Image = "https://data.openspaceproject.com/missions/apollo/as17-147-22526_orig_1.jpg", Actions = { "os.apollo17.setup.LandingSite", "os.apollo.DisableApolloSites" } } } diff --git a/data/assets/scene/solarsystem/missions/artemis/mission.asset b/data/assets/scene/solarsystem/missions/artemis/mission.asset index 44bcce8503..ce8c08f440 100644 --- a/data/assets/scene/solarsystem/missions/artemis/mission.asset +++ b/data/assets/scene/solarsystem/missions/artemis/mission.asset @@ -1,16 +1,14 @@ --- Source: https://solarsystem.nasa.gov/missions/rosetta-philae/in-depth/ - local Mission = { Identifier = "Artemis", Name = "Artemis", TimeRange = { Start = "2022 NOV 16 06:47:00", End = "2022 DEC 11 17:40:30" }, - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/em1_patch_final.png", + Image = "https://data.openspaceproject.com/missions/artemis/em1_patch_final.png", Description = "With Artemis missions, NASA will land the first woman and first person of color on the Moon, using innovative technologies to explore more of the lunar surface than ever before. We will collaborate with commercial and international partners and establish the first long-term presence on the Moon. Then, we will use what we learn on and around the Moon to take the next giant leap: sending the first astronauts to Mars.", Milestones = { { Name = "Mission launch", Date = "2022 NOV 16 06:47:44", - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/sls_rocket.jpg", + Image = "https://data.openspaceproject.com/missions/artemis/sls_rocket.png", Description = "Following a successful launch of NASA's Space Launch System (SLS), the most powerful rocket in the world, the agency's Orion spacecraft is on its way to the Moon as part of the Artemis program. Carrying an uncrewed Orion, SLS lifted off for its flight test debut at 1:47 a.m. EST Wednesday from Launch Pad 39B at NASA's Kennedy Space Center in Florida. The launch is the first leg of a mission in which Orion is planned to travel approximately 40,000 miles beyond the Moon and return to Earth over the course of 25.5 days. Known as Artemis I, the mission is a critical part of NASA's Moon to Mars exploration approach, in which the agency explores for the benefit of humanity. It's an important test for the agency before flying astronauts on the Artemis II mission.", Link = "https://www.nasa.gov/press-release/liftoff-nasa-s-artemis-i-mega-rocket-launches-orion-to-moon" }, @@ -18,19 +16,19 @@ local Mission = { Name = "Closest approach to the Moon", Date = "2022 NOV 21 12:57:00", Description = "A portion of the far side of the Moon looms large just beyond the Orion spacecraft in this image taken on the sixth day of the Artemis I mission by a camera on the tip of one of Orion's solar arrays. The spacecraft entered the lunar sphere of influence Sunday, Nov. 20, making the Moon, instead of Earth, the main gravitational force acting on the spacecraft. On Monday, Nov. 21, it came within 80 miles of the lunar surface, the closest approach of the uncrewed Artemis I mission, before moving into a distant retrograde orbit around the Moon. The darkest spot visible near the middle of the image is Mare Orientale.", - Image = "https://blogs.nasa.gov/artemis/wp-content/uploads/sites/303/2022/11/art001e000269-1200x900.jpg", + Image = "https://data.openspaceproject.com/missions/artemis/art001e000269-1200x900.jpg", Link = "https://blogs.nasa.gov/artemis/2022/11/21/artemis-i-flight-day-six-orion-performs-lunar-flyby-closest-outbound-approach/" }, { Name = "Maximum distance from Earth", Date = "2022 NOV 28 00:00:00", Description = "NASA's uncrewed Orion spacecraft reached a maximum distance of nearly 270,000 miles from Earth during the Artemis I flight test before beginning its journey back toward Earth. Orion captured imagery of the Earth and Moon together from its distant lunar orbit, including this image taken from camera on one of the spacecraft's solar array wings.", - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/orion_day_13_advisory.jpg" + Image = "https://data.openspaceproject.com/missions/artemis/orion_day_13_advisory.jpg" }, { Name = "Orion landing", Description = "NASA's Orion spacecraft for the Artemis I mission splashed down in the Pacific Ocean after a 25.5 day mission to the Moon.", - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/orion_splashdown_image.jpg", + Image = "https://data.openspaceproject.com/missions/artemis/Orion_splashdown_image.jpg", Date = "2022 DEC 11 17:40:30" } }, diff --git a/data/assets/scene/solarsystem/missions/artemis/trail.asset b/data/assets/scene/solarsystem/missions/artemis/trail.asset index d3a29f95da..ab01e5acc2 100644 --- a/data/assets/scene/solarsystem/missions/artemis/trail.asset +++ b/data/assets/scene/solarsystem/missions/artemis/trail.asset @@ -1,5 +1,5 @@ local earthTransforms = asset.require("scene/solarsystem/planets/earth/transforms") -local moonTransforms = asset.require("scene/solarsystem/planets/earth/moon/moon") +local moon = asset.require("scene/solarsystem/planets/earth/moon/moon") local kernels = asset.require("./kernels") local coreKernels = asset.require("spice/core") @@ -25,13 +25,14 @@ local ArtemisEarthTrail = { GUI = { Name = "Artemis-1 Earth Trail", Path = "/Solar System/Missions/Artemis/Trails", + Focusable = false, Description = "Artemis-1 trail relative to Earth" } } -local ArtemisMoonTrail= { +local ArtemisMoonTrail = { Identifier = "ArtemisMoonTrail", - Parent = moonTransforms.Moon.Identifier, + Parent = moon.Moon.Identifier, Renderable = { Type = "RenderableTrailTrajectory", Translation = { @@ -49,6 +50,7 @@ local ArtemisMoonTrail= { GUI = { Name = "Artemis-1 Moon Trail", Path = "/Solar System/Missions/Artemis/Trails", + Focusable = false, Description = "Artemis-1 trail relative to the Moon" } } diff --git a/data/assets/scene/solarsystem/missions/artemis/transforms.asset b/data/assets/scene/solarsystem/missions/artemis/transforms.asset index 8c32007207..11327e195d 100644 --- a/data/assets/scene/solarsystem/missions/artemis/transforms.asset +++ b/data/assets/scene/solarsystem/missions/artemis/transforms.asset @@ -18,6 +18,7 @@ local ArtemisPosition = { GUI = { Name = "Artemis-1 Position", Path = "/Solar System/Missions/Artemis", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset index d60f6f2658..5963055e52 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/bela.asset @@ -22,6 +22,7 @@ local BelaReceiver = { GUI = { Name = "MPO BELA Receiver", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local BelaTransmitterMain = { GUI = { Name = "MPO BELA Transmitter Main", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local BelaTransmitterRed = { GUI = { Name = "MPO BELA Transmitter Main", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset index 730c2841ae..c896e9fc55 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/hga.asset @@ -22,6 +22,7 @@ local HGA = { GUI = { Name = "MPO HGA", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset index 75e04598a6..88143ee020 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mertis.asset @@ -22,6 +22,7 @@ local MertisTis = { GUI = { Name = "MPO MERTIS TIS", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local MertisTisPlanet = { GUI = { Name = "MPO MERTIS TIS Planet", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local MertisTisSpace = { GUI = { Name = "MPO MERTIS TIS Space", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset index 836712e892..abdcad883d 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mgns.asset @@ -22,6 +22,7 @@ local MGNS = { GUI = { Name = "MPO MGNS", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset index 1286f23bfe..a810f1f4ba 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/mixs.asset @@ -22,6 +22,7 @@ local MIXS_C = { GUI = { Name = "MPO MIXS-C", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local MIXS_T = { GUI = { Name = "MPO MIXS-T", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset index 18fe04b1c5..b0080f9bde 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/phebus.asset @@ -22,6 +22,7 @@ local PhebusSlit75 = { GUI = { Name = "MPO Phebus Slit 75", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local PhebusSlit100 = { GUI = { Name = "MPO Phebus Slit 100", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local Phebus75 = { GUI = { Name = "MPO Phebus 75", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -88,6 +91,7 @@ local Phebus100 = { GUI = { Name = "MPO Phebus 100", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset index d2c303524a..525c98578e 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena.asset @@ -22,6 +22,7 @@ local SerenaElena = { GUI = { Name = "MPO Serena Elena", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset index a10d997bf1..8e6041cc4b 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/serena_anodes.asset @@ -22,6 +22,7 @@ local SerenaElenaAN01 = { GUI = { Name = "MPO Serena Elena AN01", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local SerenaElenaAN02 = { GUI = { Name = "MPO Serena Elena AN02", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local SerenaElenaAN03 = { GUI = { Name = "MPO Serena Elena AN03", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -88,6 +91,7 @@ local SerenaElenaAN04 = { GUI = { Name = "MPO Serena Elena AN04", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -110,6 +114,7 @@ local SerenaElenaAN05 = { GUI = { Name = "MPO Serena Elena AN05", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -132,6 +137,7 @@ local SerenaElenaAN06 = { GUI = { Name = "MPO Serena Elena AN06", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -154,6 +160,7 @@ local SerenaElenaAN07 = { GUI = { Name = "MPO Serena Elena AN07", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -176,6 +183,7 @@ local SerenaElenaAN08 = { GUI = { Name = "MPO Serena Elena AN08", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -198,6 +206,7 @@ local SerenaElenaAN09 = { GUI = { Name = "MPO Serena Elena AN09", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -220,6 +229,7 @@ local SerenaElenaAN10 = { GUI = { Name = "MPO Serena Elena AN10", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -242,6 +252,7 @@ local SerenaElenaAN11 = { GUI = { Name = "MPO Serena Elena AN11", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -264,6 +275,7 @@ local SerenaElenaAN12 = { GUI = { Name = "MPO Serena Elena AN12", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -286,6 +298,7 @@ local SerenaElenaAN13 = { GUI = { Name = "MPO Serena Elena AN13", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -308,6 +321,7 @@ local SerenaElenaAN14 = { GUI = { Name = "MPO Serena Elena AN14", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -330,6 +344,7 @@ local SerenaElenaAN15 = { GUI = { Name = "MPO Serena Elena AN15", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -352,6 +367,7 @@ local SerenaElenaAN16 = { GUI = { Name = "MPO Serena Elena AN16", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -374,6 +390,7 @@ local SerenaElenaAN17 = { GUI = { Name = "MPO Serena Elena AN17", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -396,6 +413,7 @@ local SerenaElenaAN18 = { GUI = { Name = "MPO Serena Elena AN18", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -418,6 +436,7 @@ local SerenaElenaAN19 = { GUI = { Name = "MPO Serena Elena AN19", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -440,6 +459,7 @@ local SerenaElenaAN20 = { GUI = { Name = "MPO Serena Elena AN20", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -462,6 +482,7 @@ local SerenaElenaAN21 = { GUI = { Name = "MPO Serena Elena AN21", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -484,6 +505,7 @@ local SerenaElenaAN22 = { GUI = { Name = "MPO Serena Elena AN22", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -506,6 +528,7 @@ local SerenaElenaAN23 = { GUI = { Name = "MPO Serena Elena AN23", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -528,6 +551,7 @@ local SerenaElenaAN24 = { GUI = { Name = "MPO Serena Elena AN24", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -550,6 +574,7 @@ local SerenaElenaAN25 = { GUI = { Name = "MPO Serena Elena AN25", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -572,6 +597,7 @@ local SerenaElenaAN26 = { GUI = { Name = "MPO Serena Elena AN26", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -594,6 +620,7 @@ local SerenaElenaAN27 = { GUI = { Name = "MPO Serena Elena AN27", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -616,6 +643,7 @@ local SerenaElenaAN28 = { GUI = { Name = "MPO Serena Elena AN28", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -638,6 +666,7 @@ local SerenaElenaAN29 = { GUI = { Name = "MPO Serena Elena AN29", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -660,6 +689,7 @@ local SerenaElenaAN30 = { GUI = { Name = "MPO Serena Elena AN30", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -682,6 +712,7 @@ local SerenaElenaAN31 = { GUI = { Name = "MPO Serena Elena AN31", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -704,6 +735,7 @@ local SerenaElenaAN32 = { GUI = { Name = "MPO Serena Elena AN32", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset index 1f00714adf..9a6db853a4 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sibbiosys.asset @@ -22,6 +22,7 @@ local SimbioSys_HRIC_FPA = { GUI = { Name = "MPO Simbio-Sys HRIC FPA", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local SimbioSys_HRIC_F550 = { GUI = { Name = "MPO Simbio-Sys HRIC F550", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local SimbioSys_HRIC_FPAN = { GUI = { Name = "MPO Simbio-Sys HRIC FPAN", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -88,6 +91,7 @@ local SimbioSys_HRIC_F750 = { GUI = { Name = "MPO Simbio-Sys HRIC F750", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -110,6 +114,7 @@ local SimbioSys_HRIC_F880 = { GUI = { Name = "MPO Simbio-Sys HRIC F880", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -132,6 +137,7 @@ local SimbioSys_STC_L = { GUI = { Name = "MPO Simbio-Sys STC L", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -154,6 +160,7 @@ local SimbioSys_STC_H = { GUI = { Name = "MPO Simbio-Sys STC H", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -176,6 +183,7 @@ local SimbioSys_STC_L_F920 = { GUI = { Name = "MPO Simbio-Sys STC L F920", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -198,6 +206,7 @@ local SimbioSys_STC_L_F550 = { GUI = { Name = "MPO Simbio-Sys STC L F550", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -220,6 +229,7 @@ local SimbioSys_STC_L_P700 = { GUI = { Name = "MPO Simbio-Sys STC L P700", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -242,6 +252,7 @@ local SimbioSys_STC_H_P700 = { GUI = { Name = "MPO Simbio-Sys STC H P700", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -264,6 +275,7 @@ local SimbioSys_STC_H_F420 = { GUI = { Name = "MPO Simbio-Sys STC H F420", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -286,6 +298,7 @@ local SimbioSys_STC_H_F750 = { GUI = { Name = "MPO Simbio-Sys STC H F750", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -308,6 +321,7 @@ local SimbioSys_VIHI = { GUI = { Name = "MPO Simbio-Sys VIHI", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset index 78c81c9818..9bb1b17d98 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/sixs.asset @@ -22,6 +22,7 @@ local SixsX1 = { GUI = { Name = "MPO Sixs X1", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local SixsX2 = { GUI = { Name = "MPO Sixs X2", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local SixsX3 = { GUI = { Name = "MPO Sixs X3", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset b/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset index f5afe6f213..e274f85e5e 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/fov/startracker.asset @@ -22,6 +22,7 @@ local StarTracker1 = { GUI = { Name = "MPO Star Tracker 1", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -44,6 +45,7 @@ local StarTracker2 = { GUI = { Name = "MPO Star Tracker 2", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } @@ -66,6 +68,7 @@ local StarTracker3 = { GUI = { Name = "MPO Star Tracker 3", Path = "/Solar System/Missions/BepiColombo/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset b/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset index c108ec8b8a..85a952636f 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/mission.asset @@ -1,7 +1,7 @@ local Mission = { Identifier = "BepiColombo", Name = "BepiColombo", - Image = "https://scifleet.esa.int/downloads/bepi_mcs/bepicolombo.png", + Image = "https://data.openspaceproject.com/missions/bepicolombo/bepicolombo.png", Description = [[BepiColombo is Europe's first mission to Mercury. It launched in October 2018 on a journey to the smallest and least explored terrestrial planet in our Solar System. Arriving at Mercury in December 2025, it will endure temperatures in excess of 350°C and gather data during a 1 year nominal mission. The mission comprises two spacecraft: 1. Mercury Planetary Orbiter (MPO), 2. Mercury Magnetospheric Orbiter (MMO). BepiColombo is a joint mission between ESA and the Japan Aerospace Exploration Agency (JAXA), executed under ESA leadership.]], TimeRange = { Start = "2018 OCT 20 01:45:00", diff --git a/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset b/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset index 5dff82569c..06c8fc35ee 100644 --- a/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset +++ b/data/assets/scene/solarsystem/missions/bepicolombo/trails.asset @@ -22,7 +22,8 @@ local BepiColomboTrailSun = { }, GUI = { Name = "BepiColombo Trail (Sun)", - Path = "/Solar System/Missions/BepiColombo" + Path = "/Solar System/Missions/BepiColombo", + Focusable = false } } @@ -43,7 +44,8 @@ local BepiColomboTrailMercury = { }, GUI = { Name = "BepiColombo Trail (Mercury)", - Path = "/Solar System/Missions/BepiColombo" + Path = "/Solar System/Missions/BepiColombo", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/dawn/dawn.asset b/data/assets/scene/solarsystem/missions/dawn/dawn.asset index d2096a1ac5..cf7370afe6 100644 --- a/data/assets/scene/solarsystem/missions/dawn/dawn.asset +++ b/data/assets/scene/solarsystem/missions/dawn/dawn.asset @@ -47,6 +47,7 @@ local DawnPosition = { GUI = { Name = "Dawn Position", Path = "/Solar System/Missions/Dawn", + Focusable = false, Hidden = true } } @@ -94,7 +95,8 @@ local DawnTrail = { }, GUI = { Name = "Dawn Trail", - Path = "/Solar System/Missions/Dawn" + Path = "/Solar System/Missions/Dawn", + Focusable = false } } @@ -116,7 +118,8 @@ local DawnFramingCamera1 = { }, GUI = { Name = "Dawn Framing Camera 1", - Path = "/Solar System/Missions/Dawn" + Path = "/Solar System/Missions/Dawn", + Focusable = false } } @@ -137,7 +140,8 @@ local DawnFramingCamera2 = { }, GUI = { Name = "Dawn Framing Camera 2", - Path = "/Solar System/Missions/Dawn" + Path = "/Solar System/Missions/Dawn", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/dawn/mission.asset b/data/assets/scene/solarsystem/missions/dawn/mission.asset index 5843ccea24..e403767f8a 100644 --- a/data/assets/scene/solarsystem/missions/dawn/mission.asset +++ b/data/assets/scene/solarsystem/missions/dawn/mission.asset @@ -1,33 +1,31 @@ local Mission = { Identifier = "Dawn", Name = "Dawn", - Image = "https://photojournal.jpl.nasa.gov/jpegMod/PIA19375_modest.jpg", + Image = "https://data.openspaceproject.com/missions/dawn/PIA19375_modest.jpg", TimeRange = { Start = "2007 SEP 07 11:34:00", End = "2018 OCT 30 00:00:00" }, Description = "Dawn was the first spacecraft to orbit two extraterrestrial destinations (Vesta and Ceres). When Dawn arrived at Vesta, it became the first spacecraft to orbit an object in the main asteroid belt. When Dawn arrived at Ceres, it was the first spacecraft to visit a dwarf planet.", Milestones = { { Name = "Launch", Date = "2007 SEP 07 11:34:00", - Image = "https://www.nasa.gov/images/content/190740main_dawnlaunch_330.jpg" + Image = "https://data.openspaceproject.com/missions/dawn/190740main_dawnlaunch_330.jpg" }, { Name = "Flyby of Mars", - Date = "2009 FEB 18 00:27:58", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/pj41_full.gif" , - Description = "On Dec. 24, 1968, Apollo 8 astronauts Frank Borman, Jim Lovell, and Bill Anders became the first humans to orbit the Moon, and the first to witness the magnificent sight called 'Earthrise'. As the spacecraft was in the process of rotating, Anders took this iconic picture showing Earth rising over the Moon's horizon." + Date = "2009 FEB 18 00:27:58" } }, Phases = { { Name = "Vesta orbit", TimeRange = { Start = "2011 JUL 16 04:47:00", End = "2012 SEP 05 06:26:00" }, - Image = "https://solarsystem.nasa.gov/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9JYTJWNVNTSXBZV1UxWWpJd016a3ROVFUxT1MwME1UZzFMVGxoTWpZdFkyUXpZVEk1T0RKak1UazFCam9HUlZRNkVHUnBjM0J2YzJsMGFXOXVTU0pQYVc1c2FXNWxPeUJtYVd4bGJtRnRaVDBpVUVsQk1UVTJOemhmYUdseVpYTXVhbkJuSWpzZ1ptbHNaVzVoYldVcVBWVlVSaTA0SnlkUVNVRXhOVFkzT0Y5b2FYSmxjeTVxY0djR093WlVPaEZqYjI1MFpXNTBYM1I1Y0dWSklnOXBiV0ZuWlM5cWNHVm5CanNHVkRvUmMyVnlkbWxqWlY5dVlXMWxPZ3BzYjJOaGJBPT0iLCJleHAiOm51bGwsInB1ciI6ImJsb2Jfa2V5In19--046d49cb8eb78db2f7202c135bc43c590c15f213/PIA15678_hires.jpg", + Image = "https://data.openspaceproject.com/missions/dawn/PIA15678_hires.jpg", Description = "Dawn orbited Vesta for more than a year, from July 2011 to September 2012. Its investigation confirmed that Vesta is the parent of the HED (howardites, eucrites, and diogenites) meteorites, which Dawn connected to Vesta's large south polar basin, a priceless cosmic connection between samples in hand and a singular event on a small planet." }, { Name = "Ceres orbit", TimeRange = { Start = "2015 MAR 06 12:29:00", End = "2018 OCT 30 00:00:00" }, - Image = "https://solarsystem.nasa.gov/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9JYTJWNVNTSXBZekk1TTJFMk5tVXRaR1F3TmkwME5XSmpMVGcwWVRNdE5qY3daREJoWkRNek1tWTJCam9HUlZRNkVHUnBjM0J2YzJsMGFXOXVTU0pEYVc1c2FXNWxPeUJtYVd4bGJtRnRaVDBpVUVsQk1qRXdOemt1YW5Cbklqc2dabWxzWlc1aGJXVXFQVlZVUmkwNEp5ZFFTVUV5TVRBM09TNXFjR2NHT3daVU9oRmpiMjUwWlc1MFgzUjVjR1ZKSWc5cGJXRm5aUzlxY0dWbkJqc0dWRG9SYzJWeWRtbGpaVjl1WVcxbE9ncHNiMk5oYkE9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9rZXkifX0=--84aa86325e1ff663ed2382dd4f30967e4c53e5e8/PIA21079.jpg", + Image = "https://data.openspaceproject.com/missions/dawn/PIA21079.jpg", Description = "After its escape from Vesta and its journey onward, Dawn entered orbit around Ceres in March 2015. Dawn discovered that the inner solar system's only dwarf planet was an ocean world where water and ammonia reacted with silicate rocks. As the ocean froze, salts and other telltale minerals concentrated into deposits that are now exposed in many locations across the surface. Dawn also found organics in several locations on Ceres' surface." } } diff --git a/data/assets/scene/solarsystem/missions/dawn/vesta.asset b/data/assets/scene/solarsystem/missions/dawn/vesta.asset index c8c28c8257..abd80648d7 100644 --- a/data/assets/scene/solarsystem/missions/dawn/vesta.asset +++ b/data/assets/scene/solarsystem/missions/dawn/vesta.asset @@ -127,7 +127,8 @@ local VestaTrail = { }, GUI = { Name = "Vesta Trail", - Path = "/Solar System/Asteroid Belt/Vesta" + Path = "/Solar System/Asteroid Belt/Vesta", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/insight/edl.asset b/data/assets/scene/solarsystem/missions/insight/edl.asset index e37316b37f..f47a53997b 100644 --- a/data/assets/scene/solarsystem/missions/insight/edl.asset +++ b/data/assets/scene/solarsystem/missions/insight/edl.asset @@ -151,6 +151,7 @@ local InsightParent = { GUI = { Name = "InsightParent", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -187,6 +188,7 @@ local Insight_Entry_CapsuleA = { GUI = { Name = "Insight Entry CapsuleA", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -207,6 +209,7 @@ local Insight_Entry_Capsule_Ring = { GUI = { Name = "Insight Entry Capsule Ring", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -227,6 +230,7 @@ local Insight_Entry_Capsule_Plugs = { GUI = { Name = "Insight Entry Capsule Plugs", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -247,6 +251,7 @@ local Insight_Entry_Heatshield = { GUI = { Name = "Insight Entry Heatshield", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -268,6 +273,7 @@ local Insight_Parachute_0 = { GUI = { Name = "Insight Parachute0", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -289,6 +295,7 @@ local Insight_Parachute_Cords_0 = { GUI = { Name = "Insight ParachuteC0", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -310,6 +317,7 @@ local Insight_Parachute_20 = { GUI = { Name = "Insight Parachute20", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -331,6 +339,7 @@ local Insight_Parachute_Cords_20 = { GUI = { Name = "Insight ParachuteC20", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -352,6 +361,7 @@ local Insight_Parachute_40 = { GUI = { Name = "Insight Parachute40", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -373,6 +383,7 @@ local Insight_Parachute_Cords_40 = { GUI = { Name = "Insight ParachuteC40", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -389,6 +400,7 @@ local Insight_Lander_A001 = { GUI = { Name = "Insight Lander A001", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -405,6 +417,7 @@ local Insight_Lander_A002 = { GUI = { Name = "Insight Lander A002", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -421,6 +434,7 @@ local Insight_Lander_A003 = { GUI = { Name = "Insight Lander A003", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -437,6 +451,7 @@ local Insight_Lander_A004 = { GUI = { Name = "Insight Lander A004", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -453,6 +468,7 @@ local Insight_Lander_A005 = { GUI = { Name = "Insight Lander A005", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -469,6 +485,7 @@ local Insight_Lander_A006 = { GUI = { Name = "Insight Lander A006", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -485,6 +502,7 @@ local Insight_Lander_A007 = { GUI = { Name = "Insight Lander A007", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -501,6 +519,7 @@ local Insight_Lander_A008 = { GUI = { Name = "Insight Lander A008", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -517,6 +536,7 @@ local Insight_Lander_foil1 = { GUI = { Name = "Insight Lander foil", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -533,6 +553,7 @@ local Insight_Lander_Tex01 = { GUI = { Name = "Insight Lander Tex01", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -549,6 +570,7 @@ local Insight_Lander_Tex02 = { GUI = { Name = "Insight Lander Tex02", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -570,6 +592,7 @@ local Insight_Legs_Stowed_tex = { GUI = { Name = "Insight legs_stow_tex", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -591,6 +614,7 @@ local Insight_Legs_Stowed_AO06 = { GUI = { Name = "Insight legs_stow_AO", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -611,6 +635,7 @@ local Insight_Legs_Deployed_tex = { GUI = { Name = "Insight legs_deploy_tex", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -631,6 +656,7 @@ local Insight_Legs_Deployed_AO06 = { GUI = { Name = "Insight legs_deploy_AO", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -647,6 +673,7 @@ local Insight_Panels_Stowed_tex = { GUI = { Name = "Insight panels_stow_tex", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -663,6 +690,7 @@ local Insight_Panels_Stowed_tex2 = { GUI = { Name = "Insight panels_stow_tex2", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -679,6 +707,7 @@ local Insight_Panels_Stowed_AO01 = { GUI = { Name = "Insight panels_stow_AO", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -699,6 +728,7 @@ local Insight_Panels_Deployed_tex = { GUI = { Name = "Insight panels_deploy_tex", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -718,7 +748,9 @@ local Insight_Panels_Deployed_tex2 = { }, GUI = { Name = "Insight panels_deploy_tex2", - Path = "/Solar System/Missions/Insight" + Path = "/Solar System/Missions/Insight", + Focusable = false, + Hidden = true } } @@ -738,6 +770,7 @@ local Insight_Panels_Deployed_AO06 = { GUI = { Name = "Insight panels_deploy_AO", Path = "/Solar System/Missions/Insight", + Focusable = false, Hidden = true } } @@ -766,7 +799,8 @@ local Insight_Trail = { }, GUI = { Name = "Insight Trail", - Path = "/Solar System/Missions/Insight" + Path = "/Solar System/Missions/Insight", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/juice/fieldlines.asset b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset index e578bd3471..080868dc08 100644 --- a/data/assets/scene/solarsystem/missions/juice/fieldlines.asset +++ b/data/assets/scene/solarsystem/missions/juice/fieldlines.asset @@ -18,11 +18,13 @@ local GanymedeMagnetosphere = { SourceFolder = data, LineWidth = 3.0, InputFileType = "Json", + ShowAtAllTimes = true, ColorMethod = "By Quantity", ColorQuantity = 0, - ColorTableRanges = { { 62.556353386366766, 1665.5534182835445 } }, + ColorTableRanges = { { 62.556353386366766, 1665.5534182835445} }, + ColorMinMaxRange = { 0, 10000 }, ColorTablePaths = { asset.resource("CMR-illuminance2.txt") }, - Color = { 0.03, 0.0, 0.0, 1.0 }, + Color = { 1.0, 0.725, 0.75, 0.8 }, ParticleSpacing = 42.0, ParticleSize = 30.0, FlowColor = { 1.0, 1.0, 1.0, 0.1 }, diff --git a/data/assets/scene/solarsystem/missions/juice/fov/gala.asset b/data/assets/scene/solarsystem/missions/juice/fov/gala.asset index 999e8e73c8..3c2d8707a0 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/gala.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/gala.asset @@ -27,6 +27,7 @@ local Gala = { GUI = { Name = "Gala FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-view for the Ganymede Laster Altimeter (GALA) instrument" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/janus.asset b/data/assets/scene/solarsystem/missions/juice/fov/janus.asset index 65d440a769..b1b689afae 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/janus.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/janus.asset @@ -33,6 +33,7 @@ local Janus = { GUI = { Name = "Janus FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-view for the JANUS instrument onboard Juice" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset b/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset index 57e183f1e7..4e1f2a3ce5 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/jmc.asset @@ -27,6 +27,7 @@ local JMC1 = { GUI = { Name = "JUICE_JMC-1 FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-views for the Juice Monitoring cameras" } } @@ -55,6 +56,7 @@ local JMC2 = { GUI = { Name = "JUICE_JMC-2 FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-views for the Juice Monitoring cameras" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/majis.asset b/data/assets/scene/solarsystem/missions/juice/fov/majis.asset index 2802dbce6a..85aceaa935 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/majis.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/majis.asset @@ -27,6 +27,7 @@ local MajisVisnir = { GUI = { Name = "Majis Visnir FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = [[ The field-of-view for the Moon and Jupiter Imaging Spectrometer measuring in the visible and near-infrared spectra (0.4-1.9 um and 1.5-5.7 um). @@ -57,7 +58,8 @@ local MajisVisnirB2 = { }, GUI = { Name = "Majis Visnir B2 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -84,7 +86,8 @@ local MajisVisnirB4 = { }, GUI = { Name = "Majis Visnir B4 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -111,7 +114,8 @@ local MajisIr = { }, GUI = { Name = "Majis IR FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -138,7 +142,8 @@ local MajisIrB2 = { }, GUI = { Name = "Majis IR B2 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -165,7 +170,8 @@ local MajisIrB4 = { }, GUI = { Name = "Majis IR B4 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -193,6 +199,7 @@ local Majis = { GUI = { Name = "Majis FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = [[ The field-of-view for the Moon and Jupiter Imaging Spectrometer measuring in the visible and near-infrared spectra (0.4-1.9 um and 1.5-5.7 um). diff --git a/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset b/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset index 1adead87e0..7704a6f513 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/navcam.asset @@ -27,6 +27,7 @@ local NavCam = { GUI = { Name = "NavCam FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The camera onboard Juice used to navigate by the stars" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/rime.asset b/data/assets/scene/solarsystem/missions/juice/fov/rime.asset index 8f9aeccf5e..9a299c717c 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/rime.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/rime.asset @@ -28,6 +28,7 @@ local RimeBase = { GUI = { Name = "Rime Base FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The location of the base for the RIME instrument onboard Juice" } } @@ -57,6 +58,7 @@ local Rime = { GUI = { Name = "Rime FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The location of the RIME instrument onboard Juice" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset b/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset index 42a7fefc8e..96bd5ebbd7 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/startracker.asset @@ -27,6 +27,7 @@ local StarOh1 = { GUI = { Name = "Star Tracker OH1 FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The first head of the Hydra star tracking system" } } @@ -55,6 +56,7 @@ local StarOh2 = { GUI = { Name = "Star Tracker OH2 FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The second head of the Hydra star tracking system" } } @@ -83,6 +85,7 @@ local StarOh3 = { GUI = { Name = "Star Tracker OH3 FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The third head of the Hydra star tracking system" } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/swi.asset b/data/assets/scene/solarsystem/missions/juice/fov/swi.asset index 8e06bff28e..35b3f98291 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/swi.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/swi.asset @@ -27,7 +27,8 @@ local SwiCh2 = { }, GUI = { Name = "SWI CH2 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } @@ -62,6 +63,7 @@ local SwiFull = { GUI = { Name = "SWI Full FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-view for the full SWI instrument onboard Juice" } } @@ -98,7 +100,8 @@ local SwiFullGCO500 = { }, GUI = { Name = "SWI Full GCO500 FOV", - Path = "/Solar System/Missions/Juice/Instruments" + Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset b/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset index e264b5b0fd..6359822729 100644 --- a/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset +++ b/data/assets/scene/solarsystem/missions/juice/fov/uvs.asset @@ -27,6 +27,7 @@ local UVS = { GUI = { Name = "UVS FOV", Path = "/Solar System/Missions/Juice/Instruments", + Focusable = false, Description = "The field-of-view for the UVS instrument onboard Juice" } } diff --git a/data/assets/scene/solarsystem/missions/juice/mission.asset b/data/assets/scene/solarsystem/missions/juice/mission.asset index 3554bc5c5f..fdd2786bed 100644 --- a/data/assets/scene/solarsystem/missions/juice/mission.asset +++ b/data/assets/scene/solarsystem/missions/juice/mission.asset @@ -1,7 +1,7 @@ local Mission = { Identifier = "Juice", Name = "Juice", - Image = "https://www.esa.int/var/esa/storage/images/science_exploration/space_science/juice/23388092-2-eng-GB/Juice_pillars.jpg", + Image = "https://data.openspaceproject.com/missions/juice/Juice_pillars.jpg", Description = "ESA's Jupiter Icy Moons Explorer, Juice, will make detailed observations of the giant gas planet and its three large ocean-bearing moons - Ganymede, Callisto and Europa - with a suite of remote sensing, geophysical, and in situ instruments. The mission will characterize these moons as both planetary objects and possible habitats, explore Jupiter's complex environment in depth, and study the wider Jupiter system as an archetype for gas giants across the Universe.", Milestones = { { diff --git a/data/assets/scene/solarsystem/missions/juice/plane.asset b/data/assets/scene/solarsystem/missions/juice/plane.asset index 39acf75d8b..e2becf8d05 100644 --- a/data/assets/scene/solarsystem/missions/juice/plane.asset +++ b/data/assets/scene/solarsystem/missions/juice/plane.asset @@ -28,6 +28,7 @@ local xy_n = { GUI = { Name = "Ganymede XY Plane N", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = "A cut plane in Ganymede's XY plane showing the number of particles" } } @@ -44,6 +45,7 @@ local xy_t = { GUI = { Name = "Ganymede XY Plane T", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = "A cut plane in Ganymede's XY plane showing the temperature" } } @@ -60,6 +62,7 @@ local xy_u = { GUI = { Name = "Ganymede XY Plane U", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XY plane showing the strength of the magnetic field]] } @@ -77,6 +80,7 @@ local xy_utot = { GUI = { Name = "Ganymede XY Plane U_tot", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XY plane showing the X, Y, and Z components of the magnetic field mapped to the RGB components]] } @@ -94,6 +98,7 @@ local xy_ux = { GUI = { Name = "Ganymede XY Plane Ux", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XY plane showing the X component of Ganymede's magnetic field]] } @@ -111,6 +116,7 @@ local xy_uy = { GUI = { Name = "Ganymede XY Plane Uy", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XY plane showing the Y component of Ganymede's magnetic field]] } @@ -128,6 +134,7 @@ local xy_uz = { GUI = { Name = "Ganymede XY Plane Uz", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XY plane showing the Z component of Ganymede's magnetic field]] } @@ -151,6 +158,7 @@ local xz_n = { GUI = { Name = "Ganymede XZ Plane N", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = "A cut plane in Ganymede's XZ plane showing the number of particles" } } @@ -173,6 +181,7 @@ local xz_t = { GUI = { Name = "Ganymede XZ Plane T", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = "A cut plane in Ganymede's XZ plane showing the temperature" } } @@ -195,6 +204,7 @@ local xz_u = { GUI = { Name = "Ganymede XZ Plane U", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XZ plane showing the strength of the magnetic field]] } @@ -218,6 +228,7 @@ local xz_utot = { GUI = { Name = "Ganymede XZ Plane U_tot", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XZ plane showing the X, Y, and Z components of the magnetic field mapped to the RGB components]] } @@ -241,6 +252,7 @@ local xz_ux = { GUI = { Name = "Ganymede XZ Plane Ux", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XZ plane showing the X component of Ganymede's magnetic field]] } @@ -264,6 +276,7 @@ local xz_uy = { GUI = { Name = "Ganymede XZ Plane Uy", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XZ plane showing the Y component of Ganymede's magnetic field]] } @@ -287,6 +300,7 @@ local xz_uz = { GUI = { Name = "Ganymede XZ Plane Uz", Path = "/Solar System/Missions/Juice/Plane", + Focusable = false, Description = [[A cut plane in Ganymede's XZ plane showing the Z component of Ganymede's magnetic field]] } diff --git a/data/assets/scene/solarsystem/missions/juice/trails/earth.asset b/data/assets/scene/solarsystem/missions/juice/trails/earth.asset index 278ed32b85..cf590c47eb 100644 --- a/data/assets/scene/solarsystem/missions/juice/trails/earth.asset +++ b/data/assets/scene/solarsystem/missions/juice/trails/earth.asset @@ -22,6 +22,7 @@ local JuiceTrailEarth = { GUI = { Name = "Juice Trail (Earth)", Path = "/Solar System/Missions/Juice", + Focusable = false, Description = "Juice's trajectory relative to the Earth barycenter" } } diff --git a/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset b/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset index 6d466cda2d..61b73a9803 100644 --- a/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset +++ b/data/assets/scene/solarsystem/missions/juice/trails/ganymede.asset @@ -22,6 +22,7 @@ local JuiceTrailGanymede = { GUI = { Name = "Juice Trail (Ganymede)", Path = "/Solar System/Missions/Juice", + Focusable = false, Description = "Juice's trajectory relative to Ganymede" } } diff --git a/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset b/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset index e1e77f21ea..e8641141c5 100644 --- a/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset +++ b/data/assets/scene/solarsystem/missions/juice/trails/jupiter.asset @@ -22,6 +22,7 @@ local JuiceTrailJupiter = { GUI = { Name = "Juice Trail (Jupiter)", Path = "/Solar System/Missions/Juice", + Focusable = false, Description = "Juice's trajectory relative to Jupiter" } } diff --git a/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset b/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset index aad27fb39a..287fed03f2 100644 --- a/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset +++ b/data/assets/scene/solarsystem/missions/juice/trails/ssb.asset @@ -22,6 +22,7 @@ local JuiceTrail = { GUI = { Name = "Juice Trail", Path = "/Solar System/Missions/Juice", + Focusable = false, Description = "Juice's trajectory relative to the solar system's barycenter" } } diff --git a/data/assets/scene/solarsystem/missions/juno/juno.asset b/data/assets/scene/solarsystem/missions/juno/juno.asset index 89eef4a490..9434c827ad 100644 --- a/data/assets/scene/solarsystem/missions/juno/juno.asset +++ b/data/assets/scene/solarsystem/missions/juno/juno.asset @@ -76,7 +76,8 @@ local JunoTrail = { }, GUI = { Name = "Juno Trail", - Path = "/Solar System/Missions/Juno" + Path = "/Solar System/Missions/Juno", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/juno/mission.asset b/data/assets/scene/solarsystem/missions/juno/mission.asset index b823e46e3f..94e3a8a31e 100644 --- a/data/assets/scene/solarsystem/missions/juno/mission.asset +++ b/data/assets/scene/solarsystem/missions/juno/mission.asset @@ -1,14 +1,12 @@ local Mission = { Identifier = "Juno", Name = "Juno", - Image = "https://upload.wikimedia.org/wikipedia/commons/3/32/Juno_mission_insignia.svg", + Image = "https://data.openspaceproject.com/missions/juno/Juno_mission_insignia.svg", Description = "On August 5, 2011, NASA's Juno spacecraft embarked on a 5-year journey to our solar system's largest planet - the gas giant Jupiter. Its mission: to probe beneath the planet's dense clouds and answer questions about the origin and evolution of Jupiter, our solar system, and giant planets in general across the cosmos. Juno arrived at Jupiter on July 4, 2016, after a 5-year, 1.7-billion-mile journey, and settled into a 53-day polar orbit stretching from just above Jupiter's cloud tops to the outer reaches of the Jovian magnetosphere.", Milestones = { { Name = "Arrival at Jupiter", - Date = "2016 JUL 04 00:00:00", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/pj41_full.gif" , - Description = "On Dec. 24, 1968, Apollo 8 astronauts Frank Borman, Jim Lovell, and Bill Anders became the first humans to orbit the Moon, and the first to witness the magnificent sight called 'Earthrise'. As the spacecraft was in the process of rotating, Anders took this iconic picture showing Earth rising over the Moon's horizon." + Date = "2016 JUL 04 00:00:00" } }, Phases = { @@ -16,7 +14,7 @@ local Mission = { Name = "Journey to Jupiter", TimeRange = { Start = "2011 AUG 05 16:25:00", End = "2016 JUL 04 00:00:00" }, Description = "Juno arrived at Jupiter on July 4, 2016, after a five-year, 1,740-million-mile journey, and settled into a 53-day polar orbit stretching from just above Jupiter's cloud tops to the outer reaches of the Jovian magnetosphere.", - Image = "https://d2pn8kiwq2w21t.cloudfront.net/original_images/jpegPIA22946.jpg", + Image = "https://data.openspaceproject.com/missions/juno/PIA22946_modest.jpg", Phases = { { Name = "Deep space maneuevers", @@ -28,12 +26,12 @@ local Mission = { Name = "Mission", TimeRange = { Start = "2016 JUL 04 00:00:00", End = "2021 AUG 01 00:00:00" }, Description = "Juno's discoveries have revolutionized our understanding of Jupiter and solar system formation. During the prime mission's 35 orbits of Jupiter, Juno collected more than three terabits (375 gigabytes) of science data and provided dazzling views of Jupiter and its satellites, all processed by citizen scientists with NASA's first-ever camera dedicated to public outreach. Juno's many discoveries have changed our view of Jupiter's atmosphere and interior, revealing an atmospheric weather layer that extends far beyond its clouds and a deep interior with a diluted, or 'fuzzy,' heavy element core. Near the end of the prime mission, as the spacecraft's orbit evolved, flybys of the moon Ganymede initiated Juno's transition into a full Jovian system explorer.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/pia22692_hires.jpg" + Image = "https://data.openspaceproject.com/missions/juno/PIA22692.jpg" }, { Name = "Extended Mission", TimeRange = { Start = "2021 AUG 01 00:00:00", End = "2025 Sep 01 00:00:00" }, - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/pia25015.jpg" + Image = "https://data.openspaceproject.com/missions/juno/PIA25015.jpg" } } } diff --git a/data/assets/scene/solarsystem/missions/messenger/messenger.asset b/data/assets/scene/solarsystem/missions/messenger/messenger.asset index 04805ebcab..496775e1f8 100644 --- a/data/assets/scene/solarsystem/missions/messenger/messenger.asset +++ b/data/assets/scene/solarsystem/missions/messenger/messenger.asset @@ -59,7 +59,9 @@ local MessengerProbeBlack = { }, GUI = { Name = "MessengerProbe Black", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false, + Hidden = true } } @@ -76,7 +78,9 @@ local MessengerProbeFoil = { }, GUI = { Name = "MessengerProbe foil", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false, + Hidden = true } } @@ -93,7 +97,9 @@ local MessengerProbeHeatShield = { }, GUI = { Name = "MessengerProbe Heat Shield", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false, + Hidden = true } } @@ -110,7 +116,9 @@ local MessengerProbeMetal = { }, GUI = { Name = "MessengerProbe Metal", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false, + Hidden = true } } @@ -127,7 +135,9 @@ local MessengerProbePanels = { }, GUI = { Name = "MessengerProbe Panels", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false + Hidden = true } } @@ -149,7 +159,8 @@ local MessengerTrail = { }, GUI = { Name = "Messenger Trail", - Path = "/Solar System/Missions/Messenger" + Path = "/Solar System/Missions/Messenger", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset index dfd4699df4..c4148ff1ea 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/charon.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/charon.asset @@ -88,7 +88,8 @@ local CharonText = { }, GUI = { Name = "Charon Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -107,7 +108,8 @@ local CharonShadow = { }, GUI = { Name = "Charon Shadow", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/fov.asset b/data/assets/scene/solarsystem/missions/newhorizons/fov.asset index 149e8c4ec7..3581b23590 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/fov.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/fov.asset @@ -34,7 +34,8 @@ local Lorri = { }, GUI = { Name = "LORRI", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -63,7 +64,8 @@ local RalphLeisa = { }, GUI = { Name = "RALPH LEISA", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -92,7 +94,8 @@ local RalphMvicPan1 = { }, GUI = { Name = "RALPH MVIC PAN 1", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -121,7 +124,8 @@ local RalphMvicPan2 = { }, GUI = { Name = "RALPH MVIC PAN 2", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -150,7 +154,8 @@ local RalphMvicRed = { }, GUI = { Name = "RALPH MVIC RED", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -179,7 +184,8 @@ local RalphMvicBlue = { }, GUI = { Name = "RALPH MVIC BLUE", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -208,7 +214,8 @@ local RalphMvicFt = { }, GUI = { Name = "RALPH MVIC FT", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -237,7 +244,8 @@ local RalphMvicMethane = { }, GUI = { Name = "RALPH MVIC METHANE", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -266,7 +274,8 @@ local RalphMvicNir = { }, GUI = { Name = "RALPH MVIC NIR", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -296,7 +305,8 @@ local AliceAirglow = { }, GUI = { Name = "ALICE AIRGLOW", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -325,7 +335,8 @@ local AliceSoc = { }, GUI = { Name = "ALICE SOC", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } @@ -354,7 +365,8 @@ local Rex = { }, GUI = { Name = "REX", - Path = "/Solar System/Missions/New Horizons/Instruments" + Path = "/Solar System/Missions/New Horizons/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/horizons.asset b/data/assets/scene/solarsystem/missions/newhorizons/horizons.asset index c0544cd88b..d9a316d0cc 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/horizons.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/horizons.asset @@ -32,6 +32,7 @@ local NewHorizons = { GUI = { Name = "New Horizons Trail (Horizons)", Path = "/Solar System/Missions/New Horizons", + Focusable = false, Description = [[New Horizons Trail, spanning from January 19th, 2006 to January 1st, 2030. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/label.asset b/data/assets/scene/solarsystem/missions/newhorizons/label.asset index b41125e178..5afd69abac 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/label.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/label.asset @@ -18,7 +18,8 @@ local Labels = { AmbientIntensity = 0.8 }, GUI = { - Path = "/Solar System/Missions/New Horizons" + Path = "/Solar System/Missions/New Horizons", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset index 3c58d84824..0b9eae578b 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/othermoons.asset @@ -53,7 +53,8 @@ local HydraText = { }, GUI = { Name = "Hydra Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -76,7 +77,8 @@ local KerberosText = { }, GUI = { Name = "Kerberos Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -93,7 +95,8 @@ local NixText = { }, GUI = { Name = "Nix Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -116,7 +119,8 @@ local StyxText = { }, GUI = { Name = "Styx Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset index 747fa0adfe..caa02d03d8 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/pluto.asset @@ -192,7 +192,8 @@ local PlutoBarycenterLabel = { }, GUI = { Name = "Pluto Barycenter Label", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -215,7 +216,8 @@ local PlutoText = { }, GUI = { Name = "Pluto Text", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } @@ -234,7 +236,8 @@ local PlutoShadow = { }, GUI = { Name = "Pluto Shadow", - Path = "/Solar System/Dwarf Planets/Pluto" + Path = "/Solar System/Dwarf Planets/Pluto", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/newhorizons/trail.asset b/data/assets/scene/solarsystem/missions/newhorizons/trail.asset index 6abb7c6966..05881d246c 100644 --- a/data/assets/scene/solarsystem/missions/newhorizons/trail.asset +++ b/data/assets/scene/solarsystem/missions/newhorizons/trail.asset @@ -25,7 +25,8 @@ local TrailAtPluto = { }, GUI = { Name = "New Horizons Trail Pluto", - Path = "/Solar System/Missions/New Horizons" + Path = "/Solar System/Missions/New Horizons", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset b/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset index 2b7e392ea6..9805b2a6aa 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/bennu_projection.asset @@ -105,7 +105,8 @@ local BennuTrail = { }, GUI = { Name = "Bennu Trail", - Path = "/Solar System/Asteroid" + Path = "/Solar System/Asteroid", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/osirisrex/mission.asset b/data/assets/scene/solarsystem/missions/osirisrex/mission.asset index d2d3e229d6..1b0179c55d 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/mission.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/mission.asset @@ -33,13 +33,13 @@ local Mission = { Identifier = "OsirisRex", Name = "OSIRIS-REx", Description = "Launched on Sept. 8, 2016, the Origins, Spectral Interpretation, Resource Identification, Security-Regolith Explorer (OSIRIS-REx) spacecraft traveled to a near-Earth asteroid called Bennu (formerly 1999 RQ36), and collected a sample of the of rocks and material from the surface that it will return to Earth in 2023. The mission will help scientists investigate how planets formed and how life began, as well as improve our understanding of asteroids that could impact Earth.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/osiris-rex-mission-logo12_copy.png", + Image = "https://data.openspaceproject.com/missions/osirisrex/osiris-rex-mission-logo12-copy.png", Actions = { "os.osirisrex.AimAtBennu", "os.osirisrex.SetLaunchTime", "os.osirisrex.LookImageCapture" }, Phases = { -- All 1-level phases based on [1] { Name = "Outbound Cruise", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/28929096574_85a647dc8e_o.jpg", + Image = "https://data.openspaceproject.com/missions/osirisrex/OSIRIS-REx_launch_28929096574_85a647dc8e_o.jpg", Phases = { -- Phases from [4] { @@ -56,7 +56,7 @@ local Mission = { { Name = "Solar Orbit", TimeRange = { Start = "2016 SEP 08 23:45:00", End = "2018 SEP 01 00:00:00" }, - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/ega_1ms_mapcam_color_corrected_0.png", + Image = "https://data.openspaceproject.com/missions/osirisrex/ega_1ms_mapcam_color_corrected_0.png", Description = "A color composite image of Earth taken on Sept. 22 by the MapCam camera on NASA's OSIRIS-REx spacecraft. This image was taken just hours after the spacecraft completed its Earth Gravity Assist at a range of approximately 106,000 miles (170,000 kilometers). MapCam is part of the OSIRIS-REx Camera Suite (OCAMS) operated by the University of Arizona. Visible in this image are the Pacific Ocean and several familiar landmasses, including Australia in the lower left, and Baja California and the southwestern United States in the upper right. The dark vertical streaks at the top of the image are caused by short exposure times (less than three milliseconds). Short exposure times are required for imaging an object as bright as Earth, but are not anticipated for an object as dark as the asteroid Bennu, which the camera was designed to image. Date Taken: Sept. 22, 2017", Phases = { { @@ -77,13 +77,13 @@ local Mission = { Name = "Approach", Description = "Approach Phase began on August 17, 2018, when the spacecraft was still about 1.2 million miles (two million km) away from Bennu, and it continued until the spacecraft arrived at the asteroid on December 3, 2018. The primary goals of Approach were to visually locate Bennu for the first time, survey the surrounding area for potential hazards, and collect enough imagery of Bennu for scientists to generate a detailed shape model of the asteroid, assign a coordinate system, and understand its spin state.", TimeRange = { Start = "2018-AUG-17 00:00:00.000", End = "2018-DEC-31 01:34:21.183" }, - Image = "https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/lbt-orex-1049-loop-gif.gif", + Image = "https://data.openspaceproject.com/missions/osirisrex/LBT-OREx-1049-loop-gif-1.gif", Phases = { { Name = "Dust Plume Search Observation", Description = "Search for dust and gas plumes originating from the asteroid surface, and characterize their source regions and column densities. Information on the presence and location of dust and gas plumes is needed to assess safety, understand the geologic and dynamic history of the asteroid, and inform sample-site selection.", TimeRange = { Start = "2018-SEP-11 21:31:01.183", End = "2018-SEP-12 02:18:41.183" }, - Image = "https://www.asteroidmission.org/wp-content/uploads/2018/09/MapCamDustSearch-1.jpg" + Image = "https://data.openspaceproject.com/missions/osirisrex/MapCamDustSearch-1.jpg" }, { Name = "Light Curve", @@ -114,7 +114,7 @@ local Mission = { { Name = "Preliminary Survey", Description = "Preliminary Survey Phase began with the spacecraft's arrival at Bennu on December 3, 2018, and marked the first time that the OSIRIS-REx spacecraft operated around the asteroid. The spacecraft made a total of five passes over the north pole, equator, and south pole at a range of 4.3 miles (7 km). The primary science goals of Preliminary Survey were to estimate Bennu's mass, refine the asteroid's spin state model, and generate a global shape model at a resolution of 75-cm.", - Image = "https://www.asteroidmission.org/wp-content/uploads/2018/05/Prelim-Survey-for-Web.jpg", + Image = "https://data.openspaceproject.com/missions/osirisrex/Prelim-Survey-for-Web.jpg", Phases = { { Name = "MapCamOLA Phase 1", @@ -222,7 +222,7 @@ local Mission = { { Name = "Orbital B", Description = "At the end of Detailed Survey, the spacecraft entered a close orbit - with a radius of 0.6 miles (1 km) - around Bennu to begin Orbital B Phase. This phase broke the record OSIRIS-REx set in Orbital A for the closest that a spacecraft has ever orbited around a small body. The primary science activities for this phase were the global mapping of Bennu, the development of shape modeling based on OLA data, and the execution of a Radio Science experiment. These data were used to evaluate potential sample collection sites for three key elements: safety, sampleability and science value. Orbital B concluded with the team narrowing in on a primary and a back-up sample site.", - Image = "https://www.asteroidmission.org/wp-content/uploads/2018/05/Orbital-B-for-Web.jpg", + Image = "https://data.openspaceproject.com/missions/osirisrex/Orbital-B-for-Web.jpg", Phases = { { Name = "Candidate Sample Site Phase 1", diff --git a/data/assets/scene/solarsystem/missions/osirisrex/model.asset b/data/assets/scene/solarsystem/missions/osirisrex/model.asset index 647eea7f94..2fbddafc35 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/model.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/model.asset @@ -131,7 +131,8 @@ local PolyCamFov = { }, GUI = { Name = "POLYCAM FOV", - Path = "/Solar System/Missions/OSIRIS REx/Instruments" + Path = "/Solar System/Missions/OSIRIS REx/Instruments", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/osirisrex/trail.asset b/data/assets/scene/solarsystem/missions/osirisrex/trail.asset index e3502cedd8..e608699176 100644 --- a/data/assets/scene/solarsystem/missions/osirisrex/trail.asset +++ b/data/assets/scene/solarsystem/missions/osirisrex/trail.asset @@ -24,7 +24,8 @@ local OsirisRexTrailEarth = { }, GUI = { Name = "OSIRIS REx Trail Earth", - Path = "/Solar System/Missions/OSIRIS REx" + Path = "/Solar System/Missions/OSIRIS REx", + Focusable = false } } @@ -45,7 +46,8 @@ local OsirisRexTrailSolarSystem = { }, GUI = { Name = "OSIRIS REx Trail Solar System", - Path = "/Solar System/Missions/OSIRIS REx" + Path = "/Solar System/Missions/OSIRIS REx", + Focusable = false } } @@ -66,7 +68,8 @@ local OsirisRexTrailBennu = { }, GUI = { Name = "OSIRIS REx Trail Bennu", - Path = "/Solar System/Missions/OSIRIS REx" + Path = "/Solar System/Missions/OSIRIS REx", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/perseverance/mission.asset b/data/assets/scene/solarsystem/missions/perseverance/mission.asset index db45229dae..efe0684c94 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/mission.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/mission.asset @@ -5,22 +5,22 @@ local Mission = { { Name = "First Color Photo", TimeRange = { Start = "2021 FEB 18" }, - Image = "http://data.openspaceproject.com/missions/perseverance/Perseverance's_First_Full-Color_Look_at_Mars.png" + Image = "https://data.openspaceproject.com/missions/perseverance/Perseverance's_First_Full-Color_Look_at_Mars.png" }, { Name = "First Study Target", TimeRange = { Start = "2021 FEB 22" }, - Image = "http://data.openspaceproject.com/missions/perseverance/PIA24484-MarsPerseveranceRover-FirstStudyTarget-20210222.jpg" + Image = "https://data.openspaceproject.com/missions/perseverance/PIA24484-MarsPerseveranceRover-FirstStudyTarget-20210222.jpg" }, { Name = "Drive Test", TimeRange = { Start = "2021 MAR 07" }, - Image = "http://data.openspaceproject.com/missions/perseverance/PIA23729-MarsPerseveranceRover-DriveTest-20210307.jpg" + Image = "https://data.openspaceproject.com/missions/perseverance/PIA23729-MarsPerseveranceRover-DriveTest-20210307.jpg" }, { Name = "Ingenuity Helicopter launch", TimeRange = { Start = "2021 APR 04" }, - Image = "http://data.openspaceproject.com/missions/perseverance/Ingenuity_helicopter_first_colour_image.jpg" + Image = "https://data.openspaceproject.com/missions/perseverance/Ingenuity_helicopter_first_colour_image.jpg" }, { Name = "Ingenuity Helicopter First Flight", diff --git a/data/assets/scene/solarsystem/missions/perseverance/model.asset b/data/assets/scene/solarsystem/missions/perseverance/model.asset index 36a73de73a..e2f76b1f26 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/model.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/model.asset @@ -74,6 +74,7 @@ local PerseveranceNode = { GUI = { Name = "Perseverance Node", Path = "/Solar System/Missions/Perseverance", + Focusable = false, Hidden = true } } @@ -101,6 +102,7 @@ local PerseveranceModel = { GUI = { Name = "Perseverance Model", Path = "/Solar System/Missions/Perseverance", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/missions/perseverance/trail.asset b/data/assets/scene/solarsystem/missions/perseverance/trail.asset index 97d4c232d8..9fe9fba9d2 100644 --- a/data/assets/scene/solarsystem/missions/perseverance/trail.asset +++ b/data/assets/scene/solarsystem/missions/perseverance/trail.asset @@ -27,7 +27,8 @@ local PerseveranceTrailSun = { }, GUI = { Name = "Perseverance Trail (Sun)", - Path = "/Solar System/Missions/Perseverance" + Path = "/Solar System/Missions/Perseverance", + Focusable = false } } @@ -49,7 +50,8 @@ local PerseveranceTrailMars = { }, GUI = { Name = "Perseverance Trail (Mars)", - Path = "/Solar System/Missions/Perseverance" + Path = "/Solar System/Missions/Perseverance", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/pioneer/horizons.asset b/data/assets/scene/solarsystem/missions/pioneer/horizons.asset index e9e87b1afd..6e09394afa 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/horizons.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/horizons.asset @@ -32,6 +32,7 @@ local Pioneer10 = { GUI = { Name = "Pioneer 10 Trail (Horizons)", Path = "/Solar System/Missions/Pioneer", + Focusable = false, Description = [[Pioneer 10 Trail, spanning from March 4th, 1972 to January 1st, 2030. Data from JPL Horizons]] } @@ -61,6 +62,7 @@ local Pioneer11 = { GUI = { Name = "Pioneer 11 Trail (Horizons)", Path = "/Solar System/Missions/Pioneer", + Focusable = false, Description = [[Pioneer 11 Trail, spanning from April 7th, 1973 to January 1st, 2030. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset index 57ed722850..e0769dfc65 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer10.asset @@ -50,6 +50,7 @@ local Pioneer10Trail = { GUI = { Name = "Pioneer 10 Trail (SPICE)", Path = "/Solar System/Missions/Pioneer", + Focusable = false, Description = [[Pioneer 10 Trail, spanning March 3rd, 1972 to January 2nd, 1990. Data from SPICE]] } diff --git a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset index 4db1484673..ecee70721d 100644 --- a/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset +++ b/data/assets/scene/solarsystem/missions/pioneer/pioneer11.asset @@ -55,6 +55,7 @@ local Pioneer11Trail = { GUI = { Name = "Pioneer 11 Trail (SPICE)", Path = "/Solar System/Missions/Pioneer", + Focusable = false, Description = [[Pioneer 11 Trail, spanning April 6th, 1973 to January 2nd, 1990. Data from SPICE]] } diff --git a/data/assets/scene/solarsystem/missions/rosetta/67p.asset b/data/assets/scene/solarsystem/missions/rosetta/67p.asset index 27c0dafd75..f8a6a68125 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/67p.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/67p.asset @@ -133,7 +133,8 @@ local Trail67P = { }, GUI = { Name = "67P Trail", - Path = "/Solar System/Comets/67P Churymov-Gerasimenko" + Path = "/Solar System/Comets/67P Churymov-Gerasimenko", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/rosetta/mission.asset b/data/assets/scene/solarsystem/missions/rosetta/mission.asset index 3ee1cbb585..3e1f1c2cdc 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/mission.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/mission.asset @@ -4,7 +4,7 @@ local Mission = { Identifier = "Rosetta", Name = "Rosetta", TimeRange = { Start = "2004 MAR 02 00:00:00", End = "2016 SEP 30 00:00:00" }, - Image = "https://www.cosmos.esa.int/documents/522118/522182/Rosetta_logo.png/cd85878d-2fac-e086-e32a-df0eaee5e505?t=1614026031720", + Image = "https://data.openspaceproject.com/missions/rosetta/Rosetta_logo.png", Description = "ESAs Rosetta mission was the first to rendezvous with a comet, the first to follow a comet on its orbit around the Sun, and the first to deploy a lander to a comets surface. Comets are time capsules containing primitive material left over from the epoch when the Sun and its planets formed. By studying the gas, dust and structure of the nucleus and organic materials associated with the comet, via both remote and in situ observations, the Rosetta mission is unlocking the history and evolution of our Solar System.", Milestones = { { @@ -14,15 +14,14 @@ local Mission = { { Name = "First Earth gravity assist", Date = "2005 MAR 04 00:00:00", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2005/03/moonrise_above_the_pacific_22_06_utc_4_march_2005/9520996-4-eng-GB/Moonrise_above_the_Pacific_22_06_UTC_4_March_2005_pillars.jpg", - Description = "The Moon rising above the Pacific, three minutes before the point of closest approach during Rosettas first Earth fly-by.", - Link = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2015/08/approaching_perihelion_animation/15556093-1-eng-GB/Approaching_perihelion_Animation_pillars.gif" + Image = "https://data.openspaceproject.com/missions/rosetta/Moonrise_above_the_Pacific_22_06_UTC_4_March_2005_pillars.jpg", + Description = "The Moon rising above the Pacific, three minutes before the point of closest approach during Rosettas first Earth fly-by." }, { Name = "Mars gravity assist", Date = "2007 FEB 25 00:00:00", Description = "The Rosetta swing-by of Mars is the second of four gravity assists needed to place Rosetta on course for its final destination: comet 67P/Churyumov-Gerasimenko. The closest approach of the swing-by will take place at 01:54 UT, when the spacecraft will pass 250 km above the surface of Mars.", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2007/02/image_of_mars_seen_by_osiris/10287257-2-eng-GB/Image_of_Mars_seen_by_OSIRIS_pillars.jpg", + Image = "https://data.openspaceproject.com/missions/rosetta/Image_of_Mars_seen_by_OSIRIS_pillars.jpg", Link = "https://sci.esa.int/web/rosetta/-/40697-rosetta-mars-swing-by" }, { @@ -33,7 +32,7 @@ local Mission = { { Name = "Asteroid Steins flyby", Date = "2008 SEP 05 00:00:00", - Image = "https://cdn.sci.esa.int/documents/34878/35534/1567217294466-Steins-FlyBy-Mosaic_625.jpg", + Image = "https://data.openspaceproject.com/missions/rosetta/1567217294466-Steins-FlyBy-Mosaic_625.jpg", Description = "Images of asteroid 2867-Steins taken by the OSIRIS Wide Angle Camera during the fly-by of 5 September 2008. The effective diameter of the asteroid is 5 km, approximately as predicted. At the top of the asteroid, a large crater, approximately 2 km in size, can be seen." }, { @@ -43,7 +42,7 @@ local Mission = { { Name = "Asteroid Lutetia flyby", Date = "2010 NOV 10 00:00:00", - Image = "https://cdn.sci.esa.int/documents/34878/35534/1567216468815-4_closest_approach-0_625.jpg", + Image = "https://data.openspaceproject.com/missions/rosetta/1567216468815-4_closest_approach-0_625.jpg", Description = "Together with 2867-Steins, 21-Lutetia is one of the two target asteroids that Rosetta will study during its long trek to comet 67P-Churyumov-Gersimenko." }, { @@ -53,7 +52,7 @@ local Mission = { { Name = "Arrive at comet", Date = "2014 AUG 06 00:00:00", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2014/08/navcam_animation_6_august/14705553-1-eng-GB/NavCam_animation_6_August_pillars.gif", + Image = "https://data.openspaceproject.com/missions/rosetta/NavCam_animation_6_August_pillars.gif", Description = "After ten years, five months and four days travelling towards our destination, looping around the Sun five times and clocking up 6.4 billion kilometres, we are delighted to announce finally we are here, exclaimed Jean-Jacques Dordain, ESA's Director General." }, { @@ -64,14 +63,14 @@ local Mission = { { Name = "Philae lander delivery", Date = "2014 NOV 12 00:00:00", - Image = "https://cdn.sci.esa.int/documents/34878/35534/1567216603810-ESA_Rosetta_OSIRIS_NAC_Farewell_Philae_625.jpg", + Image = "https://data.openspaceproject.com/missions/rosetta/1567216603810-ESA_Rosetta_OSIRIS_NAC_Farewell_Philae_625.jpg", Description = "Rosetta's OSIRIS narrow-angle camera captured this parting shot of the Philae lander after separation." }, { Name = "Closest approach to Sun (Perihelion)", Date = "2015 AUG 13 00:00:00", Description = "Perihelion is the closest point a Solar System object gets to the Sun along its orbit (aphelion is the term given to the most distant point).", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2015/03/comet_s_orbit/15317969-1-eng-GB/Comet_s_orbit_pillars.jpg" + Image = "https://data.openspaceproject.com/missions/rosetta/Comet_s_orbit_pillars.jpg" }, { Name = "Mission end", @@ -100,8 +99,7 @@ local Mission = { }, { Name = "Mission", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2015/08/approaching_perihelion_animation/15556093-1-eng-GB/Approaching_perihelion_Animation_pillars.gif", - Link = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2015/08/approaching_perihelion_animation/15556093-1-eng-GB/Approaching_perihelion_Animation_pillars.gif", + Image = "https://data.openspaceproject.com/missions/rosetta/Approaching_perihelion_Animation_pillars.gif", Description = "At 10:00 CET the spacecraft woke up and started post-hibernation procedures, including communications with ESA and NASA.", TimeRange = { Start = "2014 JAN 20 10:00:00", End = "2016 SEP 30 00:00:00" } } diff --git a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset index cd03949867..39b620ccd2 100644 --- a/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset +++ b/data/assets/scene/solarsystem/missions/rosetta/rosetta.asset @@ -94,6 +94,7 @@ local PhilaePosition = { GUI = { Name = "Philae Position", Path = "/Solar System/Missions/Rosetta", + Focusable = false, Hidden = true } } @@ -126,7 +127,8 @@ local Philae = { }, GUI = { Name = "Philae", - Path = "/Solar System/Missions/Rosetta" + Path = "/Solar System/Missions/Rosetta", + Focusable = false } } @@ -134,7 +136,8 @@ local NavCam = { Identifier = "NAVCAM", Parent = RosettaPosition.Identifier, GUI = { - Path = "/Solar System/Missions/Rosetta/Instruments" + Path = "/Solar System/Missions/Rosetta/Instruments", + Focusable = false } } @@ -158,7 +161,8 @@ local NavCamFov = { }, GUI = { Name = "NAVCAM FOV", - Path = "/Solar System/Missions/Rosetta/Instruments" + Path = "/Solar System/Missions/Rosetta/Instruments", + Focusable = false } } @@ -197,7 +201,8 @@ local RosettaCometTrail = { }, GUI = { Name = "Rosetta Comet Trail", - Path = "/Solar System/Missions/Rosetta" + Path = "/Solar System/Missions/Rosetta", + Focusable = false } } @@ -218,7 +223,8 @@ local PhilaeTrail = { }, GUI = { Name = "Philae Trail", - Path = "/Solar System/Missions/Rosetta" + Path = "/Solar System/Missions/Rosetta", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/voyager/horizons.asset b/data/assets/scene/solarsystem/missions/voyager/horizons.asset index 0dc7160ea8..b02031f419 100644 --- a/data/assets/scene/solarsystem/missions/voyager/horizons.asset +++ b/data/assets/scene/solarsystem/missions/voyager/horizons.asset @@ -32,6 +32,7 @@ local Voyager1 = { GUI = { Name = "Voyager 1 Trail (Horizons)", Path = "/Solar System/Missions/Voyager", + Focusable = false, Description = [[Voyager 1 Trail, spanning from September 6th, 1977 to January 1st, 2030. Data from JPL Horizons]] } @@ -61,6 +62,7 @@ local Voyager2 = { GUI = { Name = "Voyager 2 Trail (Horizons)", Path = "/Solar System/Missions/Voyager", + Focusable = false, Description = [[Voyager 2 Trail, spanning from August 21st, 1977 to January 1st, 2030. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/missions/voyager/mission.asset b/data/assets/scene/solarsystem/missions/voyager/mission.asset index 23b712834d..c28a4501aa 100644 --- a/data/assets/scene/solarsystem/missions/voyager/mission.asset +++ b/data/assets/scene/solarsystem/missions/voyager/mission.asset @@ -7,42 +7,42 @@ local Mission = { Identifier = "Voyager", Name = "Voyager", - Image = "https://upload.wikimedia.org/wikipedia/commons/8/87/Voyager_-_mission_logo.png", + Image = "https://data.openspaceproject.com/missions/voyager/Voyager_-_mission_logo.png", Description = "The twin Voyager 1 and 2 spacecraft are exploring where nothing from Earth has flown before. Continuing on their more-than-40-year journey since their 1977 launches, they each are much farther away from Earth and the sun than Pluto. In August 2012, Voyager 1 made the historic entry into interstellar space, the region between stars, filled with material ejected by the death of nearby stars millions of years ago. Voyager 2 entered interstellar space on November 5, 2018 and scientists hope to learn more about this region. Both spacecraft are still sending scientific information about their surroundings through the Deep Space Network, or DSN. The primary mission was the exploration of Jupiter and Saturn. After making a string of discoveries there — such as active volcanoes on Jupiter's moon Io and intricacies of Saturn's rings — the mission was extended. Voyager 2 went on to explore Uranus and Neptune, and is still the only spacecraft to have visited those outer planets. The adventurers' current mission, the Voyager Interstellar Mission (VIM), will explore the outermost edge of the Sun's domain. And beyond.", Milestones = { { Name = "Voyager 1 Jupiter Encounter", Date = "1979 MAR 05 00:00:00", Description = "Voyager 1 discovered a thin ring around Jupiter and two new Jovian moons: Thebe and Metis.", - Image = "https://voyager.jpl.nasa.gov/assets/images/galleries/approaches/jupiter2.gif" + Image = "https://data.openspaceproject.com/missions/voyager/jupiter2.gif" }, { Name = "Voyager 2 Jupiter Encounter", Date = "1979 JUL 09 00:00:00", Description = "During the Jupiter leg of its journey, Voyager 2 explored the giant planet, its magnetosphere and moons in greater detail than had the Pioneer spacecraft that preceded it. Voyager 2 also used it as a springboard to Saturn, using the gravity-assist technique. Voyager 2 succeeded on all counts. It returned spectacular photos of the entire Jovian system, and time-lapse movies made from its images of Jupiter showed how the planet had changed since Voyager 1's visit. Its images of Io revealed changes in the moon's surface and the persistence of its volcanic eruptions. The spacecraft resolved the streaks Voyager 1 had shown on Europa into a collection of cracks in a thick and remarkably smooth icy crust. It also discovered a 14th moon and revealed a third component to the planet's rings.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width/public/thumbnails/image/voyager_2_jupiter_full_planet_incl_great_red_spot.jpg?itok=lSyZCyab" + Image = "https://data.openspaceproject.com/missions/voyager/voyager_2_jupiter_full_planet_incl_great_red_spot.png" }, { Name = "Voyager 1 Saturn Encounter", Date = "1980 NOV 09 00:00:00", - Image = "https://voyager.jpl.nasa.gov/assets/images/galleries/images-voyager-took/saturn/1bg.jpg" + Image = "https://data.openspaceproject.com/missions/voyager/1bg.jpg" }, { Name = "Voyager 2 Saturn Encounter", Date = "1981 AUG 25 00:00:00", Description = "Voyager 2 was to become the third spacecraft to visit Saturn. It gave us another close-range look at Saturn and its moons. Using its photopolarimeter, an instrument that had failed on Voyager 1, Voyager 2 was able to observe the planet's rings at much higher resolution and to discover many more ringlets. It also provided more detailed images of the ring spokes and kinks, and of the F-ring and its shepherding moons. Finally, it employed a gravity-assist maneuver at Saturn to help it reach its next destination, Uranus.", - Image = "https://voyager.jpl.nasa.gov/assets/images/galleries/images-voyager-took/saturn/saturn.gif" + Image = "https://data.openspaceproject.com/missions/voyager/saturn.gif" }, { Name = "Voyager 2 Uranus Encounter", Date = "1986 JAN 24 00:00:00", - Image = "https://solarsystem.nasa.gov/internal_resources/445/", + Image = "https://data.openspaceproject.com/missions/voyager/PIA00346_modest.jpg", Description = "Following its flybys of Jupiter and Saturn, Voyager 2 became the first spacecraft to visit Uranus. Voyager 2 remains the only spacecraft to have flown by Uranus. The planet appeared to have few features but Voyager 2 found evidence of an ocean of boiling water about 500 miles (800 kilometers) below its cloud tops. Curiously, the average temperature of its Sun-facing pole was found to be the same as that at the equator. Voyager 2 discovered 10 new moons, two new rings, and a strangely tilted magnetic field stronger than that of Saturn. A gravity assist at Uranus propelled the spacecraft toward its next destination, Neptune." }, { Name = "Voyager 2 Neptune Encounter", Date = "1989 AUG 25 00:00:00", - Image = "https://solarsystem.nasa.gov/internal_resources/444/", + Image = "https://data.openspaceproject.com/missions/voyager/PIA01492_modest.jpg", Description = "Voyager 2 is the only human-made object to have flown by Neptune. In the closest approach of its entire tour, the spacecraft passed less than 3,100 miles (5,000 kilometers) above the planet's cloud tops. It discovered five moons, four rings, and a 'Great Dark Spot' that vanished by the time the Hubble Space Telescope imaged Neptune five years later. Neptune's largest moon, Triton, was found to be the coldest known planetary body in the solar system, with a nitrogen ice 'volcano' on its surface." }, { @@ -69,12 +69,12 @@ local Mission = { Name = "Launches", TimeRange = { Start = "1977 AUG 20 00:00:00", End = "1977 SEP 05 00:00:00" }, Description = "Both the Voyager spacecrafts carries a gold plated record that contains information about their home planet, including recordings of terrestrial sounds, music and greetings in 55 languages. Instructions on how to play the record are also included.", - Image = "https://www.nasa.gov/sites/default/files/styles/full_width/public/thumbnails/image/voyager_golden_record_0.jpg?itok=ujFbQDyF", + Image = "https://data.openspaceproject.com/missions/voyager/voyager_golden_record_0.jpg", Phases = { { Name = "Voyager 2 Launch", TimeRange = { Start = "1977 AUG 20 00:00:00", End = "1977 AUG 20 00:00:00" }, - Image = "https://solarsystem.nasa.gov/internal_resources/446/" + Image = "https://data.openspaceproject.com/missions/voyager/image_1_pia01480.jpg" }, { Name = "Voyager 1 Launch", diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset index c328d4a974..f101d17ec2 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager1.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager1.asset @@ -99,7 +99,8 @@ local VoyagerTrailCruiseEarthJupiter = { Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Earth-Jupiter", - Path = "/Solar System/Missions/Voyager 1" + Path = "/Solar System/Missions/Voyager 1", + Focusable = false } } @@ -124,7 +125,8 @@ local VoyagerTrailEncounterJupiter = { Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Encounter Jupiter", - Path = "/Solar System/Missions/Voyager 1" + Path = "/Solar System/Missions/Voyager 1", + Focusable = false } } @@ -147,7 +149,8 @@ local VoyagerTrailCruiseJupiterSaturn = { Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Jupiter-Saturn", - Path = "/Solar System/Missions/Voyager 1" + Path = "/Solar System/Missions/Voyager 1", + Focusable = false } } @@ -172,7 +175,8 @@ local VoyagerTrailEncounterSaturn = { Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Encounter Saturn", - Path = "/Solar System/Missions/Voyager 1" + Path = "/Solar System/Missions/Voyager 1", + Focusable = false } } @@ -195,7 +199,8 @@ local VoyagerTrailCruiseSaturnInf = { Tag = { "voyager1_trail" }, GUI = { Name = "Voyager 1 Trail Cruise Saturn-Inf", - Path = "/Solar System/Missions/Voyager 1" + Path = "/Solar System/Missions/Voyager 1", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset index 178428d12c..a855ff0a0e 100644 --- a/data/assets/scene/solarsystem/missions/voyager/voyager2.asset +++ b/data/assets/scene/solarsystem/missions/voyager/voyager2.asset @@ -102,7 +102,8 @@ local VoyagerTrailCruiseEarthJupiter = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Earth-Jupiter", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -127,7 +128,8 @@ local VoyagerTrailEncounterJupiter = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Jupiter", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -150,7 +152,8 @@ local VoyagerTrailCruiseJupiterSaturn = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Jupiter-Saturn", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -175,7 +178,8 @@ local VoyagerTrailEncounterSaturn = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Saturn", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -198,7 +202,8 @@ local VoyagerTrailCruiseSaturnUranus = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Saturn-Uranus", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -223,7 +228,8 @@ local VoyagerTrailEncounterUranus = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Uranus", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -246,7 +252,8 @@ local VoyagerTrailCruiseUranusNeptune = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Uranus-Neptune", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -271,7 +278,8 @@ local VoyagerTrailEncounterNeptune = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Encounter Neptune", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } @@ -294,7 +302,8 @@ local VoyagerTrailCruiseNeptuneInf = { Tag = { "voyager2_trail" }, GUI = { Name = "Voyager 2 Trail Cruise Neptune-Inf", - Path = "/Solar System/Missions/Voyager 2" + Path = "/Solar System/Missions/Voyager 2", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/atmosphere.asset b/data/assets/scene/solarsystem/planets/earth/atmosphere.asset index b112638123..377abbe9e7 100644 --- a/data/assets/scene/solarsystem/planets/earth/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/earth/atmosphere.asset @@ -82,7 +82,8 @@ local Atmosphere = { GUI = { Name = "Earth Atmosphere", Path = "/Solar System/Planets/Earth", - Description = "Atmosphere of Earth" + Description = "Atmosphere of Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/earth.asset b/data/assets/scene/solarsystem/planets/earth/earth.asset index e8917f7928..4f133bde6f 100644 --- a/data/assets/scene/solarsystem/planets/earth/earth.asset +++ b/data/assets/scene/solarsystem/planets/earth/earth.asset @@ -70,7 +70,8 @@ local EarthLabel = { GUI = { Name = "Earth Label", Path = "/Solar System/Planets/Earth", - Description = "Main label for Earth" + Description = "Main label for Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset b/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset index 6543fcc589..9d5cf3a6a4 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipse_shadow.asset @@ -20,7 +20,8 @@ local EarthMoonShadow = { }, GUI = { Name = "Earth/Moon Shadow", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset b/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset index a94559e606..ea7061782a 100644 --- a/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset +++ b/data/assets/scene/solarsystem/planets/earth/eclipses/timeline.asset @@ -11,2262 +11,2262 @@ local Timeline = { { Name = "Total Eclipse", Date = "1901 May 18 05:33:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1901-05-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1901-05-18.gif" }, { Name = "Annular Eclipse", Date = "1901 Nov 11 07:28:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1901-11-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1901-11-11.gif" }, { Name = "Partial Eclipse", Date = "1902 Apr 08 14:05:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1902-04-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1902-04-08.gif" }, { Name = "Partial Eclipse", Date = "1902 May 07 22:34:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1902-05-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1902-05-07.gif" }, { Name = "Partial Eclipse", Date = "1902 Oct 31 08:00:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1902-10-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1902-10-31.gif" }, { Name = "Annular Eclipse", Date = "1903 Mar 29 01:35:2", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1903-03-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1903-03-29.gif" }, { Name = "Total Eclipse", Date = "1903 Sep 21 04:39:52", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1903-09-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1903-09-21.gif" }, { Name = "Annular Eclipse", Date = "1904 Mar 17 05:40:44", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1904-03-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1904-03-17.gif" }, { Name = "Total Eclipse", Date = "1904 Sep 09 20:44:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1904-09-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1904-09-09.gif" }, { Name = "Annular Eclipse", Date = "1905 Mar 06 05:12:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1905-03-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1905-03-06.gif" }, { Name = "Total Eclipse", Date = "1905 Aug 30 13:07:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1905-08-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1905-08-30.gif" }, { Name = "Partial Eclipse", Date = "1906 Feb 23 07:43:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1906-02-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1906-02-23.gif" }, { Name = "Partial Eclipse", Date = "1906 Jul 21 13:14:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1906-07-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1906-07-21.gif" }, { Name = "Partial Eclipse", Date = "1906 Aug 20 01:12:50", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1906-08-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1906-08-20.gif" }, { Name = "Total Eclipse", Date = "1907 Jan 14 06:05:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1907-01-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1907-01-14.gif" }, { Name = "Annular Eclipse", Date = "1907 Jul 10 15:24:32", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1907-07-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1907-07-10.gif" }, { Name = "Total Eclipse", Date = "1908 Jan 03 21:45:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1908-01-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1908-01-03.gif" }, { Name = "Annular Eclipse", Date = "1908 Jun 28 16:29:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1908-06-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1908-06-28.gif" }, { Name = "Hybrid Eclipse", Date = "1908 Dec 23 11:44:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1908-12-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1908-12-23.gif" }, { Name = "Hybrid Eclipse", Date = "1909 Jun 17 23:18:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1909-06-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1909-06-17.gif" }, { Name = "Partial Eclipse", Date = "1909 Dec 12 19:44:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1909-12-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1909-12-12.gif" }, { Name = "Total Eclipse", Date = "1910 May 09 05:42:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1910-05-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1910-05-09.gif" }, { Name = "Partial Eclipse", Date = "1910 Nov 02 02:08:32", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1910-11-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1910-11-02.gif" }, { Name = "Total Eclipse", Date = "1911 Apr 28 22:27:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1911-04-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1911-04-28.gif" }, { Name = "Annular Eclipse", Date = "1911 Oct 22 04:13:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1911-10-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1911-10-22.gif" }, { Name = "Hybrid Eclipse", Date = "1912 Apr 17 11:34:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1912-04-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1912-04-17.gif" }, { Name = "Total Eclipse", Date = "1912 Oct 10 13:36:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1912-10-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1912-10-10.gif" }, { Name = "Partial Eclipse", Date = "1913 Apr 06 17:33:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1913-04-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1913-04-06.gif" }, { Name = "Partial Eclipse", Date = "1913 Aug 31 20:52:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1913-08-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1913-08-31.gif" }, { Name = "Partial Eclipse", Date = "1913 Sep 30 04:45:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1913-09-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1913-09-30.gif" }, { Name = "Annular Eclipse", Date = "1914 Feb 25 00:13:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1914-02-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1914-02-25.gif" }, { Name = "Total Eclipse", Date = "1914 Aug 21 12:34:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1914-08-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1914-08-21.gif" }, { Name = "Annular Eclipse", Date = "1915 Feb 14 04:33:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1915-02-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1915-02-14.gif" }, { Name = "Annular Eclipse", Date = "1915 Aug 10 22:52:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1915-08-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1915-08-10.gif" }, { Name = "Total Eclipse", Date = "1916 Feb 03 16:00:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1916-02-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1916-02-03.gif" }, { Name = "Annular Eclipse", Date = "1916 Jul 30 02:06:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1916-07-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1916-07-30.gif" }, { Name = "Partial Eclipse", Date = "1916 Dec 24 20:46:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1916-12-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1916-12-24.gif" }, { Name = "Partial Eclipse", Date = "1917 Jan 23 07:28:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1917-01-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1917-01-23.gif" }, { Name = "Partial Eclipse", Date = "1917 Jun 19 13:16:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1917-06-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1917-06-19.gif" }, { Name = "Partial Eclipse", Date = "1917 Jul 19 02:42:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1917-07-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1917-07-19.gif" }, { Name = "Annular Eclipse", Date = "1917 Dec 14 09:27:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1917-12-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1917-12-14.gif" }, { Name = "Total Eclipse", Date = "1918 Jun 08 22:07:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1918-06-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1918-06-08.gif" }, { Name = "Annular Eclipse", Date = "1918 Dec 03 15:22:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1918-12-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1918-12-03.gif" }, { Name = "Total Eclipse", Date = "1919 May 29 13:08:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1919-05-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1919-05-29.gif" }, { Name = "Annular Eclipse", Date = "1919 Nov 22 15:14:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1919-11-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1919-11-22.gif" }, { Name = "Partial Eclipse", Date = "1920 May 18 06:14:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1920-05-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1920-05-18.gif" }, { Name = "Partial Eclipse", Date = "1920 Nov 10 15:52:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1920-11-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1920-11-10.gif" }, { Name = "Annular Eclipse", Date = "1921 Apr 08 09:15:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1921-04-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1921-04-08.gif" }, { Name = "Total Eclipse", Date = "1921 Oct 01 12:35:58", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1921-10-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1921-10-01.gif" }, { Name = "Annular Eclipse", Date = "1922 Mar 28 13:05:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1922-03-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1922-03-28.gif" }, { Name = "Total Eclipse", Date = "1922 Sep 21 04:40:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1922-09-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1922-09-21.gif" }, { Name = "Annular Eclipse", Date = "1923 Mar 17 12:44:58", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1923-03-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1923-03-17.gif" }, { Name = "Total Eclipse", Date = "1923 Sep 10 20:47:29", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1923-09-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1923-09-10.gif" }, { Name = "Partial Eclipse", Date = "1924 Mar 05 15:44:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1924-03-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1924-03-05.gif" }, { Name = "Partial Eclipse", Date = "1924 Jul 31 19:58:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1924-07-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1924-07-31.gif" }, { Name = "Partial Eclipse", Date = "1924 Aug 30 08:23:00", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1924-08-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1924-08-30.gif" }, { Name = "Total Eclipse", Date = "1925 Jan 24 14:54:03", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1925-01-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1925-01-24.gif" }, { Name = "Annular Eclipse", Date = "1925 Jul 20 21:48:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1925-07-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1925-07-20.gif" }, { Name = "Total Eclipse", Date = "1926 Jan 14 06:36:58", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1926-01-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1926-01-14.gif" }, { Name = "Annular Eclipse", Date = "1926 Jul 09 23:06:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1926-07-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1926-07-09.gif" }, { Name = "Annular Eclipse", Date = "1927 Jan 03 20:22:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1927-01-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1927-01-03.gif" }, { Name = "Total Eclipse", Date = "1927 Jun 29 06:23:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1927-06-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1927-06-29.gif" }, { Name = "Partial Eclipse", Date = "1927 Dec 24 03:59:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1927-12-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1927-12-24.gif" }, { Name = "Total Eclipse", Date = "1928 May 19 13:24:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1928-05-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1928-05-19.gif" }, { Name = "Partial Eclipse", Date = "1928 Jun 17 20:27:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1928-06-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1928-06-17.gif" }, { Name = "Partial Eclipse", Date = "1928 Nov 12 09:48:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1928-11-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1928-11-12.gif" }, { Name = "Total Eclipse", Date = "1929 May 09 06:10:34", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1929-05-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1929-05-09.gif" }, { Name = "Annular Eclipse", Date = "1929 Nov 01 12:05:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1929-11-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1929-11-01.gif" }, { Name = "Hybrid Eclipse", Date = "1930 Apr 28 19:03:34", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1930-04-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1930-04-28.gif" }, { Name = "Total Eclipse", Date = "1930 Oct 21 21:43:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1930-10-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1930-10-21.gif" }, { Name = "Partial Eclipse", Date = "1931 Apr 18 00:45:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1931-04-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1931-04-18.gif" }, { Name = "Partial Eclipse", Date = "1931 Sep 12 04:41:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1931-09-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1931-09-12.gif" }, { Name = "Partial Eclipse", Date = "1931 Oct 11 12:55:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1931-10-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1931-10-11.gif" }, { Name = "Annular Eclipse", Date = "1932 Mar 07 07:55:50", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1932-03-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1932-03-07.gif" }, { Name = "Total Eclipse", Date = "1932 Aug 31 20:03:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1932-08-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1932-08-31.gif" }, { Name = "Annular Eclipse", Date = "1933 Feb 24 12:46:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1933-02-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1933-02-24.gif" }, { Name = "Annular Eclipse", Date = "1933 Aug 21 05:49:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1933-08-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1933-08-21.gif" }, { Name = "Total Eclipse", Date = "1934 Feb 14 00:38:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1934-02-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1934-02-14.gif" }, { Name = "Annular Eclipse", Date = "1934 Aug 10 08:37:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1934-08-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1934-08-10.gif" }, { Name = "Partial Eclipse", Date = "1935 Jan 05 05:35:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1935-01-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1935-01-05.gif" }, { Name = "Partial Eclipse", Date = "1935 Feb 03 16:16:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1935-02-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1935-02-03.gif" }, { Name = "Partial Eclipse", Date = "1935 Jun 30 19:59:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1935-06-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1935-06-30.gif" }, { Name = "Partial Eclipse", Date = "1935 Jul 30 09:16:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1935-07-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1935-07-30.gif" }, { Name = "Annular Eclipse", Date = "1935 Dec 25 17:59:52", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1935-12-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1935-12-25.gif" }, { Name = "Total Eclipse", Date = "1936 Jun 19 05:20:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1936-06-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1936-06-19.gif" }, { Name = "Annular Eclipse", Date = "1936 Dec 13 23:28:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1936-12-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1936-12-13.gif" }, { Name = "Total Eclipse", Date = "1937 Jun 08 20:41:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1937-06-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1937-06-08.gif" }, { Name = "Annular Eclipse", Date = "1937 Dec 02 23:05:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1937-12-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1937-12-02.gif" }, { Name = "Total Eclipse", Date = "1938 May 29 13:50:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1938-05-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1938-05-29.gif" }, { Name = "Partial Eclipse", Date = "1938 Nov 21 23:52:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1938-11-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1938-11-21.gif" }, { Name = "Annular Eclipse", Date = "1939 Apr 19 16:45:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1939-04-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1939-04-19.gif" }, { Name = "Total Eclipse", Date = "1939 Oct 12 20:40:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1939-10-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1939-10-12.gif" }, { Name = "Annular Eclipse", Date = "1940 Apr 07 20:21:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1940-04-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1940-04-07.gif" }, { Name = "Total Eclipse", Date = "1940 Oct 01 12:44:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1940-10-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1940-10-01.gif" }, { Name = "Annular Eclipse", Date = "1941 Mar 27 20:08:08", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1941-03-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1941-03-27.gif" }, { Name = "Total Eclipse", Date = "1941 Sep 21 04:34:03", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1941-09-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1941-09-21.gif" }, { Name = "Partial Eclipse", Date = "1942 Mar 16 23:37:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1942-03-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1942-03-16.gif" }, { Name = "Partial Eclipse", Date = "1942 Aug 12 02:45:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1942-08-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1942-08-12.gif" }, { Name = "Partial Eclipse", Date = "1942 Sep 10 15:39:32", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1942-09-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1942-09-10.gif" }, { Name = "Total Eclipse", Date = "1943 Feb 04 23:38:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1943-02-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1943-02-04.gif" }, { Name = "Annular Eclipse", Date = "1943 Aug 01 04:16:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1943-08-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1943-08-01.gif" }, { Name = "Total Eclipse", Date = "1944 Jan 25 15:26:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1944-01-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1944-01-25.gif" }, { Name = "Annular Eclipse", Date = "1944 Jul 20 05:43:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1944-07-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1944-07-20.gif" }, { Name = "Annular Eclipse", Date = "1945 Jan 14 05:01:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1945-01-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1945-01-14.gif" }, { Name = "Total Eclipse", Date = "1945 Jul 09 13:27:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1945-07-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1945-07-09.gif" }, { Name = "Partial Eclipse", Date = "1946 Jan 03 12:16:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1946-01-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1946-01-03.gif" }, { Name = "Partial Eclipse", Date = "1946 May 30 21:00:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1946-05-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1946-05-30.gif" }, { Name = "Partial Eclipse", Date = "1946 Jun 29 03:51:58", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1946-06-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1946-06-29.gif" }, { Name = "Partial Eclipse", Date = "1946 Nov 23 17:37:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1946-11-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1946-11-23.gif" }, { Name = "Total Eclipse", Date = "1947 May 20 13:47:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1947-05-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1947-05-20.gif" }, { Name = "Annular Eclipse", Date = "1947 Nov 12 20:05:37", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1947-11-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1947-11-12.gif" }, { Name = "Annular Eclipse", Date = "1948 May 09 02:26:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1948-05-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1948-05-09.gif" }, { Name = "Total Eclipse", Date = "1948 Nov 01 05:59:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1948-11-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1948-11-01.gif" }, { Name = "Partial Eclipse", Date = "1949 Apr 28 07:48:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1949-04-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1949-04-28.gif" }, { Name = "Partial Eclipse", Date = "1949 Oct 21 21:13:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1949-10-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1949-10-21.gif" }, { Name = "Annular Eclipse", Date = "1950 Mar 18 15:32:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1950-03-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1950-03-18.gif" }, { Name = "Total Eclipse", Date = "1950 Sep 12 03:38:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1950-09-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1950-09-12.gif" }, { Name = "Annular Eclipse", Date = "1951 Mar 07 20:53:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1951-03-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1951-03-07.gif" }, { Name = "Annular Eclipse", Date = "1951 Sep 01 12:51:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1951-09-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1951-09-01.gif" }, { Name = "Total Eclipse", Date = "1952 Feb 25 09:11:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1952-02-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1952-02-25.gif" }, { Name = "Annular Eclipse", Date = "1952 Aug 20 15:13:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1952-08-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1952-08-20.gif" }, { Name = "Partial Eclipse", Date = "1953 Feb 14 00:59:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1953-02-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1953-02-14.gif" }, { Name = "Partial Eclipse", Date = "1953 Jul 11 02:44:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1953-07-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1953-07-11.gif" }, { Name = "Partial Eclipse", Date = "1953 Aug 09 15:55:03", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1953-08-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1953-08-09.gif" }, { Name = "Annular Eclipse", Date = "1954 Jan 05 02:32:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1954-01-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1954-01-05.gif" }, { Name = "Total Eclipse", Date = "1954 Jun 30 12:32:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1954-06-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1954-06-30.gif" }, { Name = "Annular Eclipse", Date = "1954 Dec 25 07:36:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1954-12-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1954-12-25.gif" }, { Name = "Total Eclipse", Date = "1955 Jun 20 04:10:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1955-06-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1955-06-20.gif" }, { Name = "Annular Eclipse", Date = "1955 Dec 14 07:02:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1955-12-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1955-12-14.gif" }, { Name = "Total Eclipse", Date = "1956 Jun 08 21:20:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1956-06-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1956-06-08.gif" }, { Name = "Partial Eclipse", Date = "1956 Dec 02 08:00:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1956-12-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1956-12-02.gif" }, { Name = "Annular Eclipse", Date = "1957 Apr 30 00:05:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1957-04-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1957-04-30.gif" }, { Name = "Total Eclipse", Date = "1957 Oct 23 04:54:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1957-10-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1957-10-23.gif" }, { Name = "Annular Eclipse", Date = "1958 Apr 19 03:27:17", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1958-04-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1958-04-19.gif" }, { Name = "Total Eclipse", Date = "1958 Oct 12 20:55:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1958-10-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1958-10-12.gif" }, { Name = "Annular Eclipse", Date = "1959 Apr 08 03:24:08", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1959-04-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1959-04-08.gif" }, { Name = "Total Eclipse", Date = "1959 Oct 02 12:27:00", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1959-10-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1959-10-02.gif" }, { Name = "Partial Eclipse", Date = "1960 Mar 27 07:25:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1960-03-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1960-03-27.gif" }, { Name = "Partial Eclipse", Date = "1960 Sep 20 22:59:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1960-09-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1960-09-20.gif" }, { Name = "Total Eclipse", Date = "1961 Feb 15 08:19:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1961-02-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1961-02-15.gif" }, { Name = "Annular Eclipse", Date = "1961 Aug 11 10:46:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1961-08-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1961-08-11.gif" }, { Name = "Total Eclipse", Date = "1962 Feb 05 00:12:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1962-02-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1962-02-05.gif" }, { Name = "Annular Eclipse", Date = "1962 Jul 31 12:25:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1962-07-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1962-07-31.gif" }, { Name = "Annular Eclipse", Date = "1963 Jan 25 13:37:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1963-01-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1963-01-25.gif" }, { Name = "Total Eclipse", Date = "1963 Jul 20 20:36:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1963-07-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1963-07-20.gif" }, { Name = "Partial Eclipse", Date = "1964 Jan 14 20:30:08", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1964-01-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1964-01-14.gif" }, { Name = "Partial Eclipse", Date = "1964 Jun 10 04:34:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1964-06-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1964-06-10.gif" }, { Name = "Partial Eclipse", Date = "1964 Jul 09 11:17:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1964-07-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1964-07-09.gif" }, { Name = "Partial Eclipse", Date = "1964 Dec 04 01:31:54", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1964-12-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1964-12-04.gif" }, { Name = "Total Eclipse", Date = "1965 May 30 21:17:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1965-05-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1965-05-30.gif" }, { Name = "Annular Eclipse", Date = "1965 Nov 23 04:14:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1965-11-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1965-11-23.gif" }, { Name = "Annular Eclipse", Date = "1966 May 20 09:39:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1966-05-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1966-05-20.gif" }, { Name = "Total Eclipse", Date = "1966 Nov 12 14:23:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1966-11-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1966-11-12.gif" }, { Name = "Partial Eclipse", Date = "1967 May 09 14:42:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1967-05-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1967-05-09.gif" }, { Name = "Total Eclipse", Date = "1967 Nov 02 05:38:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1967-11-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1967-11-02.gif" }, { Name = "Partial Eclipse", Date = "1968 Mar 28 23:00:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1968-03-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1968-03-28.gif" }, { Name = "Total Eclipse", Date = "1968 Sep 22 11:18:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1968-09-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1968-09-22.gif" }, { Name = "Annular Eclipse", Date = "1969 Mar 18 04:54:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1969-03-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1969-03-18.gif" }, { Name = "Annular Eclipse", Date = "1969 Sep 11 19:58:59", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1969-09-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1969-09-11.gif" }, { Name = "Total Eclipse", Date = "1970 Mar 07 17:38:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1970-03-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1970-03-07.gif" }, { Name = "Annular Eclipse", Date = "1970 Aug 31 21:55:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1970-08-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1970-08-31.gif" }, { Name = "Partial Eclipse", Date = "1971 Feb 25 09:38:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1971-02-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1971-02-25.gif" }, { Name = "Partial Eclipse", Date = "1971 Jul 22 09:31:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1971-07-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1971-07-22.gif" }, { Name = "Partial Eclipse", Date = "1971 Aug 20 22:39:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1971-08-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1971-08-20.gif" }, { Name = "Annular Eclipse", Date = "1972 Jan 16 11:03:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1972-01-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1972-01-16.gif" }, { Name = "Total Eclipse", Date = "1972 Jul 10 19:46:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1972-07-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1972-07-10.gif" }, { Name = "Annular Eclipse", Date = "1973 Jan 04 15:46:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1973-01-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1973-01-04.gif" }, { Name = "Total Eclipse", Date = "1973 Jun 30 11:38:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1973-06-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1973-06-30.gif" }, { Name = "Annular Eclipse", Date = "1973 Dec 24 15:02:44", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1973-12-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1973-12-24.gif" }, { Name = "Total Eclipse", Date = "1974 Jun 20 04:48:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1974-06-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1974-06-20.gif" }, { Name = "Partial Eclipse", Date = "1974 Dec 13 16:13:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1974-12-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1974-12-13.gif" }, { Name = "Partial Eclipse", Date = "1975 May 11 07:17:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1975-05-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1975-05-11.gif" }, { Name = "Partial Eclipse", Date = "1975 Nov 03 13:15:54", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1975-11-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1975-11-03.gif" }, { Name = "Annular Eclipse", Date = "1976 Apr 29 10:24:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1976-04-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1976-04-29.gif" }, { Name = "Total Eclipse", Date = "1976 Oct 23 05:13:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1976-10-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1976-10-23.gif" }, { Name = "Annular Eclipse", Date = "1977 Apr 18 10:31:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1977-04-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1977-04-18.gif" }, { Name = "Total Eclipse", Date = "1977 Oct 12 20:27:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1977-10-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1977-10-12.gif" }, { Name = "Partial Eclipse", Date = "1978 Apr 07 15:03:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1978-04-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1978-04-07.gif" }, { Name = "Partial Eclipse", Date = "1978 Oct 02 06:28:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1978-10-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1978-10-02.gif" }, { Name = "Total Eclipse", Date = "1979 Feb 26 16:55:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1979-02-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1979-02-26.gif" }, { Name = "Annular Eclipse", Date = "1979 Aug 22 17:22:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1979-08-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1979-08-22.gif" }, { Name = "Total Eclipse", Date = "1980 Feb 16 08:54:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1980-02-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1980-02-16.gif" }, { Name = "Annular Eclipse", Date = "1980 Aug 10 19:12:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1980-08-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1980-08-10.gif" }, { Name = "Annular Eclipse", Date = "1981 Feb 04 22:09:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1981-02-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1981-02-04.gif" }, { Name = "Total Eclipse", Date = "1981 Jul 31 03:46:37", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1981-07-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1981-07-31.gif" }, { Name = "Partial Eclipse", Date = "1982 Jan 25 04:42:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1982-01-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1982-01-25.gif" }, { Name = "Partial Eclipse", Date = "1982 Jun 21 12:04:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1982-06-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1982-06-21.gif" }, { Name = "Partial Eclipse", Date = "1982 Jul 20 18:44:44", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1982-07-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1982-07-20.gif" }, { Name = "Partial Eclipse", Date = "1982 Dec 15 09:32:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1982-12-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1982-12-15.gif" }, { Name = "Total Eclipse", Date = "1983 Jun 11 04:43:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1983-06-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1983-06-11.gif" }, { Name = "Annular Eclipse", Date = "1983 Dec 04 12:31:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1983-12-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1983-12-04.gif" }, { Name = "Annular Eclipse", Date = "1984 May 30 16:45:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1984-05-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1984-05-30.gif" }, { Name = "Total Eclipse", Date = "1984 Nov 22 22:54:17", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1984-11-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1984-11-22.gif" }, { Name = "Partial Eclipse", Date = "1985 May 19 21:29:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1985-05-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1985-05-19.gif" }, { Name = "Total Eclipse", Date = "1985 Nov 12 14:11:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1985-11-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1985-11-12.gif" }, { Name = "Partial Eclipse", Date = "1986 Apr 09 06:21:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1986-04-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1986-04-09.gif" }, { Name = "Hybrid Eclipse", Date = "1986 Oct 03 19:06:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1986-10-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1986-10-03.gif" }, { Name = "Hybrid Eclipse", Date = "1987 Mar 29 12:49:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1987-03-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1987-03-29.gif" }, { Name = "Annular Eclipse", Date = "1987 Sep 23 03:12:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1987-09-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1987-09-23.gif" }, { Name = "Total Eclipse", Date = "1988 Mar 18 01:58:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1988-03-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1988-03-18.gif" }, { Name = "Annular Eclipse", Date = "1988 Sep 11 04:44:29", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1988-09-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1988-09-11.gif" }, { Name = "Partial Eclipse", Date = "1989 Mar 07 18:08:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1989-03-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1989-03-07.gif" }, { Name = "Partial Eclipse", Date = "1989 Aug 31 05:31:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1989-08-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1989-08-31.gif" }, { Name = "Annular Eclipse", Date = "1990 Jan 26 19:31:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1990-01-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1990-01-26.gif" }, { Name = "Total Eclipse", Date = "1990 Jul 22 03:03:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1990-07-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1990-07-22.gif" }, { Name = "Annular Eclipse", Date = "1991 Jan 15 23:53:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1991-01-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1991-01-15.gif" }, { Name = "Total Eclipse", Date = "1991 Jul 11 19:07:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1991-07-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1991-07-11.gif" }, { Name = "Annular Eclipse", Date = "1992 Jan 04 23:05:37", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1992-01-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1992-01-04.gif" }, { Name = "Total Eclipse", Date = "1992 Jun 30 12:11:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1992-06-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1992-06-30.gif" }, { Name = "Partial Eclipse", Date = "1992 Dec 24 00:31:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1992-12-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1992-12-24.gif" }, { Name = "Partial Eclipse", Date = "1993 May 21 14:20:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1993-05-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1993-05-21.gif" }, { Name = "Partial Eclipse", Date = "1993 Nov 13 21:45:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1993-11-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1993-11-13.gif" }, { Name = "Annular Eclipse", Date = "1994 May 10 17:12:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1994-05-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1994-05-10.gif" }, { Name = "Total Eclipse", Date = "1994 Nov 03 13:40:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1994-11-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1994-11-03.gif" }, { Name = "Annular Eclipse", Date = "1995 Apr 29 17:33:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1995-04-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1995-04-29.gif" }, { Name = "Total Eclipse", Date = "1995 Oct 24 04:33:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1995-10-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1995-10-24.gif" }, { Name = "Partial Eclipse", Date = "1996 Apr 17 22:38:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1996-04-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1996-04-17.gif" }, { Name = "Partial Eclipse", Date = "1996 Oct 12 14:03:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1996-10-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1996-10-12.gif" }, { Name = "Total Eclipse", Date = "1997 Mar 09 01:24:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1997-03-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1997-03-09.gif" }, { Name = "Partial Eclipse", Date = "1997 Sep 02 00:04:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1997-09-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1997-09-02.gif" }, { Name = "Total Eclipse", Date = "1998 Feb 26 17:29:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1998-02-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1998-02-26.gif" }, { Name = "Annular Eclipse", Date = "1998 Aug 22 02:07:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1998-08-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1998-08-22.gif" }, { Name = "Annular Eclipse", Date = "1999 Feb 16 06:34:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1999-02-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1999-02-16.gif" }, { Name = "Total Eclipse", Date = "1999 Aug 11 11:04:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/1999-08-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/1999-08-11.gif" }, { Name = "Partial Eclipse", Date = "2000 Feb 05 12:50:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/2000-02-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2000-02-05.gif" }, { Name = "Partial Eclipse", Date = "2000 Jul 01 19:33:34", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/2000-07-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2000-07-01.gif" }, { Name = "Partial Eclipse", Date = "2000 Jul 31 02:14:08", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/2000-07-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2000-07-31.gif" }, { Name = "Partial Eclipse", Date = "2000 Dec 25 17:35:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/1901-2000/2000-12-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2000-12-25.gif" }, { Name = "Total Eclipse", Date = "2001 Jun 21 12:04:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2001-06-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2001-06-21.gif" }, { Name = "Annular Eclipse", Date = "2001 Dec 14 20:53:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2001-12-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2001-12-14.gif" }, { Name = "Annular Eclipse", Date = "2002 Jun 10 23:45:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2002-06-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2002-06-10.gif" }, { Name = "Total Eclipse", Date = "2002 Dec 04 07:32:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2002-12-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2002-12-04.gif" }, { Name = "Annular Eclipse", Date = "2003 May 31 04:09:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2003-05-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2003-05-31.gif" }, { Name = "Total Eclipse", Date = "2003 Nov 23 22:50:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2003-11-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2003-11-23.gif" }, { Name = "Partial Eclipse", Date = "2004 Apr 19 13:35:05", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2004-04-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2004-04-19.gif" }, { Name = "Partial Eclipse", Date = "2004 Oct 14 03:00:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2004-10-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2004-10-14.gif" }, { Name = "Hybrid Eclipse", Date = "2005 Apr 08 20:36:51", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2005-04-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2005-04-08.gif" }, { Name = "Annular Eclipse", Date = "2005 Oct 03 10:32:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2005-10-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2005-10-03.gif" }, { Name = "Total Eclipse", Date = "2006 Mar 29 10:12:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2006-03-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2006-03-29.gif" }, { Name = "Annular Eclipse", Date = "2006 Sep 22 11:41:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2006-09-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2006-09-22.gif" }, { Name = "Partial Eclipse", Date = "2007 Mar 19 02:32:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2007-03-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2007-03-19.gif" }, { Name = "Partial Eclipse", Date = "2007 Sep 11 12:32:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2007-09-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2007-09-11.gif" }, { Name = "Annular Eclipse", Date = "2008 Feb 07 03:56:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2008-02-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2008-02-07.gif" }, { Name = "Total Eclipse", Date = "2008 Aug 01 10:22:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2008-08-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2008-08-01.gif" }, { Name = "Annular Eclipse", Date = "2009 Jan 26 07:59:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2009-01-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2009-01-26.gif" }, { Name = "Total Eclipse", Date = "2009 Jul 22 02:36:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2009-07-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2009-07-22.gif" }, { Name = "Annular Eclipse", Date = "2010 Jan 15 07:07:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2010-01-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2010-01-15.gif" }, { Name = "Total Eclipse", Date = "2010 Jul 11 19:34:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2010-07-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2010-07-11.gif" }, { Name = "Partial Eclipse", Date = "2011 Jan 04 08:51:4", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2011-01-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2011-01-04.gif" }, { Name = "Partial Eclipse", Date = "2011 Jun 01 21:17:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2011-06-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2011-06-01.gif" }, { Name = "Partial Eclipse", Date = "2011 Jul 01 08:39:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2011-07-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2011-07-01.gif" }, { Name = "Partial Eclipse", Date = "2011 Nov 25 06:21:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2011-11-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2011-11-25.gif" }, { Name = "Annular Eclipse", Date = "2012 May 20 23:53:54", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2012-05-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2012-05-20.gif" }, { Name = "Total Eclipse", Date = "2012 Nov 13 22:12:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2012-11-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2012-11-13.gif" }, { Name = "Annular Eclipse", Date = "2013 May 10 00:26:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2013-05-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2013-05-10.gif" }, { Name = "Hybrid Eclipse", Date = "2013 Nov 03 12:47:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2013-11-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2013-11-03.gif" }, { Name = "Annular Eclipse", Date = "2014 Apr 29 06:04:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2014-04-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2014-04-29.gif" }, { Name = "Partial Eclipse", Date = "2014 Oct 23 21:45:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2014-10-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2014-10-23.gif" }, { Name = "Total Eclipse", Date = "2015 Mar 20 09:46:47", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2015-03-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2015-03-20.gif" }, { Name = "Partial Eclipse", Date = "2015 Sep 13 06:55:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2015-09-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2015-09-13.gif" }, { Name = "Total Eclipse", Date = "2016 Mar 09 01:58:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2016-03-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2016-03-09.gif" }, { Name = "Annular Eclipse", Date = "2016 Sep 01 09:08:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2016-09-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2016-09-01.gif" }, { Name = "Annular Eclipse", Date = "2017 Feb 26 14:54:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2017-02-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2017-02-26.gif" }, { Name = "Total Eclipse", Date = "2017 Aug 21 18:26:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2017-08-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2017-08-21.gif" }, { Name = "Partial Eclipse", Date = "2018 Feb 15 20:52:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2018-02-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2018-02-15.gif" }, { Name = "Partial Eclipse", Date = "2018 Jul 13 03:02:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2018-07-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2018-07-13.gif" }, { Name = "Partial Eclipse", Date = "2018 Aug 11 09:47:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2018-08-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2018-08-11.gif" }, { Name = "Partial Eclipse", Date = "2019 Jan 06 01:42:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2019-01-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2019-01-06.gif" }, { Name = "Total Eclipse", Date = "2019 Jul 02 19:24:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2019-07-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2019-07-02.gif" }, { Name = "Annular Eclipse", Date = "2019 Dec 26 05:18:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2019-12-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2019-12-26.gif" }, { Name = "Annular Eclipse", Date = "2020 Jun 21 06:41:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2020-06-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2020-06-21.gif" }, { Name = "Total Eclipse", Date = "2020 Dec 14 16:14:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2020-12-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2020-12-14.gif" }, { Name = "Annular Eclipse", Date = "2021 Jun 10 10:43:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2021-06-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2021-06-10.gif" }, { Name = "Total Eclipse", Date = "2021 Dec 04 07:34:38", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2021-12-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2021-12-04.gif" }, { Name = "Partial Eclipse", Date = "2022 Apr 30 20:42:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2022-04-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2022-04-30.gif" }, { Name = "Partial Eclipse", Date = "2022 Oct 25 11:01:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2022-10-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2022-10-25.gif" }, { Name = "Hybrid Eclipse", Date = "2023 Apr 20 04:17:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2023-04-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2023-04-20.gif" }, { Name = "Annular Eclipse", Date = "2023 Oct 14 18:00:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2023-10-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2023-10-14.gif" }, { Name = "Total Eclipse", Date = "2024 Apr 08 18:18:29", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2024-04-08.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2024-04-08.gif" }, { Name = "Annular Eclipse", Date = "2024 Oct 02 18:46:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2024-10-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2024-10-02.gif" }, { Name = "Partial Eclipse", Date = "2025 Mar 29 10:48:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2025-03-29.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2025-03-29.gif" }, { Name = "Partial Eclipse", Date = "2025 Sep 21 19:43:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2025-09-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2025-09-21.gif" }, { Name = "Annular Eclipse", Date = "2026 Feb 17 12:13:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2026-02-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2026-02-17.gif" }, { Name = "Total Eclipse", Date = "2026 Aug 12 17:47:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2026-08-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2026-08-12.gif" }, { Name = "Annular Eclipse", Date = "2027 Feb 06 16:00:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2027-02-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2027-02-06.gif" }, { Name = "Total Eclipse", Date = "2027 Aug 02 10:07:50", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2027-08-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2027-08-02.gif" }, { Name = "Annular Eclipse", Date = "2028 Jan 26 15:08:59", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2028-01-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2028-01-26.gif" }, { Name = "Total Eclipse", Date = "2028 Jul 22 02:56:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2028-07-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2028-07-22.gif" }, { Name = "Partial Eclipse", Date = "2029 Jan 14 17:13:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2029-01-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2029-01-14.gif" }, { Name = "Partial Eclipse", Date = "2029 Jun 12 04:06:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2029-06-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2029-06-12.gif" }, { Name = "Partial Eclipse", Date = "2029 Jul 11 15:37:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2029-07-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2029-07-11.gif" }, { Name = "Partial Eclipse", Date = "2029 Dec 05 15:03:58", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2029-12-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2029-12-05.gif" }, { Name = "Annular Eclipse", Date = "2030 Jun 01 06:29:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2030-06-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2030-06-01.gif" }, { Name = "Total Eclipse", Date = "2030 Nov 25 06:51:37", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2030-11-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2030-11-25.gif" }, { Name = "Annular Eclipse", Date = "2031 May 21 07:16:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2031-05-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2031-05-21.gif" }, { Name = "Hybrid Eclipse", Date = "2031 Nov 14 21:07:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2031-11-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2031-11-14.gif" }, { Name = "Annular Eclipse", Date = "2032 May 09 13:26:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2032-05-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2032-05-09.gif" }, { Name = "Partial Eclipse", Date = "2032 Nov 03 05:34:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2032-11-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2032-11-03.gif" }, { Name = "Total Eclipse", Date = "2033 Mar 30 18:02:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2033-03-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2033-03-30.gif" }, { Name = "Partial Eclipse", Date = "2033 Sep 23 13:54:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2033-09-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2033-09-23.gif" }, { Name = "Total Eclipse", Date = "2034 Mar 20 10:18:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2034-03-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2034-03-20.gif" }, { Name = "Annular Eclipse", Date = "2034 Sep 12 16:19:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2034-09-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2034-09-12.gif" }, { Name = "Annular Eclipse", Date = "2035 Mar 09 23:05:54", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2035-03-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2035-03-09.gif" }, { Name = "Total Eclipse", Date = "2035 Sep 02 01:56:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2035-09-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2035-09-02.gif" }, { Name = "Partial Eclipse", Date = "2036 Feb 27 04:46:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2036-02-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2036-02-27.gif" }, { Name = "Partial Eclipse", Date = "2036 Jul 23 10:32:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2036-07-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2036-07-23.gif" }, { Name = "Partial Eclipse", Date = "2036 Aug 21 17:25:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2036-08-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2036-08-21.gif" }, { Name = "Partial Eclipse", Date = "2037 Jan 16 09:48:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2037-01-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2037-01-16.gif" }, { Name = "Total Eclipse", Date = "2037 Jul 13 02:40:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2037-07-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2037-07-13.gif" }, { Name = "Annular Eclipse", Date = "2038 Jan 05 13:47:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2038-01-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2038-01-05.gif" }, { Name = "Annular Eclipse", Date = "2038 Jul 02 13:32:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2038-07-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2038-07-02.gif" }, { Name = "Total Eclipse", Date = "2038 Dec 26 01:00:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2038-12-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2038-12-26.gif" }, { Name = "Annular Eclipse", Date = "2039 Jun 21 17:12:54", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2039-06-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2039-06-21.gif" }, { Name = "Total Eclipse", Date = "2039 Dec 15 16:23:46", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2039-12-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2039-12-15.gif" }, { Name = "Partial Eclipse", Date = "2040 May 11 03:43:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2040-05-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2040-05-11.gif" }, { Name = "Partial Eclipse", Date = "2040 Nov 04 19:09:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2040-11-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2040-11-04.gif" }, { Name = "Total Eclipse", Date = "2041 Apr 30 11:52:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2041-04-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2041-04-30.gif" }, { Name = "Annular Eclipse", Date = "2041 Oct 25 01:36:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2041-10-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2041-10-25.gif" }, { Name = "Total Eclipse", Date = "2042 Apr 20 02:17:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2042-04-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2042-04-20.gif" }, { Name = "Annular Eclipse", Date = "2042 Oct 14 02:00:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2042-10-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2042-10-14.gif" }, { Name = "Total Eclipse", Date = "2043 Apr 09 18:57:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2043-04-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2043-04-09.gif" }, { Name = "Annular Eclipse", Date = "2043 Oct 03 03:01:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2043-10-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2043-10-03.gif" }, { Name = "Annular Eclipse", Date = "2044 Feb 28 20:24:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2044-02-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2044-02-28.gif" }, { Name = "Total Eclipse", Date = "2044 Aug 23 01:17:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2044-08-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2044-08-23.gif" }, { Name = "Annular Eclipse", Date = "2045 Feb 16 23:56:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2045-02-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2045-02-16.gif" }, { Name = "Total Eclipse", Date = "2045 Aug 12 17:42:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2045-08-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2045-08-12.gif" }, { Name = "Annular Eclipse", Date = "2046 Feb 05 23:06:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2046-02-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2046-02-05.gif" }, { Name = "Total Eclipse", Date = "2046 Aug 02 10:21:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2046-08-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2046-08-02.gif" }, { Name = "Partial Eclipse", Date = "2047 Jan 26 01:33:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2047-01-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2047-01-26.gif" }, { Name = "Partial Eclipse", Date = "2047 Jun 23 10:52:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2047-06-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2047-06-23.gif" }, { Name = "Partial Eclipse", Date = "2047 Jul 22 22:36:17", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2047-07-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2047-07-22.gif" }, { Name = "Partial Eclipse", Date = "2047 Dec 16 23:50:12", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2047-12-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2047-12-16.gif" }, { Name = "Annular Eclipse", Date = "2048 Jun 11 12:58:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2048-06-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2048-06-11.gif" }, { Name = "Total Eclipse", Date = "2048 Dec 05 15:35:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2048-12-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2048-12-05.gif" }, { Name = "Annular Eclipse", Date = "2049 May 31 13:59:59", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2049-05-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2049-05-31.gif" }, { Name = "Hybrid Eclipse", Date = "2049 Nov 25 05:33:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2049-11-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2049-11-25.gif" }, { Name = "Hybrid Eclipse", Date = "2050 May 20 20:42:50", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2050-05-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2050-05-20.gif" }, { Name = "Partial Eclipse", Date = "2050 Nov 14 13:30:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2050-11-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2050-11-14.gif" }, { Name = "Partial Eclipse", Date = "2051 Apr 11 02:10:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2051-04-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2051-04-11.gif" }, { Name = "Partial Eclipse", Date = "2051 Oct 04 21:02:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2051-10-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2051-10-04.gif" }, { Name = "Total Eclipse", Date = "2052 Mar 30 18:31:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2052-03-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2052-03-30.gif" }, { Name = "Annular Eclipse", Date = "2052 Sep 22 23:39:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2052-09-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2052-09-22.gif" }, { Name = "Annular Eclipse", Date = "2053 Mar 20 07:08:19", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2053-03-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2053-03-20.gif" }, { Name = "Total Eclipse", Date = "2053 Sep 12 09:34:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2053-09-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2053-09-12.gif" }, { Name = "Partial Eclipse", Date = "2054 Mar 09 12:33:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2054-03-09.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2054-03-09.gif" }, { Name = "Partial Eclipse", Date = "2054 Aug 03 18:04:02", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2054-08-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2054-08-03.gif" }, { Name = "Partial Eclipse", Date = "2054 Sep 02 01:09:34", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2054-09-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2054-09-02.gif" }, { Name = "Partial Eclipse", Date = "2055 Jan 27 17:54:05", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2055-01-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2055-01-27.gif" }, { Name = "Total Eclipse", Date = "2055 Jul 24 09:57:50", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2055-07-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2055-07-24.gif" }, { Name = "Annular Eclipse", Date = "2056 Jan 16 22:16:45", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2056-01-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2056-01-16.gif" }, { Name = "Annular Eclipse", Date = "2056 Jul 12 20:21:59", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2056-07-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2056-07-12.gif" }, { Name = "Total Eclipse", Date = "2057 Jan 05 09:47:52", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2057-01-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2057-01-05.gif" }, { Name = "Annular Eclipse", Date = "2057 Jul 01 23:40:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2057-07-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2057-07-01.gif" }, { Name = "Total Eclipse", Date = "2057 Dec 26 01:14:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2057-12-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2057-12-26.gif" }, { Name = "Partial Eclipse", Date = "2058 May 22 10:39:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2058-05-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2058-05-22.gif" }, { Name = "Partial Eclipse", Date = "2058 Jun 21 00:19:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2058-06-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2058-06-21.gif" }, { Name = "Partial Eclipse", Date = "2058 Nov 16 03:23:07", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2058-11-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2058-11-16.gif" }, { Name = "Total Eclipse", Date = "2059 May 11 19:22:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2059-05-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2059-05-11.gif" }, { Name = "Annular Eclipse", Date = "2059 Nov 05 09:18:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2059-11-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2059-11-05.gif" }, { Name = "Total Eclipse", Date = "2060 Apr 30 10:10:00", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2060-04-30.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2060-04-30.gif" }, { Name = "Annular Eclipse", Date = "2060 Oct 24 09:24:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2060-10-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2060-10-24.gif" }, { Name = "Total Eclipse", Date = "2061 Apr 20 02:56:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2061-04-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2061-04-20.gif" }, { Name = "Annular Eclipse", Date = "2061 Oct 13 10:32:10", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2061-10-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2061-10-13.gif" }, { Name = "Partial Eclipse", Date = "2062 Mar 11 04:26:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2062-03-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2062-03-11.gif" }, { Name = "Partial Eclipse", Date = "2062 Sep 03 08:54:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2062-09-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2062-09-03.gif" }, { Name = "Annular Eclipse", Date = "2063 Feb 28 07:43:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2063-02-28.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2063-02-28.gif" }, { Name = "Total Eclipse", Date = "2063 Aug 24 01:22:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2063-08-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2063-08-24.gif" }, { Name = "Annular Eclipse", Date = "2064 Feb 17 07:00:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2064-02-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2064-02-17.gif" }, { Name = "Total Eclipse", Date = "2064 Aug 12 17:46:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2064-08-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2064-08-12.gif" }, { Name = "Partial Eclipse", Date = "2065 Feb 05 09:52:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2065-02-05.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2065-02-05.gif" }, { Name = "Partial Eclipse", Date = "2065 Jul 03 17:33:52", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2065-07-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2065-07-03.gif" }, { Name = "Partial Eclipse", Date = "2065 Aug 02 05:34:17", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2065-08-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2065-08-02.gif" }, { Name = "Partial Eclipse", Date = "2065 Dec 27 08:39:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2065-12-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2065-12-27.gif" }, { Name = "Annular Eclipse", Date = "2066 Jun 22 19:25:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2066-06-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2066-06-22.gif" }, { Name = "Total Eclipse", Date = "2066 Dec 17 00:23:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2066-12-17.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2066-12-17.gif" }, { Name = "Annular Eclipse", Date = "2067 Jun 11 20:42:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2067-06-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2067-06-11.gif" }, { Name = "Hybrid Eclipse", Date = "2067 Dec 06 14:03:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2067-12-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2067-12-06.gif" }, { Name = "Total Eclipse", Date = "2068 May 31 03:56:39", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2068-05-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2068-05-31.gif" }, { Name = "Partial Eclipse", Date = "2068 Nov 24 21:32:30", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2068-11-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2068-11-24.gif" }, { Name = "Partial Eclipse", Date = "2069 Apr 21 10:11:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2069-04-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2069-04-21.gif" }, { Name = "Partial Eclipse", Date = "2069 May 20 17:53:18", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2069-05-20.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2069-05-20.gif" }, { Name = "Partial Eclipse", Date = "2069 Oct 15 04:19:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2069-10-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2069-10-15.gif" }, { Name = "Total Eclipse", Date = "2070 Apr 11 02:36:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2070-04-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2070-04-11.gif" }, { Name = "Annular Eclipse", Date = "2070 Oct 04 07:08:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2070-10-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2070-10-04.gif" }, { Name = "Annular Eclipse", Date = "2071 Mar 31 15:01:06", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2071-03-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2071-03-31.gif" }, { Name = "Total Eclipse", Date = "2071 Sep 23 17:20:28", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2071-09-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2071-09-23.gif" }, { Name = "Partial Eclipse", Date = "2072 Mar 19 20:10:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2072-03-19.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2072-03-19.gif" }, { Name = "Total Eclipse", Date = "2072 Sep 12 08:59:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2072-09-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2072-09-12.gif" }, { Name = "Partial Eclipse", Date = "2073 Feb 07 01:55:59", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2073-02-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2073-02-07.gif" }, { Name = "Total Eclipse", Date = "2073 Aug 03 17:15:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2073-08-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2073-08-03.gif" }, { Name = "Annular Eclipse", Date = "2074 Jan 27 06:44:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2074-01-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2074-01-27.gif" }, { Name = "Annular Eclipse", Date = "2074 Jul 24 03:10:32", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2074-07-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2074-07-24.gif" }, { Name = "Total Eclipse", Date = "2075 Jan 16 18:36:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2075-01-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2075-01-16.gif" }, { Name = "Annular Eclipse", Date = "2075 Jul 13 06:05:44", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2075-07-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2075-07-13.gif" }, { Name = "Total Eclipse", Date = "2076 Jan 06 10:07:27", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2076-01-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2076-01-06.gif" }, { Name = "Partial Eclipse", Date = "2076 Jun 01 17:31:22", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2076-06-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2076-06-01.gif" }, { Name = "Partial Eclipse", Date = "2076 Jul 01 06:50:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2076-07-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2076-07-01.gif" }, { Name = "Partial Eclipse", Date = "2076 Nov 26 11:43:01", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2076-11-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2076-11-26.gif" }, { Name = "Total Eclipse", Date = "2077 May 22 02:46:05", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2077-05-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2077-05-22.gif" }, { Name = "Annular Eclipse", Date = "2077 Nov 15 17:07:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2077-11-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2077-11-15.gif" }, { Name = "Total Eclipse", Date = "2078 May 11 17:56:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2078-05-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2078-05-11.gif" }, { Name = "Annular Eclipse", Date = "2078 Nov 04 16:55:44", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2078-11-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2078-11-04.gif" }, { Name = "Total Eclipse", Date = "2079 May 01 10:50:13", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2079-05-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2079-05-01.gif" }, { Name = "Annular Eclipse", Date = "2079 Oct 24 18:11:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2079-10-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2079-10-24.gif" }, { Name = "Partial Eclipse", Date = "2080 Mar 21 12:20:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2080-03-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2080-03-21.gif" }, { Name = "Partial Eclipse", Date = "2080 Sep 13 16:38:09", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2080-09-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2080-09-13.gif" }, { Name = "Annular Eclipse", Date = "2081 Mar 10 15:23:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2081-03-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2081-03-10.gif" }, { Name = "Total Eclipse", Date = "2081 Sep 03 09:07:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2081-09-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2081-09-03.gif" }, { Name = "Annular Eclipse", Date = "2082 Feb 27 14:47:00", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2082-02-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2082-02-27.gif" }, { Name = "Total Eclipse", Date = "2082 Aug 24 01:16:21", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2082-08-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2082-08-24.gif" }, { Name = "Partial Eclipse", Date = "2083 Feb 16 18:06:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2083-02-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2083-02-16.gif" }, { Name = "Partial Eclipse", Date = "2083 Jul 15 00:14:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2083-07-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2083-07-15.gif" }, { Name = "Partial Eclipse", Date = "2083 Aug 13 12:34:41", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2083-08-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2083-08-13.gif" }, { Name = "Partial Eclipse", Date = "2084 Jan 07 17:30:24", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2084-01-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2084-01-07.gif" }, { Name = "Annular Eclipse", Date = "2084 Jul 03 01:50:26", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2084-07-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2084-07-03.gif" }, { Name = "Total Eclipse", Date = "2084 Dec 27 09:13:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2084-12-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2084-12-27.gif" }, { Name = "Annular Eclipse", Date = "2085 Jun 22 03:21:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2085-06-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2085-06-22.gif" }, { Name = "Annular Eclipse", Date = "2085 Dec 16 22:37:48", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2085-12-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2085-12-16.gif" }, { Name = "Total Eclipse", Date = "2086 Jun 11 11:07:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2086-06-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2086-06-11.gif" }, { Name = "Partial Eclipse", Date = "2086 Dec 06 05:38:55", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2086-12-06.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2086-12-06.gif" }, { Name = "Partial Eclipse", Date = "2087 May 02 18:04:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2087-05-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2087-05-02.gif" }, { Name = "Partial Eclipse", Date = "2087 Jun 01 01:27:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2087-06-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2087-06-01.gif" }, { Name = "Partial Eclipse", Date = "2087 Oct 26 11:46:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2087-10-26.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2087-10-26.gif" }, { Name = "Total Eclipse", Date = "2088 Apr 21 10:31:49", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2088-04-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2088-04-21.gif" }, { Name = "Annular Eclipse", Date = "2088 Oct 14 14:48:05", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2088-10-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2088-10-14.gif" }, { Name = "Annular Eclipse", Date = "2089 Apr 10 22:44:42", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2089-04-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2089-04-10.gif" }, { Name = "Total Eclipse", Date = "2089 Oct 04 01:15:23", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2089-10-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2089-10-04.gif" }, { Name = "Partial Eclipse", Date = "2090 Mar 31 03:38:08", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2090-03-31.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2090-03-31.gif" }, { Name = "Total Eclipse", Date = "2090 Sep 23 16:56:36", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2090-09-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2090-09-23.gif" }, { Name = "Partial Eclipse", Date = "2091 Feb 18 09:54:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2091-02-18.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2091-02-18.gif" }, { Name = "Total Eclipse", Date = "2091 Aug 15 00:34:43", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2091-08-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2091-08-15.gif" }, { Name = "Annular Eclipse", Date = "2092 Feb 07 15:10:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2092-02-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2092-02-07.gif" }, { Name = "Annular Eclipse", Date = "2092 Aug 03 09:59:33", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2092-08-03.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2092-08-03.gif" }, { Name = "Total Eclipse", Date = "2093 Jan 27 03:22:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2093-01-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2093-01-27.gif" }, { Name = "Annular Eclipse", Date = "2093 Jul 23 12:32:04", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2093-07-23.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2093-07-23.gif" }, { Name = "Total Eclipse", Date = "2094 Jan 16 18:59:03", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2094-01-16.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2094-01-16.gif" }, { Name = "Partial Eclipse", Date = "2094 Jun 13 00:22:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2094-06-13.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2094-06-13.gif" }, { Name = "Partial Eclipse", Date = "2094 Jul 12 13:24:35", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2094-07-12.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2094-07-12.gif" }, { Name = "Partial Eclipse", Date = "2094 Dec 07 20:05:56", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2094-12-07.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2094-12-07.gif" }, { Name = "Total Eclipse", Date = "2095 Jun 02 10:07:40", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2095-06-02.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2095-06-02.gif" }, { Name = "Annular Eclipse", Date = "2095 Nov 27 01:02:57", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2095-11-27.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2095-11-27.gif" }, { Name = "Total Eclipse", Date = "2096 May 22 01:37:14", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2096-05-22.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2096-05-22.gif" }, { Name = "Annular Eclipse", Date = "2096 Nov 15 00:36:15", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2096-11-15.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2096-11-15.gif" }, { Name = "Total Eclipse", Date = "2097 May 11 18:34:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2097-05-11.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2097-05-11.gif" }, { Name = "Annular Eclipse", Date = "2097 Nov 04 02:01:25", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2097-11-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2097-11-04.gif" }, { Name = "Partial Eclipse", Date = "2098 Apr 01 20:02:31", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2098-04-01.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2098-04-01.gif" }, { Name = "Partial Eclipse", Date = "2098 Sep 25 00:31:16", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2098-09-25.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2098-09-25.gif" }, { Name = "Partial Eclipse", Date = "2098 Oct 24 10:36:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2098-10-24.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2098-10-24.gif" }, { Name = "Annular Eclipse", Date = "2099 Mar 21 22:54:32", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2099-03-21.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2099-03-21.gif" }, { Name = "Total Eclipse", Date = "2099 Sep 14 16:57:53", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2099-09-14.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2099-09-14.gif" }, { Name = "Annular Eclipse", Date = "2100 Mar 10 22:28:11", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2100-03-10.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2100-03-10.gif" }, { Name = "Total Eclipse", Date = "2100 Sep 04 08:49:20", - Image = "https://eclipse.gsfc.nasa.gov/5MCSEmap/2001-2100/2100-09-04.gif" + Image = "https://data.openspaceproject.com/missions/eclipses/2100-09-04.gif" } } } diff --git a/data/assets/scene/solarsystem/planets/earth/grids.asset b/data/assets/scene/solarsystem/planets/earth/grids.asset index 64857f4652..62dd7020b0 100644 --- a/data/assets/scene/solarsystem/planets/earth/grids.asset +++ b/data/assets/scene/solarsystem/planets/earth/grids.asset @@ -36,7 +36,8 @@ local plane1lsec = { }, GUI = { Name = "1lsec Grid", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth", + Focusable = false } } @@ -64,7 +65,8 @@ local plane1lmin = { }, GUI = { Name = "1lmin Grid", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1/l1.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1/l1.asset index c1806432eb..3071c334a5 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1/l1.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l1/l1.asset @@ -46,6 +46,7 @@ local L1Label = { GUI = { Name = "L1 Label", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Description = "Main label for L1" } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2.asset index 4ae51aa794..30bfcd5609 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2.asset @@ -64,6 +64,7 @@ local L2SmallLabel = { GUI = { Name = "L2 Small Label", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Description = "Small label for L2" } } @@ -86,6 +87,7 @@ local L2Label = { GUI = { Name = "L2 Label", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Description = "Main label for L2" } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2sunline.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2sunline.asset index 16c3bb83ba..8af3a8080c 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2sunline.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/l2sunline.asset @@ -18,7 +18,8 @@ local L2SunLine = { Tag = { "lagrange_points_earth_l2_small" }, GUI = { Name = "Sun to L2 Line", - Path = "/Solar System/Planets/Earth/Lagrange Points" + Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/transforms.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/transforms.asset index 2fc0f468ee..bac618b7f3 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/transforms.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l2/transforms.asset @@ -18,6 +18,7 @@ local L2Position = { GUI = { Name = "L2 Position", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Hidden = true } } @@ -38,6 +39,7 @@ local L2CoRevFrame = { GUI = { Name = "L2 Co-revolving Reference Frame", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/l4.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/l4.asset index 7dda9ff4e9..c3f775e389 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/l4.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/l4.asset @@ -46,6 +46,7 @@ local L4Label = { GUI = { Name = "L4 Label", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Description = "Main label for L4" } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/transforms.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/transforms.asset index 9bf6a983e9..b9209795b8 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/transforms.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l4/transforms.asset @@ -18,6 +18,7 @@ local L4Position = { GUI = { Name = "L4 Position", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/l5.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/l5.asset index a7f71a277c..fa71ad688f 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/l5.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/l5.asset @@ -46,6 +46,7 @@ local L5Label = { GUI = { Name = "L5 Label", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Description = "Main label for L5" } } diff --git a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/transforms.asset b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/transforms.asset index fef44db03d..0275695791 100644 --- a/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/transforms.asset +++ b/data/assets/scene/solarsystem/planets/earth/lagrange_points/l5/transforms.asset @@ -18,6 +18,7 @@ local L5Position = { GUI = { Name = "L5 Position", Path = "/Solar System/Planets/Earth/Lagrange Points", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/markers.asset b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset index 7516de40e7..d8445dc0f2 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/markers.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/markers.asset @@ -24,7 +24,8 @@ local MoonMarker = { }, GUI = { Name = "Moon Marker", - Path = "/Solar System/Planets/Earth/Moon" + Path = "/Solar System/Planets/Earth/Moon", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset index 8bff4799e5..225053fbf7 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/moon.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/moon.asset @@ -79,6 +79,7 @@ local MoonLabel = { GUI = { Name = "Moon Label", Path = "/Solar System/Planets/Earth/Moon", + Focusable = false, Description = "Label for Earth's Moon" } } diff --git a/data/assets/scene/solarsystem/planets/earth/moon/trail.asset b/data/assets/scene/solarsystem/planets/earth/moon/trail.asset index a167a23b96..870cfd5a12 100644 --- a/data/assets/scene/solarsystem/planets/earth/moon/trail.asset +++ b/data/assets/scene/solarsystem/planets/earth/moon/trail.asset @@ -15,12 +15,17 @@ local MoonTrail = { }, Color = { 0.5, 0.3, 0.3 }, Period = 27, - Resolution = 1000, - Tag = { "moonTrail_solarSystem", "moonTrail_terrestrial", "moonTrail_earth" } + Resolution = 1000 + }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_terrestrial", + "moonTrail_earth" }, GUI = { Name = "Moon Trail", - Path = "/Solar System/Planets/Earth/Moon" + Path = "/Solar System/Planets/Earth/Moon", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset index ed48d2e0a3..b46ed23b85 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/amateur.asset @@ -28,7 +28,8 @@ local AmateurSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Amateur Radio", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset index fc9655828f..2696e21905 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/experimental.asset @@ -28,7 +28,8 @@ local ExperimentalSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Experimental", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset index c8ff854b88..67e814edc4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/geostationary.asset @@ -29,6 +29,7 @@ local GeoStationarySatellites = { GUI = { Name = "Geostationary", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[Satellites that are currently active and in a Geosynchronous orbit, meaning their orbital period matches Earth's rotation.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset index a76d042f90..3ea3ade5a0 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/globalstar.asset @@ -28,7 +28,8 @@ local GlobalStarSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "GlobalStar", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset index bb74c08ce4..0b3858db90 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/gorizont.asset @@ -28,7 +28,8 @@ local GorizontSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Gorizont", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset index 4601e65efe..74246f3bd5 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/intelsat.asset @@ -28,7 +28,8 @@ local IntelsatSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Intelsat", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset index 12c4a6e28e..9588ffbd7b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium.asset @@ -28,7 +28,8 @@ local IridiumSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Iridium", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium_next.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium_next.asset index 759e31cafd..1d632a70d9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium_next.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/iridium_next.asset @@ -28,7 +28,8 @@ local IridiumNextSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Iridium NEXT", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/kuiper.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/kuiper.asset index 6e6fde7997..2bb88d5847 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/kuiper.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/kuiper.asset @@ -29,6 +29,7 @@ local KuiperSatellites = { GUI = { Name = "Kuiper", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[LEO satellite constellation launched by Amazon to provide broadband internet access.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset index 58586625e0..5f15a1695e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/molniya.asset @@ -28,7 +28,8 @@ local MolniyaSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Molniya", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset index 107171335d..bd0fc73554 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/orbcomm.asset @@ -28,7 +28,8 @@ local OrbcommSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Orbcomm", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/other_comm.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/other_comm.asset index ab09abef8a..b3ad87f9e8 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/other_comm.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/other_comm.asset @@ -28,7 +28,8 @@ local OtherCommunicationSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Other comm", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset index ba24bec98c..645d481fac 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/raduga.asset @@ -28,7 +28,8 @@ local RadugaSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Raduga", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset index 8a2ae6cfe1..a0cce6703a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/ses.asset @@ -28,7 +28,8 @@ local SesSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "SES", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset b/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset index 323cdd446b..0797b0b5eb 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/communications/starlink.asset @@ -29,6 +29,7 @@ local StarlinkSatellites = { GUI = { Name = "Starlink", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[LEO satellite constellation launched by SpaceX to provide broadband internet access.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_breezem.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_breezem.asset index 085e280b89..6325970fc4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_breezem.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_breezem.asset @@ -28,7 +28,8 @@ local DebrisBreezem = { Tag = { "earth_satellites" }, GUI = { Name = "Breeze-M Breakup", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_fengyun.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_fengyun.asset index a52a8393ff..6b082194a9 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_fengyun.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_fengyun.asset @@ -28,7 +28,8 @@ local DebrisFengyun = { Tag = { "earth_satellites" }, GUI = { Name = "Fengyun Debris", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_iridium33.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_iridium33.asset index bc251261fe..3cbefd817d 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_iridium33.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_iridium33.asset @@ -28,7 +28,8 @@ local DebrisIridium = { Tag = { "earth_satellites" }, GUI = { Name = "Iridium 33 Debris", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_kosmos2251.asset b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_kosmos2251.asset index bcad916d9f..71949a168f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_kosmos2251.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/debris/debris_kosmos2251.asset @@ -22,12 +22,14 @@ local DebrisCosmos = { SegmentQuality = 3, Color = { 0.66, 0.8, 0.5 }, TrailFade = 1.5, + PointSizeExponent = 5.0, RenderBinMode = "PostDeferredTransparent" }, Tag = { "earth_satellites" }, GUI = { Name = "Kosmos 2251 Debris", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset index e13d13d328..f24b1331bf 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/active.asset @@ -29,6 +29,7 @@ local ActiveSatellites = { GUI = { Name = "Active", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[Satellites that employ active communication.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset index c02b1d4735..31941a1481 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/brightest.asset @@ -29,6 +29,7 @@ local BrightestSatellites = { GUI = { Name = "100 Brightest", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[The 100 (or so) satellites that will appear brightest when viewed from Earth.]] } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset index 7188ae6c79..5c769c5cf2 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/cubesats.asset @@ -28,7 +28,8 @@ local Cubesats = { Tag = { "earth_satellites" }, GUI = { Name = "CubeSat", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/hubble_trail.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/hubble_trail.asset index b29818479d..9849267e6f 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/hubble_trail.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/hubble_trail.asset @@ -29,10 +29,11 @@ local HubblePosition = { DestinationFrame = coreKernels.Frame.J2000 } }, - Tag = { "earth_satellite", "hubble" }, + Tag = { "earth_satellites", "hubble" }, GUI = { Name = "Hubble Position", Path = "/Solar System/Planets/Earth/Satellites/Hubble", + Focusable = false, Hidden = true } } @@ -53,10 +54,11 @@ local HubbleTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite", "hubble" }, + Tag = { "earth_satellites", "hubble" }, GUI = { Name = "Hubble Trail", - Path = "/Solar System/Planets/Earth/Satellites/Hubble" + Path = "/Solar System/Planets/Earth/Satellites/Hubble", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset index 36efd6a593..7024fea6ba 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/iss.asset @@ -49,7 +49,7 @@ local IssPosition = { Format = "OMM" } }, - Tag = { "earth_satellite", "ISS" }, + Tag = { "earth_satellites", "ISS" }, GUI = { Name = "ISS Position", Path = "/Solar System/Planets/Earth/Satellites/ISS", @@ -76,7 +76,7 @@ local IssModel = { }, PerformShading = true }, - Tag = { "earth_satellite", "ISS" }, + Tag = { "earth_satellites", "ISS" }, GUI = { Name = "ISS", Path = "/Solar System/Planets/Earth/Satellites/ISS" @@ -99,10 +99,11 @@ local IssTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite", "ISS" }, + Tag = { "earth_satellites", "ISS" }, GUI = { Name = "ISS Trail", - Path = "/Solar System/Planets/Earth/Satellites/ISS" + Path = "/Solar System/Planets/Earth/Satellites/ISS", + Focusable = false } } @@ -126,7 +127,8 @@ local IssLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "ISS Label", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset index 1098be5793..1a5bade094 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/military.asset @@ -28,7 +28,8 @@ local MilitarySatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Military", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset index 64ea9f90d9..2521eaf549 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/other.asset @@ -28,7 +28,8 @@ local OtherSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Other", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset index 75d2402b85..ef0cbd1306 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/radar.asset @@ -28,7 +28,8 @@ local RadarSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Radar Calibration", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset index ad7ef07723..63c5cd5a7a 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/spacestations.asset @@ -29,6 +29,7 @@ local SpaceStations = { GUI = { Name = "Space Stations", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[A collection of space stations (including the ISS and China's Tiangong), along with certain cubesats and satellite constellations from space agencies.]] diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset index 5f421a2df9..12525a6ec7 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tiangong.asset @@ -37,10 +37,11 @@ local TiangongPosition = { DestinationFrame = coreKernels.Frame.J2000 } }, - Tag = { "earth_satellite" }, + Tag = { "earth_satellites" }, GUI = { Name = "Tiangong Position", Path = "/Solar System/Planets/Earth/Satellites/Tiangong", + Focusable = false, Hidden = true } } @@ -65,7 +66,7 @@ local TiangongModel = { }, PerformShading = true }, - Tag = { "earth_satellite" }, + Tag = { "earth_satellites" }, GUI = { Name = "Tiangong", Path = "/Solar System/Planets/Earth/Satellites/Tiangong" @@ -88,10 +89,11 @@ local TiangongTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite" }, + Tag = { "earth_satellites" }, GUI = { Name = "Tiangong Trail", - Path = "/Solar System/Planets/Earth/Satellites/Tiangong" + Path = "/Solar System/Planets/Earth/Satellites/Tiangong", + Focusable = false } } @@ -115,7 +117,8 @@ local TiangongLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "Tiangong Label", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tle-new.asset b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tle-new.asset index cd7537f716..8e34e99bfc 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/misc/tle-new.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/misc/tle-new.asset @@ -29,6 +29,7 @@ local Last30DaysSatellites = { GUI = { Name = "Last 30 Days", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[All the satellites that have been launched in the last 30 days.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset index dfd9306d03..8770680ded 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/beidou.asset @@ -28,7 +28,8 @@ local BeidouSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Beidou", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset index 4a905b2cdd..a13e237a8c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/galileo.asset @@ -28,7 +28,8 @@ local GalileoSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Galileo", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset index 84b6de8b2f..06b3e20dd6 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/glosnass.asset @@ -28,7 +28,8 @@ local GlosnassSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Glosnass", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset index 31b8578fb6..796dd46f0c 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/gps.asset @@ -29,6 +29,7 @@ local GpsSatellites = { GUI = { Name = "GPS", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[The GPS satellites that give us our precise locations back on Earth.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset index 6b688a3585..1123530e2e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/musson.asset @@ -28,7 +28,8 @@ local MussonSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Russian LEO Navigation", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset index 0457dafb50..a18fbb2aef 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/nnss.asset @@ -29,6 +29,7 @@ local NavyNavigationSatellites = { GUI = { Name = "Navy Navigation Satellite System", Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false, Description = [[The first satellite navigation system to be used operationally.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset index a092adf1d6..c2d1883ec3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/navigation/sbas.asset @@ -28,7 +28,8 @@ local SatelliteBasedAugmentationSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Satellite Based Augmentation System", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset b/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset index d7567078de..7d7cd0165b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/education.asset @@ -28,7 +28,8 @@ local EducationSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Education", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset b/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset index 5ee3c70cf3..65d74ea8aa 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/engineering.asset @@ -28,7 +28,8 @@ local EngineeringSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Engineering", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset b/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset index 656c7d6330..a8dcb6d935 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/geodetic.asset @@ -28,7 +28,8 @@ local GeodeticSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Geodetic", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset b/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset index 8daedff803..89fa152d9e 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/science/spaceearth.asset @@ -28,7 +28,8 @@ local ScienceSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Space & Earth Science", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset index d8a9f8e2f3..f5c0123979 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/aqua.asset @@ -30,7 +30,7 @@ local Aqua = { DestinationFrame = coreKernels.Frame.J2000 } }, - Tag = { "earth_satellite", "Aqua" }, + Tag = { "earth_satellites", "Aqua" }, GUI = { Name = "Aqua", Path = "/Solar System/Planets/Earth/Satellites/Aqua" @@ -53,10 +53,11 @@ local AquaTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite", "Aqua" }, + Tag = { "earth_satellites", "Aqua" }, GUI = { Name = "Aqua Trail", - Path = "/Solar System/Planets/Earth/Satellites/Aqua" + Path = "/Solar System/Planets/Earth/Satellites/Aqua", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset index fd2a4bab75..6f5871d6ac 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/argos.asset @@ -28,7 +28,8 @@ local Argos = { Tag = { "earth_satellites" }, GUI = { Name = "ARGOS", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset index 051a79b8c1..f7810d2894 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/dmc.asset @@ -28,7 +28,8 @@ local DisasterMonitoringConstellation = { Tag = { "earth_satellites" }, GUI = { Name = "Disaster Monitoring", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/earth_resources.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/earth_resources.asset index 5d23acbdb8..22de3bad19 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/earth_resources.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/earth_resources.asset @@ -28,7 +28,8 @@ local ResourceSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Earth Resources", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset index 68d2a9dd4e..b43d3205ae 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/goes.asset @@ -28,7 +28,8 @@ local GoesSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "GOES", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset index d3e360be01..77227dcbeb 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/noaa.asset @@ -28,7 +28,8 @@ local NoaaSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "NOAA", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset index c9148ea6a7..99dfc5fa0d 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/planet.asset @@ -28,7 +28,8 @@ local PlanetSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Planet", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset index a786fa426c..e7fa6f5132 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/sarsat.asset @@ -28,7 +28,8 @@ local SarSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Search & Rescue (SARSAT)", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset index 3094da65ec..b3bac7fb97 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/snpp.asset @@ -30,7 +30,7 @@ local SNPP = { DestinationFrame = coreKernels.Frame.J2000 } }, - Tag = { "earth_satellite", "SNPP" }, + Tag = { "earth_satellites", "SNPP" }, GUI = { Name = "SNPP", Path = "/Solar System/Planets/Earth/Satellites/SNPP" @@ -53,10 +53,11 @@ local SNPPTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite", "SNPP" }, + Tag = { "earth_satellites", "SNPP" }, GUI = { Name = "SNPP Trail", - Path = "/Solar System/Planets/Earth/Satellites/SNPP" + Path = "/Solar System/Planets/Earth/Satellites/SNPP", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset index 972274778a..38174babb3 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/spire.asset @@ -28,7 +28,8 @@ local SpireSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Spire", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset index e44459833c..d1f8a5cee4 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/tdrss.asset @@ -28,7 +28,8 @@ local TrackingDataRelaySatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Tracking and Data Relay Satellite System (TDRSS)", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset index ba5fbdb877..4e6e7c860b 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/terra.asset @@ -30,7 +30,7 @@ local Terra = { DestinationFrame = coreKernels.Frame.J2000 } }, - Tag = { "earth_satellite", "Terra" }, + Tag = { "earth_satellites", "Terra" }, GUI = { Name = "Terra", Path = "/Solar System/Planets/Earth/Satellites/Terra" @@ -53,10 +53,11 @@ local TerraTrail = { Fade = 1.5, Resolution = 320 }, - Tag = { "earth_satellite", "Terra" }, + Tag = { "earth_satellites", "Terra" }, GUI = { Name = "Terra Trail", - Path = "/Solar System/Planets/Earth/Satellites/Terra" + Path = "/Solar System/Planets/Earth/Satellites/Terra", + Focusable = false } } @@ -82,7 +83,8 @@ local TerraLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "Terra Label", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth/Satellites/Terra", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset b/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset index c4a0c29460..bddba2caa1 100644 --- a/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset +++ b/data/assets/scene/solarsystem/planets/earth/satellites/weather/weather.asset @@ -28,7 +28,8 @@ local WeatherSatellites = { Tag = { "earth_satellites" }, GUI = { Name = "Weather", - Path = "/Solar System/Planets/Earth/Satellites" + Path = "/Solar System/Planets/Earth/Satellites", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/trail.asset b/data/assets/scene/solarsystem/planets/earth/trail.asset index a127de8615..ef2ad50807 100644 --- a/data/assets/scene/solarsystem/planets/earth/trail.asset +++ b/data/assets/scene/solarsystem/planets/earth/trail.asset @@ -20,7 +20,8 @@ local EarthTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_terrestrial" }, GUI = { Name = "Earth Trail", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/earth/trail_barycenter.asset index 5687a9ff23..630b197406 100644 --- a/data/assets/scene/solarsystem/planets/earth/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/earth/trail_barycenter.asset @@ -21,7 +21,8 @@ local EarthBarycenterTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_terrestrial" }, GUI = { Name = "Earth Barycenter Trail", - Path = "/Solar System/Planets/Earth" + Path = "/Solar System/Planets/Earth", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/earth/transforms.asset b/data/assets/scene/solarsystem/planets/earth/transforms.asset index d3bbfae3da..84f66fc2c0 100644 --- a/data/assets/scene/solarsystem/planets/earth/transforms.asset +++ b/data/assets/scene/solarsystem/planets/earth/transforms.asset @@ -16,6 +16,7 @@ local EarthBarycenter = { GUI = { Name = "Earth Barycenter", Path = "/Solar System/Planets/Earth", + Focusable = false, Hidden = true } } @@ -33,6 +34,7 @@ local EarthCenter = { GUI = { Name = "Earth Center", Path = "/Solar System/Planets/Earth", + Focusable = false, Hidden = true } } @@ -51,6 +53,7 @@ local EarthInertial = { GUI = { Name = "Earth Inertial", Path = "/Solar System/Planets/Earth", + Focusable = false, Hidden = true } } @@ -68,6 +71,7 @@ local EarthIAU = { GUI = { Name = "Earth IAU", Path = "/Solar System/Planets/Earth", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/earth/transforms_gse.asset b/data/assets/scene/solarsystem/planets/earth/transforms_gse.asset index 84e5d71b57..522274a417 100644 --- a/data/assets/scene/solarsystem/planets/earth/transforms_gse.asset +++ b/data/assets/scene/solarsystem/planets/earth/transforms_gse.asset @@ -27,13 +27,13 @@ local GeocentricSolarEcliptic = { GUI = { Name = "Geocentric Solar Ecliptic", Path = "/Solar System/Planets/Earth", + Focusable = false, + Hidden = true, Description = [[The X-Y plane is defined by the Earth Mean Ecliptic plane of date: - the +Z axis, primary vector, is the normal vector to this plane, - always pointing toward the North side of the invariant plane. - +X axis is the component of the Earth-Sun vector that is orthogonal - to the +Z axis. - +Y axis completes the right-handed system.]], - Hidden = true + the +Z axis, primary vector, is the normal vector to this plane, always pointing + toward the North side of the invariant plane. +X axis is the component of the + Earth-Sun vector that is orthogonal to the +Z axis. +Y axis completes the + right-handed system.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm.asset b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm.asset index 6b3bf4d13b..2823d218e0 100644 --- a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm.asset +++ b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm.asset @@ -28,12 +28,12 @@ local GeocentricSolarMagnetospheric = { GUI = { Name = "Geocentric Solar Magnetospheric", Path = "/Solar System/Planets/Earth", - Description = [[ +X is parallel to the geometric earth-sun position vector. - +Z axis is normalized component of north centered geomagnetic dipole - vector orthogonal to GSM +X axis. - +Y completes the right-handed frame. - - the origin of this frame is the center of mass of the Earth.]], - Hidden = true + Focusable = false, + Hidden = true, + Description = [[+X is parallel to the geometric earth-sun position vector. +Z axis is + normalized component of north centered geomagnetic dipole vector orthogonal to GSM + +X axis. +Y completes the right-handed frame. The origin of this frame is the center + of mass of the Earth.]] } } @@ -50,14 +50,13 @@ local SolarMagnetic = { GUI = { Name = "Solar Magnetic", Path = "/Solar System/Planets/Earth", - Description = [[+Z axis is the direction of Earth's magnetic dipole axis - (positive North); it's the primary vector. - +X axis is the projection of the geometric position of the - Sun relative to the Earth onto the plane perpendicular to the - Z axis. - +Y axis completes the right-handed system. - - the origin of this frame is the center of mass of the Earth.]], - Hidden = true + Focusable = false, + Hidden = true, + Description = [[+Z axis is the direction of Earth's magnetic dipole axis (positive + North); it's the primary vector. +X axis is the projection of the geometric position + of the Sun relative to the Earth onto the plane perpendicular to the Z axis. +Y axis + completes the right-handed system. The origin of this frame is the center of mass + of the Earth.]] } } @@ -65,6 +64,7 @@ local SolarMagnetic = { asset.onInitialize(function() openspace.spice.loadKernel(earthcentricKernels .. "GSM.tf") openspace.spice.loadKernel(earthcentricKernels .. "SM.tf") + openspace.addSceneGraphNode(GeocentricSolarMagnetospheric) openspace.addSceneGraphNode(SolarMagnetic) end) @@ -72,6 +72,7 @@ end) asset.onDeinitialize(function() openspace.removeSceneGraphNode(SolarMagnetic) openspace.removeSceneGraphNode(GeocentricSolarMagnetospheric) + openspace.spice.unloadKernel(earthcentricKernels .. "SM.tf") openspace.spice.unloadKernel(earthcentricKernels .. "GSM.tf") end) diff --git a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm_timedependent.asset b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm_timedependent.asset index eaf1122589..d9c8194a5a 100644 --- a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm_timedependent.asset +++ b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_sm_timedependent.asset @@ -42,16 +42,15 @@ local GeocentricSolarMagnetosphericTimeDependent = { GUI = { Name = "Geocentric Solar Magnetospheric (Timedependent)", Path = "/Solar System/Planets/Earth", - Description = [[The Earth's magnetic dipole axis direction is time- - variable and is defined by the EARTH_NORTH_POLE/399901 object location - as seen from the Earth center provided in the SPK file - earthnpole_19500101_20251231_v01.bsp (or newer). - +X is parallel to the geometric earth-sun position vector. - +Z axis is normalized component of north centered geomagnetic dipole - vector orthogonal to GSM +X axis. - +Y completes the right-handed frame. - - the origin of this frame is the center of mass of the Earth.]], - Hidden = true + Focusable = false, + Hidden = true, + Description = [[The Earth's magnetic dipole axis direction is time-variable and is + defined by the EARTH_NORTH_POLE/399901 object location as seen from the Earth center + provided in the SPK file earthnpole_19500101_20251231_v01.bsp (or newer). +X is + parallel to the geometric earth-sun position vector. +Z axis is normalized component + of north centered geomagnetic dipole vector orthogonal to GSM +X axis. +Y completes + the right-handed frame. The origin of this frame is the center of mass of the + Earth.]] } } @@ -70,18 +69,15 @@ local SolarMagneticTimeDependent = { GUI = { Name = "Solar Magnetic (Timedependent)", Path = "/Solar System/Planets/Earth", - Description = [[ The Earth's magnetic dipole axis direction is time- - variable and is defined by the EARTH_NORTH_POLE/399901 object location - as seen from the Earth center provided in the SPK file - earthnpole_19500101_20251231_v01.bsp (or newer). - +Z axis is the direction of Earth's magnetic dipole axis - (positive North); it's the primary vector. - +X axis is the projection of the geometric position of the - Sun relative to the Earth onto the plane perpendicular to the - Z axis. - +Y axis completes the right-handed system. - - the origin of this frame is the center of mass of the Earth.]], - Hidden = true + Focusable = false, + Hidden = true, + Description = [[The Earth's magnetic dipole axis direction is time-variable and is + defined by the EARTH_NORTH_POLE/399901 object location as seen from the Earth center + provided in the SPK file earthnpole_19500101_20251231_v01.bsp (or newer). +Z axis is + the direction of Earth's magnetic dipole axis (positive North); it's the primary + vector. +X axis is the projection of the geometric position of the Sun relative to + the Earth onto the plane perpendicular to the Z axis. +Y axis completes the + right-handed system. The origin of this frame is the center of mass of the Earth.]] } } diff --git a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_static.asset b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_static.asset index 19048f6252..9ecb79559a 100644 --- a/data/assets/scene/solarsystem/planets/earth/transforms_gsm_static.asset +++ b/data/assets/scene/solarsystem/planets/earth/transforms_gsm_static.asset @@ -27,26 +27,27 @@ local GeocentricSolarMagnetosphericStatic = { GUI = { Name = "Geocentric Solar Magnetospheric Static", Path = "/Solar System/Planets/Earth", - Description =[[The Kernel for this is the same as - GSM (Geocentric Solar Magnetospheric), except it is using - ECLIPJ2000 instead of IAU_EARTH for the secondary axis. GSM is defind as: - +X is parallel to the geometric earth-sun position vector. - +Z axis is normalized component of north centered geomagnetic dipole - vector orthogonal to GSM +X axis. - +Y completes the right-handed frame. - - the origin of this frame is the center of mass of the Earth.]], - Hidden = true + Focusable = false, + Hidden = true, + Description =[[The Kernel for this is the same as GSM (Geocentric Solar + Magnetospheric), except it is using ECLIPJ2000 instead of IAU_EARTH for the + secondary axis. GSM is defind as: +X is parallel to the geometric earth-sun position + vector. +Z axis is normalized component of north centered geomagnetic dipole vector + orthogonal to GSM +X axis. +Y completes the right-handed frame. The origin of this + frame is the center of mass of the Earth.]] } } asset.onInitialize(function() openspace.spice.loadKernel(earthcentricKernels .. "GSM_static.tf") + openspace.addSceneGraphNode(GeocentricSolarMagnetosphericStatic ) end) asset.onDeinitialize(function() openspace.removeSceneGraphNode(GeocentricSolarMagnetosphericStatic ) + openspace.spice.unloadKernel(earthcentricKernels .. "GSM_static.tf") end) diff --git a/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset b/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset index 0fa2242dfe..c2c36b4bfc 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/callisto/callisto.asset @@ -72,6 +72,7 @@ local CallistoLabel = { GUI = { Name = "Callisto Label", Path = "/Solar System/Planets/Jupiter/Major Moons/Callisto", + Focusable = false, Description = "Label for Jupiter's moon Callisto" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/callisto/trail.asset b/data/assets/scene/solarsystem/planets/jupiter/callisto/trail.asset index a7a46d6c9a..ccfab97715 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/callisto/trail.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/callisto/trail.asset @@ -18,10 +18,16 @@ local CallistoTrail = { Period = 17.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", "moonTrail_major_jupiter" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_jupiter", + "moonTrail_major_jupiter" + }, GUI = { Name = "Callisto Trail", - Path = "/Solar System/Planets/Jupiter/Major Moons/Callisto" + Path = "/Solar System/Planets/Jupiter/Major Moons/Callisto", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset index 18460b39e2..b4ae20b4e4 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/europa.asset @@ -71,6 +71,7 @@ local EuropaLabel = { GUI = { Name = "Europa Label", Path = "/Solar System/Planets/Jupiter/Major Moons/Europa", + Focusable = false, Description = "Label for Jupiter's moon Europa" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/europa/trail.asset b/data/assets/scene/solarsystem/planets/jupiter/europa/trail.asset index d0f6334f54..596aae4ce9 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/europa/trail.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/europa/trail.asset @@ -18,10 +18,16 @@ local EuropaTrail = { Period = 85.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", "moonTrail_major_jupiter" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_jupiter", + "moonTrail_major_jupiter" + }, GUI = { Name = "Europa Trail", - Path = "/Solar System/Planets/Jupiter/Major Moons/Europa" + Path = "/Solar System/Planets/Jupiter/Major Moons/Europa", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset b/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset index b3466d7e05..14f173e206 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/ganymede/ganymede.asset @@ -71,6 +71,7 @@ local GanymedeLabel = { GUI = { Name = "Ganymede Label", Path = "/Solar System/Planets/Jupiter/Major Moons/Ganymede", + Focusable = false, Description = "Label for Jupiter's moon Ganymede" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/ganymede/trail.asset b/data/assets/scene/solarsystem/planets/jupiter/ganymede/trail.asset index 7d9a810209..ce38b797d8 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/ganymede/trail.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/ganymede/trail.asset @@ -18,10 +18,16 @@ local GanymedeTrail = { Period = 172.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", "moonTrail_major_jupiter" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_jupiter", + "moonTrail_major_jupiter" + }, GUI = { Name = "Ganymede Trail", - Path = "/Solar System/Planets/Jupiter/Major Moons/Ganymede" + Path = "/Solar System/Planets/Jupiter/Major Moons/Ganymede", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/io/io.asset b/data/assets/scene/solarsystem/planets/jupiter/io/io.asset index 9fac665977..4ae1523109 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/io/io.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/io/io.asset @@ -71,6 +71,7 @@ local IoLabel = { GUI = { Name = "Io Label", Path = "/Solar System/Planets/Jupiter/Major Moons/Io", + Focusable = false, Description = "Label for Jupiter's moon Io" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/io/trail.asset b/data/assets/scene/solarsystem/planets/jupiter/io/trail.asset index cc58f52492..6281348acc 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/io/trail.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/io/trail.asset @@ -18,10 +18,16 @@ local IoTrail = { Period = 42.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_jupiter", "moonTrail_major_jupiter" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_jupiter", + "moonTrail_major_jupiter" + }, GUI = { Name = "Io Trail", - Path = "/Solar System/Planets/Jupiter/Major Moons/Io" + Path = "/Solar System/Planets/Jupiter/Major Moons/Io", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/jupiter.asset b/data/assets/scene/solarsystem/planets/jupiter/jupiter.asset index 5231ed1d1c..8c295811c9 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/jupiter.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/jupiter.asset @@ -60,7 +60,8 @@ local JupiterLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "Jupiter Label", - Path = "/Solar System/Planets/Jupiter" + Path = "/Solar System/Planets/Jupiter", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset index 7c6e31f410..608cc6bec0 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/ananke_group.asset @@ -57,7 +57,8 @@ local S2010J2Trail = { }, GUI = { Name = "S/2010 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2010J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2010J2", + Focusable = false } } @@ -88,6 +89,7 @@ local S2010J2Label = { GUI = { Name = "S/2010 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2010J2", + Focusable = false, Description = "Label for Jupiter's moon S/2010 J 2 (Ananke group)" } } @@ -144,7 +146,8 @@ local ThelxinoeTrail = { }, GUI = { Name = "Thelxinoe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thelxinoe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thelxinoe", + Focusable = false } } @@ -175,6 +178,7 @@ local ThelxinoeLabel = { GUI = { Name = "Thelxinoe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thelxinoe", + Focusable = false, Description = "Label for Jupiter's moon Thelxinoe (Ananke group)" } } @@ -231,7 +235,8 @@ local EuantheTrail = { }, GUI = { Name = "Euanthe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Euanthe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Euanthe", + Focusable = false } } @@ -262,6 +267,7 @@ local EuantheLabel = { GUI = { Name = "Euanthe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Euanthe", + Focusable = false, Description = "Label for Jupiter's moon Euanthe (Ananke group)" } } @@ -318,7 +324,8 @@ local IocasteTrail = { }, GUI = { Name = "Iocaste Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Iocaste" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Iocaste", + Focusable = false } } @@ -349,6 +356,7 @@ local IocasteLabel = { GUI = { Name = "Iocaste Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Iocaste", + Focusable = false, Description = "Label for Jupiter's moon Iocaste (Ananke group)" } } @@ -405,7 +413,8 @@ local S2003J16Trail = { }, GUI = { Name = "S/2003 J 16 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J16" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J16", + Focusable = false } } @@ -436,6 +445,7 @@ local S2003J16Label = { GUI = { Name = "S/2003 J 16 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J16", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 16 (Ananke group)" } } @@ -492,7 +502,8 @@ local PraxidikeTrail = { }, GUI = { Name = "Praxidike Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Praxidike" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Praxidike", + Focusable = false } } @@ -523,6 +534,7 @@ local PraxidikeLabel = { GUI = { Name = "Praxidike Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Praxidike", + Focusable = false, Description = "Label for Jupiter's moon Praxidike (Ananke group)" } } @@ -579,7 +591,8 @@ local HarpalykeTrail = { }, GUI = { Name = "Harpalyke Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Harpalyke" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Harpalyke", + Focusable = false } } @@ -610,6 +623,7 @@ local HarpalykeLabel = { GUI = { Name = "Harpalyke Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Harpalyke", + Focusable = false, Description = "Label for Jupiter's moon Harpalyke (Ananke group)" } } @@ -666,7 +680,8 @@ local MnemeTrail = { }, GUI = { Name = "Mneme Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Mneme" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Mneme", + Focusable = false } } @@ -697,6 +712,7 @@ local MnemeLabel = { GUI = { Name = "Mneme Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Mneme", + Focusable = false, Description = "Label for Jupiter's moon Mneme (Ananke group)" } } @@ -753,7 +769,8 @@ local HermippeTrail = { }, GUI = { Name = "Hermippe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Hermippe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Hermippe", + Focusable = false } } @@ -784,6 +801,7 @@ local HermippeLabel = { GUI = { Name = "Hermippe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Hermippe", + Focusable = false, Description = "Label for Jupiter's moon Hermippe (Ananke group)" } } @@ -840,7 +858,8 @@ local ThyoneTrail = { }, GUI = { Name = "Thyone Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thyone" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thyone", + Focusable = false } } @@ -871,6 +890,7 @@ local ThyoneLabel = { GUI = { Name = "Thyone Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Thyone", + Focusable = false, Description = "Label for Jupiter's moon Thyone (Ananke group)" } } @@ -927,7 +947,8 @@ local AnankeTrail = { }, GUI = { Name = "Ananke Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Ananke" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Ananke", + Focusable = false } } @@ -958,6 +979,7 @@ local AnankeLabel = { GUI = { Name = "Ananke Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Ananke", + Focusable = false, Description = "Label for Jupiter's moon Ananke (Ananke group)" } } @@ -1014,7 +1036,8 @@ local S2021J1Trail = { }, GUI = { Name = "S/2021 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J1", + Focusable = false } } @@ -1045,6 +1068,7 @@ local S2021J1Label = { GUI = { Name = "S/2021 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J1", + Focusable = false, Description = "Label for Jupiter's moon S/2021 J 1 (Ananke group)" } } @@ -1101,7 +1125,8 @@ local S2021J2Trail = { }, GUI = { Name = "S/2021 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J2", + Focusable = false } } @@ -1132,6 +1157,7 @@ local S2021J2Label = { GUI = { Name = "S/2021 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J2", + Focusable = false, Description = "Label for Jupiter's moon S/2021 J 2 (Ananke group)" } } @@ -1188,7 +1214,8 @@ local S2021J3Trail = { }, GUI = { Name = "S/2021 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J3", + Focusable = false } } @@ -1219,6 +1246,7 @@ local S2021J3Label = { GUI = { Name = "S/2021 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2021J3", + Focusable = false, Description = "Label for Jupiter's moon S/2021 J 3 (Ananke group)" } } @@ -1275,7 +1303,8 @@ local S2022J3Trail = { }, GUI = { Name = "S/2022 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2022J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2022J3", + Focusable = false } } @@ -1306,6 +1335,7 @@ local S2022J3Label = { GUI = { Name = "S/2022 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2022J3", + Focusable = false, Description = "Label for Jupiter's moon S/2022 J 3 (Ananke group)" } } @@ -1362,7 +1392,8 @@ local S2017J3Trail = { }, GUI = { Name = "S/2017 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J3", + Focusable = false } } @@ -1393,6 +1424,7 @@ local S2017J3Label = { GUI = { Name = "S/2017 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J3", + Focusable = false, Description = "Label for Jupiter's moon S/2017 J 3 (Ananke group)" } } @@ -1449,7 +1481,8 @@ local S2017J7Trail = { }, GUI = { Name = "S/2017 J 7 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J7" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J7", + Focusable = false } } @@ -1480,6 +1513,7 @@ local S2017J7Label = { GUI = { Name = "S/2017 J 7 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J7", + Focusable = false, Description = "Label for Jupiter's moon S/2017 J 7 (Ananke group)" } } @@ -1536,7 +1570,8 @@ local S2017J9Trail = { }, GUI = { Name = "S/2017 J 9 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J9" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J9", + Focusable = false } } @@ -1567,6 +1602,7 @@ local S2017J9Label = { GUI = { Name = "S/2017 J 9 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2017J9", + Focusable = false, Description = "Label for Jupiter's moon S/2017 J 9 (Ananke group)" } } @@ -1623,7 +1659,8 @@ local S2003J2Trail = { }, GUI = { Name = "S/2003 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J2", + Focusable = false } } @@ -1654,6 +1691,7 @@ local S2003J2Label = { GUI = { Name = "S/2003 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J2", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 2 (Ananke group)" } } @@ -1710,7 +1748,8 @@ local S2003J12Trail = { }, GUI = { Name = "S/2003 J 12 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J12" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J12", + Focusable = false } } @@ -1741,6 +1780,7 @@ local S2003J12Label = { GUI = { Name = "S/2003 J 12 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J12", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 12 (Ananke group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset index a4d05d4632..467b396527 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/carme_group.asset @@ -57,7 +57,8 @@ local HerseTrail = { }, GUI = { Name = "Herse Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Herse" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Herse", + Focusable = false } } @@ -88,6 +89,7 @@ local HerseLabel = { GUI = { Name = "Herse Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Herse", + Focusable = false, Description = "Label for Jupiter's moon Herse (Carme group)" } } @@ -144,7 +146,8 @@ local AitneTrail = { }, GUI = { Name = "Aitne Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Aitne" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Aitne", + Focusable = false } } @@ -175,6 +178,7 @@ local AitneLabel = { GUI = { Name = "Aitne Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Aitne", + Focusable = false, Description = "Label for Jupiter's moon Aitne (Carme group)" } } @@ -231,7 +235,8 @@ local KaleTrail = { }, GUI = { Name = "Kale Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kale" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kale", + Focusable = false } } @@ -262,6 +267,7 @@ local KaleLabel = { GUI = { Name = "Kale Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kale", + Focusable = false, Description = "Label for Jupiter's moon Kale (Carme group)" } } @@ -318,7 +324,8 @@ local TaygeteTrail = { }, GUI = { Name = "Taygete Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Taygete" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Taygete", + Focusable = false } } @@ -349,6 +356,7 @@ local TaygeteLabel = { GUI = { Name = "Taygete Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Taygete", + Focusable = false, Description = "Label for Jupiter's moon Taygete (Carme group)" } } @@ -405,7 +413,8 @@ local ChaldeneTrail = { }, GUI = { Name = "Chaldene Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Chaldene" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Chaldene", + Focusable = false } } @@ -436,6 +445,7 @@ local ChaldeneLabel = { GUI = { Name = "Chaldene Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Chaldene", + Focusable = false, Description = "Label for Jupiter's moon Chaldene (Carme group)" } } @@ -492,7 +502,8 @@ local ErinomeTrail = { }, GUI = { Name = "Erinome Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Erinome" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Erinome", + Focusable = false } } @@ -523,6 +534,7 @@ local ErinomeLabel = { GUI = { Name = "Erinome Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Erinome", + Focusable = false, Description = "Label for Jupiter's moon Erinome (Carme group)" } } @@ -579,7 +591,8 @@ local KallichoreTrail = { }, GUI = { Name = "Kallichore Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kallichore" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kallichore", + Focusable = false } } @@ -610,6 +623,7 @@ local KallichoreLabel = { GUI = { Name = "Kallichore Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kallichore", + Focusable = false, Description = "Label for Jupiter's moon Kallichore (Carme group)" } } @@ -666,7 +680,8 @@ local KalykeTrail = { }, GUI = { Name = "Kalyke Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kalyke" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kalyke", + Focusable = false } } @@ -697,6 +712,7 @@ local KalykeLabel = { GUI = { Name = "Kalyke Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Kalyke", + Focusable = false, Description = "Label for Jupiter's moon Kalyke (Carme group)" } } @@ -753,7 +769,8 @@ local PasitheeTrail = { }, GUI = { Name = "Pasithee Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Pasithee" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Pasithee", + Focusable = false } } @@ -784,6 +801,7 @@ local PasitheeLabel = { GUI = { Name = "Pasithee Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Pasithee", + Focusable = false, Description = "Label for Jupiter's moon Pasithee (Carme group)" } } @@ -840,7 +858,8 @@ local S2010J1Trail = { }, GUI = { Name = "S/2010 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2010J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2010J1", + Focusable = false } } @@ -871,6 +890,7 @@ local S2010J1Label = { GUI = { Name = "S/2010 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2010J1", + Focusable = false, Description = "Label for Jupiter's moon S2010J1 (Carme group)" } } @@ -927,7 +947,8 @@ local EukeladeTrail = { }, GUI = { Name = "Eukelade Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Eukelade" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Eukelade", + Focusable = false } } @@ -958,6 +979,7 @@ local EukeladeLabel = { GUI = { Name = "Eukelade Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Eukelade", + Focusable = false, Description = "Label for Jupiter's moon Eukelade (Carme group)" } } @@ -1014,7 +1036,8 @@ local ArcheTrail = { }, GUI = { Name = "Arche Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Arche" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Arche", + Focusable = false } } @@ -1045,6 +1068,7 @@ local ArcheLabel = { GUI = { Name = "Arche Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Arche", + Focusable = false, Description = "Label for Jupiter's moon Arche (Carme group)" } } @@ -1101,7 +1125,8 @@ local IsonoeTrail = { }, GUI = { Name = "Isonoe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Isonoe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Isonoe, + Focusable = false" } } @@ -1132,6 +1157,7 @@ local IsonoeLabel = { GUI = { Name = "Isonoe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Isonoe", + Focusable = false, Description = "Label for Jupiter's moon Isonoe (Carme group)" } } @@ -1188,7 +1214,8 @@ local CarmeTrail = { }, GUI = { Name = "Carme Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Carme" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Carme", + Focusable = false } } @@ -1219,6 +1246,7 @@ local CarmeLabel = { GUI = { Name = "Carme Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/Carme", + Focusable = false, Description = "Label for Jupiter's moon Carme (Carme group)" } } @@ -1275,7 +1303,8 @@ local S2003J5Trail = { }, GUI = { Name = "S/2003 J 5 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J5" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J5", + Focusable = false } } @@ -1306,6 +1335,7 @@ local S2003J5Label = { GUI = { Name = "S/2003 J 5 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J5", + Focusable = false, Description = "Label for Jupiter's moon S2003J5 (Carme group)" } } @@ -1362,7 +1392,8 @@ local S2018J3Trail = { }, GUI = { Name = "S/2018 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2018J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2018J3", + Focusable = false } } @@ -1393,6 +1424,7 @@ local S2018J3Label = { GUI = { Name = "S/2018 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2018J3", + Focusable = false, Description = "Label for Jupiter's moon S2018J3 (Carme group)" } } @@ -1449,7 +1481,8 @@ local S2021J4Trail = { }, GUI = { Name = "S/2021 J 4 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J4" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J4", + Focusable = false } } @@ -1480,6 +1513,7 @@ local S2021J4Label = { GUI = { Name = "S/2021 J 4 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J4", + Focusable = false, Description = "Label for Jupiter's moon S2021J4 (Carme group)" } } @@ -1536,7 +1570,8 @@ local S2021J5Trail = { }, GUI = { Name = "S/2021 J 5 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J5" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J5", + Focusable = false } } @@ -1567,6 +1602,7 @@ local S2021J5Label = { GUI = { Name = "S/2021 J 5 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J5", + Focusable = false, Description = "Label for Jupiter's moon S2021J5 (Carme group)" } } @@ -1623,7 +1659,8 @@ local S2021J6Trail = { }, GUI = { Name = "S/2021 J 6 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J6" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J6", + Focusable = false } } @@ -1654,6 +1691,7 @@ local S2021J6Label = { GUI = { Name = "S/2021 J 6 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2021J6", + Focusable = false, Description = "Label for Jupiter's moon S2021J6 (Carme group)" } } @@ -1710,7 +1748,8 @@ local S2016J3Trail = { }, GUI = { Name = "S/2016 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2016J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2016J3", + Focusable = false } } @@ -1741,6 +1780,7 @@ local S2016J3Label = { GUI = { Name = "S/2016 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2016J3", + Focusable = false, Description = "Label for Jupiter's moon S2016J3 (Carme group)" } } @@ -1797,7 +1837,8 @@ local S2022J1Trail = { }, GUI = { Name = "S/2022 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J1", + Focusable = false } } @@ -1828,6 +1869,7 @@ local S2022J1Label = { GUI = { Name = "S/2022 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J1", + Focusable = false, Description = "Label for Jupiter's moon S2022J1 (Carme group)" } } @@ -1884,7 +1926,8 @@ local S2022J2Trail = { }, GUI = { Name = "S/2022 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J2", + Focusable = false } } @@ -1915,6 +1958,7 @@ local S2022J2Label = { GUI = { Name = "S/2022 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2022J2", + Focusable = false, Description = "Label for Jupiter's moon S2022J2 (Carme group)" } } @@ -1971,7 +2015,8 @@ local S2017J2Trail = { }, GUI = { Name = "S/2017 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J2", + Focusable = false } } @@ -2002,6 +2047,7 @@ local S2017J2Label = { GUI = { Name = "S/2017 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J2", + Focusable = false, Description = "Label for Jupiter's moon S2017J2 (Carme group)" } } @@ -2058,7 +2104,8 @@ local S2017J5Trail = { }, GUI = { Name = "S/2017 J 5 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J5" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J5", + Focusable = false } } @@ -2089,6 +2136,7 @@ local S2017J5Label = { GUI = { Name = "S/2017 J 5 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J5", + Focusable = false, Description = "Label for Jupiter's moon S2017J5 (Carme group)" } } @@ -2145,7 +2193,8 @@ local S2017J8Trail = { }, GUI = { Name = "S/2017 J 8 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J8" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J8", + Focusable = false } } @@ -2176,6 +2225,7 @@ local S2017J8Label = { GUI = { Name = "S/2017 J 8 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2017J8", + Focusable = false, Description = "Label for Jupiter's moon S2017J8 (Carme group)" } } @@ -2232,7 +2282,8 @@ local S2011J1Trail = { }, GUI = { Name = "S/2011 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2011J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2011J1", + Focusable = false } } @@ -2263,6 +2314,7 @@ local S2011J1Label = { GUI = { Name = "S/2011 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2011J1", + Focusable = false, Description = "Label for Jupiter's moon S2011J1 (Carme group)" } } @@ -2319,7 +2371,8 @@ local S2003J9Trail = { }, GUI = { Name = "S/2003 J 9 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J9" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J9", + Focusable = false } } @@ -2350,6 +2403,7 @@ local S2003J9Label = { GUI = { Name = "S/2003 J 9 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J9", + Focusable = false, Description = "Label for Jupiter's moon S2003J9 (Carme group)" } } @@ -2406,7 +2460,8 @@ local S2003J10Trail = { }, GUI = { Name = "S/2003 J 10 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J10" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J10", + Focusable = false } } @@ -2437,6 +2492,7 @@ local S2003J10Label = { GUI = { Name = "S/2003 J 10 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carme Group/S2003J10", + Focusable = false, Description = "Label for Jupiter's moon S2003J10 (Carme group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset index 78b8c10e45..c17e5be2f0 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/carpo_group.asset @@ -57,7 +57,8 @@ local CarpoTrail = { }, GUI = { Name = "Carpo Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/Carpo" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/Carpo", + Focusable = false } } @@ -88,6 +89,7 @@ local CarpoLabel = { GUI = { Name = "Carpo Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/Carpo", + Focusable = false, Description = "Label for Jupiter's moon Carpo (Carpo group)" } } @@ -119,6 +121,7 @@ local CarpoLabelNear = { GUI = { Name = "Carpo Label (Near)", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/Carpo", + Focusable = false, Description = "Transitional Label for close-range viewing of Carpo (Carpo group)" } } @@ -175,7 +178,8 @@ local S2018J4Trail = { }, GUI = { Name = "S/2018 J 4 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/S2018J4" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/S2018J4", + Focusable = false } } @@ -206,6 +210,7 @@ local S2018J4Label = { GUI = { Name = "S/2018 J 4 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/S2018J4", + Focusable = false, Description = "Label for Jupiter's moon S2018J4 (Carpo group)" } } @@ -237,6 +242,7 @@ local S2018J4LabelNear = { GUI = { Name = "S2018J4 Label (Near)", Path = "/Solar System/Planets/Jupiter/Minor Moons/Carpo Group/S2018J4", + Focusable = false, Description = "Transitional Label for close-range viewing of S2018J4 (Carpo group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset index cdbb1c3fb9..7d4c46380d 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/himalia_group.asset @@ -57,7 +57,8 @@ local LedaTrail = { }, GUI = { Name = "Leda Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Leda" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Leda", + Focusable = false } } @@ -88,6 +89,7 @@ local LedaLabel = { GUI = { Name = "Leda Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Leda", + Focusable = false, Description = "Label for Jupiter's moon Leda (Himalia group)" } } @@ -144,7 +146,8 @@ local HimaliaTrail = { }, GUI = { Name = "Himalia Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Himalia" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Himalia", + Focusable = false } } @@ -175,6 +178,7 @@ local HimaliaLabel = { GUI = { Name = "Himalia Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Himalia", + Focusable = false, Description = "Label for Jupiter's moon Himalia (Himalia group)" } } @@ -231,7 +235,8 @@ local LysitheaTrail = { }, GUI = { Name = "Lysithea Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Lysithea" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Lysithea", + Focusable = false } } @@ -262,6 +267,7 @@ local LysitheaLabel = { GUI = { Name = "Lysithea Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Lysithea", + Focusable = false, Description = "Label for Jupiter's moon Lysithea (Himalia group)" } } @@ -318,7 +324,8 @@ local ElaraTrail = { }, GUI = { Name = "Elara Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Elara" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Elara", + Focusable = false } } @@ -349,6 +356,7 @@ local ElaraLabel = { GUI = { Name = "Elara Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Elara", + Focusable = false, Description = "Label for Jupiter's moon Elara (Himalia group)" } } @@ -405,7 +413,8 @@ local DiaTrail = { }, GUI = { Name = "Dia Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Dia" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Dia", + Focusable = false } } @@ -436,6 +445,7 @@ local DiaLabel = { GUI = { Name = "Dia Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Dia", + Focusable = false, Description = "Label for Jupiter's moon Dia (Himalia group)" } } @@ -492,7 +502,8 @@ local S2011J3Trail = { }, GUI = { Name = "S/2011 J 3 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2011J3" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2011J3", + Focusable = false } } @@ -523,6 +534,7 @@ local S2011J3Label = { GUI = { Name = "S/2011 J 3 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2011J3", + Focusable = false, Description = "Label for Jupiter's moon S2011J3 (Himalia group)" } } @@ -579,7 +591,8 @@ local S2018J2Trail = { }, GUI = { Name = "S/2018 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2018J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2018J2", + Focusable = false } } @@ -610,6 +623,7 @@ local S2018J2Label = { GUI = { Name = "S/2018 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/S2018J2", + Focusable = false, Description = "Label for Jupiter's moon S2018J2 (Himalia group)" } } @@ -666,7 +680,8 @@ local PandiaTrail = { }, GUI = { Name = "Pandia Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Pandia" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Pandia", + Focusable = false } } @@ -697,6 +712,7 @@ local PandiaLabel = { GUI = { Name = "Pandia Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Pandia", + Focusable = false, Description = "Label for Jupiter's moon Pandia (Himalia group)" } } @@ -753,7 +769,8 @@ local ErsaTrail = { }, GUI = { Name = "Ersa Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Ersa" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Ersa", + Focusable = false } } @@ -784,6 +801,7 @@ local ErsaLabel = { GUI = { Name = "Ersa Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Himalia Group/Ersa", + Focusable = false, Description = "Label for Jupiter's moon Ersa (Himalia group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset index a582070c4f..f885f6cf3c 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/inner_group.asset @@ -56,7 +56,8 @@ local MetisTrail = { }, GUI = { Name = "Metis Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Metis" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Metis", + Focusable = false } } @@ -87,6 +88,7 @@ local MetisLabel = { GUI = { Name = "Metis Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Metis", + Focusable = false, Description = "Label for Jupiter's moon Metis (inner group)" } } @@ -143,7 +145,8 @@ local AdrasteaTrail = { }, GUI = { Name = "Adrastea Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Adrastea" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Adrastea", + Focusable = false } } @@ -174,6 +177,7 @@ local AdrasteaLabel = { GUI = { Name = "Adrastea Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Adrastea", + Focusable = false, Description = "Label for Jupiter's moon Adrastea (inner group)" } } @@ -230,7 +234,8 @@ local AmaltheaTrail = { }, GUI = { Name = "Amalthea Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Amalthea" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Amalthea", + Focusable = false } } @@ -261,6 +266,7 @@ local AmaltheaLabel = { GUI = { Name = "Amalthea Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Amalthea", + Focusable = false, Description = "Label for Jupiter's moon Amalthea (inner group)" } } @@ -317,7 +323,8 @@ local ThebeTrail = { }, GUI = { Name = "Thebe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Thebe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Thebe", + Focusable = false } } @@ -348,6 +355,7 @@ local ThebeLabel = { GUI = { Name = "Thebe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Inner Group/Thebe", + Focusable = false, Description = "Label for Jupiter's moon Thebe (inner group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset index f2d49dc414..9033957fdf 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/other_groups.asset @@ -56,7 +56,8 @@ local EuphemeTrail = { }, GUI = { Name = "Eupheme Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Other Group/Eupheme" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Other Group/Eupheme", + Focusable = false } } @@ -87,6 +88,7 @@ local EuphemeLabel = { GUI = { Name = "Eupheme Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Other Group/Eupheme", + Focusable = false, Description = "Label for Jupiter's moon Eupheme (other group)" } } @@ -143,7 +145,8 @@ local S2003J19Trail = { }, GUI = { Name = "S/2003 J 19 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J19" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J19", + Focusable = false } } @@ -174,6 +177,7 @@ local S2003J19Label = { GUI = { Name = "S/2003 J 19 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/S2003J19", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 19 (other group)" } } @@ -230,7 +234,8 @@ local ValetudoTrail = { }, GUI = { Name = "Valetudo Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Valetudo" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Valetudo", + Focusable = false } } @@ -261,6 +266,7 @@ local ValetudoLabel = { GUI = { Name = "Valetudo Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Ananke Group/Valetudo", + Focusable = false, Description = "Label for Jupiter's moon Valetudo (other group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset index e31425a8f2..e98b1acde2 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/pasiphae_group.asset @@ -57,7 +57,8 @@ local EuporieTrail = { }, GUI = { Name = "Euporie Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Euporie" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Euporie", + Focusable = false } } @@ -88,6 +89,7 @@ local EuporieLabel = { GUI = { Name = "Euporie Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Euporie", + Focusable = false, Description = "Label for Jupiter's moon Euporie (Pasiphae group)" } } @@ -144,7 +146,8 @@ local S2003J18Trail = { }, GUI = { Name = "S/2003 J 18 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J18" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J18", + Focusable = false } } @@ -175,6 +178,7 @@ local S2003J18Label = { GUI = { Name = "S/2003 J 18 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J18", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 18 (Pasiphae group)" } } @@ -231,7 +235,8 @@ local HelikeTrail = { }, GUI = { Name = "Helike Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Helike" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Helike", + Focusable = false } } @@ -262,6 +267,7 @@ local HelikeLabel = { GUI = { Name = "Helike Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Helike", + Focusable = false, Description = "Label for Jupiter's moon Helike (Pasiphae group)" } } @@ -318,7 +324,8 @@ local OrthosieTrail = { }, GUI = { Name = "Orthosie Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Orthosie" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Orthosie", + Focusable = false } } @@ -349,6 +356,7 @@ local OrthosieLabel = { GUI = { Name = "Orthosie Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Orthosie", + Focusable = false, Description = "Label for Jupiter's moon Orthosie (Pasiphae group)" } } @@ -405,7 +413,8 @@ local S2016J1Trail = { }, GUI = { Name = "S/2016 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J1", + Focusable = false } } @@ -436,6 +445,7 @@ local S2016J1Label = { GUI = { Name = "S/2016 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J1", + Focusable = false, Description = "Label for Jupiter's moon S/2016 J 1 (Pasiphae group)" } } @@ -492,7 +502,8 @@ local S2003J15Trail = { }, GUI = { Name = "S/2003 J 15 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J15" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J15", + Focusable = false } } @@ -523,6 +534,7 @@ local S2003J15Label = { GUI = { Name = "S/2003 J 15 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J15", + Focusable = false, Description = "Label for Jupiter's moon OrthosiS/2003 J 15e (Pasiphae group)" } } @@ -579,7 +591,8 @@ local AoedeTrail = { }, GUI = { Name = "Aoede Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Aoede" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Aoede", + Focusable = false } } @@ -610,6 +623,7 @@ local AoedeLabel = { GUI = { Name = "Aoede Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Aoede", + Focusable = false, Description = "Label for Jupiter's moon Aoede (Pasiphae group)" } } @@ -666,7 +680,8 @@ local CallirrhoeTrail = { }, GUI = { Name = "Callirrhoe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Callirrhoe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Callirrhoe", + Focusable = false } } @@ -697,6 +712,7 @@ local CallirrhoeLabel = { GUI = { Name = "Callirrhoe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Callirrhoe", + Focusable = false, Description = "Label for Jupiter's moon Callirrhoe (Pasiphae group)" } } @@ -753,7 +769,8 @@ local EurydomeTrail = { }, GUI = { Name = "Eurydome Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Eurydome" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Eurydome", + Focusable = false } } @@ -784,6 +801,7 @@ local EurydomeLabel = { GUI = { Name = "Eurydome Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Eurydome", + Focusable = false, Description = "Label for Jupiter's moon Eurydome (Pasiphae group)" } } @@ -840,7 +858,8 @@ local KoreTrail = { }, GUI = { Name = "Kore Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Kore" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Kore", + Focusable = false } } @@ -871,6 +890,7 @@ local KoreLabel = { GUI = { Name = "Kore Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Kore", + Focusable = false, Description = "Label for Jupiter's moon Kore (Pasiphae group)" } } @@ -927,7 +947,8 @@ local CylleneTrail = { }, GUI = { Name = "Cyllene Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Cyllene" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Cyllene", + Focusable = false } } @@ -958,6 +979,7 @@ local CylleneLabel = { GUI = { Name = "Cyllene Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Cyllene", + Focusable = false, Description = "Label for Jupiter's moon Cyllene (Pasiphae group)" } } @@ -1014,7 +1036,8 @@ local S2011J2Trail = { }, GUI = { Name = "S/2011 J 2 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2011J2" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2011J2", + Focusable = false } } @@ -1045,6 +1068,7 @@ local S2011J2Label = { GUI = { Name = "S/2011 J 2 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2011J2", + Focusable = false, Description = "Label for Jupiter's moon S/2011 J 2 (Pasiphae group)" } } @@ -1101,7 +1125,8 @@ local S2017J1Trail = { }, GUI = { Name = "S/2017 J 1 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J1" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J1", + Focusable = false } } @@ -1132,6 +1157,7 @@ local S2017J1Label = { GUI = { Name = "S/2017 J 1 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J1", + Focusable = false, Description = "Label for Jupiter's moon S/2017 J 1 (Pasiphae group)" } } @@ -1188,7 +1214,8 @@ local S2003J4Trail = { }, GUI = { Name = "S/2003 J 4 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J4" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J4", + Focusable = false } } @@ -1219,6 +1246,7 @@ local S2003J4Label = { GUI = { Name = "S/2003 J 4 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J4", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 4 (Pasiphae group)" } } @@ -1275,7 +1303,8 @@ local PasiphaeTrail = { }, GUI = { Name = "Pasiphae Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Pasiphae" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Pasiphae", + Focusable = false } } @@ -1306,6 +1335,7 @@ local PasiphaeLabel = { GUI = { Name = "Pasiphae Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Pasiphae", + Focusable = false, Description = "Label for Jupiter's moon Pasiphae (Pasiphae group)" } } @@ -1362,7 +1392,8 @@ local HegemoneTrail = { }, GUI = { Name = "Hegemone Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Hegemone" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Hegemone", + Focusable = false } } @@ -1393,6 +1424,7 @@ local HegemoneLabel = { GUI = { Name = "Hegemone Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Hegemone", + Focusable = false, Description = "Label for Jupiter's moon Hegemone (Pasiphae group)" } } @@ -1449,7 +1481,8 @@ local SinopeTrail = { }, GUI = { Name = "Sinope Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sinope" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sinope", + Focusable = false } } @@ -1480,6 +1513,7 @@ local SinopeLabel = { GUI = { Name = "Sinope Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sinope", + Focusable = false, Description = "Label for Jupiter's moon Sinope (Pasiphae group)" } } @@ -1536,7 +1570,8 @@ local SpondeTrail = { }, GUI = { Name = "Sponde Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sponde" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sponde", + Focusable = false } } @@ -1567,6 +1602,7 @@ local SpondeLabel = { GUI = { Name = "Sponde Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Sponde", + Focusable = false, Description = "Label for Jupiter's moon Sponde (Pasiphae group)" } } @@ -1623,7 +1659,8 @@ local AutonoeTrail = { }, GUI = { Name = "Autonoe Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Autonoe" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Autonoe", + Focusable = false } } @@ -1654,6 +1691,7 @@ local AutonoeLabel = { GUI = { Name = "Autonoe Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Autonoe", + Focusable = false, Description = "Label for Jupiter's moon Autonoe (Pasiphae group)" } } @@ -1710,7 +1748,8 @@ local MegacliteTrail = { }, GUI = { Name = "Megaclite Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Megaclite" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Megaclite", + Focusable = false } } @@ -1741,6 +1780,7 @@ local MegacliteLabel = { GUI = { Name = "Megaclite Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/Megaclite", + Focusable = false, Description = "Label for Jupiter's moon Megaclite (Pasiphae group)" } } @@ -1797,7 +1837,8 @@ local S2016J4Trail = { }, GUI = { Name = "S/2016 J 4 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J4" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J4", + Focusable = false } } @@ -1828,6 +1869,7 @@ local S2016J4Label = { GUI = { Name = "S/2016 J 4 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2016J4", + Focusable = false, Description = "Label for Jupiter's moon S/2016 J 4 (Pasiphae group)" } } @@ -1884,7 +1926,8 @@ local S2017J6Trail = { }, GUI = { Name = "S/2017 J 6 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J6" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J6", + Focusable = false } } @@ -1915,6 +1958,7 @@ local S2017J6Label = { GUI = { Name = "S/2017 J 6 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2017J6", + Focusable = false, Description = "Label for Jupiter's moon S/2017 J 6 (Pasiphae group)" } } @@ -1971,7 +2015,8 @@ local S2003J23Trail = { }, GUI = { Name = "S/2003 J 23 Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J23" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J23", + Focusable = false } } @@ -2002,6 +2047,7 @@ local S2003J23Label = { GUI = { Name = "S/2003 J 23 Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Pasiphae Group/S2003J23", + Focusable = false, Description = "Label for Jupiter's moon S/2003 J 23 (Pasiphae group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset b/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset index d353185aee..0c533b6860 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/minor/themisto_group.asset @@ -56,7 +56,8 @@ local ThemistoTrail = { }, GUI = { Name = "Themisto Trail", - Path = "/Solar System/Planets/Jupiter/Minor Moons/Themisto Group/Themisto" + Path = "/Solar System/Planets/Jupiter/Minor Moons/Themisto Group/Themisto", + Focusable = false } } @@ -87,6 +88,7 @@ local ThemistoLabel = { GUI = { Name = "Themisto Label", Path = "/Solar System/Planets/Jupiter/Minor Moons/Themisto Group/Themisto", + Focusable = false, Description = "Label for Jupiter's moon Themisto (Themisto group)" } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/trail.asset b/data/assets/scene/solarsystem/planets/jupiter/trail.asset index 45c8633c63..dbe739106a 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/trail.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/trail.asset @@ -20,7 +20,8 @@ local JupiterTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_giants" }, GUI = { Name = "Jupiter Trail", - Path = "/Solar System/Planets/Jupiter" + Path = "/Solar System/Planets/Jupiter", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/jupiter/trail_barycenter.asset index d480d1a503..aa08f555b5 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/trail_barycenter.asset @@ -21,7 +21,8 @@ local JupiterBarycenterTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_giants" }, GUI = { Name = "Jupiter Barycenter Trail", - Path = "/Solar System/Planets/Jupiter" + Path = "/Solar System/Planets/Jupiter", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/trail_earth.asset b/data/assets/scene/solarsystem/planets/jupiter/trail_earth.asset index ece03e2ec5..c318d51bc3 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/trail_earth.asset @@ -22,7 +22,8 @@ local JupiterTrailEarth = { Tag = { "planetTrail_solarSystem_alt", "planetTrail_terrestrial_alt" }, GUI = { Name = "Jupiter trail from Earth", - Path = "/Solar System/Planets/Jupiter" + Path = "/Solar System/Planets/Jupiter", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/jupiter/transforms.asset b/data/assets/scene/solarsystem/planets/jupiter/transforms.asset index 77636066a9..6eb644cd21 100644 --- a/data/assets/scene/solarsystem/planets/jupiter/transforms.asset +++ b/data/assets/scene/solarsystem/planets/jupiter/transforms.asset @@ -16,6 +16,7 @@ local JupiterBarycenter = { GUI = { Name = "Jupiter Barycenter", Path = "/Solar System/Planets/Jupiter", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/mars/atmosphere.asset b/data/assets/scene/solarsystem/planets/mars/atmosphere.asset index d66b766f24..f93d6fa3c2 100644 --- a/data/assets/scene/solarsystem/planets/mars/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/mars/atmosphere.asset @@ -3,53 +3,54 @@ local transforms = asset.require("./mars") local Atmosphere = { - Identifier = "MarsAtmosphere", - Parent = transforms.Mars.Identifier, - Renderable = { - Type = "RenderableAtmosphere", - -- Atmosphere radius in Km - AtmosphereHeight = 3463.17495 - 3386.190, - PlanetRadius = 3386.190, - PlanetAverageGroundReflectance = 0.1, - GroundRadianceEmission = 0.37, - SunIntensity = 13.1, - MieScatteringExtinctionPropCoefficient = 0.23862, - Rayleigh = { - Coefficients = { - -- Wavelengths are given in 10^-9m - Wavelengths = { 680, 550, 440 }, - -- Reflection coefficients are given in km^-1 - Scattering = { 0.019918, 0.01357, 0.00575 } - -- In Rayleigh scattering, the coefficients of - -- absorption and scattering are the same. - }, - -- Thickness of atmosphere if its density were uniform, in Km - H_R = 10.43979 + Identifier = "MarsAtmosphere", + Parent = transforms.Mars.Identifier, + Renderable = { + Type = "RenderableAtmosphere", + -- Atmosphere radius in Km + AtmosphereHeight = 3463.17495 - 3386.190, + PlanetRadius = 3386.190, + PlanetAverageGroundReflectance = 0.1, + GroundRadianceEmission = 0.37, + SunIntensity = 13.1, + MieScatteringExtinctionPropCoefficient = 0.23862, + Rayleigh = { + Coefficients = { + -- Wavelengths are given in 10^-9m + Wavelengths = { 680, 550, 440 }, + -- Reflection coefficients are given in km^-1 + Scattering = { 0.019918, 0.01357, 0.00575 } + -- In Rayleigh scattering, the coefficients of + -- absorption and scattering are the same. }, - -- Default - Mie = { - Coefficients = { - -- Reflection coefficients are given in km^-1 - Scattering = { 0.05361771, 0.05361771, 0.05361771 }, - -- Extinction coefficients are a fraction of the Scattering coefficients - Extinction = { 0.05361771 / 0.98979, 0.05361771 / 0.98979, 0.05361771 / 0.98979 } - }, - -- Mie Height scale (atmosphere thickness for constant density) in Km - H_M = 3.09526, - -- Mie Phase Function Value (G e [-1.0, 1.0]. - -- If G = 1.0, Mie phase function = Rayleigh Phase Function) - G = 0.85 - }, - Debug = { - PreCalculatedTextureScale = 1.0, - SaveCalculatedTextures = false - } + -- Thickness of atmosphere if its density were uniform, in Km + H_R = 10.43979 }, - GUI = { - Name = "Mars Atmosphere", - Path = "/Solar System/Planets/Mars", - Description = "Atmosphere of Mars" + -- Default + Mie = { + Coefficients = { + -- Reflection coefficients are given in km^-1 + Scattering = { 0.05361771, 0.05361771, 0.05361771 }, + -- Extinction coefficients are a fraction of the Scattering coefficients + Extinction = { 0.05361771 / 0.98979, 0.05361771 / 0.98979, 0.05361771 / 0.98979 } + }, + -- Mie Height scale (atmosphere thickness for constant density) in Km + H_M = 3.09526, + -- Mie Phase Function Value (G e [-1.0, 1.0]. + -- If G = 1.0, Mie phase function = Rayleigh Phase Function) + G = 0.85 + }, + Debug = { + PreCalculatedTextureScale = 1.0, + SaveCalculatedTextures = false } + }, + GUI = { + Name = "Mars Atmosphere", + Path = "/Solar System/Planets/Mars", + Focusable = false, + Description = "Atmosphere of Mars" + } } diff --git a/data/assets/scene/solarsystem/planets/mars/mars.asset b/data/assets/scene/solarsystem/planets/mars/mars.asset index f6b0ecf0e9..944eff00ee 100644 --- a/data/assets/scene/solarsystem/planets/mars/mars.asset +++ b/data/assets/scene/solarsystem/planets/mars/mars.asset @@ -81,6 +81,7 @@ local MarsLabel = { GUI = { Name = "Mars Label", Path = "/Solar System/Planets/Mars", + Focusable = false, Description = "Main label for Mars" } } diff --git a/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset b/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset index e35ac1c93d..9c19dbe128 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/deimos.asset @@ -68,6 +68,7 @@ local DeimosTrail = { GUI = { Name = "Deimos Trail", Path = "/Solar System/Planets/Mars/Moons/Deimos", + Focusable = false, Description = "Trail for Deimos" } } @@ -93,6 +94,7 @@ local DeimosLabel = { GUI = { Name = "Deimos Label", Path = "/Solar System/Planets/Mars/Moons/Deimos", + Focusable = false, Description = "Label for Mars' moon Deimos" } } diff --git a/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset b/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset index 8babafe4ea..e5caa8676b 100644 --- a/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset +++ b/data/assets/scene/solarsystem/planets/mars/moons/phobos.asset @@ -68,6 +68,7 @@ local PhobosTrail = { GUI = { Name = "Phobos Trail", Path = "/Solar System/Planets/Mars/Moons/Phobos", + Focusable = false, Description = "Trail for Phobos" } } @@ -93,6 +94,7 @@ local PhobosLabel = { GUI = { Name = "Phobos Label", Path = "/Solar System/Planets/Mars/Moons/Phobos", + Focusable = false, Description = "Label for Mars' moon Phobos" } } diff --git a/data/assets/scene/solarsystem/planets/mars/trail.asset b/data/assets/scene/solarsystem/planets/mars/trail.asset index 1a602c1dcb..db1001d11e 100644 --- a/data/assets/scene/solarsystem/planets/mars/trail.asset +++ b/data/assets/scene/solarsystem/planets/mars/trail.asset @@ -21,6 +21,7 @@ local MarsTrail = { GUI = { Name = "Mars Trail", Path = "/Solar System/Planets/Mars", + Focusable = false, Description = "Trail of Mars as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/mars/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/mars/trail_barycenter.asset index c997945b12..ba704fdb4c 100644 --- a/data/assets/scene/solarsystem/planets/mars/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/mars/trail_barycenter.asset @@ -22,6 +22,7 @@ local MarsBarycenterTrail = { GUI = { Name = "Mars Barycenter Trail", Path = "/Solar System/Planets/Mars", + Focusable = false, Description = "Trail of Mars' Barycenter as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/mars/trail_earth.asset b/data/assets/scene/solarsystem/planets/mars/trail_earth.asset index be2f3923e3..28001301c7 100644 --- a/data/assets/scene/solarsystem/planets/mars/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/mars/trail_earth.asset @@ -22,6 +22,7 @@ local MarsTrailEarth = { GUI = { Name = "Mars trail from Earth", Path = "/Solar System/Planets/Mars", + Focusable = false, Description = "Trail of Mars as observed by the Earth" } } diff --git a/data/assets/scene/solarsystem/planets/mars/transforms.asset b/data/assets/scene/solarsystem/planets/mars/transforms.asset index 8af3239f34..7e0fd4661a 100644 --- a/data/assets/scene/solarsystem/planets/mars/transforms.asset +++ b/data/assets/scene/solarsystem/planets/mars/transforms.asset @@ -16,6 +16,7 @@ local MarsBarycenter = { GUI = { Name = "Mars Barycenter", Path = "/Solar System/Planets/Mars", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/mercury/mercury.asset b/data/assets/scene/solarsystem/planets/mercury/mercury.asset index 4b036cf6d0..ad9a510cd6 100644 --- a/data/assets/scene/solarsystem/planets/mercury/mercury.asset +++ b/data/assets/scene/solarsystem/planets/mercury/mercury.asset @@ -70,7 +70,8 @@ local MercuryLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "Mercury Label", - Path = "/Solar System/Planets/Mercury" + Path = "/Solar System/Planets/Mercury", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/mercury/trail.asset b/data/assets/scene/solarsystem/planets/mercury/trail.asset index 6f24cac77f..f773c9ecbf 100644 --- a/data/assets/scene/solarsystem/planets/mercury/trail.asset +++ b/data/assets/scene/solarsystem/planets/mercury/trail.asset @@ -21,6 +21,7 @@ local MercuryTrail = { GUI = { Name = "Mercury Trail", Path = "/Solar System/Planets/Mercury", + Focusable = false, Description = "Trail of Mercury as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/mercury/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/mercury/trail_barycenter.asset index b7001285b4..f4ec2a9eea 100644 --- a/data/assets/scene/solarsystem/planets/mercury/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/mercury/trail_barycenter.asset @@ -22,6 +22,7 @@ local MercuryBarycenterTrail = { GUI = { Name = "Mercury Barycenter Trail", Path = "/Solar System/Planets/Mercury", + Focusable = false, Description = "Barycenter Trail of Mercury as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/mercury/trail_earth.asset b/data/assets/scene/solarsystem/planets/mercury/trail_earth.asset index 97ed2e70d5..123d801a49 100644 --- a/data/assets/scene/solarsystem/planets/mercury/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/mercury/trail_earth.asset @@ -23,6 +23,7 @@ local MercuryTrailEarth = { GUI = { Name = "Mercury trail from Earth", Path = "/Solar System/Planets/Mercury", + Focusable = false, Description = "Trail of Mercury as observed by the Earth" } } diff --git a/data/assets/scene/solarsystem/planets/mercury/transforms.asset b/data/assets/scene/solarsystem/planets/mercury/transforms.asset index 30116f18e3..f6f70aebde 100644 --- a/data/assets/scene/solarsystem/planets/mercury/transforms.asset +++ b/data/assets/scene/solarsystem/planets/mercury/transforms.asset @@ -16,6 +16,7 @@ local MercuryBarycenter = { GUI = { Name = "Mercury Barycenter", Path = "/Solar System/Planets/Mercury", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset b/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset index 6ce4c2c2df..1c97a09f65 100644 --- a/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/inner_moons.asset @@ -55,7 +55,8 @@ local NaiadTrail = { }, GUI = { Name = "Naiad Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Naiad" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Naiad", + Focusable = false } } @@ -80,6 +81,7 @@ local NaiadLabel = { GUI = { Name = "Naiad Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Naiad", + Focusable = false, Description = "Label for Neptune's moon Naiad (Inner Moons)" } } @@ -135,7 +137,8 @@ local ThalassaTrail = { }, GUI = { Name = "Thalassa Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Thalassa" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Thalassa", + Focusable = false } } @@ -160,6 +163,7 @@ local ThalassaLabel = { GUI = { Name = "Thalassa Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Thalassa", + Focusable = false, Description = "Label for Neptune's moon Thalassa (Inner Moons)" } } @@ -215,7 +219,8 @@ local DespinaTrail = { }, GUI = { Name = "Despina Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Despina" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Despina", + Focusable = false } } @@ -240,6 +245,7 @@ local DespinaLabel = { GUI = { Name = "Despina Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Despina", + Focusable = false, Description = "Label for Neptune's moon Despina (Inner Moons)" } } @@ -295,7 +301,8 @@ local GalateaTrail = { }, GUI = { Name = "Galatea Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Galatea" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Galatea", + Focusable = false } } @@ -320,6 +327,7 @@ local GalateaLabel = { GUI = { Name = "Galatea Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Galatea", + Focusable = false, Description = "Label for Neptune's moon Galatea (Inner Moons)" } } @@ -375,7 +383,8 @@ local LarissaTrail = { }, GUI = { Name = "Larissa Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Larissa" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Larissa", + Focusable = false } } @@ -400,6 +409,7 @@ local LarissaLabel = { GUI = { Name = "Larissa Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Larissa", + Focusable = false, Description = "Label for Neptune's moon Larissa (Inner Moons)" } } @@ -455,7 +465,8 @@ local HippocampTrail = { }, GUI = { Name = "Hippocamp Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Hippocamp" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Hippocamp", + Focusable = false } } @@ -480,6 +491,7 @@ local HippocampLabel = { GUI = { Name = "Hippocamp Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Hippocamp", + Focusable = false, Description = "Label for Neptune's moon Hippocamp (Inner Moons)" } } @@ -535,7 +547,8 @@ local ProteusTrail = { }, GUI = { Name = "Proteus Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Proteus" + Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Proteus", + Focusable = false } } @@ -560,6 +573,7 @@ local ProteusLabel = { GUI = { Name = "Proteus Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Inner Moons/Proteus", + Focusable = false, Description = "Label for Neptune's moon Proteus (Inner Moons)" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/irregular_moons.asset b/data/assets/scene/solarsystem/planets/neptune/irregular_moons.asset index 0f17f84ff2..fa7fd20bc0 100644 --- a/data/assets/scene/solarsystem/planets/neptune/irregular_moons.asset +++ b/data/assets/scene/solarsystem/planets/neptune/irregular_moons.asset @@ -55,7 +55,8 @@ local HalimedeTrail = { }, GUI = { Name = "Halimede Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Halimede" + Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Halimede", + Focusable = false } } @@ -80,6 +81,7 @@ local HalimedeLabel = { GUI = { Name = "Halimede Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Halimede", + Focusable = false, Description = "Label for Neptune's moon Halimede (Irregular Prograde Moons)" } } @@ -135,7 +137,8 @@ local PsamatheTrail = { }, GUI = { Name = "Psamathe Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Psamathe" + Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Psamathe", + Focusable = false } } @@ -160,6 +163,7 @@ local PsamatheLabel = { GUI = { Name = "Psamathe Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Psamathe", + Focusable = false, Description = "Label for Neptune's moon Psamathe (Irregular Prograde Moons)" } } @@ -215,7 +219,8 @@ local SaoTrail = { }, GUI = { Name = "Sao Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Sao" + Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Sao", + Focusable = false } } @@ -240,6 +245,7 @@ local SaoLabel = { GUI = { Name = "Sao Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Sao", + Focusable = false, Description = "Label for Neptune's moon Sao (Irregular Prograde Moons)" } } @@ -295,7 +301,8 @@ local LaomedeiaTrail = { }, GUI = { Name = "Laomedeia Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Laomedeia" + Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Laomedeia", + Focusable = false } } @@ -320,6 +327,7 @@ local LaomedeiaLabel = { GUI = { Name = "Laomedeia Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Laomedeia", + Focusable = false, Description = "Label for Neptune's moon Laomedeia (Irregular Prograde Moons)" } } @@ -375,7 +383,8 @@ local NesoTrail = { }, GUI = { Name = "Neso Trail", - Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Neso" + Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Neso", + Focusable = false } } @@ -400,6 +409,7 @@ local NesoLabel = { GUI = { Name = "Neso Label", Path = "/Solar System/Planets/Neptune/Minor Moons/Irregular Prograde Moons/Neso", + Focusable = false, Description = "Label for Neptune's moon Neso (Irregular Prograde Moons)" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/nereid/nereid.asset b/data/assets/scene/solarsystem/planets/neptune/nereid/nereid.asset index 7db4b2e752..d14bd6671f 100644 --- a/data/assets/scene/solarsystem/planets/neptune/nereid/nereid.asset +++ b/data/assets/scene/solarsystem/planets/neptune/nereid/nereid.asset @@ -54,7 +54,8 @@ local NereidTrail = { }, GUI = { Name = "Nereid Trail", - Path = "/Solar System/Planets/Neptune/Major Moons/Nereid" + Path = "/Solar System/Planets/Neptune/Major Moons/Nereid", + Focusable = false } } @@ -79,6 +80,7 @@ local NereidLabel = { GUI = { Name = "Nereid Label", Path = "/Solar System/Planets/Neptune/Major Moons/Nereid", + Focusable = false, Description = "Label for Neptune's moon Nereid" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/trail.asset b/data/assets/scene/solarsystem/planets/neptune/trail.asset index 80dea527af..e2ee211a0e 100644 --- a/data/assets/scene/solarsystem/planets/neptune/trail.asset +++ b/data/assets/scene/solarsystem/planets/neptune/trail.asset @@ -21,6 +21,7 @@ local NeptuneTrail = { GUI = { Name = "Neptune Trail", Path = "/Solar System/Planets/Neptune", + Focusable = false, Description = "Trail of Neptune as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/neptune/trail_barycenter.asset index 1627018a52..9af71b3d6b 100644 --- a/data/assets/scene/solarsystem/planets/neptune/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/neptune/trail_barycenter.asset @@ -22,6 +22,7 @@ local NeptuneBarycenterTrail = { GUI = { Name = "Neptune Barycenter Trail", Path = "/Solar System/Planets/Neptune", + Focusable = false, Description = "BarycenterTrail of Neptune as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/trail_earth.asset b/data/assets/scene/solarsystem/planets/neptune/trail_earth.asset index 7f22e97c3f..6f98d3434d 100644 --- a/data/assets/scene/solarsystem/planets/neptune/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/neptune/trail_earth.asset @@ -23,6 +23,7 @@ local NeptuneTrailEarth = { GUI = { Name = "Neptune trail from Earth", Path = "/Solar System/Planets/Neptune", + Focusable = false, Description = "Trail of Neptune as observed by the Earth" } } diff --git a/data/assets/scene/solarsystem/planets/neptune/transforms.asset b/data/assets/scene/solarsystem/planets/neptune/transforms.asset index 9022f1a8e1..509fdd3e88 100644 --- a/data/assets/scene/solarsystem/planets/neptune/transforms.asset +++ b/data/assets/scene/solarsystem/planets/neptune/transforms.asset @@ -16,6 +16,7 @@ local NeptuneBarycenter = { GUI = { Name = "Neptune Barycenter", Path = "/Solar System/Planets/Neptune", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/neptune/triton/triton.asset b/data/assets/scene/solarsystem/planets/neptune/triton/triton.asset index f50ba6297a..9c39930ed7 100644 --- a/data/assets/scene/solarsystem/planets/neptune/triton/triton.asset +++ b/data/assets/scene/solarsystem/planets/neptune/triton/triton.asset @@ -59,7 +59,8 @@ local TritonTrail = { }, GUI = { Name = "Triton Trail", - Path = "/Solar System/Planets/Neptune/Major Moons/Triton" + Path = "/Solar System/Planets/Neptune/Major Moons/Triton", + Focusable = false } } @@ -84,6 +85,7 @@ local TritonLabel = { GUI = { Name = "Triton Label", Path = "/Solar System/Planets/Neptune/Major Moons/Triton", + Focusable = false, Description = "Label for Neptune's moon Triton" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset b/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset index 0dd8f2b2aa..9d61827976 100644 --- a/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset +++ b/data/assets/scene/solarsystem/planets/saturn/dione/dione.asset @@ -71,6 +71,7 @@ local DioneLabel = { GUI = { Name = "Dione Label", Path = "/Solar System/Planets/Saturn/Major Moons/Dione", + Focusable = false, Description = "Label for Saturn's moon Dione" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/dione/trail.asset b/data/assets/scene/solarsystem/planets/saturn/dione/trail.asset index 8e5fda0d3e..9de391ea92 100644 --- a/data/assets/scene/solarsystem/planets/saturn/dione/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/dione/trail.asset @@ -18,10 +18,16 @@ local DioneTrail = { Period = 66.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", "moonTrail_major_saturn" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_saturn", + "moonTrail_major_saturn" + }, GUI = { Name = "Dione Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Dione", + Focusable = false, Description = "Trail of Saturn's moon Dione as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset index b218e8066c..f18ca0255f 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/enceladus.asset @@ -72,6 +72,7 @@ local EnceladusLabel = { GUI = { Name = "Enceladus Label", Path = "/Solar System/Planets/Saturn/Major Moons/Enceladus", + Focusable = false, Description = "Label for Saturn's moon Enceladus" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/enceladus/trail.asset b/data/assets/scene/solarsystem/planets/saturn/enceladus/trail.asset index 9cfd1ceca5..2de6a518bc 100644 --- a/data/assets/scene/solarsystem/planets/saturn/enceladus/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/enceladus/trail.asset @@ -18,10 +18,16 @@ local EnceladusTrail = { Period = 33.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", "moonTrail_major_saturn" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_saturn", + "moonTrail_major_saturn" + }, GUI = { Name = "Enceladus Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Enceladus", + Focusable = false, Description = "Trail of Saturn's moon Enceladus as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset b/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset index e2915d5ea4..2b5c2059b6 100644 --- a/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset +++ b/data/assets/scene/solarsystem/planets/saturn/hyperion/hyperion.asset @@ -69,6 +69,7 @@ local HyperionLabel = { GUI = { Name = "Hyperion Label", Path = "/Solar System/Planets/Saturn/Major Moons/Hyperion", + Focusable = false, Description = "Label for Saturn's moon Hyperion" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/hyperion/trail.asset b/data/assets/scene/solarsystem/planets/saturn/hyperion/trail.asset index 29260a58e8..9d706dd09f 100644 --- a/data/assets/scene/solarsystem/planets/saturn/hyperion/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/hyperion/trail.asset @@ -26,7 +26,8 @@ local HyperionTrail = { }, GUI = { Name = "Hyperion Trail", - Path = "/Solar System/Planets/Saturn/Major Moons/Hyperion" + Path = "/Solar System/Planets/Saturn/Major Moons/Hyperion", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset b/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset index e9a51fc40a..967c642a0a 100644 --- a/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset +++ b/data/assets/scene/solarsystem/planets/saturn/iapetus/iapetus.asset @@ -71,7 +71,8 @@ local IapetusLabel = { Tag = { "solarsystem_labels", "moon_labels", "major_moon_labels" }, GUI = { Name = "Iapetus Label", - Path = "/Solar System/Planets/Saturn/Major Moons/Iapetus" + Path = "/Solar System/Planets/Saturn/Major Moons/Iapetus", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/iapetus/trail.asset b/data/assets/scene/solarsystem/planets/saturn/iapetus/trail.asset index 1ced8f0d38..c91b9a1b5e 100644 --- a/data/assets/scene/solarsystem/planets/saturn/iapetus/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/iapetus/trail.asset @@ -18,10 +18,16 @@ local IapetusTrail = { Period = 79.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", "moonTrail_major_saturn" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_saturn", + "moonTrail_major_saturn" + }, GUI = { Name = "Iapetus Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Iapetus", + Focusable = false, Description = "Trail of Saturn's moon Iapetus as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset b/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset index 2f6c3ade12..0de3973ade 100644 --- a/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset +++ b/data/assets/scene/solarsystem/planets/saturn/mimas/mimas.asset @@ -73,6 +73,7 @@ local MimasLabel = { GUI = { Name = "Mimas Label", Path = "/Solar System/Planets/Saturn/Major Moons/Mimas", + Focusable = false, Description = "Label for Saturn's moon Mimas" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/mimas/trail.asset b/data/assets/scene/solarsystem/planets/saturn/mimas/trail.asset index bc58f63adf..c9f42b5218 100644 --- a/data/assets/scene/solarsystem/planets/saturn/mimas/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/mimas/trail.asset @@ -18,10 +18,16 @@ local MimasTrail = { Period = 23.0 / 24.0, Resolution = 1000 }, - Tag = { "moonTrail_solarSystem", "moonTrail_giants", "moonTrail_saturn", "moonTrail_major_saturn" }, + Tag = { + "moonTrail_solarSystem", + "moonTrail_giants", + "moonTrail_saturn", + "moonTrail_major_saturn" + }, GUI = { Name = "Mimas Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Mimas", + Focusable = false, Description = "Trail of Saturn's moon Mimas as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset index 3767e88daa..f6ffa416af 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/gallic_group.asset @@ -56,7 +56,8 @@ local AlbiorixTrail = { }, GUI = { Name = "Albiorix Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Albiorix" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Albiorix", + Focusable = false } } @@ -86,7 +87,8 @@ local AlbiorixLabel = { }, GUI = { Name = "Albiorix Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Albiorix" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Albiorix", + Focusable = false } } @@ -142,7 +144,8 @@ local BebhionnTrail = { }, GUI = { Name = "Bebhionn Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Bebhionn" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Bebhionn", + Focusable = false } } @@ -172,7 +175,8 @@ local BebhionnLabel = { }, GUI = { Name = "Bebhionn Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Bebhionn" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Bebhionn", + Focusable = false } } @@ -228,7 +232,8 @@ local ErriapusTrail = { }, GUI = { Name = "Erriapus Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Erriapus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Erriapus", + Focusable = false } } @@ -258,7 +263,8 @@ local ErriapusLabel = { }, GUI = { Name = "Erriapus Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Erriapus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Erriapus", + Focusable = false } } @@ -314,7 +320,8 @@ local TarvosTrail = { }, GUI = { Name = "Tarvos Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Tarvos" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Tarvos", + Focusable = false } } @@ -344,7 +351,8 @@ local TarvosLabel = { }, GUI = { Name = "Tarvos Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Tarvos" + Path = "/Solar System/Planets/Saturn/Minor Moons/Gallic Group/Tarvos", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset index 55403af79c..ad7c1f9481 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/inuit_group.asset @@ -56,7 +56,8 @@ local KiviuqTrail = { }, GUI = { Name = "Kiviuq Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Kiviuq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Kiviuq", + Focusable = false } } @@ -86,7 +87,8 @@ local KiviuqLabel = { }, GUI = { Name = "Kiviuq Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Kiviuq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Kiviuq", + Focusable = false } } @@ -142,7 +144,8 @@ local IjiraqTrail = { }, GUI = { Name = "Ijiraq Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Ijiraq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Ijiraq", + Focusable = false } } @@ -172,7 +175,8 @@ local IjiraqLabel = { }, GUI = { Name = "Ijiraq Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Ijiraq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Ijiraq", + Focusable = false } } @@ -228,7 +232,8 @@ local PaaliaqTrail = { }, GUI = { Name = "Paaliaq Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Paaliaq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Paaliaq", + Focusable = false } } @@ -258,7 +263,8 @@ local PaaliaqLabel = { }, GUI = { Name = "Paaliaq Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Paaliaq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Paaliaq", + Focusable = false } } @@ -314,7 +320,8 @@ local SiarnaqTrail = { }, GUI = { Name = "Cyllene Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Cyllene" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Cyllene", + Focusable = false } } @@ -344,7 +351,8 @@ local SiarnaqLabel = { }, GUI = { Name = "Siarnaq Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Siarnaq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Siarnaq", + Focusable = false } } @@ -400,7 +408,8 @@ local TarqeqTrail = { }, GUI = { Name = "Tarqeq Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Tarqeq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Tarqeq", + Focusable = false } } @@ -430,7 +439,8 @@ local TarqeqLabel = { }, GUI = { Name = "Tarqeq Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Tarqeq" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/Tarqeq", + Focusable = false } } @@ -486,7 +496,8 @@ local S2004S29Trail = { }, GUI = { Name = "S/2004 S 29 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S29" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S29", + Focusable = false } } @@ -516,7 +527,8 @@ local S2004S29Label = { }, GUI = { Name = "S/2004 S 29 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S29" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S29", + Focusable = false } } @@ -572,7 +584,8 @@ local S2004S31Trail = { }, GUI = { Name = "S/2004 S 31 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S31" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S31", + Focusable = false } } @@ -602,7 +615,8 @@ local S2004S31Label = { }, GUI = { Name = "S/2004 S 31 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S31" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2004S31", + Focusable = false } } @@ -658,7 +672,8 @@ local S2019S01Trail = { }, GUI = { Name = "S/2019 S 01 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2019S01" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2019S01", + Focusable = false } } @@ -688,7 +703,8 @@ local S2019S01Label = { }, GUI = { Name = "S/2019 S 01 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2019S01" + Path = "/Solar System/Planets/Saturn/Minor Moons/Inuit Group/S2019S01", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset index 9e0499b62f..effe289a12 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/norse_group.asset @@ -57,7 +57,8 @@ local PhoebeTrail = { }, GUI = { Name = "Phoebe Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Phoebe" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Phoebe", + Focusable = false } } @@ -87,7 +88,8 @@ local PhoebeLabel = { }, GUI = { Name = "Phoebe Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Phoebe" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Phoebe", + Focusable = false } } @@ -143,7 +145,8 @@ local SkathiTrail = { }, GUI = { Name = "Skathi Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skathi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skathi", + Focusable = false } } @@ -173,7 +176,8 @@ local SkathiLabel = { }, GUI = { Name = "Skathi Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skathi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skathi", + Focusable = false } } @@ -229,7 +233,8 @@ local S2007S2Trail = { }, GUI = { Name = "S/2007 S 2 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S2" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S2", + Focusable = false } } @@ -259,7 +264,8 @@ local S2007S2Label = { }, GUI = { Name = "S/2007 S 2 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S2" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S2", + Focusable = false } } @@ -315,7 +321,8 @@ local SkollTrail = { }, GUI = { Name = "Skoll Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skoll" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skoll", + Focusable = false } } @@ -345,7 +352,8 @@ local SkollLabel = { }, GUI = { Name = "Skoll Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skoll" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skoll", + Focusable = false } } @@ -401,7 +409,8 @@ local S2004S13Trail = { }, GUI = { Name = "S/2004 S 13 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S13" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S13", + Focusable = false } } @@ -431,7 +440,8 @@ local S2004S13Label = { }, GUI = { Name = "S/2004 S 13 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S13" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S13", + Focusable = false } } @@ -487,7 +497,8 @@ local GreipTrail = { }, GUI = { Name = "Greip Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Greip" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Greip", + Focusable = false } } @@ -517,7 +528,8 @@ local GreipLabel = { }, GUI = { Name = "Greip Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Greip" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Greip", + Focusable = false } } @@ -573,7 +585,8 @@ local HyrrokkinTrail = { }, GUI = { Name = "Hyrrokkin Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hyrrokkin" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hyrrokkin", + Focusable = false } } @@ -603,7 +616,8 @@ local HyrrokkinLabel = { }, GUI = { Name = "Hyrrokkin Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hyrrokkin" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hyrrokkin", + Focusable = false } } @@ -659,7 +673,8 @@ local JarnsaxaTrail = { }, GUI = { Name = "Jarnsaxa Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Jarnsaxa" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Jarnsaxa", + Focusable = false } } @@ -689,7 +704,8 @@ local JarnsaxaLabel = { }, GUI = { Name = "Jarnsaxa Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Jarnsaxa" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Jarnsaxa", + Focusable = false } } @@ -745,7 +761,8 @@ local MundilfariTrail = { }, GUI = { Name = "Mundilfari Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Mundilfari" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Mundilfari", + Focusable = false } } @@ -775,7 +792,8 @@ local MundilfariLabel = { }, GUI = { Name = "Mundilfari Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Mundilfari" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Mundilfari", + Focusable = false } } @@ -831,7 +849,8 @@ local S2006S1Trail = { }, GUI = { Name = "S/2006 S 1 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S1" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S1", + Focusable = false } } @@ -861,7 +880,8 @@ local S2006S1Label = { }, GUI = { Name = "S/2006 S 1 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S1" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S1", + Focusable = false } } @@ -917,7 +937,8 @@ local S2004S17Trail = { }, GUI = { Name = "S/2004 S 17 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S17" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S17", + Focusable = false } } @@ -947,7 +968,8 @@ local S2004S17Label = { }, GUI = { Name = "S/2004 S 17 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S17" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S17", + Focusable = false } } @@ -1003,7 +1025,8 @@ local BergelmirTrail = { }, GUI = { Name = "Bergelmir Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bergelmir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bergelmir", + Focusable = false } } @@ -1033,7 +1056,8 @@ local BergelmirLabel = { }, GUI = { Name = "Bergelmir Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bergelmir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bergelmir", + Focusable = false } } @@ -1089,7 +1113,8 @@ local NarviTrail = { }, GUI = { Name = "Narvi Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Narvi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Narvi", + Focusable = false } } @@ -1119,7 +1144,8 @@ local NarviLabel = { }, GUI = { Name = "Narvi Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Narvi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Narvi", + Focusable = false } } @@ -1175,7 +1201,8 @@ local SuttungrTrail = { }, GUI = { Name = "Suttungr Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Suttungr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Suttungr", + Focusable = false } } @@ -1205,7 +1232,8 @@ local SuttungrLabel = { }, GUI = { Name = "Suttungr Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Suttungr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Suttungr", + Focusable = false } } @@ -1261,7 +1289,8 @@ local HatiTrail = { }, GUI = { Name = "Hati Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hati" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hati", + Focusable = false } } @@ -1291,7 +1320,8 @@ local HatiLabel = { }, GUI = { Name = "Hati Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hati" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Hati", + Focusable = false } } @@ -1347,7 +1377,8 @@ local S2004S12Trail = { }, GUI = { Name = "S/2004 S 12 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S12" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S12", + Focusable = false } } @@ -1377,7 +1408,8 @@ local S2004S12Label = { }, GUI = { Name = "S/2004 S 12 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S12" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S12", + Focusable = false } } @@ -1433,7 +1465,8 @@ local FarbautiTrail = { }, GUI = { Name = "Farbauti Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Farbauti" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Farbauti", + Focusable = false } } @@ -1463,7 +1496,8 @@ local FarbautiLabel = { }, GUI = { Name = "Farbauti Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Farbauti" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Farbauti", + Focusable = false } } @@ -1519,7 +1553,8 @@ local ThrymrTrail = { }, GUI = { Name = "Thrymr Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thrymr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thrymr", + Focusable = false } } @@ -1549,7 +1584,8 @@ local ThrymrLabel = { }, GUI = { Name = "Thrymr Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thrymr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thrymr", + Focusable = false } } @@ -1605,7 +1641,8 @@ local AegirTrail = { }, GUI = { Name = "Aegir Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Aegir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Aegir", + Focusable = false } } @@ -1635,7 +1672,8 @@ local AegirLabel = { }, GUI = { Name = "Aegir Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Aegir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Aegir", + Focusable = false } } @@ -1691,7 +1729,8 @@ local S2007S3Trail = { }, GUI = { Name = "S/2007 S 3 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S3" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S3", + Focusable = false } } @@ -1721,7 +1760,8 @@ local S2007S3Label = { }, GUI = { Name = "S/2007 S 3 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S3" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2007S3", + Focusable = false } } @@ -1777,7 +1817,8 @@ local BestlaTrail = { }, GUI = { Name = "Bestla Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bestla" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bestla", + Focusable = false } } @@ -1807,7 +1848,8 @@ local BestlaLabel = { }, GUI = { Name = "Bestla Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bestla" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Bestla", + Focusable = false } } @@ -1863,7 +1905,8 @@ local S2004S7Trail = { }, GUI = { Name = "S/2004 S 7 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S7" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S7", + Focusable = false } } @@ -1893,7 +1936,8 @@ local S2004S7Label = { }, GUI = { Name = "S/2004 S 7 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S7" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S7", + Focusable = false } } @@ -1949,7 +1993,8 @@ local S2006S3Trail = { }, GUI = { Name = "S/2006 S 3 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S3" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S3", + Focusable = false } } @@ -1979,7 +2024,8 @@ local S2006S3Label = { }, GUI = { Name = "S/2006 S 3 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S3" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2006S3", + Focusable = false } } @@ -2035,7 +2081,8 @@ local FenrirTrail = { }, GUI = { Name = "Fenrir Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fenrir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fenrir", + Focusable = false } } @@ -2065,7 +2112,8 @@ local FenrirLabel = { }, GUI = { Name = "Fenrir Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fenrir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fenrir", + Focusable = false } } @@ -2121,7 +2169,8 @@ local SurturTrail = { }, GUI = { Name = "Surtur Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Surtur" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Surtur", + Focusable = false } } @@ -2151,7 +2200,8 @@ local SurturLabel = { }, GUI = { Name = "Surtur Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Surtur" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Surtur", + Focusable = false } } @@ -2207,7 +2257,8 @@ local KariTrail = { }, GUI = { Name = "Kari Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Kari" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Kari", + Focusable = false } } @@ -2237,7 +2288,8 @@ local KariLabel = { }, GUI = { Name = "Kari Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Kari" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Kari", + Focusable = false } } @@ -2293,7 +2345,8 @@ local YmirTrail = { }, GUI = { Name = "Ymir Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Ymir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Ymir", + Focusable = false } } @@ -2323,7 +2376,8 @@ local YmirLabel = { }, GUI = { Name = "Ymir Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Ymir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Ymir", + Focusable = false } } @@ -2379,7 +2433,8 @@ local LogeTrail = { }, GUI = { Name = "Loge Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Loge" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Loge", + Focusable = false } } @@ -2409,7 +2464,8 @@ local LogeLabel = { }, GUI = { Name = "Loge Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Loge" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Loge", + Focusable = false } } @@ -2465,7 +2521,8 @@ local FornjotTrail = { }, GUI = { Name = "Fornjot Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fornjot" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fornjot", + Focusable = false } } @@ -2495,7 +2552,8 @@ local FornjotLabel = { }, GUI = { Name = "Fornjot Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fornjot" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Fornjot", + Focusable = false } } @@ -2551,7 +2609,8 @@ local SkadiTrail = { }, GUI = { Name = "Skadi Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skadi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skadi", + Focusable = false } } @@ -2581,7 +2640,8 @@ local SkadiLabel = { }, GUI = { Name = "Skadi Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skadi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skadi", + Focusable = false } } @@ -2637,7 +2697,8 @@ local GridrTrail = { }, GUI = { Name = "Gridr Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gridr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gridr", + Focusable = false } } @@ -2667,7 +2728,8 @@ local GridrLabel = { }, GUI = { Name = "Gridr Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gridr" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gridr", + Focusable = false } } @@ -2723,7 +2785,8 @@ local AngrbodaTrail = { }, GUI = { Name = "Angrboda Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Angrboda" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Angrboda", + Focusable = false } } @@ -2753,7 +2816,8 @@ local AngrbodaLabel = { }, GUI = { Name = "Angrboda Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Angrboda" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Angrboda", + Focusable = false } } @@ -2809,7 +2873,8 @@ local SkrymirTrail = { }, GUI = { Name = "Skrymir Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skrymir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skrymir", + Focusable = false } } @@ -2839,7 +2904,8 @@ local SkrymirLabel = { }, GUI = { Name = "Skrymir Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skrymir" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Skrymir", + Focusable = false } } @@ -2895,7 +2961,8 @@ local GerdTrail = { }, GUI = { Name = "Gerd Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gerd" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gerd", + Focusable = false } } @@ -2925,7 +2992,8 @@ local GerdLabel = { }, GUI = { Name = "Gerd Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gerd" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gerd", + Focusable = false } } @@ -2981,7 +3049,8 @@ local S2004S26Trail = { }, GUI = { Name = "S/2004 S 26 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S26" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S26", + Focusable = false } } @@ -3011,7 +3080,8 @@ local S2004S26Label = { }, GUI = { Name = "S/2004 S 26 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S26" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S26", + Focusable = false } } @@ -3067,7 +3137,8 @@ local EggtherTrail = { }, GUI = { Name = "Eggther Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Eggther" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Eggther", + Focusable = false } } @@ -3097,7 +3168,8 @@ local EggtherLabel = { }, GUI = { Name = "Eggther Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Eggther" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Eggther", + Focusable = false } } @@ -3153,7 +3225,8 @@ local BeliTrail = { }, GUI = { Name = "Beli Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Beli" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Beli", + Focusable = false } } @@ -3183,7 +3256,8 @@ local BeliLabel = { }, GUI = { Name = "Beli Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Beli" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Beli", + Focusable = false } } @@ -3239,7 +3313,8 @@ local GunnlodTrail = { }, GUI = { Name = "Gunnlod Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gunnlod" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gunnlod", + Focusable = false } } @@ -3269,7 +3344,8 @@ local GunnlodLabel = { }, GUI = { Name = "Gunnlod Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gunnlod" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Gunnlod", + Focusable = false } } @@ -3325,7 +3401,8 @@ local ThiazziTrail = { }, GUI = { Name = "Thiazzi Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thiazzi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thiazzi", + Focusable = false } } @@ -3355,7 +3432,8 @@ local ThiazziLabel = { }, GUI = { Name = "Thiazzi Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thiazzi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Thiazzi", + Focusable = false } } @@ -3411,7 +3489,8 @@ local S2004S34Trail = { }, GUI = { Name = "S/2004 S 34 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S34" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S34", + Focusable = false } } @@ -3441,7 +3520,8 @@ local S2004S34Label = { }, GUI = { Name = "S/2004 S 34 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S34" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S34", + Focusable = false } } @@ -3497,7 +3577,8 @@ local AlvaldiTrail = { }, GUI = { Name = "Alvaldi Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Alvaldi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Alvaldi", + Focusable = false } } @@ -3527,7 +3608,8 @@ local AlvaldiLabel = { }, GUI = { Name = "Alvaldi Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Alvaldi" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Alvaldi", + Focusable = false } } @@ -3583,7 +3665,8 @@ local GeirrodTrail = { }, GUI = { Name = "Geirrod Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Geirrod" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Geirrod", + Focusable = false } } @@ -3613,7 +3696,8 @@ local GeirrodLabel = { }, GUI = { Name = "Geirrod Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Geirrod" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/Geirrod", + Focusable = false } } @@ -3669,7 +3753,8 @@ local S2004S28Trail = { }, GUI = { Name = "S/2004 S 28 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S28" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S28", + Focusable = false } } @@ -3699,7 +3784,8 @@ local S2004S28Label = { }, GUI = { Name = "S/2004 S 28 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S28" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S28", + Focusable = false } } @@ -3755,7 +3841,8 @@ local S2004S21Trail = { }, GUI = { Name = "S/2004 S 21 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S21" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S21", + Focusable = false } } @@ -3785,7 +3872,8 @@ local S2004S21Label = { }, GUI = { Name = "S/2004 S 21 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S21" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S21", + Focusable = false } } @@ -3841,7 +3929,8 @@ local S2004S36Trail = { }, GUI = { Name = "S/2004 S 36 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S36" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S36", + Focusable = false } } @@ -3871,7 +3960,8 @@ local S2004S36Label = { }, GUI = { Name = "S/2004 S 36 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S36" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S36", + Focusable = false } } @@ -3927,7 +4017,8 @@ local S2004S37Trail = { }, GUI = { Name = "S/2004 S 37 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S37" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S37", + Focusable = false } } @@ -3957,7 +4048,8 @@ local S2004S37Label = { }, GUI = { Name = "S/2004 S 37 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S37" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S37", + Focusable = false } } @@ -4013,7 +4105,8 @@ local S2004S39Trail = { }, GUI = { Name = "S/2004 S 39 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S39" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S39", + Focusable = false } } @@ -4043,7 +4136,8 @@ local S2004S39Label = { }, GUI = { Name = "S/2004 S 39 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S39" + Path = "/Solar System/Planets/Saturn/Minor Moons/Norse Group/S2004S39", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset index 6a10e65078..fa15db0741 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/other_group.asset @@ -58,7 +58,8 @@ local AegaeonTrail = { }, GUI = { Name = "Aegaeon Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Aegaeon" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Aegaeon", + Focusable = false } } @@ -88,7 +89,8 @@ local AegaeonLabel = { }, GUI = { Name = "Aegaeon Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Aegaeon" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Aegaeon", + Focusable = false } } @@ -144,7 +146,8 @@ local MethoneTrail = { }, GUI = { Name = "Methone Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Methone" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Methone", + Focusable = false } } @@ -174,7 +177,8 @@ local MethoneLabel = { }, GUI = { Name = "Methone Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Methone" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Methone", + Focusable = false } } @@ -230,7 +234,8 @@ local AntheTrail = { }, GUI = { Name = "Anthe Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Anthe" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Anthe", + Focusable = false } } @@ -260,7 +265,8 @@ local AntheLabel = { }, GUI = { Name = "Anthe Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Anthe" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Anthe", + Focusable = false } } @@ -316,7 +322,8 @@ local PalleneTrail = { }, GUI = { Name = "Pallene Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Pallene" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Pallene", + Focusable = false } } @@ -346,7 +353,8 @@ local PalleneLabel = { }, GUI = { Name = "Pallene Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Pallene" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Pallene", + Focusable = false } } @@ -402,7 +410,8 @@ local TelestoTrail = { }, GUI = { Name = "Telesto Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Telesto" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Telesto", + Focusable = false } } @@ -432,7 +441,8 @@ local TelestoLabel = { }, GUI = { Name = "Telesto Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Telesto" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Telesto", + Focusable = false } } @@ -488,7 +498,8 @@ local CalypsoTrail = { }, GUI = { Name = "Calypso Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Calypso" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Calypso", + Focusable = false } } @@ -518,7 +529,8 @@ local CalypsoLabel = { }, GUI = { Name = "Calypso Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Calypso" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Calypso", + Focusable = false } } @@ -574,7 +586,8 @@ local HeleneTrail = { }, GUI = { Name = "Helene Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Helene" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Helene", + Focusable = false } } @@ -604,7 +617,8 @@ local HeleneLabel = { }, GUI = { Name = "Helene Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Helene" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Helene", + Focusable = false } } @@ -660,7 +674,8 @@ local PolydeucesTrail = { }, GUI = { Name = "Polydeuces Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Polydeuces" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Polydeuces", + Focusable = false } } @@ -690,7 +705,8 @@ local PolydeucesLabel = { }, GUI = { Name = "Polydeuces Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Polydeuces" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/Polydeuces", + Focusable = false } } @@ -746,7 +762,8 @@ local S2004S24Trail = { }, GUI = { Name = "S/2004 S 24 Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/S2004S24" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/S2004S24", + Focusable = false } } @@ -776,7 +793,8 @@ local S2004S24Label = { }, GUI = { Name = "S/2004 S 24 Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/S2004S24" + Path = "/Solar System/Planets/Saturn/Minor Moons/Other Group/S2004S24", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset b/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset index b371212420..41453d88d5 100644 --- a/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset +++ b/data/assets/scene/solarsystem/planets/saturn/minor/shepherd_group.asset @@ -69,7 +69,8 @@ local PrometheusTrail = { }, GUI = { Name = "Prometheus Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Prometheus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Prometheus", + Focusable = false } } @@ -99,7 +100,8 @@ local PrometheusLabel = { }, GUI = { Name = "Prometheus Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Prometheus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Prometheus", + Focusable = false } } @@ -155,7 +157,8 @@ local PandoraTrail = { }, GUI = { Name = "Pandora Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pandora" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pandora", + Focusable = false } } @@ -185,7 +188,8 @@ local PandoraLabel = { }, GUI = { Name = "Pandora Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pandora" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pandora", + Focusable = false } } @@ -241,7 +245,8 @@ local AtlasTrail = { }, GUI = { Name = "Atlas Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Atlas" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Atlas", + Focusable = false } } @@ -271,7 +276,8 @@ local AtlasLabel = { }, GUI = { Name = "Atlas Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Atlas" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Atlas", + Focusable = false } } @@ -327,7 +333,8 @@ local JanusTrail = { }, GUI = { Name = "Janus Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Janus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Janus", + Focusable = false } } @@ -357,7 +364,8 @@ local JanusLabel = { }, GUI = { Name = "Janus Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Janus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Janus", + Focusable = false } } @@ -413,7 +421,8 @@ local EpimetheusTrail = { }, GUI = { Name = "Epimetheus Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Epimetheus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Epimetheus", + Focusable = false } } @@ -443,7 +452,8 @@ local EpimetheusLabel = { }, GUI = { Name = "Epimetheus Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Epimetheus" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Epimetheus", + Focusable = false } } @@ -499,7 +509,8 @@ local DaphnisTrail = { }, GUI = { Name = "Daphnis Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Daphnis" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Daphnis", + Focusable = false } } @@ -529,7 +540,8 @@ local DaphnisLabel = { }, GUI = { Name = "Daphnis Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Daphnis" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Daphnis", + Focusable = false } } @@ -585,7 +597,8 @@ local PanTrail = { }, GUI = { Name = "Pan Trail", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pan" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pan", + Focusable = false } } @@ -615,7 +628,8 @@ local PanLabel = { }, GUI = { Name = "Pan Label", - Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pan" + Path = "/Solar System/Planets/Saturn/Minor Moons/Shepherd Moons/Pan", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset b/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset index 0c7e8d1b64..94d92d2a0c 100644 --- a/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset +++ b/data/assets/scene/solarsystem/planets/saturn/rhea/rhea.asset @@ -72,7 +72,8 @@ local RheaLabel = { Tag = { "solarsystem_labels", "moon_labels", "major_moon_labels", "moon_major_saturn" }, GUI = { Name = "Rhea Label", - Path = "/Solar System/Planets/Saturn/Major Moons/Rhea" + Path = "/Solar System/Planets/Saturn/Major Moons/Rhea", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/rhea/trail.asset b/data/assets/scene/solarsystem/planets/saturn/rhea/trail.asset index f439933392..5185998463 100644 --- a/data/assets/scene/solarsystem/planets/saturn/rhea/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/rhea/trail.asset @@ -27,6 +27,7 @@ local RheaTrail = { GUI = { Name = "Rhea Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Rhea", + Focusable = false, Description = "Trail of Saturn's moon Rhea as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/saturn.asset b/data/assets/scene/solarsystem/planets/saturn/saturn.asset index f85abdd7b8..5b92978410 100644 --- a/data/assets/scene/solarsystem/planets/saturn/saturn.asset +++ b/data/assets/scene/solarsystem/planets/saturn/saturn.asset @@ -81,6 +81,7 @@ local SaturnLabel = { GUI = { Name = "Saturn Label", Path = "/Solar System/Planets/Saturn", + Focusable = false, Description = "Main planet label for Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset b/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset index d895eb207a..2aa3ea72ab 100644 --- a/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset +++ b/data/assets/scene/solarsystem/planets/saturn/tethys/tethys.asset @@ -70,7 +70,8 @@ local TethysLabel = { Tag = { "solarsystem_labels", "moon_labels", "major_moon_labels", "moon_major_saturn" }, GUI = { Name = "Tethys Label", - Path = "/Solar System/Planets/Saturn/Major Moons/Tethys" + Path = "/Solar System/Planets/Saturn/Major Moons/Tethys", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/tethys/trail.asset b/data/assets/scene/solarsystem/planets/saturn/tethys/trail.asset index 1a9539d8f6..1794256334 100644 --- a/data/assets/scene/solarsystem/planets/saturn/tethys/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/tethys/trail.asset @@ -27,6 +27,7 @@ local TethysTrail = { GUI = { Name = "Tethys Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Tethys", + Focusable = false, Description = "Trail of Saturn's moon Tethys as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/atmosphere.asset b/data/assets/scene/solarsystem/planets/saturn/titan/atmosphere.asset index ef2e18ab3f..957751e15e 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/atmosphere.asset @@ -43,7 +43,8 @@ local Atmosphere = { }, GUI = { Name = "Titan Atmosphere", - Path = "/Solar System/Planets/Saturn/Major Moons/Titan" + Path = "/Solar System/Planets/Saturn/Major Moons/Titan", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset b/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset index cabd4f2813..6949745dc6 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/titan.asset @@ -73,6 +73,7 @@ local TitanLabel = { GUI = { Name = "Titan Label", Path = "/Solar System/Planets/Saturn/Major Moons/Titan", + Focusable = false, Description = "Label for Saturn's moon Titan" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/titan/trail.asset b/data/assets/scene/solarsystem/planets/saturn/titan/trail.asset index 942716d5f0..786f31cb84 100644 --- a/data/assets/scene/solarsystem/planets/saturn/titan/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/titan/trail.asset @@ -27,6 +27,7 @@ local TitanTrail = { GUI = { Name = "Titan Trail", Path = "/Solar System/Planets/Saturn/Major Moons/Titan", + Focusable = false, Description = "Trail of Saturn's moon Titan as observed by Saturn" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/trail.asset b/data/assets/scene/solarsystem/planets/saturn/trail.asset index 44617c9697..14cc40bc83 100644 --- a/data/assets/scene/solarsystem/planets/saturn/trail.asset +++ b/data/assets/scene/solarsystem/planets/saturn/trail.asset @@ -21,6 +21,7 @@ local SaturnTrail = { GUI = { Name = "Saturn Trail", Path = "/Solar System/Planets/Saturn", + Focusable = false, Description = "Trail of Saturn as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/saturn/trail_barycenter.asset index 383bb510bc..d90bafcea3 100644 --- a/data/assets/scene/solarsystem/planets/saturn/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/saturn/trail_barycenter.asset @@ -22,6 +22,7 @@ local SaturnBarycenterTrail = { GUI = { Name = "Saturn Barycenter Trail", Path = "/Solar System/Planets/Saturn", + Focusable = false, Description = "Trail of Saturn's Barycenter as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/trail_earth.asset b/data/assets/scene/solarsystem/planets/saturn/trail_earth.asset index e35bd3acd5..73d1ee2959 100644 --- a/data/assets/scene/solarsystem/planets/saturn/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/saturn/trail_earth.asset @@ -22,6 +22,7 @@ local SaturnTrailEarth = { GUI = { Name = "Saturn trail from Earth", Path = "/Solar System/Planets/Saturn", + Focusable = false, Description = "Trail of Saturn as observed by the Earth" } } diff --git a/data/assets/scene/solarsystem/planets/saturn/transforms.asset b/data/assets/scene/solarsystem/planets/saturn/transforms.asset index 0d06778328..4045e93182 100644 --- a/data/assets/scene/solarsystem/planets/saturn/transforms.asset +++ b/data/assets/scene/solarsystem/planets/saturn/transforms.asset @@ -16,6 +16,7 @@ local SaturnBarycenter = { GUI = { Name = "Saturn Barycenter", Path = "/Solar System/Planets/Saturn", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset b/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset index eecd6fbe4b..50f42ba559 100644 --- a/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/inner_moons.asset @@ -55,7 +55,8 @@ local CordeliaTrail = { }, GUI = { Name = "Cordelia Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cordelia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cordelia", + Focusable = false } } @@ -79,7 +80,8 @@ local CordeliaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Cordelia Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cordelia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cordelia", + Focusable = false } } @@ -134,7 +136,8 @@ local OpheliaTrail = { }, GUI = { Name = "Ophelia Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Ophelia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Ophelia", + Focusable = false } } @@ -158,7 +161,8 @@ local OpheliaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Ophelia Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Ophelia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Ophelia", + Focusable = false } } @@ -213,7 +217,8 @@ local BiancaTrail = { }, GUI = { Name = "Bianca Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Bianca" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Bianca", + Focusable = false } } @@ -237,7 +242,8 @@ local BiancaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Bianca Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Bianca" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Bianca", + Focusable = false } } @@ -292,7 +298,8 @@ local CressidaTrail = { }, GUI = { Name = "Cressida Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cressida" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cressida", + Focusable = false } } @@ -316,7 +323,8 @@ local CressidaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Cressida Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cressida" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cressida", + Focusable = false } } @@ -371,7 +379,8 @@ local DesdemonaTrail = { }, GUI = { Name = "Desdemona Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Desdemona" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Desdemona", + Focusable = false } } @@ -395,7 +404,8 @@ local DesdemonaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Desdemona Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Desdemona" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Desdemona", + Focusable = false } } @@ -450,7 +460,8 @@ local JulietTrail = { }, GUI = { Name = "Juliet Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Juliet" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Juliet", + Focusable = false } } @@ -474,7 +485,8 @@ local JulietLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Juliet Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Juliet" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Juliet", + Focusable = false } } @@ -529,7 +541,8 @@ local PortiaTrail = { }, GUI = { Name = "Portia Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Portia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Portia", + Focusable = false } } @@ -553,7 +566,8 @@ local PortiaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Portia Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Portia" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Portia", + Focusable = false } } @@ -608,7 +622,8 @@ local RosalindTrail = { }, GUI = { Name = "Rosalind Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Rosalind" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Rosalind", + Focusable = false } } @@ -632,7 +647,8 @@ local RosalindLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Rosalind Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Rosalind" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Rosalind", + Focusable = false } } @@ -687,7 +703,8 @@ local CupidTrail = { }, GUI = { Name = "Cupid Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cupid" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cupid", + Focusable = false } } @@ -711,7 +728,8 @@ local CupidLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Cupid Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cupid" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Cupid", + Focusable = false } } @@ -766,7 +784,8 @@ local BelindaTrail = { }, GUI = { Name = "Belinda Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Belinda" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Belinda", + Focusable = false } } @@ -790,7 +809,8 @@ local BelindaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Belinda Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Belinda" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Belinda", + Focusable = false } } @@ -845,7 +865,8 @@ local PerditaTrail = { }, GUI = { Name = "Perdita Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Perdita" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Perdita", + Focusable = false } } @@ -869,7 +890,8 @@ local PerditaLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Perdita Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Perdita" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Perdita", + Focusable = false } } @@ -924,7 +946,8 @@ local PuckTrail = { }, GUI = { Name = "Puck Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Puck" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Puck", + Focusable = false } } @@ -948,7 +971,8 @@ local PuckLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Puck Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Puck" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Puck", + Focusable = false } } @@ -1003,7 +1027,8 @@ local MabTrail = { }, GUI = { Name = "Mab Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Mab" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Mab", + Focusable = false } } @@ -1027,7 +1052,8 @@ local MabLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Mab Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Mab" + Path = "/Solar System/Planets/Uranus/Minor Moons/Inner Moons/Mab", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset b/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset index 3502dfc264..7ff187da5a 100644 --- a/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/irregular_prograde_moons.asset @@ -55,7 +55,8 @@ local MargaretTrail = { }, GUI = { Name = "Margaret Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Prograde Moons/Margaret" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Prograde Moons/Margaret", + Focusable = false } } @@ -79,7 +80,8 @@ local MargaretLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Margaret Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Prograde Moons/Margaret" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Prograde Moons/Margaret", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset b/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset index 15fbab936d..0de2a028e1 100644 --- a/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset +++ b/data/assets/scene/solarsystem/planets/uranus/irregular_retrograde_moons.asset @@ -55,7 +55,8 @@ local FranciscoTrail = { }, GUI = { Name = "Francisco Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Francisco" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Francisco", + Focusable = false } } @@ -79,7 +80,8 @@ local FranciscoLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Francisco Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Francisco" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Francisco", + Focusable = false } } @@ -134,7 +136,8 @@ local CalibanTrail = { }, GUI = { Name = "Caliban Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Caliban" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Caliban", + Focusable = false } } @@ -158,7 +161,8 @@ local CalibanLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Caliban Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Caliban" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Caliban", + Focusable = false } } @@ -213,7 +217,8 @@ local StephanoTrail = { }, GUI = { Name = "Stephano Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Stephano" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Stephano", + Focusable = false } } @@ -237,7 +242,8 @@ local StephanoLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Stephano Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Stephano" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Stephano", + Focusable = false } } @@ -292,7 +298,8 @@ local TrinculoTrail = { }, GUI = { Name = "Trinculo Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Trinculo" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Trinculo", + Focusable = false } } @@ -316,7 +323,8 @@ local TrinculoLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Trinculo Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Trinculo" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Trinculo", + Focusable = false } } @@ -371,7 +379,8 @@ local SycoraxTrail = { }, GUI = { Name = "Sycorax Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Sycorax" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Sycorax", + Focusable = false } } @@ -395,7 +404,8 @@ local SycoraxLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Sycorax Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Sycorax" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Sycorax", + Focusable = false } } @@ -450,7 +460,8 @@ local ProsperoTrail = { }, GUI = { Name = "Prospero Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Prospero" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Prospero", + Focusable = false } } @@ -474,7 +485,8 @@ local ProsperoLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Prospero Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Prospero" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Prospero", + Focusable = false } } @@ -529,7 +541,8 @@ local SetebosTrail = { }, GUI = { Name = "Setebos Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Setebos" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Setebos", + Focusable = false } } @@ -553,7 +566,8 @@ local SetebosLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Setebos Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Setebos" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Setebos", + Focusable = false } } @@ -608,7 +622,8 @@ local FerdinandTrail = { }, GUI = { Name = "Ferdinand Trail", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Ferdinand" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Ferdinand", + Focusable = false } } @@ -632,7 +647,8 @@ local FerdinandLabel = { Tag = { "solarsystem_labels", "moon_labels", "minor_moon_labels" }, GUI = { Name = "Ferdinand Label", - Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Ferdinand" + Path = "/Solar System/Planets/Uranus/Minor Moons/Irregular Retrograde Moons/Ferdinand", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/uranus/trail.asset b/data/assets/scene/solarsystem/planets/uranus/trail.asset index ef649343ca..75fa7afb5c 100644 --- a/data/assets/scene/solarsystem/planets/uranus/trail.asset +++ b/data/assets/scene/solarsystem/planets/uranus/trail.asset @@ -21,6 +21,7 @@ local UranusTrail = { GUI = { Name = "Uranus Trail", Path = "/Solar System/Planets/Uranus", + Focusable = false, Description = "Trail of Uranus as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/uranus/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/uranus/trail_barycenter.asset index cdd4fd6513..9c14f1ed97 100644 --- a/data/assets/scene/solarsystem/planets/uranus/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/uranus/trail_barycenter.asset @@ -22,6 +22,7 @@ local UranusBarycenterTrail = { GUI = { Name = "Uranus Barycenter Trail", Path = "/Solar System/Planets/Uranus", + Focusable = false, Description = "Trail of Uranus as observed by the Sun" } } diff --git a/data/assets/scene/solarsystem/planets/uranus/trail_earth.asset b/data/assets/scene/solarsystem/planets/uranus/trail_earth.asset index be915740bc..8cdcf86a55 100644 --- a/data/assets/scene/solarsystem/planets/uranus/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/uranus/trail_earth.asset @@ -22,6 +22,7 @@ local UranusTrailEarth = { GUI = { Name = "Uranus trail from Earth", Path = "/Solar System/Planets/Uranus", + Focusable = false, Description = "Trail of Uranus as observed by the Earth" } } diff --git a/data/assets/scene/solarsystem/planets/uranus/transforms.asset b/data/assets/scene/solarsystem/planets/uranus/transforms.asset index 6e05e5c0e7..168feca8f5 100644 --- a/data/assets/scene/solarsystem/planets/uranus/transforms.asset +++ b/data/assets/scene/solarsystem/planets/uranus/transforms.asset @@ -16,6 +16,7 @@ local UranusBarycenter = { GUI = { Name = "Uranus Barycenter", Path = "/Solar System/Planets/Uranus", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/uranus/uranus.asset b/data/assets/scene/solarsystem/planets/uranus/uranus.asset index 5bda3b2e01..200e5b52ed 100644 --- a/data/assets/scene/solarsystem/planets/uranus/uranus.asset +++ b/data/assets/scene/solarsystem/planets/uranus/uranus.asset @@ -50,7 +50,8 @@ local UranusLabel = { Tag = { "solarsystem_labels" }, GUI = { Name = "Uranus Label", - Path = "/Solar System/Planets/Uranus" + Path = "/Solar System/Planets/Uranus", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/venus/atmosphere.asset b/data/assets/scene/solarsystem/planets/venus/atmosphere.asset index 66604edb9e..b6b4e95689 100644 --- a/data/assets/scene/solarsystem/planets/venus/atmosphere.asset +++ b/data/assets/scene/solarsystem/planets/venus/atmosphere.asset @@ -48,7 +48,8 @@ local Atmosphere = { GUI = { Name = "Venus Atmosphere", Path = "/Solar System/Planets/Venus", - Description = "Simulation of Venus' Atmosphere" + Description = "Simulation of Venus' Atmosphere", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/venus/trail.asset b/data/assets/scene/solarsystem/planets/venus/trail.asset index 5e8d0a37a9..aa91892736 100644 --- a/data/assets/scene/solarsystem/planets/venus/trail.asset +++ b/data/assets/scene/solarsystem/planets/venus/trail.asset @@ -20,7 +20,8 @@ local VenusTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_terrestrial" }, GUI = { Name = "Venus Trail", - Path = "/Solar System/Planets/Venus" + Path = "/Solar System/Planets/Venus", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/venus/trail_barycenter.asset b/data/assets/scene/solarsystem/planets/venus/trail_barycenter.asset index ec46a030d9..68626464c7 100644 --- a/data/assets/scene/solarsystem/planets/venus/trail_barycenter.asset +++ b/data/assets/scene/solarsystem/planets/venus/trail_barycenter.asset @@ -21,7 +21,8 @@ local VenusBarycenterTrail = { Tag = { "planetTrail_solarSystem", "planetTrail_terrestrial" }, GUI = { Name = "Venus Barycenter Trail", - Path = "/Solar System/Planets/Venus" + Path = "/Solar System/Planets/Venus", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/planets/venus/trail_earth.asset b/data/assets/scene/solarsystem/planets/venus/trail_earth.asset index bbe796393e..50339342cb 100644 --- a/data/assets/scene/solarsystem/planets/venus/trail_earth.asset +++ b/data/assets/scene/solarsystem/planets/venus/trail_earth.asset @@ -23,6 +23,7 @@ local VenusTrailEarth = { GUI = { Name = "Venus trail from Earth", Path = "/Solar System/Planets/Venus", + Focusable = false, Description = "Alternate trail for Venus, showing Venus as observed from Earth" } } diff --git a/data/assets/scene/solarsystem/planets/venus/transforms.asset b/data/assets/scene/solarsystem/planets/venus/transforms.asset index bee0e82620..d110c95dfd 100644 --- a/data/assets/scene/solarsystem/planets/venus/transforms.asset +++ b/data/assets/scene/solarsystem/planets/venus/transforms.asset @@ -16,6 +16,7 @@ local VenusBarycenter = { GUI = { Name = "Venus Barycenter", Path = "/Solar System/Planets/Venus", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/planets/venus/venus.asset b/data/assets/scene/solarsystem/planets/venus/venus.asset index 5bf8b63645..036ccd155f 100644 --- a/data/assets/scene/solarsystem/planets/venus/venus.asset +++ b/data/assets/scene/solarsystem/planets/venus/venus.asset @@ -70,8 +70,9 @@ local VenusLabel = { }, Tag = { "solarsystem_labels" }, GUI = { - Name = "Venus Label", - Path = "/Solar System/Planets/Venus" + Name = "Venus Label", + Path = "/Solar System/Planets/Venus", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/sssb/amor_asteroid.asset b/data/assets/scene/solarsystem/sssb/amor_asteroid.asset index b89b521494..5ab657307f 100644 --- a/data/assets/scene/solarsystem/sssb/amor_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/amor_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Amor Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Earth-approaching Near-Earth-Asteroids with orbits exterior to Earth's but interior to Mars'.]] } diff --git a/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset b/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset index 8f2b1ea3d1..22624d2e33 100644 --- a/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/apollo_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Apollo Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Earth-crossing Near-Earth-Asteroids with semi-major axes larger than Earth's.]] } diff --git a/data/assets/scene/solarsystem/sssb/astraea.asset b/data/assets/scene/solarsystem/sssb/astraea.asset index 8679e1ec84..891a2e9737 100644 --- a/data/assets/scene/solarsystem/sssb/astraea.asset +++ b/data/assets/scene/solarsystem/sssb/astraea.asset @@ -30,7 +30,8 @@ local AstraeaTrail = { }, GUI = { Name = "5 Astraea Trail", - Path = "/Solar System/Interstellar" + Path = "/Solar System/Interstellar", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/sssb/aten_asteroid.asset b/data/assets/scene/solarsystem/sssb/aten_asteroid.asset index 1c7c7b97ae..0e22950cd7 100644 --- a/data/assets/scene/solarsystem/sssb/aten_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/aten_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Aten Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Earth-crossing Near-Earth-Asteroids with semi-major axes smaller than Earth's.]] } diff --git a/data/assets/scene/solarsystem/sssb/atira_asteroid.asset b/data/assets/scene/solarsystem/sssb/atira_asteroid.asset index 000904556b..4c681e9100 100644 --- a/data/assets/scene/solarsystem/sssb/atira_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/atira_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Atira Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Near-Earth-Asteroids whose orbits are contained entirely within the orbit of the Earth.]] } diff --git a/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset b/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset index 3dafeab613..c3f8bd2fe2 100644 --- a/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset +++ b/data/assets/scene/solarsystem/sssb/c2019y4atlas.asset @@ -35,7 +35,8 @@ local C2019Y4AtlasTrail = { }, GUI = { Name = "C2019 Y4 Atlas Trail", - Path = "/Solar System/Small Bodies" + Path = "/Solar System/Small Bodies", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset b/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset index 688e139197..1f5a7a8e8f 100644 --- a/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/centaur_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Centaur Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids with either a perihelion or a semi-major axis between those of the four outer planets.]] } diff --git a/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset b/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset index 13ac881cd8..b16a2eaa08 100644 --- a/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/chiron-type_comet.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Chiron-type Comets", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Comets with a Tisserand's parameter with respect to Jupiter of greater than 3 and a semi-major axis greater than that of Jupiter.]] } diff --git a/data/assets/scene/solarsystem/sssb/encke-type_comet.asset b/data/assets/scene/solarsystem/sssb/encke-type_comet.asset index 3ce380a567..584e4389d2 100644 --- a/data/assets/scene/solarsystem/sssb/encke-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/encke-type_comet.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Encke-type Comets", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Comets with a Tisserand's parameter with respect to Jupiter of greater than 3 and a semi-major axis less than that of Jupiter.]] } diff --git a/data/assets/scene/solarsystem/sssb/halley-type_comet.asset b/data/assets/scene/solarsystem/sssb/halley-type_comet.asset index d135cfbbba..d32fdb162b 100644 --- a/data/assets/scene/solarsystem/sssb/halley-type_comet.asset +++ b/data/assets/scene/solarsystem/sssb/halley-type_comet.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Halley-type Comets", Path = "/Solar System/Small Bodies", + Focusable = false, Description = "Periodic comets with an orbital period between 20 and 200 years." } } diff --git a/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset b/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset index 2b843dd9b3..939251108a 100644 --- a/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/inner_main_belt_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Inner Main Asteroid Belt", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids with a semi-major axis less than 2.0 AU and a perihelion distance greater than 1.666 AU.]] } diff --git a/data/assets/scene/solarsystem/sssb/itokawa.asset b/data/assets/scene/solarsystem/sssb/itokawa.asset index a7de3618cf..42ea794cd2 100644 --- a/data/assets/scene/solarsystem/sssb/itokawa.asset +++ b/data/assets/scene/solarsystem/sssb/itokawa.asset @@ -38,6 +38,7 @@ local ItokawaTrail = { GUI = { Name = "Itokawa Trail", Path = "/Solar System/Small Bodies/Itokawa", + Focusable = false, Description = [[Trail of asteroid 25143 Itokawa from 1950 JAN 1 00:00:00 to 2050 JAN 1 00:00:00. Data from JPL Horizons]] } diff --git a/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset b/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset index d38b10968c..d41134268a 100644 --- a/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset +++ b/data/assets/scene/solarsystem/sssb/jupiter-family_comet.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Jupiter-family Comets", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Comets with a Tisserand's parameter with respect to Jupiter of between 2 and 3.]] } diff --git a/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset b/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset index ea06683651..56697005a4 100644 --- a/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/jupiter_trojan_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Jupiter Trojan Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids trapped in Jupiter's L4/L5 Lagrange points (semimajor axis of between 4.6 and 5.5 AU), with an eccentricity of less than 0.3.]] } diff --git a/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset b/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset index 76978d5826..48876f918b 100644 --- a/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/main_belt_asteroid.asset @@ -27,6 +27,7 @@ local Object = { GUI = { Name = "Main Asteroid Belt", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids with a semi-major axis of between 2.0 and 3.2 AU, and a perihelion distance greater than 1.666 AU.]] } diff --git a/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset b/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset index 2e173fa8cb..6e60ac5f21 100644 --- a/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/mars-crossing_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Mars-crossing Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids that cross the orbit of Mars, with a semi-major axis of less than 3.2 AU, and a perihelion distance of between 1.3 and 1.666 AU.]] } diff --git a/data/assets/scene/solarsystem/sssb/mpc.asset b/data/assets/scene/solarsystem/sssb/mpc.asset index 9be9958342..1c20a51f00 100644 --- a/data/assets/scene/solarsystem/sssb/mpc.asset +++ b/data/assets/scene/solarsystem/sssb/mpc.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Minor Planet Center Bodies", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[The full catalog of objects from the IAU's Minor Planets Center. Specifically from the publications of the Minor Planets Circulars, the Minor Planets Orbit Supplement, and the Minor Planet Electronic Circulars. For more information diff --git a/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset b/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset index be738fa2a0..cc082e8074 100644 --- a/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/outer_main_belt_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Outer Main Asteroid Belt", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids with a semi-major axis of between 3.2 and 4.6 AU.]] } } diff --git a/data/assets/scene/solarsystem/sssb/pha.asset b/data/assets/scene/solarsystem/sssb/pha.asset index 35465484a8..60b3505f49 100644 --- a/data/assets/scene/solarsystem/sssb/pha.asset +++ b/data/assets/scene/solarsystem/sssb/pha.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Potentially Hazardous Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Asteroids that are deemed potentially hazardous to Earth based on their close approaches. All asteroids with an Earth Minimum Orbit Intersection Distance (MOID) of 0.05 AU or less, and with an absolute magnitude (H) of 22.0 or diff --git a/data/assets/scene/solarsystem/sssb/swifttuttle.asset b/data/assets/scene/solarsystem/sssb/swifttuttle.asset index f4d5c82348..3a3bfc02f3 100644 --- a/data/assets/scene/solarsystem/sssb/swifttuttle.asset +++ b/data/assets/scene/solarsystem/sssb/swifttuttle.asset @@ -30,7 +30,8 @@ local SwiftTuttleTrail = { }, GUI = { Name = "Swift Tuttle Trail", - Path = "/Solar System/Small Bodies" + Path = "/Solar System/Small Bodies", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset index d17437a097..a62fd5cf10 100644 --- a/data/assets/scene/solarsystem/sssb/tesla_roadster.asset +++ b/data/assets/scene/solarsystem/sssb/tesla_roadster.asset @@ -30,7 +30,8 @@ local TeslaRoadsterTrail = { }, GUI = { Name = "Tesla Roadster Trail", - Path = "/Solar System/Small Bodies" + Path = "/Solar System/Small Bodies", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset b/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset index fab0c4d349..3c39ebbd1c 100644 --- a/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset +++ b/data/assets/scene/solarsystem/sssb/transneptunian_object_asteroid.asset @@ -26,6 +26,7 @@ local Object = { GUI = { Name = "Transneptunian Object Asteroids", Path = "/Solar System/Small Bodies", + Focusable = false, Description = [[Any minor or dwarf planets in the solar system that orbit the Sun at a greater average distance than Neptune (semi-major axis of 30.1 AU).]] } diff --git a/data/assets/scene/solarsystem/sun/EUV_layer.asset b/data/assets/scene/solarsystem/sun/euv_layer.asset similarity index 98% rename from data/assets/scene/solarsystem/sun/EUV_layer.asset rename to data/assets/scene/solarsystem/sun/euv_layer.asset index 755a756111..65e7820ab0 100644 --- a/data/assets/scene/solarsystem/sun/EUV_layer.asset +++ b/data/assets/scene/solarsystem/sun/euv_layer.asset @@ -33,7 +33,7 @@ local EUVLayer = { } local ToggleEuv = { - Identifier = "os.solarsystem.ToggleEuv", + Identifier = "os.solarsystem.sun.ToggleEuv", Name = "Toggle EUV layer", Command = [[ if openspace.propertyValue("Scene.EUV-Layer-bastille-day-2000.Renderable.Enabled") then diff --git a/data/assets/scene/solarsystem/sun/glare.asset b/data/assets/scene/solarsystem/sun/glare.asset index 678958163b..6158e48961 100644 --- a/data/assets/scene/solarsystem/sun/glare.asset +++ b/data/assets/scene/solarsystem/sun/glare.asset @@ -26,6 +26,7 @@ local SunGlare = { GUI = { Name = "Solar Glare", Path = "/Solar System/Sun", + Focusable = false, Description = "Sun glare effect. Enabled by default instead of sun globe" } } diff --git a/data/assets/scene/solarsystem/sun/habitablezone.asset b/data/assets/scene/solarsystem/sun/habitablezone.asset index db89f7a758..4b7f167aa5 100644 --- a/data/assets/scene/solarsystem/sun/habitablezone.asset +++ b/data/assets/scene/solarsystem/sun/habitablezone.asset @@ -18,6 +18,7 @@ local HabitableZone = { GUI = { Name = "Sun's Habitable Zone", Path = "/Solar System/Sun", + Focusable = false, Description = "Habitable zone for the sun in our solar system" } } diff --git a/data/assets/scene/solarsystem/sun/sun.asset b/data/assets/scene/solarsystem/sun/sun.asset index 9174b51f27..0497fc0249 100644 --- a/data/assets/scene/solarsystem/sun/sun.asset +++ b/data/assets/scene/solarsystem/sun/sun.asset @@ -45,6 +45,7 @@ local SunLabel = { GUI = { Name = "Sun Label", Path = "/Solar System/Sun", + Focusable = false, Description = "Label for the sun in our solar system" } } diff --git a/data/assets/scene/solarsystem/sun/transforms.asset b/data/assets/scene/solarsystem/sun/transforms.asset index 4cd42b86e9..1f44ee8004 100644 --- a/data/assets/scene/solarsystem/sun/transforms.asset +++ b/data/assets/scene/solarsystem/sun/transforms.asset @@ -14,6 +14,7 @@ local SolarSystemBarycenter = { GUI = { Name = "Solar System Barycenter", Path = "/Solar System", + Focusable = false, Hidden = true } } @@ -32,6 +33,7 @@ local SunCenter = { Name = "Sun Center", Path = "/Solar System/Sun", Description = "Spice frame for the Sun", + Focusable = false, Hidden = true } } @@ -55,6 +57,7 @@ local SunIAU = { GUI = { Name = "Sun IAU", Path = "/Solar System/Sun", + Focusable = false, Hidden = true } } @@ -77,6 +80,7 @@ local SunEclipJ2000 = { GUI = { Name = "Sun J2000", Path = "/Solar System/Sun", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/telescopes/euclid/mission.asset b/data/assets/scene/solarsystem/telescopes/euclid/mission.asset index a5379df34a..3509208015 100644 --- a/data/assets/scene/solarsystem/telescopes/euclid/mission.asset +++ b/data/assets/scene/solarsystem/telescopes/euclid/mission.asset @@ -1,7 +1,7 @@ local Mission = { Identifier = "Euclid", Name = "Euclid", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2013/01/euclid_logo/12493233-3-eng-GB/Euclid_logo_pillars.png", + Image = "https://data.openspaceproject.com/missions/euclid/Euclid_logo_pillars.png", Description = [[Euclid is designed to explore the evolution of the dark universe. It will make a 3D-map of the universe (with time as the third dimension) by observing billions of galaxies out to 10 billion light-years, across more than a third of the sky. While dark energy accelerates the expansion of the universe and dark matter governs the growth of cosmic structures, scientists remain unsure about what dark energy and dark matter actually are. diff --git a/data/assets/scene/solarsystem/telescopes/euclid/trails.asset b/data/assets/scene/solarsystem/telescopes/euclid/trails.asset index b91f91ad34..8c6616e245 100644 --- a/data/assets/scene/solarsystem/telescopes/euclid/trails.asset +++ b/data/assets/scene/solarsystem/telescopes/euclid/trails.asset @@ -25,7 +25,8 @@ local EuclidTrailSun = { }, GUI = { Name = "Euclid Trail (Sun)", - Path = "/Solar System/Telescopes/Euclid" + Path = "/Solar System/Telescopes/Euclid", + Focusable = false } } @@ -46,7 +47,8 @@ local EuclidTrailEarth = { }, GUI = { Name = "Euclid Trail (Earth)", - Path = "/Solar System/Telescopes/Euclid" + Path = "/Solar System/Telescopes/Euclid", + Focusable = false } } @@ -73,6 +75,7 @@ local EuclidTrailOrbit = { GUI = { Name = "Euclid Orbit Trail", Path = "/Solar System/Telescopes/Euclid", + Focusable = false, Description = "Euclid Orbit Trail relative to L2" } } @@ -100,6 +103,7 @@ local EuclidTrailCoRevOrbit = { GUI = { Name = "Euclid L2 Co-Revolving Orbit Trail", Path = "/Solar System/Telescopes/Euclid", + Focusable = false, Description = "Euclid Orbit Trail relative to L2" } } diff --git a/data/assets/scene/solarsystem/telescopes/gaia/trail.asset b/data/assets/scene/solarsystem/telescopes/gaia/trail.asset index cc159ca913..a28902e69d 100644 --- a/data/assets/scene/solarsystem/telescopes/gaia/trail.asset +++ b/data/assets/scene/solarsystem/telescopes/gaia/trail.asset @@ -35,7 +35,8 @@ local GaiaTrail = { }, GUI = { Name = "Gaia Trail", - Path = "/Solar System/Telescopes/Gaia" + Path = "/Solar System/Telescopes/Gaia", + Focusable = false } } @@ -61,7 +62,8 @@ local GaiaTrailEclip = { }, GUI = { Name = "Gaia Ecliptic Trail", - Path = "/Solar System/Telescopes/Gaia" + Path = "/Solar System/Telescopes/Gaia", + Focusable = false } } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/fieldofview.asset b/data/assets/scene/solarsystem/telescopes/jwst/fieldofview.asset index 95d5117d3d..119342ebdb 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/fieldofview.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/fieldofview.asset @@ -30,6 +30,7 @@ local JWSTFov = { GUI = { Name = "JWST Field of View", Path = "/Solar System/Telescopes/JWST", + Focusable = false, Description = [[ The field of view for the James Webb Space Telescope at its current position. ]] diff --git a/data/assets/scene/solarsystem/telescopes/jwst/label.asset b/data/assets/scene/solarsystem/telescopes/jwst/label.asset index 21fe46a65c..567fb8c83c 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/label.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/label.asset @@ -23,6 +23,7 @@ local JWSTLabel = { GUI = { Name = "JWST Label", Path = "/Solar System/Telescopes/JWST", + Focusable = false, Description = "Main label for the James Webb Space Telescope." } } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/mission.asset b/data/assets/scene/solarsystem/telescopes/jwst/mission.asset index e1ede5a9ce..00f3fe29c5 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/mission.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/mission.asset @@ -1,20 +1,20 @@ local Mission = { Identifier = "JWST", Name = "James Webb Space Telescope", - Image = "https://www.esa.int/var/esa/storage/images/esa_multimedia/images/2016/12/jwst_mission_logo/16561412-4-eng-GB/JWST_mission_logo_pillars.png", + Image = "https://data.openspaceproject.com/missions/jwst/JWST_mission_logo_pillars.png", Description = "The James Webb Space Telescope (sometimes called JWST or Webb) is an orbiting infrared observatory that will complement and extend the discoveries of the Hubble Space Telescope, with longer wavelength coverage and greatly improved sensitivity. The longer wavelengths enable Webb to look much closer to the beginning of time and to hunt for the unobserved formation of the first galaxies, as well as to look inside dust clouds where stars and planetary systems are forming today.", Milestones = { { Name = "Launch", Date = "2021 DEC 25 12:20:00", - Image = "https://webb.nasa.gov/ImagesContent/51775043129_7aeedc5a6d_k.jpg", + Image = "https://data.openspaceproject.com/missions/jwst/51775043129_7aeedc5a6d_k.jpg", Description = "Webb was launched from Arianespace's ELA-3 launch complex at Europe's Spaceport located near Kourou, French Guiana. It is beneficial for launch sites to be located near the equator - the spin of the Earth can help give an additional push. The surface of the Earth at the equator is moving at 1670 km/hr. The James Webb Space Telescope was launched on an Ariane 5 rocket. The launch vehicle and launch site were part of the European Space Agency's contribution to the mission. The Ariane 5 is one of the world's most reliable launch vehicles and was chosen for a combination of reliability (it was the only launch vehicle that met NASA's requirements for launching a mission like Webb) and for the value it brought via our international partnership." }, { Name = "Arrival at L2 orbit", Date = "2022 JAN 24 00:00:00", Description = "When you ask an astronomer about the James Webb Space Telescope's orbit, they'll tell you something that sounds like it came from a science-fiction novel. The Webb won't be orbiting the Earth - instead we will send it almost a million miles out into space to a place called 'L2'. L2 is short-hand for the second Lagrange Point, a wonderful accident of gravity and orbital mechanics, and the perfect place to park the Webb telescope in space. There are five so-called 'Lagrange Points' - areas where gravity from the sun and Earth balance the orbital motion of a satellite. Putting a spacecraft at any of these points allows it to stay in a fixed position relative to the Earth and sun with a minimal amount of energy needed for course correction.", - Image = "https://www.nasa.gov/images/content/463480main_lagrange_point_lg_1.jpg", + Image = "https://data.openspaceproject.com/missions/jwst/463480main_lagrange_point_lg_1.webp", Link = "https://www.nasa.gov/topics/universe/features/webb-l2.html" }, { @@ -25,19 +25,19 @@ local Mission = { Name = "Fine phasing alignment", Date = "2022 MAR 11 00:00:00", Description = "While the purpose of this image was to focus on the bright star at the center for alignment evaluation, Webb's optics and NIRCam are so sensitive that the galaxies and stars seen in the background show up. At this stage of Webb's mirror alignment, known as “fine phasing,” each of the primary mirror segments have been adjusted to produce one unified image of the same star using only the NIRCam instrument. This image of the star, which is called 2MASS J17554042+6551277, uses a red filter to optimize visual contrast.", - Image = "https://www.nasa.gov/sites/default/files/thumbnails/image/telescope_alignment_evaluation_image_labeled.png" + Image = "https://data.openspaceproject.com/missions/jwst/telescope_alignment_evaluation_image_labeled.jpg" }, { Name = "First deep field image released", Date = "2022 JUL 11 14:30:00", Description = "JWST's first science image was released a day early, on July 11, 2022, in an address by the President of the United States, Joe Biden. This deep field image is the highest-resolution and deepest infrared view of our Universe taken to date. The light from these galaxies is gravitationally lensed by the mass of the galaxy cluster SMACS 0723 in the foreground. It causes their light to be warped into beautiful arcs. This image shows SMACS 0723 as it was 4.6 billion years ago, but the background galaxies are much further away. The furthest light in this image has taken over 13 billion years to reach us. This image represents a part of the sky that's so small that it could fit behind a grain of sand on the tip of your finger held at arm's length.", - Image = "https://planetary.s3.amazonaws.com/web/assets/pictures/_2400x2448_crop_center-center_82_line/JWST-First-Deep-Field.jpg.webp", + Image = "https://data.openspaceproject.com/missions/jwst/JWST-First-Deep-Field.jpg.webp", Link = "https://webbtelescope.org/news/first-images/gallery" }, { Name = "Alignment complete", Description = "Alignment of NASA's James Webb Space Telescope is now complete. After full review, the observatory has been confirmed to be capable of capturing crisp, well-focused images with each of its four powerful onboard science instruments. Upon completing the seventh and final stage of telescope alignment, the team held a set of key decision meetings and unanimously agreed that Webb is ready to move forward into its next and final series of preparations, known as science instrument commissioning. This process will take about two months before scientific operations begin in the summer.", - Image = "https://blogs.nasa.gov/webb/wp-content/uploads/sites/326/2022/04/webb_img_sharpness.png", + Image = "https://data.openspaceproject.com/missions/jwst/webb_img_sharpness.png", Date = "2022 APR 28 00:00:00", Link = "https://blogs.nasa.gov/webb/2022/04/28/nasas-webb-in-full-focus-ready-for-instrument-commissioning/" } @@ -59,7 +59,7 @@ local Mission = { { Name = "Sunshield deployment", TimeRange = { Start = "2021 DEC 25 12:50:00", End = "2022 JAN 04 00:00:00" }, - Image = "https://c1.staticflickr.com/5/4573/37594108385_36d5e25c8a_b.jpg", + Image = "https://data.openspaceproject.com/missions/jwst/37594108385_36d5e25c8a_b.jpg", Description = "The sunshield separates the observatory into a warm, sun-facing side (thermal models show the max temperature of the outermost layer is 383K or approximately 230F or 110C), and a cold side (with the coldest layer having a modeled minimum temp of 36K or around -394F or -236C). The five-layer sunshield keeps sunlight from interfering with the sensitive telescope instruments. The telescope operates under 50K (~-370F or ~-223C)" } } @@ -67,9 +67,8 @@ local Mission = { { Name = "Telescope alignment", TimeRange = { Start = "2022 JAN 24 00:00:00", End = "2022 APR 28 00:00:00" }, - Image = "https://blogs.nasa.gov/webb/wp-content/uploads/sites/326/2022/02/alignment_mosaic_compressed-1200x813.png", - Description = "Using the Fine Guidance Sensor, we pointed Webb at a single bright star and demonstrated that the observatory could acquire and lock onto targets, and we took data mainly with NIRCam. But because the primary mirror segments had yet to be aligned to work as a single mirror, there were distorted images of the same single target star. We then embarked on the long process of aligning all the telescope optics, beginning with identifying which primary mirror segment went with which image by moving each segment one at a time and ended a few months later with all the segments aligned as one and the secondary mirror aligned optimally.", - Link = "https://blogs.nasa.gov/webb/wp-content/uploads/sites/326/2022/02/SegmentAlignment.gif" + Image = "https://data.openspaceproject.com/missions/jwst/alignment_mosaic_compressed-1200x813.png", + Description = "Using the Fine Guidance Sensor, we pointed Webb at a single bright star and demonstrated that the observatory could acquire and lock onto targets, and we took data mainly with NIRCam. But because the primary mirror segments had yet to be aligned to work as a single mirror, there were distorted images of the same single target star. We then embarked on the long process of aligning all the telescope optics, beginning with identifying which primary mirror segment went with which image by moving each segment one at a time and ended a few months later with all the segments aligned as one and the secondary mirror aligned optimally." }, { Name = "Science instrument commissioning", diff --git a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset index 928564a9e1..fa7d4c6758 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/trail.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/trail.asset @@ -36,6 +36,7 @@ local JWSTTrailLaunch = { GUI = { Name = "JWST Launch Trail", Path = "/Solar System/Telescopes/JWST/Trails", + Focusable = false, Description = "James Webb Space Telescope Launch Trail relative to Earth IAU." } } @@ -66,6 +67,7 @@ local JWSTTrailCruise = { GUI = { Name = "JWST Cruise Trail", Path = "/Solar System/Telescopes/JWST/Trails", + Focusable = false, Description = "James Webb Space Telescope Cruise Trail relative to Earth." } } @@ -97,6 +99,7 @@ local JWSTTrailOrbit = { GUI = { Name = "JWST Orbit Trail", Path = "/Solar System/Telescopes/JWST/Trails", + Focusable = false, Description = "James Webb Space Telescope Orbit Trail relative to L2." } } @@ -127,6 +130,7 @@ local JWSTTrailCoRevOrbit = { GUI = { Name = "JWST L2 Co-revolving Orbit Trail", Path = "/Solar System/Telescopes/JWST/Trails", + Focusable = false, Description = "James Webb Space Telescope Orbit Trail that Co-revolves with L2." } } @@ -155,6 +159,7 @@ local JWSTSunTrail = { GUI = { Name = "JWST Sun Trail", Path = "/Solar System/Telescopes/JWST/Trails", + Focusable = false, Description = "James Webb Space Telescope Trail relative to the Sun." } } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset b/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset index 56fa1265b7..d5097f78a1 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/transforms.asset @@ -43,6 +43,7 @@ local JWSTPosition = { GUI = { Name = "JWST Position", Path = "/Solar System/Telescopes/JWST", + Focusable = false, Hidden = true } } @@ -63,6 +64,7 @@ local JWSTRotation = { GUI = { Name = "JWST Rotation", Path = "/Solar System/Telescopes/JWST", + Focusable = false, Hidden = true } } diff --git a/data/assets/scene/solarsystem/telescopes/jwst/viewingband.asset b/data/assets/scene/solarsystem/telescopes/jwst/viewingband.asset index 9177158b10..a616d3277e 100644 --- a/data/assets/scene/solarsystem/telescopes/jwst/viewingband.asset +++ b/data/assets/scene/solarsystem/telescopes/jwst/viewingband.asset @@ -41,6 +41,7 @@ local JWSTBand = { GUI = { Name = "JWST Safe Viewing Band", Path = "/Solar System/Telescopes/JWST", + Focusable = false, Description = [[ The safe viewing band for the James Webb Space Telescope at its current position. ]] diff --git a/data/assets/util/static_server.asset b/data/assets/util/static_server.asset index b6a4c39804..11ca748ae2 100644 --- a/data/assets/util/static_server.asset +++ b/data/assets/util/static_server.asset @@ -1,4 +1,4 @@ -local BackendHash = "7ca0a34e9c4c065b7bfad0623db0e322bf3e0af9" +local BackendHash = "091038cbc60b7edfecc143f9c6373ab48254c3d7" local backend = asset.resource({ Identifier = "WebGuiBackend", diff --git a/data/assets/util/webgui.asset b/data/assets/util/webgui.asset index 55822c7dc6..202a0aa0dd 100644 --- a/data/assets/util/webgui.asset +++ b/data/assets/util/webgui.asset @@ -4,24 +4,40 @@ local guiCustomization = asset.require("customization/gui") -- Select which commit hashes to use for the UI frontend -local frontendHash = "b2c5407c617a87faa18778c993a695ae6014a0b3" +local frontendHash = "6842c17cba43318852cd05d2bcae132bf7f88c39" -- The name of the file to download from the server -local file = "frontend.zip" +local frontendFile = "frontend.zip" local frontend = asset.resource({ Identifier = "WebGuiFrontend", Name = "Web Gui Frontend", Type = "UrlSynchronization", - Url = "http://data.openspaceproject.com/files/webgui/frontend/" .. frontendHash .. "/" .. file + Url = "http://data.openspaceproject.com/files/webgui/frontend/" .. frontendHash .. "/" .. frontendFile +}) + + +local showcomposerHash = "9071d8bc80d16dc1e081017e02297915563f0a64" +local showcomposerFile = "showcomposer.zip" + +local showcomposer = asset.resource({ + Identifier = "WebGuiShowComposer", + Name = "Web Gui ShowComposer", + Type = "UrlSynchronization", + Url = "http://data.openspaceproject.com/files/webgui/showcomposer/" .. showcomposerHash .. "/" .. showcomposerFile }) asset.onInitialize(function() -- Unzip the frontend bundle - local dest = frontend .. "frontend" - if not openspace.directoryExists(dest) then - openspace.unzipFile(frontend .. file, dest, true) + local destFrontend = frontend .. "frontend" + if not openspace.directoryExists(destFrontend) then + openspace.unzipFile(frontend .. frontendFile, destFrontend, true) + end + + local destShowcomposer = showcomposer .. "showcomposer" + if not openspace.directoryExists(destShowcomposer) then + openspace.unzipFile(showcomposer .. showcomposerFile, destShowcomposer, true) end -- Disable the server, add production gui endpoint, and restart server. @@ -40,6 +56,16 @@ asset.onInitialize(function() directories[#directories + 1] = "webpanels" directories[#directories + 1] = openspace.absPath("${USER_WEBPANELS}") + -- Add user directories for showcompower + directories[#directories + 1] = "showcomposer" + directories[#directories + 1] = showcomposer .. "showcomposer" + directories[#directories + 1] = "showcomposer/hub" + directories[#directories + 1] = showcomposer .. "showcomposer" + directories[#directories + 1] = "showcomposer/uploads" + directories[#directories + 1] = openspace.absPath("${USER_SHOWCOMPOSER_UPLOADS}") + directories[#directories + 1] = "showcomposer/projects" + directories[#directories + 1] = openspace.absPath("${USER_SHOWCOMPOSER_PROJECTS}") + openspace.setPropertyValueSingle("Modules.WebGui.Directories", directories) openspace.setPropertyValueSingle("Modules.WebGui.DefaultEndpoint", "frontend") openspace.setPropertyValueSingle("Modules.WebGui.ServerProcessEnabled", enabled) diff --git a/data/profiles/spaceweather/bastilleday2000.profile b/data/profiles/spaceweather/bastilleday2000.profile index 5b91a06709..9a0416504c 100644 --- a/data/profiles/spaceweather/bastilleday2000.profile +++ b/data/profiles/spaceweather/bastilleday2000.profile @@ -13,7 +13,6 @@ "scene/solarsystem/heliosphere/bastille_day/magnetogram", "scene/solarsystem/heliosphere/bastille_day/magnetogram_textures", "scene/solarsystem/planets/earth/magnetosphere/magnetosphere", - "scene/solarsystem/planets/earth/magnetosphere/transforms_magnetosphere", "scene/solarsystem/planets/earth/satellites/satellites", "scene/solarsystem/sun/euv_layer" ], @@ -80,7 +79,7 @@ "key": "I" }, { - "action": "os.solarsystem.ToggleEuv", + "action": "os.solarsystem.sun.ToggleEuv", "key": "E" }, { @@ -162,4 +161,4 @@ "major": 1, "minor": 4 } -} \ No newline at end of file +} diff --git a/data/profiles/spaceweather/todays_sun.profile b/data/profiles/spaceweather/todays_sun.profile new file mode 100644 index 0000000000..2a1f03812a --- /dev/null +++ b/data/profiles/spaceweather/todays_sun.profile @@ -0,0 +1,164 @@ +{ + "assets": [ + "base", + "base_keybindings", + "scene/solarsystem/heliosphere/todayssun/fieldlines", + "scene/solarsystem/heliosphere/todayssun/grid", + "scene/solarsystem/heliosphere/todayssun/mission", + "scene/solarsystem/heliosphere/todayssun/sun_earth_line", + "scene/solarsystem/heliosphere/todayssun/surfaces", + "scene/solarsystem/planets/earth/earth", + "scene/solarsystem/planets/earth/satellites/satellites" + ], + "camera": { + "altitude": 4578000000.0, + "anchor": "Sun", + "latitude": 1.5877, + "longitude": -150.1924, + "type": "goToGeo" + }, + "delta_times": [ + 1.0, + 5.0, + 30.0, + 60.0, + 300.0, + 1800.0, + 3600.0, + 43200.0, + 86400.0, + 604800.0, + 1209600.0, + 2592000.0, + 5184000.0, + 7776000.0, + 15552000.0, + 31536000.0, + 63072000.0, + 157680000.0, + 315360000.0, + 630720000.0 + ], + "keybindings": [ + { + "action": "os.solarsystem.ToggleSatelliteTrails", + "key": "S" + } + ], + "mark_nodes": [ + "Sun", + "Earth" + ], + "meta": { + "author": "OpenSpace Team", + "description": "This profile uses simulation outputs in real time from the model WSA to visualize the magnetic fluctuations on the Sun.", + "license": "MIT License", + "name": "Todays Sun", + "url": "https://www.openspaceproject.com", + "version": "1.0" + }, + "panel_visibility": { + "exoplanets": false, + "flightControl": false, + "geoLocation": false, + "gettingStartedTour": false, + "mission": true, + "skyBrowser": false + }, + "properties": [ + { + "name": "{earth_satellites}.Renderable.Enabled", + "type": "setPropertyValue", + "value": "false" + }, + { + "name": "Scene.Sun.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.SunGlare.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.Earth.Renderable.Layers.ColorLayers.Blue_Marble.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.Earth.Renderable.Layers.ColorLayers.ESRI_VIIRS_Combo.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_velocity_GONGZ_Outer_Boundary.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_velocity_ADAPT_Outer_Boundary.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Magnetograms_ADAPT.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Magnetograms_GONGZ.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.WSA_54_Magnetic_Field_ADAPT_5_Rs.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Magnetic_Field_GONGZ_5_Rs.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Fieldlines_PFSS_IO.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.WSA_54_Fieldlines_PFSS_OI.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "true" + }, + { + "name": "Scene.WSA_54_Fieldlines_SCS_OI.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Fieldlines_Earth.Renderable.Enabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Fieldlines_PFSS_IO.Renderable.ABlendingEnabled", + "type": "setPropertyValueSingle", + "value": "false" + }, + { + "name": "Scene.WSA_54_Fieldlines_PFSS_IO.Renderable.LineWidth", + "type": "setPropertyValueSingle", + "value": "2.0" + } + ], + "time": { + "is_paused": false, + "type": "relative", + "value": "-2h" + }, + "version": { + "major": 1, + "minor": 4 + } +} diff --git a/ext/ghoul b/ext/ghoul index c9f98622e7..4219692f42 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit c9f98622e71c0f763c7956c6bd22a1ac39b2bad3 +Subproject commit 4219692f4282309c5da3ea6b7277f3d375b2f859 diff --git a/include/openspace/engine/windowdelegate.h b/include/openspace/engine/windowdelegate.h index 806adc063b..8a9cd1bf65 100644 --- a/include/openspace/engine/windowdelegate.h +++ b/include/openspace/engine/windowdelegate.h @@ -43,6 +43,7 @@ struct WindowDelegate { void (*setSynchronization)(bool enabled) = [](bool) {}; bool (*windowHasResized)() = []() { return false; }; + bool (*anyWindowHasResized)() = []() { return false; }; double (*averageDeltaTime)() = []() { return 0.0; }; diff --git a/include/openspace/events/event.h b/include/openspace/events/event.h index 19311832d3..563e4c5a44 100644 --- a/include/openspace/events/event.h +++ b/include/openspace/events/event.h @@ -266,7 +266,7 @@ struct EventMissionAdded : public Event { /** * Creates an instance of an EventMissionAdded event. - * + * * \param identifier The identifier of the mission added */ EventMissionAdded(std::string_view identifier); @@ -310,7 +310,7 @@ struct EventPlanetEclipsed : public Event { /** * Creates an instance of an EventPlanetEclipsed event. - + * \param eclipsee_ The scene graph node that is eclipsed by another object * \param eclipser_ The scene graph node that is eclipsing the other object * diff --git a/include/openspace/interaction/sessionrecordinghandler.h b/include/openspace/interaction/sessionrecordinghandler.h index 3a92fe3c63..a3cc99fba9 100644 --- a/include/openspace/interaction/sessionrecordinghandler.h +++ b/include/openspace/interaction/sessionrecordinghandler.h @@ -106,7 +106,8 @@ public: * and all keyframes deleted from memory. * \param filename File saved with recorded keyframes */ - void stopRecording(const std::filesystem::path& filename, DataMode dataMode, bool overwrite = false); + void stopRecording(const std::filesystem::path& filename, DataMode dataMode, + bool overwrite = false); /** * Used to check if a session recording is in progress. diff --git a/include/openspace/properties/misc/optionproperty.h b/include/openspace/properties/misc/optionproperty.h index c1b0513c26..deeadd946d 100644 --- a/include/openspace/properties/misc/optionproperty.h +++ b/include/openspace/properties/misc/optionproperty.h @@ -141,7 +141,6 @@ public: std::string stringValue() const override final; private: - static const std::string OptionsKey; nlohmann::json generateAdditionalJsonDescription() const override final; int toValue(lua_State* state) const override final; diff --git a/include/openspace/properties/numericalproperty.inl b/include/openspace/properties/numericalproperty.inl index 9c053298c2..708cf9b224 100644 --- a/include/openspace/properties/numericalproperty.inl +++ b/include/openspace/properties/numericalproperty.inl @@ -62,7 +62,7 @@ T NumericalProperty::minValue() const { template void NumericalProperty::setMinValue(T value) { _minimumValue = std::move(value); - Property::notifyMetaDataChangeListeners(); + Property::notifyMetaDataChangeListeners(); } template @@ -73,7 +73,7 @@ T NumericalProperty::maxValue() const { template void NumericalProperty::setMaxValue(T value) { _maximumValue = std::move(value); - Property::notifyMetaDataChangeListeners(); + Property::notifyMetaDataChangeListeners(); } template @@ -84,7 +84,7 @@ T NumericalProperty::steppingValue() const { template void NumericalProperty::setSteppingValue(T value) { _stepping = std::move(value); - Property::notifyMetaDataChangeListeners(); + Property::notifyMetaDataChangeListeners(); } template @@ -127,10 +127,22 @@ void NumericalProperty::setExponent(float exponent) { template nlohmann::json NumericalProperty::generateAdditionalJsonDescription() const { nlohmann::json result = { - { MinimumValueKey, nlohmann::json::parse(luaToJson(ghoul::to_string(_minimumValue))) }, - { MaximumValueKey, nlohmann::json::parse(luaToJson(ghoul::to_string(_maximumValue))) }, - { SteppingValueKey, nlohmann::json::parse(luaToJson(ghoul::to_string(_stepping))) }, - { ExponentValueKey, nlohmann::json::parse(luaToJson(ghoul::to_string(_exponent))) } + { + MinimumValueKey, + nlohmann::json::parse(luaToJson(ghoul::to_string(_minimumValue))) + }, + { + MaximumValueKey, + nlohmann::json::parse(luaToJson(ghoul::to_string(_maximumValue))) + }, + { + SteppingValueKey, + nlohmann::json::parse(luaToJson(ghoul::to_string(_stepping))) + }, + { + ExponentValueKey, + nlohmann::json::parse(luaToJson(ghoul::to_string(_exponent))) + } }; return result; } diff --git a/include/openspace/properties/property.h b/include/openspace/properties/property.h index 5713729e55..230d7040c1 100644 --- a/include/openspace/properties/property.h +++ b/include/openspace/properties/property.h @@ -463,7 +463,7 @@ public: /** * Creates the information that is general to every Property and adds the - * `description`, `guiName`, `group`, `isReadOnly`, `needsConfirmation` `type`, + * `description`, `guiName`, `group`, `isReadOnly`, `needsConfirmation` `type`, * and `visibility` keys and their values. * * \return The base description common to all Property classes diff --git a/include/openspace/properties/propertyowner.h b/include/openspace/properties/propertyowner.h index 8c7e8761f8..1849f08a28 100644 --- a/include/openspace/properties/propertyowner.h +++ b/include/openspace/properties/propertyowner.h @@ -250,7 +250,7 @@ public: * PropertyOwner. This method will also inform the Property about the change in * ownership by calling the Property::setPropertyOwner method. * - * \param prop The Property whose ownership is changed. + * \param prop The Property whose ownership is changed */ void addProperty(Property* prop); diff --git a/include/openspace/rendering/transferfunction.h b/include/openspace/rendering/transferfunction.h index 6f672a0548..1b0fe415c5 100644 --- a/include/openspace/rendering/transferfunction.h +++ b/include/openspace/rendering/transferfunction.h @@ -39,7 +39,7 @@ namespace openspace { class TransferFunction { public: using TfChangedCallback = std::function; - + explicit TransferFunction(const std::filesystem::path& filepath, TfChangedCallback tfChangedCallback = TfChangedCallback()); ~TransferFunction(); diff --git a/include/openspace/scene/assetmanager.h b/include/openspace/scene/assetmanager.h index bb10f252d0..45bcf91302 100644 --- a/include/openspace/scene/assetmanager.h +++ b/include/openspace/scene/assetmanager.h @@ -78,8 +78,9 @@ public: void remove(const std::string& path); /** - * Reloads the asset at the provided \p path as a new root asset of the AssetManager. If the - * asset at that path was not previously loaded, acts the same as the add function. + * Reloads the asset at the provided \p path as a new root asset of the AssetManager. + * If the asset at that path was not previously loaded, acts the same as the add + * function. * * \param path The path from which the Asset is loaded. This path can be either * relative to the base directory (the path starting with . or ..), an absolute diff --git a/include/openspace/scene/rotation.h b/include/openspace/scene/rotation.h index f95481a504..7db4d7ea9c 100644 --- a/include/openspace/scene/rotation.h +++ b/include/openspace/scene/rotation.h @@ -64,7 +64,7 @@ public: explicit Rotation(const ghoul::Dictionary& dictionary); virtual ~Rotation() override = default; - virtual bool initialize(); + virtual void initialize(); virtual void update(const UpdateData& data); const glm::dmat3& matrix() const; diff --git a/include/openspace/scene/scale.h b/include/openspace/scene/scale.h index 55f22458f6..188a18e6f4 100644 --- a/include/openspace/scene/scale.h +++ b/include/openspace/scene/scale.h @@ -47,7 +47,7 @@ public: Scale(const ghoul::Dictionary& dictionary); virtual ~Scale() override = default; - virtual bool initialize(); + virtual void initialize(); virtual void update(const UpdateData& data); glm::dvec3 scaleValue() const; diff --git a/include/openspace/scene/translation.h b/include/openspace/scene/translation.h index cdb5d05443..9096e9a1af 100644 --- a/include/openspace/scene/translation.h +++ b/include/openspace/scene/translation.h @@ -48,7 +48,7 @@ public: explicit Translation(const ghoul::Dictionary& dictionary); virtual ~Translation() override = default; - virtual bool initialize(); + virtual void initialize(); virtual void update(const UpdateData& data); glm::dvec3 position() const; diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index ce73d11f47..9a72e2fa53 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -110,7 +110,7 @@ public: void queueScript(Script script); void queueScript(std::string script); - // Runs the `script` every `timeout` seconds wallclock time + // Runs the `script` every `timeout` seconds wallclock time void registerRepeatedScript(std::string identifier, std::string script, double timeout, std::string preScript = "", std::string postScript = ""); void removeRepeatedScript(std::string_view identifier); diff --git a/include/openspace/util/dynamicfilesequencedownloader.h b/include/openspace/util/dynamicfilesequencedownloader.h new file mode 100644 index 0000000000..699c5a20d9 --- /dev/null +++ b/include/openspace/util/dynamicfilesequencedownloader.h @@ -0,0 +1,107 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_CORE___DYNAMICFILESEQUENCEDOWNLOADER___H__ +#define __OPENSPACE_CORE___DYNAMICFILESEQUENCEDOWNLOADER___H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openspace { + +struct File { + std::unique_ptr download; + std::string timestep; + double time = 0.0; + std::string URL; + std::filesystem::path path; + double cadence = 0.0; + int availableIndex = -1; + enum class State { + Available, + OnQueue, + Downloading, + Downloaded, + Unknown + }; + State state = State::Unknown; +}; + +class DynamicFileSequenceDownloader { +public: + DynamicFileSequenceDownloader(int dataID, const std::string& identifier, + std::string infoUrl, std::string dataUrl, size_t nFilesToQueue); + + void deinitialize(bool cacheFiles); + void requestDataInfo(std::string httpInfoRequest); + void requestAvailableFiles(std::string httpDataRequest, + std::filesystem::path syncDir); + std::vector::iterator closestFileToNow(double time); + void update(double time, double deltaTime); + const std::vector& downloadedFiles() const; + void checkForFinishedDownloads(); + void clearDownloaded(); + const std::filesystem::path& destinationDirectory() const; + bool areFilesCurrentlyDownloading() const; + const std::vector& filesCurrentlyDownloading() const; + +private: + void downloadFile(); + double calculateCadence() const; + void putInQueue(); + + bool _isForwardDirection = true; + bool _isFirstFrame = true; + bool _isSecondFrame = true; + bool _hasNotifiedTooFast = false; + + std::filesystem::path _syncDir; + std::filesystem::path _trackSynced; + const int _dataID; + const std::string _infoUrl; + const std::string _dataUrl; + + double _dataMinTime = 0.0; + double _dataMaxTime = 0.0; + + const size_t _nFilesToQueue = 0; + + std::vector::iterator _currentFile; + + std::vector _availableData; + std::vector _queuedFilesToDownload; + std::vector _filesCurrentlyDownloading; + std::vector _downloadedFiles; +}; + +} // namespace openspace + +#endif // __OPENSPACE_CORE___DYNAMICFILESEQUENCEDOWNLOADER___H__ diff --git a/modules/atmosphere/atmospheremodule.cpp b/modules/atmosphere/atmospheremodule.cpp index 9540d6ba0a..59e667d309 100644 --- a/modules/atmosphere/atmospheremodule.cpp +++ b/modules/atmosphere/atmospheremodule.cpp @@ -48,4 +48,5 @@ std::vector AtmosphereModule::documentations() con RenderableAtmosphere::Documentation() }; } + } // namespace openspace diff --git a/modules/base/basemodule.cpp b/modules/base/basemodule.cpp index 17a83b2820..f37d0b9961 100644 --- a/modules/base/basemodule.cpp +++ b/modules/base/basemodule.cpp @@ -122,7 +122,9 @@ void BaseModule::internalInitialize(const ghoul::Dictionary&) { fSsRenderable->registerClass( "ScreenSpaceRenderableRenderable" ); - fSsRenderable->registerClass("ScreenSpaceTimeVaryingImageOnline"); + fSsRenderable->registerClass( + "ScreenSpaceTimeVaryingImageOnline" + ); ghoul::TemplateFactory* fDashboard = diff --git a/modules/base/dashboard/dashboarditemtimevaryingtext.cpp b/modules/base/dashboard/dashboarditemtimevaryingtext.cpp index f539715570..f23a730774 100644 --- a/modules/base/dashboard/dashboarditemtimevaryingtext.cpp +++ b/modules/base/dashboard/dashboarditemtimevaryingtext.cpp @@ -84,7 +84,7 @@ DashboardItemTimeVaryingText::DashboardItemTimeVaryingText( _formatString = p.formatString.value_or(_formatString); addProperty(_formatString); - + _dataFile.onChange([this]() { loadDataFromJson(_dataFile); }); _dataFile = p.dataFile.string(); addProperty(_dataFile); diff --git a/modules/base/rendering/grids/renderablesphericalgrid.cpp b/modules/base/rendering/grids/renderablesphericalgrid.cpp index ea5894d11e..d59b05aafb 100644 --- a/modules/base/rendering/grids/renderablesphericalgrid.cpp +++ b/modules/base/rendering/grids/renderablesphericalgrid.cpp @@ -82,9 +82,9 @@ namespace { // will always be given a radius of one meter. To change its size, use a `Scale` // transform, such as the [StaticScale](#base_transform_scale_static). // - // The grid may be split up into equal segments in both directions using the `Segments` - // parameter, or different number of segments in the latitudal and longtudal direction - // using the `LatSegments` and `LongSegments` parameters. + // The grid may be split up into equal segments in both directions using the + // `Segments` parameter, or different number of segments in the latitudal and + // longtudal direction using the `LatSegments` and `LongSegments` parameters. struct [[codegen::Dictionary(RenderableSphericalGrid)]] Parameters { // [[codegen::verbatim(ColorInfo.description)]] std::optional color [[codegen::color()]]; diff --git a/modules/base/rendering/renderabledistancelabel.cpp b/modules/base/rendering/renderabledistancelabel.cpp index a9c81ad198..b695c9a09a 100644 --- a/modules/base/rendering/renderabledistancelabel.cpp +++ b/modules/base/rendering/renderabledistancelabel.cpp @@ -167,7 +167,9 @@ void RenderableDistanceLabel::update(const UpdateData&) { // Get distance as string const double convertedDistance = convertMeters(nodeline->distance(), unit); - std::string distanceText = std::format("{:.{}f}", convertedDistance, _precision.value()); + std::string distanceText = std::format( + "{:.{}f}", convertedDistance, _precision.value() + ); // Create final label text and set it const std::string finalText = std::format("{} {}", distanceText, unitDescriptor); diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index e57aa6f94f..7934970c16 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -224,9 +224,12 @@ RenderablePlane::DistanceScalingSettings::DistanceScalingSettings( const Parameters::DistanceScalingSettings settings = *p.distanceScalingSettings; scaleByDistance = settings.scaleByDistance.value_or(scaleByDistance); - apparentSizeMultiplier = settings.apparentSizeMultiplier.value_or(apparentSizeMultiplier); - scaleByDistanceMaxHeight = settings.scaleByDistanceMaxHeight.value_or(scaleByDistanceMaxHeight); - scaleByDistanceMinHeight = settings.scaleByDistanceMinHeight.value_or(scaleByDistanceMinHeight); + apparentSizeMultiplier = + settings.apparentSizeMultiplier.value_or(apparentSizeMultiplier); + scaleByDistanceMaxHeight = + settings.scaleByDistanceMaxHeight.value_or(scaleByDistanceMaxHeight); + scaleByDistanceMinHeight = + settings.scaleByDistanceMinHeight.value_or(scaleByDistanceMinHeight); } addProperty(scaleByDistance); diff --git a/modules/base/rendering/renderablesphere.cpp b/modules/base/rendering/renderablesphere.cpp index 187957b834..479246258b 100644 --- a/modules/base/rendering/renderablesphere.cpp +++ b/modules/base/rendering/renderablesphere.cpp @@ -40,6 +40,7 @@ #include namespace { + constexpr std::string_view _loggerCat = "RenderableSphere"; constexpr int DefaultBlending = 0; constexpr int AdditiveBlending = 1; constexpr int PolygonBlending = 2; @@ -112,6 +113,21 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo UseColorMapInfo = { + "UseColorMap", + "Use Color Map", + "Used to toggle color map on or off for the sphere. Mainly used to transform " + "grayscale textures from data into color images.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo ColorMapInfo = { + "ColorMap", + "Transfer Function (Color Map) Path", + "Color map / Transfer function to use if `UseColorMap` is enabled.", + openspace::properties::Property::Visibility::AdvancedUser + }; + constexpr openspace::properties::Property::PropertyInfo BlendingOptionInfo = { "BlendingOption", "Blending Options", @@ -161,6 +177,12 @@ namespace { // [[codegen::verbatim(FadeOutThresholdInfo.description)]] std::optional fadeOutThreshold [[codegen::inrange(0.0, 1.0)]]; + // [[codegen::verbatim(ColorMapInfo.description)]] + std::optional colorMap; + + // [[codegen::verbatim(UseColorMapInfo.description)]] + std::optional useColorMap; + // [[codegen::verbatim(BlendingOptionInfo.description)]] std::optional blendingOption; @@ -187,6 +209,8 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) , _fadeOutThreshold(FadeOutThresholdInfo, 0.f, 0.f, 1.f, 0.001f) , _blendingFuncOption(BlendingOptionInfo) , _disableDepth(DisableDepthInfo, false) + , _useColorMap(UseColorMapInfo, false) + , _colorMap(ColorMapInfo) { const Parameters p = codegen::bake(dictionary); @@ -244,6 +268,33 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary) addProperty(_disableDepth); setBoundingSphere(_size); + + if (p.colorMap.has_value()) { + _colorMap = p.colorMap->string(); + _useColorMap = true; + } + addProperty(_useColorMap); + + _colorMap.onChange([this]() { + if (!std::filesystem::exists(_colorMap.value())) { + LERROR(std::format( + "Path {} to color map is invalid.", + _colorMap.value() + )); + return; + } + _transferFunction = std::make_unique(_colorMap.value()); + }); + addProperty(_colorMap); + + // This check is after color map in case a color map is given + // but using it on start-up is set to false. + if (p.useColorMap.has_value()) { + if (!p.colorMap.has_value()) { + throw ghoul::RuntimeError("No color map path was provided"); + } + _useColorMap = *p.useColorMap; + } } bool RenderableSphere::isReady() const { @@ -266,6 +317,10 @@ void RenderableSphere::initializeGL() { ); ghoul::opengl::updateUniformLocations(*_shader, _uniformCache); + + if (_useColorMap) { + _transferFunction = std::make_unique(_colorMap.value()); + } } void RenderableSphere::deinitializeGL() { @@ -278,6 +333,7 @@ void RenderableSphere::deinitializeGL() { } ); _shader = nullptr; + _transferFunction = nullptr; } void RenderableSphere::render(const RenderData& data, RendererTasks&) { @@ -364,6 +420,16 @@ void RenderableSphere::render(const RenderData& data, RendererTasks&) { return; } + // TextureUnit cannot be declared in if statement below + ghoul::opengl::TextureUnit transferFunctionUnit; + _shader->setUniform("usingTransferFunction", _useColorMap); + _shader->setUniform("transferFunction", transferFunctionUnit); + _shader->setUniform("dataMinMaxValues", _dataMinMaxValues); + if (_useColorMap) { + transferFunctionUnit.activate(); + _transferFunction->bind(); + } + _shader->setUniform(_uniformCache.opacity, adjustedOpacity); _shader->setUniform(_uniformCache.mirrorTexture, _mirrorTexture.value()); @@ -430,7 +496,9 @@ void RenderableSphere::update(const UpdateData&) { _shader->rebuildFromFile(); ghoul::opengl::updateUniformLocations(*_shader, _uniformCache); } - + if (!_transferFunction && std::filesystem::exists(_colorMap.value())) { + _transferFunction = std::make_unique(_colorMap.value()); + } if (_sphereIsDirty) [[unlikely]] { _sphere = std::make_unique(_size, _segments); _sphere->initialize(); diff --git a/modules/base/rendering/renderablesphere.h b/modules/base/rendering/renderablesphere.h index cd5613831d..9a6c835607 100644 --- a/modules/base/rendering/renderablesphere.h +++ b/modules/base/rendering/renderablesphere.h @@ -28,6 +28,8 @@ #include #include +#include +#include #include namespace ghoul::opengl { class ProgramObject; } @@ -70,12 +72,17 @@ protected: properties::OptionProperty _blendingFuncOption; properties::BoolProperty _disableDepth; -private: + glm::vec2 _dataMinMaxValues; ghoul::opengl::ProgramObject* _shader = nullptr; + properties::BoolProperty _useColorMap; +private: std::unique_ptr _sphere; bool _sphereIsDirty = false; + properties::StringProperty _colorMap; + std::unique_ptr _transferFunction; + UniformCache(opacity, modelViewProjection, modelViewTransform, modelViewRotation, colorTexture, mirrorTexture) _uniformCache; }; diff --git a/modules/base/rendering/renderableswitch.cpp b/modules/base/rendering/renderableswitch.cpp index 1022f1aa17..1d4dbc0e9c 100644 --- a/modules/base/rendering/renderableswitch.cpp +++ b/modules/base/rendering/renderableswitch.cpp @@ -46,10 +46,10 @@ namespace { openspace::properties::Property::Visibility::AdvancedUser }; - // A RenderableSwitch can be used to render one of two renderables depending on the + // A RenderableSwitch can be used to render one of two renderables depending on the // distance between the camera and the object's position. // - // The two renderables are specified separately: `RenderableNear` and `RenderableFar`. + // The two renderables are specified separately: `RenderableNear` and `RenderableFar`. // These can be any renderable types. // // The `DistanceThreshold` property determines which renderable will be shown. diff --git a/modules/base/rendering/renderableswitch.h b/modules/base/rendering/renderableswitch.h index 597236c888..48b8eda97d 100644 --- a/modules/base/rendering/renderableswitch.h +++ b/modules/base/rendering/renderableswitch.h @@ -55,7 +55,6 @@ protected: ghoul::mm_unique_ptr _renderableNear; ghoul::mm_unique_ptr _renderableFar; - }; } // namespace openspace diff --git a/modules/base/rendering/renderabletimevaryingsphere.cpp b/modules/base/rendering/renderabletimevaryingsphere.cpp index 6434769cf3..496909f558 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.cpp +++ b/modules/base/rendering/renderabletimevaryingsphere.cpp @@ -68,7 +68,10 @@ namespace { namespace openspace { documentation::Documentation RenderableTimeVaryingSphere::Documentation() { - return codegen::doc("base_renderable_time_varying_sphere"); + return codegen::doc( + "base_renderable_time_varying_sphere", + RenderableSphere::Documentation() + ); } RenderableTimeVaryingSphere::RenderableTimeVaryingSphere( @@ -79,20 +82,15 @@ RenderableTimeVaryingSphere::RenderableTimeVaryingSphere( const Parameters p = codegen::bake(dictionary); _textureSourcePath = p.textureSource.string(); + extractMandatoryInfoFromSourceFolder(); + computeSequenceEndTime(); + loadTexture(); } bool RenderableTimeVaryingSphere::isReady() const { return RenderableSphere::isReady() && _texture; } -void RenderableTimeVaryingSphere::initializeGL() { - RenderableSphere::initializeGL(); - - extractMandatoryInfoFromSourceFolder(); - computeSequenceEndTime(); - loadTexture(); -} - void RenderableTimeVaryingSphere::deinitializeGL() { _texture = nullptr; _files.clear(); @@ -148,9 +146,14 @@ void RenderableTimeVaryingSphere::extractMandatoryInfoFromSourceFolder() { void RenderableTimeVaryingSphere::update(const UpdateData& data) { RenderableSphere::update(data); + if (_files.empty()) { + return; + } + const double currentTime = data.time.j2000Seconds(); const bool isInInterval = (currentTime >= _files[0].time) && (currentTime < _sequenceEndTime); + if (isInInterval) { const size_t nextIdx = _activeTriggerTimeIndex + 1; if ( diff --git a/modules/base/rendering/renderabletimevaryingsphere.h b/modules/base/rendering/renderabletimevaryingsphere.h index a6322d572b..5bb35a6d92 100644 --- a/modules/base/rendering/renderabletimevaryingsphere.h +++ b/modules/base/rendering/renderabletimevaryingsphere.h @@ -42,7 +42,6 @@ class RenderableTimeVaryingSphere : public RenderableSphere { public: explicit RenderableTimeVaryingSphere(const ghoul::Dictionary& dictionary); - void initializeGL() override; void deinitializeGL() override; bool isReady() const override; @@ -64,7 +63,6 @@ private: void extractMandatoryInfoFromSourceFolder(); void updateActiveTriggerTimeIndex(double currenttime); void computeSequenceEndTime(); - // If there's just one state it should never disappear! double _sequenceEndTime = std::numeric_limits::max(); std::vector _files; diff --git a/modules/base/rendering/renderabletrail.cpp b/modules/base/rendering/renderabletrail.cpp index 939d7c043c..a666b68f44 100644 --- a/modules/base/rendering/renderabletrail.cpp +++ b/modules/base/rendering/renderabletrail.cpp @@ -244,7 +244,11 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary) } addPropertySubOwner(_appearance); +} +void RenderableTrail::initialize() { + Renderable::initialize(); + _translation->initialize(); } void RenderableTrail::initializeGL() { @@ -291,6 +295,18 @@ bool RenderableTrail::isReady() const { return _programObject != nullptr; } +glm::dvec3 RenderableTrail::translationPosition(Time time) const { + // Use empty modelTransform (local coordinates) and time 0; previous frame time + // doesn't matter + const UpdateData data = { {}, time, Time(0.0) }; + // (2025-06-09, emmbr) No need to call update here, since it's only for caching + // the position and kills the trail performance. If behavior changes or we add + // a translation type that needs pre-update, we need add the update and address + // performance + //_translation->update(data); + return _translation->position(data); +} + void RenderableTrail::internalRender(bool renderLines, bool renderPoints, const RenderData& data, const glm::dmat4& modelTransform, @@ -486,7 +502,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { _primaryRenderInformation.count, _primaryRenderInformation.first, _useSplitRenderMode, - _numberOfUniqueVertices + _nUniqueVertices ); const int floatingOffset = std::max(0, _primaryRenderInformation.count - 1); @@ -499,7 +515,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { _floatingRenderInformation.count, _floatingRenderInformation.first, _useSplitRenderMode, - _numberOfUniqueVertices, + _nUniqueVertices, floatingOffset ); @@ -513,7 +529,7 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { _secondaryRenderInformation.count, _secondaryRenderInformation.first, _useSplitRenderMode, - _numberOfUniqueVertices, + _nUniqueVertices, offset ); @@ -547,8 +563,6 @@ void RenderableTrail::render(const RenderData& data, RendererTasks&) { } - - if (renderPoints) { glDisable(GL_PROGRAM_POINT_SIZE); } diff --git a/modules/base/rendering/renderabletrail.h b/modules/base/rendering/renderabletrail.h index cf8f7e7273..a9683b4c8b 100644 --- a/modules/base/rendering/renderabletrail.h +++ b/modules/base/rendering/renderabletrail.h @@ -97,6 +97,7 @@ public: virtual ~RenderableTrail() override = default; + void initialize() override; void initializeGL() override; void deinitializeGL() override; @@ -115,6 +116,15 @@ public: protected: explicit RenderableTrail(const ghoul::Dictionary& dictionary); + /** + * Get the trail position for a given time from the Translation object. The position + * will be in the local coordinate system of the renderable. + * + * \param time The time for which to get the position + * \return The position of the trail at the given time, in the local coordinate system + */ + glm::dvec3 translationPosition(Time time) const; + static documentation::Documentation Documentation(); /// The layout of the VBOs (use float if sending as positions to shader) @@ -179,7 +189,7 @@ protected: /// Flag used to determine if we use a split trail or not during rendering bool _useSplitRenderMode = false; /// Number of unique vertices used when rendering segmented trails - int _numberOfUniqueVertices = 0; + int _nUniqueVertices = 0; private: void internalRender(bool renderLines, bool renderPoints, diff --git a/modules/base/rendering/renderabletrailorbit.cpp b/modules/base/rendering/renderabletrailorbit.cpp index c8d6aedf1e..7b3c9e3a5b 100644 --- a/modules/base/rendering/renderabletrailorbit.cpp +++ b/modules/base/rendering/renderabletrailorbit.cpp @@ -185,11 +185,7 @@ void RenderableTrailOrbit::update(const UpdateData& data) { // 2 // Write the current location into the floating position - const glm::vec3 p = _translation->position({ - {}, - data.time, - Time(0.0) - }); + const glm::vec3 p = translationPosition(data.time); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; glBindVertexArray(_primaryRenderInformation._vaoID); @@ -365,11 +361,7 @@ RenderableTrailOrbit::UpdateReport RenderableTrailOrbit::updateTrails( // Get the new permanent point and write it into the (previously) floating // location - const glm::vec3 p = _translation->position({ - {}, - Time(_lastPointTime), - Time(0.0) - }); + const glm::vec3 p = translationPosition(Time(_lastPointTime)); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; // Move the current pointer back one step to be used as the new floating @@ -405,11 +397,7 @@ RenderableTrailOrbit::UpdateReport RenderableTrailOrbit::updateTrails( // Get the new permanent point and write it into the (previously) floating // location - const glm::vec3 p = _translation->position({ - {}, - Time(_firstPointTime), - Time(0.0) - }); + const glm::vec3 p = translationPosition(Time(_firstPointTime)); _vertexArray[_primaryRenderInformation.first] = { p.x, p.y, p.z }; // if we are on the upper bounds of the array, we start at 0 @@ -452,7 +440,7 @@ void RenderableTrailOrbit::fullSweep(double time) { const double secondsPerPoint = periodSeconds / (_resolution - 1); // starting at 1 because the first position is a floating current one for (int i = 1; i < _resolution; i++) { - const glm::vec3 p = _translation->position({ {}, Time(time), Time(0.0) }); + const glm::vec3 p = translationPosition(Time(time)); _vertexArray[i] = { p.x, p.y, p.z }; time -= secondsPerPoint; diff --git a/modules/base/rendering/renderabletrailtrajectory.cpp b/modules/base/rendering/renderabletrailtrajectory.cpp index f0ae0f03e2..5adc2d00c6 100644 --- a/modules/base/rendering/renderabletrailtrajectory.cpp +++ b/modules/base/rendering/renderabletrailtrajectory.cpp @@ -169,7 +169,7 @@ RenderableTrailTrajectory::RenderableTrailTrajectory(const ghoul::Dictionary& di , _sampleInterval(SampleIntervalInfo, 2.0, 2.0, 1e6) , _timeStampSubsamplingFactor(TimeSubSampleInfo, 1, 1, 1000000000) , _renderFullTrail(RenderFullPathInfo, false) - , _numberOfReplacementPoints(AccurateTrailPositionsInfo, 100, 0, 1000) + , _nReplacementPoints(AccurateTrailPositionsInfo, 100, 0, 1000) , _maxVertex(glm::vec3(-std::numeric_limits::max())) , _minVertex(glm::vec3(std::numeric_limits::max())) { @@ -203,10 +203,8 @@ RenderableTrailTrajectory::RenderableTrailTrajectory(const ghoul::Dictionary& di _timeStampSubsamplingFactor.onChange([this] { _subsamplingIsDirty = true; }); addProperty(_timeStampSubsamplingFactor); - _numberOfReplacementPoints = p.accurateTrailPositions.value_or( - _numberOfReplacementPoints - ); - addProperty(_numberOfReplacementPoints); + _nReplacementPoints = p.accurateTrailPositions.value_or(_nReplacementPoints); + addProperty(_nReplacementPoints); _enableSweepChunking = p.enableSweepChunking.value_or(_enableSweepChunking); addProperty(_enableSweepChunking); @@ -258,10 +256,8 @@ void RenderableTrailTrajectory::reset() { void RenderableTrailTrajectory::update(const UpdateData& data) { if (_needsFullSweep) { - if (_sweepIteration == 0) { - // Max number of vertices - constexpr unsigned int maxNumberOfVertices = 1000000; + constexpr unsigned int MaxVertices = 1000000; // Convert the start and end time from string representations to J2000 seconds _start = SpiceManager::ref().ephemerisTimeFromDate(_startTime); @@ -270,45 +266,43 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { _totalSampleInterval = _sampleInterval / _timeStampSubsamplingFactor; - // Cap _numberOfVertices in order to prevent overflow and extreme performance + // Cap _nVertices in order to prevent overflow and extreme performance // degredation/RAM usage - _numberOfVertices = std::min( + _nVertices = std::min( static_cast(std::ceil(timespan / _totalSampleInterval)), - maxNumberOfVertices + MaxVertices ); - // We need to recalcuate the _totalSampleInterval if _numberOfVertices eqals - // maxNumberOfVertices. If we don't do this the position for each vertex + // We need to recalcuate the _totalSampleInterval if _nVertices equals + // MaxVertices. If we don't do this the position for each vertex // will not be correct for the number of vertices we are doing along the trail - _totalSampleInterval = (_numberOfVertices == maxNumberOfVertices) ? - (timespan / _numberOfVertices) : _totalSampleInterval; + _totalSampleInterval = (_nVertices == MaxVertices) ? + (timespan / _nVertices) : _totalSampleInterval; // Make space for the vertices _vertexArray.clear(); _dVertexArray.clear(); _timeVector.clear(); - _vertexArray.resize(_numberOfVertices + 1); - _dVertexArray.resize(_numberOfVertices + 1); - _timeVector.resize(_numberOfVertices + 1); + _vertexArray.resize(_nVertices + 1); + _dVertexArray.resize(_nVertices + 1); + _timeVector.resize(_nVertices + 1); } // Calculate sweeping range for this iteration const unsigned int startIndex = _sweepIteration * _sweepChunkSize; const unsigned int nextIndex = (_sweepIteration + 1) * _sweepChunkSize; - unsigned int stopIndex = std::min(nextIndex, _numberOfVertices); + unsigned int stopIndex = std::min(nextIndex, _nVertices); // If iterative calculations are disabled if (!_enableSweepChunking) { - stopIndex = _numberOfVertices; + stopIndex = _nVertices; } // Calculate all vertex positions for (unsigned int i = startIndex; i < stopIndex; i++) { - const glm::dvec3 dp = _translation->position({ - {}, - Time(_start + i * _totalSampleInterval), - Time(0.0) - }); + const glm::dvec3 dp = translationPosition( + Time(_start + i * _totalSampleInterval) + ); const glm::vec3 p(dp.x, dp.y, dp.z); _vertexArray[i] = { p.x, p.y, p.z }; _timeVector[i] = Time(_start + i * _totalSampleInterval).j2000Seconds(); @@ -323,12 +317,8 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { // Full sweep is complete here. // Adds the last point in time to the _vertexArray so that we // ensure that points for _start and _end always exists - if (stopIndex == _numberOfVertices) { - const glm::dvec3 dp = _translation->position({ - {}, - Time(_end), - Time(0.0) - }); + if (stopIndex == _nVertices) { + const glm::dvec3 dp = translationPosition(Time(_end)); const glm::vec3 p(dp.x, dp.y, dp.z); _vertexArray[stopIndex] = { p.x, p.y, p.z }; _timeVector[stopIndex] = Time(_end).j2000Seconds(); @@ -386,7 +376,7 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { ); // Calculate number of vertices in the trail - _numberOfUniqueVertices = static_cast( + _nUniqueVertices = static_cast( std::distance(_timeVector.begin(), _timeVector.end()) ); } @@ -396,12 +386,12 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { _secondaryRenderInformation.count = 0; // Set number of vertices in the trail - _numberOfUniqueVertices = _primaryRenderInformation.count; + _nUniqueVertices = _primaryRenderInformation.count; } // Determine the number of points to be recalculated int prePaddingDelta = 0; - if (!_renderFullTrail && _numberOfReplacementPoints == 0) { + if (!_renderFullTrail && _nReplacementPoints == 0) { // Enables trail from last point to current position // if we don't do any replacement points prePaddingDelta = 1; @@ -409,16 +399,16 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { else { prePaddingDelta = std::min( static_cast(_primaryRenderInformation.count), - static_cast(_numberOfReplacementPoints) + static_cast(_nReplacementPoints) ); } int postPaddingDelta = std::min( static_cast(_secondaryRenderInformation.count), - static_cast(_numberOfReplacementPoints) + static_cast(_nReplacementPoints) ); // Get current position of the object - const glm::dvec3 p = _translation->position(data); + const glm::dvec3 p = translationPosition(data.time); // Calculates all replacement points before the object glm::dvec3 v = p; @@ -460,7 +450,7 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { } // Mid-point (model-space position for the object) - if (_numberOfReplacementPoints > 0 || !_renderFullTrail) { + if (_nReplacementPoints > 0 || !_renderFullTrail) { _replacementPoints.push_back({ 0.f, 0.f, 0.f }); } @@ -503,14 +493,11 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { _floatingRenderInformation.count = static_cast(_replacementPoints.size()); - _floatingRenderInformation._localTransform = glm::translate( - glm::dmat4(1.0), - p - ); + _floatingRenderInformation._localTransform = glm::translate(glm::dmat4(1.0), p); // Adjusts number of unique vertices if we have inserted a new mid point if (_floatingRenderInformation.count > 0 && _renderFullTrail) { - _numberOfUniqueVertices++; + _nUniqueVertices++; } // Recalculate .count and .first based on the recalculated (floating) vertices @@ -520,11 +507,10 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { // Adjusts count such that it takes into account if we don't have any line // connecting with the object - if (_renderFullTrail && _numberOfReplacementPoints == 0) { + if (_renderFullTrail && _nReplacementPoints == 0) { _primaryRenderInformation.count += 1; } - glBindVertexArray(_floatingRenderInformation._vaoID); glBindBuffer(GL_ARRAY_BUFFER, _floatingRenderInformation._vBufferID); glBufferData( @@ -540,7 +526,7 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { // Renders the whole trail if time has passed the end time _primaryRenderInformation.first = 0; _primaryRenderInformation.count = static_cast(_vertexArray.size()); - _numberOfUniqueVertices = _primaryRenderInformation.count; + _nUniqueVertices = _primaryRenderInformation.count; _secondaryRenderInformation.first = 0; _secondaryRenderInformation.count = 0; _floatingRenderInformation.first = 0; @@ -567,7 +553,6 @@ void RenderableTrailTrajectory::update(const UpdateData& data) { } glBindVertexArray(0); - } } // namespace openspace diff --git a/modules/base/rendering/renderabletrailtrajectory.h b/modules/base/rendering/renderabletrailtrajectory.h index 3e4efdd2eb..f6ce580f8e 100644 --- a/modules/base/rendering/renderabletrailtrajectory.h +++ b/modules/base/rendering/renderabletrailtrajectory.h @@ -84,7 +84,7 @@ private: properties::BoolProperty _renderFullTrail; /// Determines how many vertices around the object that will be /// replaced during full trail rendering - properties::IntProperty _numberOfReplacementPoints; + properties::IntProperty _nReplacementPoints; /// Dirty flag that determines whether the full vertex buffer needs to be resampled bool _needsFullSweep = true; @@ -102,7 +102,7 @@ private: /// How many points do we need to compute given the distance between the /// start and end date and the desired sample interval - unsigned int _numberOfVertices = 0; + unsigned int _nVertices = 0; double _totalSampleInterval = 0.0; diff --git a/modules/base/rendering/screenspaceimageonline.cpp b/modules/base/rendering/screenspaceimageonline.cpp index b0ff9527fa..76eb5dd421 100644 --- a/modules/base/rendering/screenspaceimageonline.cpp +++ b/modules/base/rendering/screenspaceimageonline.cpp @@ -144,7 +144,7 @@ void ScreenSpaceImageOnline::update() { _textureIsDirty = false; LERRORC(e.component, e.message); } - } + } } std::future ScreenSpaceImageOnline::downloadImageToMemory( diff --git a/modules/base/rendering/screenspaceinsetblackout.cpp b/modules/base/rendering/screenspaceinsetblackout.cpp index b46190a416..583dc15236 100644 --- a/modules/base/rendering/screenspaceinsetblackout.cpp +++ b/modules/base/rendering/screenspaceinsetblackout.cpp @@ -198,44 +198,44 @@ namespace { openspace::properties::Property::Visibility::Developer }; - // A ScreenSpaceInsetBlackout can be used to render a screen-space shape used to - // black out part of the rendering. This can be useful in a dome environment where - // you have a secondary presentation projector that can project on the dome surface. + // A ScreenSpaceInsetBlackout can be used to render a screen-space shape used to + // black out part of the rendering. This can be useful in a dome environment where + // you have a secondary presentation projector that can project on the dome surface. // The blackout is used to avoid overlapping rendering between the dome projectors // and the presentation projector. struct [[codegen::Dictionary(ScreenSpaceInsetBlackout)]] Parameters { struct BlackoutShape { - // List of corner positions for the blackout shape. The order of - // corner points are Top-Left, Top-Right, Bottom-Right, Bottom-Left with the - // range of 0 to 1 for `{X,Y}`, where `{0,1}` is the Top-Left corner and + // List of corner positions for the blackout shape. The order of + // corner points are Top-Left, Top-Right, Bottom-Right, Bottom-Left with the + // range of 0 to 1 for `{X,Y}`, where `{0,1}` is the Top-Left corner and // `{1,0}` is the Bottom-Right corner. std::vector corners; - // List of points between the Top-Left and Top-Right corners that will be - // used to define top spline of the blackout shape. Each point is specified - // in the range of 0 to 1, where `{0,1}` is the Top-Left corner and `{1,1}` + // List of points between the Top-Left and Top-Right corners that will be + // used to define top spline of the blackout shape. Each point is specified + // in the range of 0 to 1, where `{0,1}` is the Top-Left corner and `{1,1}` // is the Top-Right corner. std::optional> top; - // List of points between the Bottom-Right and Bottom-Left corners that will - // be used to define bottom spline of the blackout shape. Each point is - // specified in the range of 0 to 1, where `{1,0}` is the Bottom-Right + // List of points between the Bottom-Right and Bottom-Left corners that will + // be used to define bottom spline of the blackout shape. Each point is + // specified in the range of 0 to 1, where `{1,0}` is the Bottom-Right // corner and `{0,0}` is the Bottom-Left corner. std::optional> bottom; - // List of points between the Bottom-Left and Top-Left corners that will be - // used to define left spline of the blackout shape. Each point is specified - // in the range of 0 to 1, where `{0,0}` is the Bottom-Left corner and + // List of points between the Bottom-Left and Top-Left corners that will be + // used to define left spline of the blackout shape. Each point is specified + // in the range of 0 to 1, where `{0,0}` is the Bottom-Left corner and // `{0,1}` is the Top-Left corner. std::optional> left; - // List of points between the Top-Right and Bottom-Right corners that will - // be used to define right spline of the blackout shape. Each point is - // specified in the range of 0 to 1, where `{1,1}` is the Top-Right corner + // List of points between the Top-Right and Bottom-Right corners that will + // be used to define right spline of the blackout shape. Each point is + // specified in the range of 0 to 1, where `{1,1}` is the Top-Right corner // and `{1,0}` is the Bottom-Right corner. std::optional> right; - // File path for the texture that should be used when displaying the + // File path for the texture that should be used when displaying the // calibration grid. std::optional calibrationTexturePath; }; @@ -280,7 +280,12 @@ ScreenSpaceInsetBlackout::BlackoutShape::Spline::Spline(std::vector& std::string baseString) : properties::PropertyOwner({ baseString , baseString, "" }) , data(inData) - , newPointPosition(NewPointPositionInfo, glm::vec2(0.f), glm::vec2(0.f), glm::vec2(1.f)) + , newPointPosition( + NewPointPositionInfo, + glm::vec2(0.f), + glm::vec2(0.f), + glm::vec2(1.f) + ) , addSelector(AddSelectorInfo) , addButton(AddControlPointInfo) , removeSelector(RemoveSelectorInfo) @@ -362,7 +367,8 @@ ScreenSpaceInsetBlackout::BlackoutShape::Corners::Corners(std::vector } } -ScreenSpaceInsetBlackout::BlackoutShape::BlackoutShape(const ghoul::Dictionary& dictionary) +ScreenSpaceInsetBlackout::BlackoutShape::BlackoutShape( + const ghoul::Dictionary& dictionary) : properties::PropertyOwner({ "BlackoutShape", "Blackout Shape", "" }) , enableCalibrationColor(CalibrationColorInfo, false) , enableCalibrationPattern(CalibrationPatternInfo, false) diff --git a/modules/base/rendering/screenspaceinsetblackout.h b/modules/base/rendering/screenspaceinsetblackout.h index df817e21ec..3ca71e64b8 100644 --- a/modules/base/rendering/screenspaceinsetblackout.h +++ b/modules/base/rendering/screenspaceinsetblackout.h @@ -84,7 +84,7 @@ private: /// Selects which point to remove properties::OptionProperty removeSelector; /// Removes a point - properties::TriggerProperty removeButton; + properties::TriggerProperty removeButton; }; class Corners : public properties::PropertyOwner { diff --git a/modules/base/rendering/screenspacerenderablerenderable.cpp b/modules/base/rendering/screenspacerenderablerenderable.cpp index 98b2f482cc..b9032ed8ae 100644 --- a/modules/base/rendering/screenspacerenderablerenderable.cpp +++ b/modules/base/rendering/screenspacerenderablerenderable.cpp @@ -187,7 +187,6 @@ ScreenSpaceRenderableRenderable::ScreenSpaceRenderableRenderable( addProperty(_cameraFov); _renderable = Renderable::createFromDictionary(p.renderable); - _renderable->initialize(); addPropertySubOwner(_renderable.get()); _transform = ghoul::mm_unique_ptr( @@ -204,7 +203,6 @@ ScreenSpaceRenderableRenderable::ScreenSpaceRenderableRenderable( translation.setValue("Position", glm::dvec3(0.0)); _translation = Translation::createFromDictionary(translation); } - _translation->initialize(); _transform->addPropertySubOwner(_translation.get()); if (p.transform.has_value() && p.transform->rotation.has_value()) { @@ -216,7 +214,6 @@ ScreenSpaceRenderableRenderable::ScreenSpaceRenderableRenderable( rotation.setValue("Rotation", glm::dvec3(0.0)); _rotation = Rotation::createFromDictionary(rotation); } - _rotation->initialize(); _transform->addPropertySubOwner(_rotation.get()); if (p.transform.has_value() && p.transform->scale.has_value()) { @@ -228,12 +225,19 @@ ScreenSpaceRenderableRenderable::ScreenSpaceRenderableRenderable( scale.setValue("Scale", 1.0); _scale = Scale::createFromDictionary(scale); } - _scale->initialize(); _transform->addPropertySubOwner(_scale.get()); } ScreenSpaceRenderableRenderable::~ScreenSpaceRenderableRenderable() {} +void ScreenSpaceRenderableRenderable::initialize() { + ScreenSpaceFramebuffer::initialize(); + _translation->initialize(); + _rotation->initialize(); + _scale->initialize(); + _renderable->initialize(); +} + void ScreenSpaceRenderableRenderable::initializeGL() { ScreenSpaceFramebuffer::initializeGL(); diff --git a/modules/base/rendering/screenspacerenderablerenderable.h b/modules/base/rendering/screenspacerenderablerenderable.h index 83f373cd1a..4ebed2c6e2 100644 --- a/modules/base/rendering/screenspacerenderablerenderable.h +++ b/modules/base/rendering/screenspacerenderablerenderable.h @@ -50,6 +50,7 @@ public: explicit ScreenSpaceRenderableRenderable(const ghoul::Dictionary& dictionary); virtual ~ScreenSpaceRenderableRenderable() override; + void initialize() override; void initializeGL() override; void deinitializeGL() override; void update() override; diff --git a/modules/base/rendering/screenspacetimevaryingimageonline.cpp b/modules/base/rendering/screenspacetimevaryingimageonline.cpp index f89bba7a39..00cc5f7bcb 100644 --- a/modules/base/rendering/screenspacetimevaryingimageonline.cpp +++ b/modules/base/rendering/screenspacetimevaryingimageonline.cpp @@ -41,7 +41,8 @@ namespace { constexpr openspace::properties::Property::PropertyInfo FileInfo = { "FilePath", "File Path", - "The file path to the data containing information about when to display which image.", + "The file path to the data containing information about when to display which " + "image.", openspace::properties::Property::Visibility::User }; @@ -129,7 +130,7 @@ void ScreenSpaceTimeVaryingImageOnline::computeSequenceEndTime() { if (_timestamps.size() <= 1) { return; } - + double first = _timestamps.front(); double last = _timestamps.back(); double avg = (last - first) / static_cast(_timestamps.size() - 1); @@ -224,7 +225,7 @@ void ScreenSpaceTimeVaryingImageOnline::loadImage(const std::string& imageUrl) { if (_imageFuture.valid()) { return; } - + _imageFuture = global::downloadManager->fetchFile( imageUrl, [](const DownloadManager::MemoryFile&) {}, diff --git a/modules/base/rotation/fixedrotation.cpp b/modules/base/rotation/fixedrotation.cpp index f84de4bb1e..711d996e03 100644 --- a/modules/base/rotation/fixedrotation.cpp +++ b/modules/base/rotation/fixedrotation.cpp @@ -444,7 +444,7 @@ FixedRotation::FixedRotation(const ghoul::Dictionary& dictionary) setPropertyVisibility(_zAxis); } -bool FixedRotation::initialize() { +void FixedRotation::initialize() { ZoneScoped; // We have already checked this before, but still @@ -454,7 +454,7 @@ bool FixedRotation::initialize() { // nodes referenced in the dictionary might not exist yet at construction time. At // initialization time, however, we know that they already have been created - const bool res = Rotation::initialize(); + Rotation::initialize(); _attachedObject = p.attached.value_or(_attachedObject); @@ -525,7 +525,6 @@ bool FixedRotation::initialize() { // No need to hold on to the data _constructorDictionary = ghoul::Dictionary(); - return res; } void FixedRotation::update(const UpdateData& data) { diff --git a/modules/base/rotation/fixedrotation.h b/modules/base/rotation/fixedrotation.h index dece6a8b4c..9875fb4096 100644 --- a/modules/base/rotation/fixedrotation.h +++ b/modules/base/rotation/fixedrotation.h @@ -43,7 +43,7 @@ class FixedRotation : public Rotation { public: explicit FixedRotation(const ghoul::Dictionary& dictionary); - bool initialize() override; + void initialize() override; void update(const UpdateData& data) override; glm::dmat3 matrix(const UpdateData& data) const override; diff --git a/modules/base/rotation/globerotation.cpp b/modules/base/rotation/globerotation.cpp index 0b37d213ee..9857cd0913 100644 --- a/modules/base/rotation/globerotation.cpp +++ b/modules/base/rotation/globerotation.cpp @@ -37,6 +37,8 @@ #include namespace { + constexpr std::string_view _loggerCat = "GlobeRotation"; + constexpr openspace::properties::Property::PropertyInfo GlobeInfo = { "Globe", "Attached Globe", @@ -136,7 +138,7 @@ GlobeRotation::GlobeRotation(const ghoul::Dictionary& dictionary) _sceneGraphNode = p.globe; _sceneGraphNode.onChange([this]() { - findNode(); + fillAttachedNode(); setUpdateVariables(); }); addProperty(_sceneGraphNode); @@ -162,13 +164,10 @@ GlobeRotation::GlobeRotation(const ghoul::Dictionary& dictionary) addProperty(_useCamera); } -void GlobeRotation::findNode() { +void GlobeRotation::fillAttachedNode() { SceneGraphNode* n = sceneGraphNode(_sceneGraphNode); - if (!n || !n->renderable()) { - LERRORC( - "GlobeRotation", - "Could not set attached node as it does not have a Renderable" - ); + if (!n) { + LERROR(std::format("Could not find attached node '{}'", _sceneGraphNode.value())); return; } _attachedNode = n; @@ -180,7 +179,7 @@ void GlobeRotation::setUpdateVariables() { } glm::vec3 GlobeRotation::computeSurfacePosition(double latitude, double longitude) const { - ghoul_assert(_attachedNode, "Renderable cannot be nullptr"); + ghoul_assert(_attachedNode, "Attached node cannot be nullptr"); const Geodetic3 pos = { { .lat = glm::radians(latitude), .lon = glm::radians(longitude) }, @@ -206,12 +205,12 @@ glm::vec3 GlobeRotation::computeSurfacePosition(double latitude, double longitud ); } -void GlobeRotation::update(const UpdateData& data) { - if (!_attachedNode) [[unlikely]] { - findNode(); - _matrixIsDirty = true; - } +void GlobeRotation::initialize() { + Rotation::initialize(); + fillAttachedNode(); +} +void GlobeRotation::update(const UpdateData& data) { if (_useHeightmap || _useCamera) { // If we use the heightmap, we have to compute the height every frame setUpdateVariables(); @@ -225,11 +224,7 @@ glm::dmat3 GlobeRotation::matrix(const UpdateData&) const { return _matrix; } - if (!_attachedNode) { - LERRORC( - "GlobeRotation", - std::format("Could not find globe '{}'", _sceneGraphNode.value()) - ); + if (!_attachedNode) [[unlikely]] { return _matrix; } diff --git a/modules/base/rotation/globerotation.h b/modules/base/rotation/globerotation.h index 753741c884..d6f6a09117 100644 --- a/modules/base/rotation/globerotation.h +++ b/modules/base/rotation/globerotation.h @@ -39,13 +39,15 @@ class GlobeRotation : public Rotation { public: explicit GlobeRotation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dmat3 matrix(const UpdateData& data) const override; static documentation::Documentation Documentation(); private: - void findNode(); + void fillAttachedNode(); void setUpdateVariables(); /** diff --git a/modules/base/rotation/multirotation.cpp b/modules/base/rotation/multirotation.cpp index 0e727c3038..b2c7e7374f 100644 --- a/modules/base/rotation/multirotation.cpp +++ b/modules/base/rotation/multirotation.cpp @@ -64,6 +64,13 @@ MultiRotation::MultiRotation(const ghoul::Dictionary& dictionary) } } +void MultiRotation::initialize() { + Rotation::initialize(); + for (const ghoul::mm_unique_ptr& rot : _rotations) { + rot->initialize(); + } +} + void MultiRotation::update(const UpdateData& data) { for (const ghoul::mm_unique_ptr& rot : _rotations) { rot->update(data); diff --git a/modules/base/rotation/multirotation.h b/modules/base/rotation/multirotation.h index dea7363d16..8a03d7ce7d 100644 --- a/modules/base/rotation/multirotation.h +++ b/modules/base/rotation/multirotation.h @@ -39,6 +39,8 @@ class MultiRotation : public Rotation { public: explicit MultiRotation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dmat3 matrix(const UpdateData& data) const override; diff --git a/modules/base/rotation/timelinerotation.cpp b/modules/base/rotation/timelinerotation.cpp index 2643ec7646..27d3630f15 100644 --- a/modules/base/rotation/timelinerotation.cpp +++ b/modules/base/rotation/timelinerotation.cpp @@ -83,6 +83,13 @@ TimelineRotation::TimelineRotation(const ghoul::Dictionary& dictionary) addProperty(_shouldInterpolate); } +void TimelineRotation::initialize() { + Rotation::initialize(); + for (const Keyframe>& kf : _timeline.keyframes()) { + kf.data->initialize(); + } +} + void TimelineRotation::update(const UpdateData& data) { const double now = data.time.j2000Seconds(); using KeyframePointer = const Keyframe>*; @@ -93,6 +100,8 @@ void TimelineRotation::update(const UpdateData& data) { if (KeyframePointer next = _timeline.firstKeyframeAfter(now, true); next) { next->data->update(data); } + + Rotation::update(data); } glm::dmat3 TimelineRotation::matrix(const UpdateData& data) const { diff --git a/modules/base/rotation/timelinerotation.h b/modules/base/rotation/timelinerotation.h index 189fb5de6d..6dc5ff9021 100644 --- a/modules/base/rotation/timelinerotation.h +++ b/modules/base/rotation/timelinerotation.h @@ -40,6 +40,8 @@ class TimelineRotation : public Rotation { public: explicit TimelineRotation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dmat3 matrix(const UpdateData& data) const override; static documentation::Documentation Documentation(); diff --git a/modules/base/scale/multiscale.cpp b/modules/base/scale/multiscale.cpp index c734d45a6c..9d683e4ac6 100644 --- a/modules/base/scale/multiscale.cpp +++ b/modules/base/scale/multiscale.cpp @@ -63,6 +63,13 @@ MultiScale::MultiScale(const ghoul::Dictionary& dictionary) } } +void MultiScale::initialize() { + Scale::initialize(); + for (const ghoul::mm_unique_ptr& scale : _scales) { + scale->initialize(); + } +} + void MultiScale::update(const UpdateData& data) { for (const ghoul::mm_unique_ptr& scale : _scales) { scale->update(data); diff --git a/modules/base/scale/multiscale.h b/modules/base/scale/multiscale.h index e0f75e576e..e1b6afec43 100644 --- a/modules/base/scale/multiscale.h +++ b/modules/base/scale/multiscale.h @@ -35,6 +35,8 @@ class MultiScale : public Scale { public: explicit MultiScale(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dvec3 scaleValue(const UpdateData& data) const override; diff --git a/modules/base/scale/timelinescale.cpp b/modules/base/scale/timelinescale.cpp index 0f2c832b66..e2ef6f2a1c 100644 --- a/modules/base/scale/timelinescale.cpp +++ b/modules/base/scale/timelinescale.cpp @@ -81,6 +81,13 @@ TimelineScale::TimelineScale(const ghoul::Dictionary& dictionary) addProperty(_shouldInterpolate); } +void TimelineScale::initialize() { + Scale::initialize(); + for (const Keyframe>& kf : _timeline.keyframes()) { + kf.data->initialize(); + } +} + void TimelineScale::update(const UpdateData& data) { const double now = data.time.j2000Seconds(); using KeyframePointer = const Keyframe>*; @@ -91,6 +98,8 @@ void TimelineScale::update(const UpdateData& data) { if (KeyframePointer next = _timeline.firstKeyframeAfter(now, true); next) { next->data->update(data); } + + Scale::update(data); } glm::dvec3 TimelineScale::scaleValue(const UpdateData& data) const { diff --git a/modules/base/scale/timelinescale.h b/modules/base/scale/timelinescale.h index 224c943fe6..a298627311 100644 --- a/modules/base/scale/timelinescale.h +++ b/modules/base/scale/timelinescale.h @@ -41,6 +41,8 @@ class TimelineScale : public Scale { public: explicit TimelineScale(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dvec3 scaleValue(const UpdateData& data) const override; static documentation::Documentation Documentation(); @@ -52,4 +54,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_BASE___TIMELINETRANSLATION___H__ +#endif // __OPENSPACE_MODULE_BASE___TIMELINESCALE___H__ diff --git a/modules/base/shaders/sphere_fs.glsl b/modules/base/shaders/sphere_fs.glsl index 8800b47bc8..98ecb7ff62 100644 --- a/modules/base/shaders/sphere_fs.glsl +++ b/modules/base/shaders/sphere_fs.glsl @@ -30,6 +30,11 @@ in vec3 vs_normal; in float vs_screenSpaceDepth; uniform sampler2D colorTexture; + +uniform bool usingTransferFunction = false; +uniform sampler1D transferFunction; +uniform vec2 dataMinMaxValues; + uniform float opacity; uniform bool mirrorTexture; @@ -41,8 +46,20 @@ Fragment getFragment() { if (mirrorTexture) { texCoord.x = 1.0 - texCoord.x; } - - frag.color = texture(colorTexture, texCoord); + if (usingTransferFunction) { + vec4 dataValue = texture(colorTexture, texCoord); + float minVal = dataMinMaxValues.x; + float maxVal = dataMinMaxValues.y; + // dataValue and minVal comes from the same texture so dataValue cannot be < minVal + float lookUpVal = (dataValue.x - minVal) / (maxVal - minVal); + frag.color = vec4( + texture(transferFunction, lookUpVal).rgb, + 1.0 + ); + } + else { + frag.color = texture(colorTexture, texCoord); + } frag.color.a *= opacity; frag.depth = vs_screenSpaceDepth; diff --git a/modules/base/task/convertmodeltask.cpp b/modules/base/task/convertmodeltask.cpp index 6288ce7d3b..a39724d713 100644 --- a/modules/base/task/convertmodeltask.cpp +++ b/modules/base/task/convertmodeltask.cpp @@ -33,10 +33,10 @@ namespace { // proprietary format that can be loaded more efficiently, but more important can be // distributed without violating terms of service for various 3D model hosting // websites. - // + // // The resulting output file can be used everywhere in OpenSpace in place of the // source material. - // + // // The list of supported files can be found here: // https://github.com/assimp/assimp/blob/master/doc/Fileformats.md struct [[codegen::Dictionary(ConvertModelTask)]] Parameters { diff --git a/modules/base/task/convertmodeltask.h b/modules/base/task/convertmodeltask.h index 289651f1c0..d481b0e19d 100644 --- a/modules/base/task/convertmodeltask.h +++ b/modules/base/task/convertmodeltask.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_CORE___CONVERTMODELTASK___H__ -#define __OPENSPACE_CORE___CONVERTMODELTASK___H__ +#ifndef __OPENSPACE_MODULE_BASE___CONVERTMODELTASK___H__ +#define __OPENSPACE_MODULE_BASE___CONVERTMODELTASK___H__ #include @@ -49,4 +49,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_CORE___CONVERTMODELTASK___H__ +#endif // __OPENSPACE_MODULE_BASE___CONVERTMODELTASK___H__ diff --git a/modules/base/translation/globetranslation.cpp b/modules/base/translation/globetranslation.cpp index 1576c2c6bb..f6060d6b11 100644 --- a/modules/base/translation/globetranslation.cpp +++ b/modules/base/translation/globetranslation.cpp @@ -37,6 +37,8 @@ #include namespace { + constexpr std::string_view _loggerCat = "GlobeTranslation"; + constexpr openspace::properties::Property::PropertyInfo GlobeInfo = { "Globe", "Attached Globe", @@ -188,14 +190,10 @@ GlobeTranslation::GlobeTranslation(const ghoul::Dictionary& dictionary) void GlobeTranslation::fillAttachedNode() { SceneGraphNode* n = sceneGraphNode(_sceneGraphNode); - if (!n || !n->renderable()) { - LERRORC( - "GlobeTranslation", - "Could not set attached node as it does not have a renderable" - ); + if (!n) { + LERROR(std::format("Could not find attached node '{}'", _sceneGraphNode.value())); return; } - _attachedNode = n; } @@ -204,12 +202,12 @@ void GlobeTranslation::setUpdateVariables() { requireUpdate(); } -void GlobeTranslation::update(const UpdateData& data) { - if (!_attachedNode) [[unlikely]] { - fillAttachedNode(); - _positionIsDirty = true; - } +void GlobeTranslation::initialize() { + Translation::initialize(); + fillAttachedNode(); +} +void GlobeTranslation::update(const UpdateData& data) { if (_useHeightmap || _useCamera) { // If we use the heightmap, we have to compute the height every frame setUpdateVariables(); @@ -223,11 +221,7 @@ glm::dvec3 GlobeTranslation::position(const UpdateData&) const { return _position; } - if (!_attachedNode) { - LERRORC( - "GlobeRotation", - std::format("Could not find attached node '{}'", _sceneGraphNode.value()) - ); + if (!_attachedNode) [[unlikely]] { return _position; } diff --git a/modules/base/translation/globetranslation.h b/modules/base/translation/globetranslation.h index 675692b44b..6a8d9c7b1d 100644 --- a/modules/base/translation/globetranslation.h +++ b/modules/base/translation/globetranslation.h @@ -39,6 +39,8 @@ class GlobeTranslation : public Translation { public: explicit GlobeTranslation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dvec3 position(const UpdateData& data) const override; diff --git a/modules/base/translation/multitranslation.cpp b/modules/base/translation/multitranslation.cpp index 854fd779ba..c368d915c8 100644 --- a/modules/base/translation/multitranslation.cpp +++ b/modules/base/translation/multitranslation.cpp @@ -64,16 +64,23 @@ MultiTranslation::MultiTranslation(const ghoul::Dictionary& dictionary) } } +void MultiTranslation::initialize() { + Translation::initialize(); + for (const ghoul::mm_unique_ptr& translation : _translations) { + translation->initialize(); + } +} + void MultiTranslation::update(const UpdateData& data) { - for (const ghoul::mm_unique_ptr& rot : _translations) { - rot->update(data); + for (const ghoul::mm_unique_ptr& translation : _translations) { + translation->update(data); } } glm::dvec3 MultiTranslation::position(const UpdateData& data) const { glm::dvec3 res = glm::dvec3(1.0); - for (const ghoul::mm_unique_ptr& rot : _translations) { - res += rot->position(data); + for (const ghoul::mm_unique_ptr& translation : _translations) { + res += translation->position(data); } return res; } diff --git a/modules/base/translation/multitranslation.h b/modules/base/translation/multitranslation.h index 7a5f3c3e86..4a69d65d82 100644 --- a/modules/base/translation/multitranslation.h +++ b/modules/base/translation/multitranslation.h @@ -37,6 +37,8 @@ class MultiTranslation : public Translation { public: explicit MultiTranslation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dvec3 position(const UpdateData& data) const override; static documentation::Documentation Documentation(); diff --git a/modules/base/translation/timelinetranslation.cpp b/modules/base/translation/timelinetranslation.cpp index 690d820e36..9bed9ab2ce 100644 --- a/modules/base/translation/timelinetranslation.cpp +++ b/modules/base/translation/timelinetranslation.cpp @@ -83,6 +83,13 @@ TimelineTranslation::TimelineTranslation(const ghoul::Dictionary& dictionary) addProperty(_shouldInterpolate); } +void TimelineTranslation::initialize() { + Translation::initialize(); + for (const Keyframe>& kf : _timeline.keyframes()) { + kf.data->initialize(); + } +} + void TimelineTranslation::update(const UpdateData& data) { const double now = data.time.j2000Seconds(); using KeyframePointer = const Keyframe>*; @@ -93,6 +100,8 @@ void TimelineTranslation::update(const UpdateData& data) { if (KeyframePointer next = _timeline.firstKeyframeAfter(now, true); next) { next->data->update(data); } + + Translation::update(data); } glm::dvec3 TimelineTranslation::position(const UpdateData& data) const { diff --git a/modules/base/translation/timelinetranslation.h b/modules/base/translation/timelinetranslation.h index 04bf958ac3..17059ddc30 100644 --- a/modules/base/translation/timelinetranslation.h +++ b/modules/base/translation/timelinetranslation.h @@ -41,6 +41,8 @@ class TimelineTranslation : public Translation { public: explicit TimelineTranslation(const ghoul::Dictionary& dictionary); + void initialize() override; + void update(const UpdateData& data) override; glm::dvec3 position(const UpdateData& data) const override; static documentation::Documentation Documentation(); diff --git a/modules/cefwebgui/cefwebguimodule.cpp b/modules/cefwebgui/cefwebguimodule.cpp index 89f90478ce..b92f384a3c 100644 --- a/modules/cefwebgui/cefwebguimodule.cpp +++ b/modules/cefwebgui/cefwebguimodule.cpp @@ -228,7 +228,7 @@ void CefWebGuiModule::internalInitialize(const ghoul::Dictionary& configuration) }); global::callback::postDraw->emplace_back([this]() { - bool windowChanged = global::windowDelegate->windowHasResized(); + bool windowChanged = global::windowDelegate->anyWindowHasResized(); if (_instance && (windowChanged || _instance->_shouldReshape)) { const glm::ivec2 res = global::windowDelegate->guiWindowResolution(); _instance->reshape(static_cast( diff --git a/modules/exoplanets/exoplanetsmodule_lua.inl b/modules/exoplanets/exoplanetsmodule_lua.inl index b2c18ad4cc..ddfd048314 100644 --- a/modules/exoplanets/exoplanetsmodule_lua.inl +++ b/modules/exoplanets/exoplanetsmodule_lua.inl @@ -169,7 +169,7 @@ std::vector hostStarsWithSufficientData() { * The data is retrieved from the module's prepared datafile for exoplanets. This file is * in a binary format, for fast retrieval during runtime. * - * \param starName The name of the star to get the information for. + * \param starName The name of the star to get the information for * * \return An object of the type [ExoplanetSystemData](#exoplanets_exoplanet_system_data) * that can be used to create the scene graph nodes for the exoplanet system @@ -191,7 +191,7 @@ std::vector hostStarsWithSufficientData() { /** * Remove a loaded exoplanet system. * - * \param starName The name of the host star for the system to remove. + * \param starName The name of the host star for the system to remove */ [[codegen::luawrap]] void removeExoplanetSystem(std::string starName) { using namespace openspace; @@ -248,7 +248,7 @@ std::vector hostStarsWithSufficientData() { * When dowloading the data from the archive we recommend including all columns, since a * few required ones are not selected by default. * - * \param csvFile A path to the CSV file to load the data from. + * \param csvFile A path to the CSV file to load the data from * * \return A list of objects of the type * [ExoplanetSystemData](#exoplanets_exoplanet_system_data), that can be used to diff --git a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h index 4c5ae3feee..5291c46481 100644 --- a/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h +++ b/modules/exoplanets/tasks/exoplanetsdatapreparationtask.h @@ -65,7 +65,7 @@ public: * * \param row The row to parse, given as a string * \param columnNames The list of column names in the file, from the CSV header - * \param positionSourceFile A SPECK file to use for getting the position of the star. + * \param positionSourceFile A SPECK file to use for getting the position of the star * This is used to make sure the position of the star matches those of other * star datasets. If no file is provided, the position from the CSV data file * is read and used instead diff --git a/modules/fieldlinessequence/CMakeLists.txt b/modules/fieldlinessequence/CMakeLists.txt index 5721c44e97..6bbda6d7f1 100644 --- a/modules/fieldlinessequence/CMakeLists.txt +++ b/modules/fieldlinessequence/CMakeLists.txt @@ -26,6 +26,7 @@ include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES rendering/renderablefieldlinessequence.h + tasks/kameleonvolumetofieldlinestask.h util/fieldlinesstate.h util/commons.h util/kameleonfieldlinehelper.h @@ -34,6 +35,7 @@ source_group("Header Files" FILES ${HEADER_FILES}) set(SOURCE_FILES rendering/renderablefieldlinessequence.cpp + tasks/kameleonvolumetofieldlinestask.cpp util/fieldlinesstate.cpp util/commons.cpp util/kameleonfieldlinehelper.cpp diff --git a/modules/fieldlinessequence/fieldlinessequencemodule.cpp b/modules/fieldlinessequence/fieldlinessequencemodule.cpp index 13de0c2083..6aef48fc51 100644 --- a/modules/fieldlinessequence/fieldlinessequencemodule.cpp +++ b/modules/fieldlinessequence/fieldlinessequencemodule.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -58,17 +59,25 @@ FieldlinesSequenceModule::FieldlinesSequenceModule() : OpenSpaceModule(Name) { } void FieldlinesSequenceModule::internalInitialize(const ghoul::Dictionary&) { - ghoul::TemplateFactory* factory = + ghoul::TemplateFactory* fRenderable = FactoryManager::ref().factory(); - ghoul_assert(factory, "No renderable factory existed"); + ghoul_assert(fRenderable, "No renderable factory existed"); + fRenderable->registerClass( + "RenderableFieldlinesSequence" + ); - factory->registerClass("RenderableFieldlinesSequence"); + ghoul::TemplateFactory* fTask = FactoryManager::ref().factory(); + ghoul_assert(fTask, "No task factory existed"); + fTask->registerClass( + "KameleonVolumeToFieldlinesTask" + ); } std::vector FieldlinesSequenceModule::documentations() const { return { - RenderableFieldlinesSequence::Documentation() + RenderableFieldlinesSequence::Documentation(), + KameleonVolumeToFieldlinesTask::Documentation() }; } diff --git a/modules/fieldlinessequence/include.cmake b/modules/fieldlinessequence/include.cmake index f6e8111e4e..e6b3e90224 100644 --- a/modules/fieldlinessequence/include.cmake +++ b/modules/fieldlinessequence/include.cmake @@ -1,3 +1,4 @@ +set(DEFAULT_MODULE ON) set (OPENSPACE_DEPENDENCIES kameleon ) diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp index cdd30c069f..1b482e3a36 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.cpp @@ -26,160 +26,188 @@ #include #include +#include #include #include -#include -#include #include -#include #include #include #include -#include -#include #include #include #include -#include -#include -#include -#include +#include #include namespace { constexpr std::string_view _loggerCat = "RenderableFieldlinesSequence"; + double extractTriggerTimeFromFilename(const std::filesystem::path& filePath) { + // number of characters in filename (excluding '.osfls') + std::string fileName = filePath.stem().string(); // excludes extention + + // Ensure the separators are correct + fileName.replace(4, 1, "-"); + fileName.replace(7, 1, "-"); + fileName.replace(10, 1, "T"); + fileName.replace(13, 1, ":"); + fileName.replace(16, 1, ":"); + fileName.replace(19, 1, "."); + return openspace::Time::convertTime(fileName); + } + constexpr openspace::properties::Property::PropertyInfo ColorMethodInfo = { "ColorMethod", "Color Method", "Color lines uniformly or using color tables based on extra quantities like, for " "examples, temperature or particle density.", - openspace::properties::Property::Visibility::AdvancedUser + openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo ColorQuantityInfo = { "ColorQuantity", "Quantity to Color By", "Quantity used to color lines if the 'By Quantity' color method is selected.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo ColorMinMaxInfo = { "ColorQuantityMinMax", "ColorTable Min Value", "Value to map to the lowest and highest end of the color table.", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo ColorTablePathInfo = { "ColorTablePath", "Path to Color Table", "Color Table/Transfer Function to use for 'By Quantity' coloring.", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo ColorUniformInfo = { "Color", "Uniform Line Color", "The uniform color of lines shown when 'Color Method' is set to 'Uniform'.", openspace::properties::Property::Visibility::NoviceUser }; + constexpr openspace::properties::Property::PropertyInfo ColorUseABlendingInfo = { "ABlendingEnabled", "Additive Blending", "Activate/deactivate additive blending.", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo DomainEnabledInfo = { "DomainEnabled", "Domain Limits", "Enable/Disable domain limits.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo DomainXInfo = { "LimitsX", "X-limits", "Valid range along the X-axis. [Min, Max].", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo DomainYInfo = { "LimitsY", "Y-limits", "Valid range along the Y-axis. [Min, Max].", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo DomainZInfo = { "LimitsZ", "Z-limits", "Valid range along the Z-axis. [Min, Max].", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo DomainRInfo = { "LimitsR", "Radial limits", "Valid radial range. [Min, Max].", openspace::properties::Property::Visibility::AdvancedUser }; + + constexpr openspace::properties::Property::PropertyInfo FlowEnabledInfo = { + "FlowEnabled", + "Flow Enabled", + "Toggles the rendering of moving particles along the lines. Can, for example, " + "illustrate magnetic flow.", + openspace::properties::Property::Visibility::NoviceUser + }; + constexpr openspace::properties::Property::PropertyInfo FlowColorInfo = { "FlowColor", "Flow Color", "Color of particles flow direction indication.", openspace::properties::Property::Visibility::NoviceUser }; - constexpr openspace::properties::Property::PropertyInfo FlowEnabledInfo = { - "FlowEnabled", - "Flow Direction", - "Toggles the rendering of moving particles along the lines. Can, for example, " - "illustrate magnetic flow.", - openspace::properties::Property::Visibility::NoviceUser - }; + constexpr openspace::properties::Property::PropertyInfo FlowReversedInfo = { "Reversed", "Reversed Flow", "Toggle to make the flow move in the opposite direction.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo FlowParticleSizeInfo = { "ParticleSize", "Particle Size", "Size of the particles.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo FlowParticleSpacingInfo = { "ParticleSpacing", "Particle Spacing", "Spacing inbetween particles.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo FlowSpeedInfo = { "Speed", "Speed", "Speed of the flow.", openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo MaskingEnabledInfo = { "MaskingEnabled", - "Masking", + "Masking Enabled", "Enable/disable masking. Use masking to show lines where a given quantity is " "within a given range, for example, if you only want to see where the " "temperature is between 10 and 20 degrees. Also used for masking out line " "topologies like solar wind & closed lines.", - openspace::properties::Property::Visibility::AdvancedUser + openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo MaskingMinMaxInfo = { "MaskingMinLimit", "Lower Limit", "Lower and upper limit of the valid masking range.", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo MaskingQuantityInfo = { "MaskingQuantity", "Quantity used for Masking", "Quantity used for masking.", openspace::properties::Property::Visibility::AdvancedUser }; + constexpr openspace::properties::Property::PropertyInfo LineWidthInfo = { "LineWidth", "Line Width", "This value specifies the line width of the fieldlines.", openspace::properties::Property::Visibility::NoviceUser }; + constexpr openspace::properties::Property::PropertyInfo TimeJumpButtonInfo = { "TimeJumpToStart", "Jump to Start Of Sequence", @@ -187,38 +215,26 @@ namespace { openspace::properties::Property::Visibility::NoviceUser }; + constexpr openspace::properties::Property::PropertyInfo SaveDownloadsOnShutdown = { + "SaveDownloadsOnShutdown", + "Save Downloads On Shutdown", + "This is an option for if dynamically downloaded should be saved between runs " + "or not.", + openspace::properties::Property::Visibility::User + }; + struct [[codegen::Dictionary(RenderableFieldlinesSequence)]] Parameters { - enum class SourceFileType { - Cdf, - Json, - Osfls + enum class [[codegen::map(openspace::RenderableFieldlinesSequence::ColorMethod)]] + ColorMethod { + Uniform, + ByQuantity [[codegen::key("By Quantity")]] }; - // Input file type. Should be cdf, json or osfls - SourceFileType inputFileType; - // Path to folder containing the input files - std::filesystem::path sourceFolder [[codegen::directory()]]; + // [[codegen::verbatim(ColorMethodInfo.description)]] + std::optional colorMethod; - // Path to a .txt file containing seed points. Mandatory if CDF as input. - // Files need time stamp in file name like so: yyyymmdd_hhmmss.txt - std::optional seedPointDirectory [[codegen::directory()]]; - - // Currently supports: batsrus, enlil & pfss - std::optional simulationModel; - - // Extra variables such as rho, p or t - std::optional> extraVariables; - - // Which variable in CDF file to trace. b is default for fieldline - std::optional tracingVariable; - - // Convert the models distance unit, ex. AU for Enlil, to meters. - // Can be used during runtime to scale domain limits. - // 1.f is default, assuming meters as input. - std::optional scaleToMeters; - - // Set to true if you are streaming data during runtime - std::optional loadAtRuntime; + // [[codegen::verbatim(ColorQuantityInfo.description)]] + std::optional colorQuantity; // [[codegen::verbatim(ColorUniformInfo.description)]] std::optional color [[codegen::color()]]; @@ -227,18 +243,14 @@ namespace { // used for colorizing the fieldlines according to different parameters std::optional> colorTablePaths; - // [[codegen::verbatim(ColorMethodInfo.description)]] - std::optional colorMethod; - - // [[codegen::verbatim(ColorQuantityInfo.description)]] - std::optional colorQuantity; - - // List of ranges for which their corresponding parameters values will be - // colorized by. Should be entered as {min value, max value} per range + // Ranges for which their corresponding parameters values will be + // colorized by. Should be entered as min value, max value std::optional> colorTableRanges; - // Enables flow, showing the direction, but not accurate speed, that particles - // would be traveling + // Specifies the total data range to where color map will be applied + std::optional colorMinMaxRange; + + // [[codegen::verbatim(FlowEnabledInfo.description)]] std::optional flowEnabled; // [[codegen::verbatim(FlowColorInfo.description)]] @@ -262,36 +274,108 @@ namespace { // [[codegen::verbatim(MaskingQuantityInfo.description)]] std::optional maskingQuantity; - // List of ranges for which their corresponding parameters values will be - // masked by. Should be entered as {min value, max value} per range + // Ranges for which their corresponding quantity parameter value will be + // masked by. Should be entered as a min value, max value pair. std::optional> maskingRanges; + // Ranges for which their corresponding parameters values will be + // masked by. Should be entered as a min value, max value pair. + std::optional maskingMinMaxRange; + // [[codegen::verbatim(DomainEnabledInfo.description)]] std::optional domainEnabled; - // Value should be path to folder where states are saved. Specifying this - // makes it use file type converter - // (JSON/CDF input => osfls output & oslfs input => JSON output) - std::optional outputFolder; - // [[codegen::verbatim(LineWidthInfo.description)]] std::optional lineWidth; + // [[codegen::verbatim(ColorUseABlendingInfo.description)]] + std::optional alphaBlendingEnabled; + + // Set if first/last file should render forever. + bool showAtAllTimes; + // If data sets parameter start_time differ from start of run, // elapsed_time_in_seconds might be in relation to start of run. // ManuelTimeOffset will be added to trigger time. - std::optional manualTimeOffset; + std::optional manualTimeOffset; + + enum class [[codegen::map(openspace::fls::Model)]] Model { + Batsrus, + Enlil, + Pfss + }; + + // If the simulation model is not specified, it means that the scaleFactor + // (scaleToMeters) will be 1.0 assuming meter as input. + std::optional simulationModel; + + // Convert the models distance unit, ex. AU to meters for Enlil. + // 1.0 is default, assuming meters as input. + // Does not need to be specified if simulationModel is specified. + // When using a different model, use this value to scale your vertex positions to + // meters. + std::optional scaleToMeters; + + enum class [[codegen::map(openspace::RenderableFieldlinesSequence::LoadingType)]] + LoadingType { + StaticLoading, + DynamicDownloading + }; + + // Choose type of loading: + // `StaticLoading`: Download and load files on startup. + // `DynamicDownloading`: Download and load files during run time. + std::optional loadingType; + + // A data ID that corresponds to what dataset to use if using dynamic data + // downloading. + std::optional dataID; + + // A maximum number to limit the number of files being downloaded simultaneously. + std::optional numberOfFilesToQueue; + + // A URL to a JSON-formatted page with metadata for the `DataURL`. + // Required if using dynamic downloading. + std::optional infoURL; + + // A URL to a JSON-formatted page with a list of each available data file. + // Required if using dynamic downloading. + std::optional dataURL; + + enum class + [[codegen::map(openspace::RenderableFieldlinesSequence::SourceFileType)]] + SourceFileType { + Cdf, + Json, + Osfls + }; + + // Specify the file format of the data used. + SourceFileType inputFileType; + + // Path to folder containing the input files. + std::optional sourceFolder [[codegen::directory()]]; + + // Path to a directory including .txt files that contain seed points. The files + // need a file name with a timestamp in the format: yyyymmdd_hhmmss.txt. + // Required if CDF is used as input. + std::optional seedPointDirectory [[codegen::directory()]]; + + // Extra variables that can be used to color the field lines. + std::optional> extraVariables; + + // Which variable in CDF file to trace. + std::optional tracingVariable; + + // Decides whether or not to cache the downloaded data between runs. By default, + // caching is disabled and all downloaded content will be deleted when OpenSpace + // is shut down. Set to true to save all the downloaded files. + std::optional cacheData; }; #include "renderablefieldlinessequence_codegen.cpp" } // namespace namespace openspace { -fls::Model stringToModel(std::string str); -std::unordered_map> - extractSeedPointsFromFiles(std::filesystem::path); -std::vector - extractMagnitudeVarsFromStrings(std::vector extrVars); - documentation::Documentation RenderableFieldlinesSequence::Documentation() { return codegen::doc("fieldlinessequence_renderablefieldlinessequence"); } @@ -302,9 +386,9 @@ RenderableFieldlinesSequence::RenderableFieldlinesSequence( , _colorGroup({ "Color" }) , _colorMethod(ColorMethodInfo) , _colorQuantity(ColorQuantityInfo) - , _colorQuantityMinMax( + , _selectedColorRange( ColorMinMaxInfo, - glm::vec2(-0.f, 100.f), + glm::vec2(0.f, 100.f), glm::vec2(-5000.f), glm::vec2(5000.f) ) @@ -316,27 +400,27 @@ RenderableFieldlinesSequence::RenderableFieldlinesSequence( glm::vec4(1.f) ) , _colorABlendEnabled(ColorUseABlendingInfo, true) - , _domainEnabled(DomainEnabledInfo, true) + , _domainEnabled(DomainEnabledInfo, false) , _domainGroup({ "Domain" }) , _domainX(DomainXInfo) , _domainY(DomainYInfo) , _domainZ(DomainZInfo) , _domainR(DomainRInfo) + , _flowEnabled(FlowEnabledInfo, false) + , _flowGroup({ "Flow" }) , _flowColor( FlowColorInfo, - glm::vec4(0.96f, 0.88f, 0.8f, 0.5f), + glm::vec4(0.96f, 0.88f, 0.8f, 1.f), glm::vec4(0.f), glm::vec4(1.f) ) - , _flowEnabled(FlowEnabledInfo, false) - , _flowGroup({ "Flow" }) , _flowParticleSize(FlowParticleSizeInfo, 5, 0, 500) , _flowParticleSpacing(FlowParticleSpacingInfo, 60, 0, 500) , _flowReversed(FlowReversedInfo, false) , _flowSpeed(FlowSpeedInfo, 20, 0, 1000) , _maskingEnabled(MaskingEnabledInfo, false) , _maskingGroup({ "Masking" }) - , _maskingMinMax( + , _selectedMaskingRange( MaskingMinMaxInfo, glm::vec2(0.f, 100.f), glm::vec2(-5000.f), @@ -344,77 +428,97 @@ RenderableFieldlinesSequence::RenderableFieldlinesSequence( ) , _maskingQuantity(MaskingQuantityInfo) , _lineWidth(LineWidthInfo, 1.f, 1.f, 20.f) - , _jumpToStartBtn(TimeJumpButtonInfo) + , _jumpToStart(TimeJumpButtonInfo) + , _saveDownloadsOnShutdown(SaveDownloadsOnShutdown, false) { const Parameters p = codegen::bake(dictionary); addProperty(Fadeable::_opacity); - // Extracts the general information (from the asset file) that - // is mandatory for the class to function; - std::string fileTypeString; - switch (p.inputFileType) { - case Parameters::SourceFileType::Cdf: - _inputFileType = SourceFileType::Cdf; - fileTypeString = "cdf"; - if (p.tracingVariable.has_value()) { - _tracingVariable = *p.tracingVariable; + _inputFileType = codegen::map(p.inputFileType); + if (p.loadingType.has_value()) { + _loadingType = codegen::map(*p.loadingType); + } + else { + _loadingType = LoadingType::StaticLoading; + } + + if (_loadingType == LoadingType::DynamicDownloading && + _inputFileType == SourceFileType::Cdf) + { + throw ghoul::RuntimeError( + "Dynamic loading (or downloading) is only supported for .osfls and .json " + "files" + ); + } + if (_loadingType == LoadingType::StaticLoading && !p.sourceFolder.has_value()) { + throw ghoul::RuntimeError( + "Either dynamic downloading parameters or a sync folder must be specified" + ); + } + + if (p.simulationModel.has_value()) { + _model = codegen::map(*p.simulationModel); + } + else { + _model = fls::Model::Invalid; + } + + setModelDependentConstants(); + + // Setting the scaling factor after model to support the case with unknown models + // (model = invalid), but scaling factor being specified. + _scalingFactor = p.scaleToMeters.value_or(_scalingFactor); + + if (_loadingType == LoadingType::DynamicDownloading) { + if (!p.dataID.has_value()) { + throw ghoul::RuntimeError( + "If running with dynamic downloading, DataID needs to be specified" + ); + } + _dataID = *p.dataID; + + _nFilesToQueue = static_cast( + p.numberOfFilesToQueue.value_or(_nFilesToQueue) + ); + + if (!p.infoURL.has_value()) { + throw ghoul::RuntimeError("InfoURL has to be provided"); + } + _infoURL = *p.infoURL; + + if (!p.dataURL.has_value()) { + throw ghoul::RuntimeError("DataURL has to be provided"); + } + _dataURL = *p.dataURL; + } + else { + ghoul_assert( + p.sourceFolder.has_value(), + "sourceFolder not specified though it should not be able to get here" + ); + std::filesystem::path path = p.sourceFolder.value(); + namespace fs = std::filesystem; + for (const fs::directory_entry& e : fs::directory_iterator(path)) { + if (!e.is_regular_file()) { + continue; } - else { - _tracingVariable = "b"; // Magnetic field variable as default - LWARNING(std::format( - "No tracing variable, using default '{}'", _tracingVariable + File file = { + .status = File::FileStatus::Downloaded, + .path = e.path(), + .timestamp = -1.0 + }; + _files.push_back(std::move(file)); + if (_files[0].path.empty()) { + throw ghoul::RuntimeError(std::format( + "Error finding file '{}' in folder '{}'", + e.path().filename(), path )); } - break; - case Parameters::SourceFileType::Json: - _inputFileType = SourceFileType::Json; - fileTypeString = "json"; - break; - case Parameters::SourceFileType::Osfls: - _inputFileType = SourceFileType::Osfls; - fileTypeString = "osfls"; - break; - } - - // Ensure that the source folder exists and then extract - // the files with the same extension as fileTypeString - std::filesystem::path sourcePath = p.sourceFolder; - if (!std::filesystem::is_directory(sourcePath)) { - LERROR(std::format( - "FieldlinesSequence '{}' is not a valid directory", sourcePath - )); - } - - // Extract all file paths from the provided folder - namespace fs = std::filesystem; - for (const fs::directory_entry& e : fs::directory_iterator(sourcePath)) { - if (e.is_regular_file()) { - std::string eStr = e.path().string(); - _sourceFiles.push_back(eStr); } + _maxLoadedFiles = _files.size(); } - std::sort(_sourceFiles.begin(), _sourceFiles.end()); - // Remove all files that don't have fileTypeString as file extension - _sourceFiles.erase( - std::remove_if( - _sourceFiles.begin(), - _sourceFiles.end(), - [&fileTypeString](const std::string& str) { - const size_t extLength = fileTypeString.length(); - std::string sub = str.substr(str.length() - extLength, extLength); - sub = ghoul::toLowerCase(sub); - return sub != fileTypeString; - } - ), - _sourceFiles.end() - ); - - // Ensure that there are available and valid source files left - if (_sourceFiles.empty()) { - LERROR(std::format("'{}' contains no {} files", sourcePath, fileTypeString)); - } _extraVars = p.extraVariables.value_or(_extraVars); _flowEnabled = p.flowEnabled.value_or(_flowEnabled); _flowColor = p.flowColor.value_or(_flowColor); @@ -422,129 +526,221 @@ RenderableFieldlinesSequence::RenderableFieldlinesSequence( _flowParticleSize = p.particleSize.value_or(_flowParticleSize); _flowParticleSpacing = p.particleSpacing.value_or(_flowParticleSpacing); _flowSpeed = p.flowSpeed.value_or(_flowSpeed); - _lineWidth = p.lineWidth.value_or(_lineWidth); - _manualTimeOffset = p.manualTimeOffset.value_or(_manualTimeOffset); - _modelStr = p.simulationModel.value_or(_modelStr); - _seedPointDirectory = p.seedPointDirectory.value_or(_seedPointDirectory); _maskingEnabled = p.maskingEnabled.value_or(_maskingEnabled); _maskingQuantityTemp = p.maskingQuantity.value_or(_maskingQuantityTemp); + _domainEnabled = p.domainEnabled.value_or(_domainEnabled); + _lineWidth = p.lineWidth.value_or(_lineWidth); + _colorABlendEnabled = p.alphaBlendingEnabled.value_or(_colorABlendEnabled); + _renderForever = p.showAtAllTimes; + _manualTimeOffset = p.manualTimeOffset.value_or(_manualTimeOffset); + _saveDownloadsOnShutdown = p.cacheData.value_or(_saveDownloadsOnShutdown); + + if (_loadingType == LoadingType::StaticLoading){ + staticallyLoadFiles(p.seedPointDirectory, p.tracingVariable); + computeSequenceEndTime(); + } + // Color group + _colorTablePath = FieldlinesSequenceModule::DefaultTransferFunctionFile.string(); if (p.colorTablePaths.has_value()) { - _colorTablePaths = *p.colorTablePaths; + for (const std::filesystem::path& path : *p.colorTablePaths) { + if (!std::filesystem::exists(path)) { + throw ghoul::RuntimeError(std::format( + "Color table path '{}' is not a valid file", path + )); + } + _colorTablePaths.emplace_back(path); + } } - else { - // Set a default color table, just in case the (optional) user defined paths are - // corrupt or not provided - _colorTablePaths.push_back(FieldlinesSequenceModule::DefaultTransferFunctionFile); + if (!p.colorTablePaths.has_value() || _colorTablePaths.empty()) { + _colorTablePaths.emplace_back( + FieldlinesSequenceModule::DefaultTransferFunctionFile + ); } - _colorUniform = p.color.value_or(_colorUniform); - _colorMethod.addOption(static_cast(ColorMethod::Uniform), "Uniform"); _colorMethod.addOption(static_cast(ColorMethod::ByQuantity), "By Quantity"); if (p.colorMethod.has_value()) { - if (p.colorMethod.value() == "Uniform") { - _colorMethod = static_cast(ColorMethod::Uniform); - } - else { - _colorMethod = static_cast(ColorMethod::ByQuantity); - } + _colorMethod = static_cast( + codegen::map( + *p.colorMethod + ) + ); } else { _colorMethod = static_cast(ColorMethod::Uniform); } - - if (p.colorQuantity.has_value()) { - _colorMethod = static_cast(ColorMethod::ByQuantity); - _colorQuantityTemp = *p.colorQuantity; - } + _colorQuantityTemp = p.colorQuantity.value_or(_colorQuantityTemp); if (p.colorTableRanges.has_value()) { _colorTableRanges = *p.colorTableRanges; } else { _colorTableRanges.push_back(glm::vec2(0.f, 1.f)); + _selectedColorRange = glm::vec2(0.f, 1.f); } - _loadingStatesDynamically = p.loadAtRuntime.value_or(_loadingStatesDynamically); - if (_loadingStatesDynamically && _inputFileType != SourceFileType::Osfls) { - LWARNING("Load at run time is only supported for osfls file type"); - _loadingStatesDynamically = false; + if (p.colorMinMaxRange.has_value()) { + _selectedColorRange.setMinValue(glm::vec2(p.colorMinMaxRange->x)); + _selectedColorRange.setMaxValue(glm::vec2(p.colorMinMaxRange->y)); } - if (p.maskingRanges.has_value()) { _maskingRanges = *p.maskingRanges; } else { - _maskingRanges.push_back(glm::vec2(-100000.f, 100000.f)); // some default values + _maskingRanges.push_back(glm::vec2(0.f, 1.f)); + _selectedMaskingRange = glm::vec2(0.f, 1.f); } - _domainEnabled = p.domainEnabled.value_or(_domainEnabled); - - _outputFolderPath = p.outputFolder.value_or(_outputFolderPath); - if (!_outputFolderPath.empty() && !std::filesystem::is_directory(_outputFolderPath)) { - _outputFolderPath.clear(); - LERROR(std::format( - "The specified output path '{}' does not exist", _outputFolderPath - )); + if (p.maskingMinMaxRange.has_value()) { + _selectedMaskingRange.setMinValue(glm::vec2(p.maskingMinMaxRange->x)); + _selectedMaskingRange.setMaxValue(glm::vec2(p.maskingMinMaxRange->y)); } - _scalingFactor = p.scaleToMeters.value_or(_scalingFactor); + _colorQuantity.onChange([this]() { + if (_colorTablePaths.empty()) { + return; + } + _shouldUpdateColorBuffer = true; + // Note that we do not need to set _selectedColorRange in the constructor, due to + // this onChange being declared before firstupdate() function that sets + // _colorQuantity. + if (_colorTableRanges.size() > _colorQuantity) { + _selectedColorRange = _colorTableRanges[_colorQuantity]; + } + // If fewer data ranges are given than there are parameters in the data, use the + // first range. + // @TODO (2025-06-10, elon) We should use a better structure for providing the + // data, since this creates discrepancy for which range belongs to which parameter + else { + _selectedColorRange = _colorTableRanges[0]; + } + + if (_colorTablePaths.size() > _colorQuantity) { + _colorTablePath = _colorTablePaths[_colorQuantity].string(); + } + else { + _colorTablePath = _colorTablePaths[0].string(); + } + }); + + // This is to save the changes done in the gui for when you switch between options + _selectedColorRange.onChange([this]() { + if (_colorTableRanges.size() > _colorQuantity) { + _colorTableRanges[_colorQuantity] = _selectedColorRange; + } + }); + + _colorTablePath.onChange([this]() { + if (std::filesystem::exists(_colorTablePath.value())) { + _transferFunction = + std::make_unique(_colorTablePath.value()); + } + else { + LERROR(std::format( + "Invalid path '{}' to transfer function. Please enter new path", + _colorTablePath.value() + )); + } + }); + + _maskingQuantity.onChange([this]() { + _shouldUpdateMaskingBuffer = true; + if (_maskingRanges.size() > _maskingQuantity) { + _selectedMaskingRange = _maskingRanges[_maskingQuantity]; + } + else if (!_maskingRanges.empty()) { + _selectedMaskingRange = _maskingRanges[0]; + } + else { + LERROR("Cannot set selected masking range"); + } + }); + + _selectedMaskingRange.onChange([this]() { + if (_maskingRanges.size() > _maskingQuantity) { + _maskingRanges[_maskingQuantity] = _selectedMaskingRange; + } + }); + + _jumpToStart.onChange([this]() { + if (_atLeastOneFileLoaded) { + global::timeManager->setTimeNextFrame(Time(_files[0].timestamp)); + } + }); + setupProperties(); +} + +void RenderableFieldlinesSequence::staticallyLoadFiles( + const std::optional& seedPointDirectory, + const std::optional& tracingVariable) +{ + bool loadSuccess = false; + switch (_inputFileType) { + case SourceFileType::Cdf: + _seedPointDirectory = seedPointDirectory.value_or(_seedPointDirectory); + _tracingVariable = tracingVariable.value_or(_tracingVariable); + for (File& file : _files) { + if (!tracingVariable.has_value()) { + throw ghoul::RuntimeError("No tracing variable specified"); + } + std::vector extraMagVars = + fls::extractMagnitudeVarsFromStrings(_extraVars); + std::unordered_map> seedsPerFiles = + fls::extractSeedPointsFromFiles(_seedPointDirectory); + if (seedsPerFiles.empty()) { + throw ghoul::RuntimeError("No seed files found"); + } + loadSuccess = fls::convertCdfToFieldlinesState( + file.state, + file.path.string(), + seedsPerFiles, + _manualTimeOffset, + _tracingVariable, + _extraVars, + extraMagVars + ); + } + break; + case SourceFileType::Json: + for (File& file : _files) { + loadSuccess = file.state.loadStateFromJson( + file.path.string(), + _model, + _scalingFactor + ); + } + break; + case SourceFileType::Osfls: + for (File& file : _files) { + loadFile(file); + } + break; + default: + throw ghoul::MissingCaseException(); + } + + _isLoadingStateFromDisk = false; + for (File& file : _files) { + if (!file.path.empty() && file.status != File::FileStatus::Loaded) { + file.status = File::FileStatus::Loaded; + file.timestamp = extractTriggerTimeFromFilename(file.path); + _atLeastOneFileLoaded = true; + } + } + std::sort(_files.begin(), _files.end()); } void RenderableFieldlinesSequence::initialize() { - _transferFunction = std::make_unique(absPath(_colorTablePaths[0])); + _isFirstLoad = true; } void RenderableFieldlinesSequence::initializeGL() { - // Setup shader program _shaderProgram = global::renderEngine->buildRenderProgram( "FieldlinesSequence", absPath("${MODULE_FIELDLINESSEQUENCE}/shaders/fieldlinessequence_vs.glsl"), absPath("${MODULE_FIELDLINESSEQUENCE}/shaders/fieldlinessequence_fs.glsl") ); - // Extract source file type specific information from dictionary - // & get states from source - switch (_inputFileType) { - case SourceFileType::Cdf: - if (!getStatesFromCdfFiles()) { - return; - } - break; - case SourceFileType::Json: - if (!loadJsonStatesIntoRAM()) { - return; - } - break; - case SourceFileType::Osfls: - if (_loadingStatesDynamically) { - if (!prepareForOsflsStreaming()) { - return; - } - } - else { - loadOsflsStatesIntoRAM(); - } - break; - default: - return; - } - - // No need to store source paths in memory if they are already in RAM - if (!_loadingStatesDynamically) { - _sourceFiles.clear(); - } - - // At this point there should be at least one state loaded into memory - if (_states.empty()) { - LERROR("Wasn't able to extract any valid states from provided source files"); - return; - } - - computeSequenceEndTime(); - setModelDependentConstants(); - setupProperties(); - glGenVertexArrays(1, &_vertexArrayObject); glGenBuffers(1, &_vertexPositionBuffer); glGenBuffers(1, &_vertexColorBuffer); @@ -554,188 +750,50 @@ void RenderableFieldlinesSequence::initializeGL() { setRenderBin(Renderable::RenderBin::Overlay); } -// Returns fls::Model::Invalid if it fails to extract mandatory information -fls::Model stringToModel(std::string str) { - str = ghoul::toLowerCase(str); - return fls::stringToModel(str); -} - -bool RenderableFieldlinesSequence::loadJsonStatesIntoRAM() { - fls::Model model = stringToModel(_modelStr); - for (const std::string& filePath : _sourceFiles) { - FieldlinesState newState; - const bool loadedSuccessfully = newState.loadStateFromJson( - filePath, - model, - _scalingFactor - ); - if (loadedSuccessfully) { - addStateToSequence(newState); - if (!_outputFolderPath.empty()) { - newState.saveStateToOsfls(_outputFolderPath); - } - } - } - return true; -} - -bool RenderableFieldlinesSequence::prepareForOsflsStreaming() { - extractTriggerTimesFromFileNames(); - FieldlinesState newState; - if (!newState.loadStateFromOsfls(_sourceFiles[0])) { - LERROR("The provided .osfls files seem to be corrupt"); - return false; - } - _states.push_back(newState); - _nStates = _startTimes.size(); - if (_nStates == 1) { - // loading dynamicaly is not nessesary if only having one set in the sequence - _loadingStatesDynamically = false; - } - _activeStateIndex = 0; - return true; -} - -void RenderableFieldlinesSequence::loadOsflsStatesIntoRAM() { - for (const std::string& filePath : _sourceFiles) { - FieldlinesState newState; - if (newState.loadStateFromOsfls(filePath)) { - addStateToSequence(newState); - if (!_outputFolderPath.empty()) { - newState.saveStateToJson( - _outputFolderPath + std::filesystem::path(filePath).stem().string() - ); - } - } - else { - LWARNING(std::format("Failed to load state from '{}'", filePath)); - } - } -} - void RenderableFieldlinesSequence::setupProperties() { - bool hasExtras = (_states[0].nExtraQuantities() > 0); - - // Add non-grouped properties (enablers and buttons) addProperty(_colorABlendEnabled); - addProperty(_domainEnabled); - addProperty(_flowEnabled); - if (hasExtras) { - addProperty(_maskingEnabled); - } addProperty(_lineWidth); - addProperty(_jumpToStartBtn); + addProperty(_jumpToStart); // Add Property Groups addPropertySubOwner(_colorGroup); addPropertySubOwner(_domainGroup); addPropertySubOwner(_flowGroup); - if (hasExtras) { - addPropertySubOwner(_maskingGroup); - } + addPropertySubOwner(_maskingGroup); - // Add Properties to the groups _colorUniform.setViewOption(properties::Property::ViewOptions::Color); _colorGroup.addProperty(_colorUniform); + _colorGroup.addProperty(_colorMethod); + _colorGroup.addProperty(_colorQuantity); + _selectedColorRange.setViewOption(properties::Property::ViewOptions::MinMaxRange); + _colorGroup.addProperty(_selectedColorRange); + _colorGroup.addProperty(_colorTablePath); + + _domainGroup.addProperty(_domainEnabled); _domainGroup.addProperty(_domainX); _domainGroup.addProperty(_domainY); _domainGroup.addProperty(_domainZ); _domainGroup.addProperty(_domainR); + + _flowGroup.addProperty(_flowEnabled); _flowGroup.addProperty(_flowReversed); _flowColor.setViewOption(properties::Property::ViewOptions::Color); _flowGroup.addProperty(_flowColor); _flowGroup.addProperty(_flowParticleSize); _flowGroup.addProperty(_flowParticleSpacing); _flowGroup.addProperty(_flowSpeed); - if (hasExtras) { - _colorGroup.addProperty(_colorMethod); - _colorGroup.addProperty(_colorQuantity); - _colorQuantityMinMax.setViewOption( - properties::Property::ViewOptions::MinMaxRange - ); - _colorGroup.addProperty(_colorQuantityMinMax); - _colorGroup.addProperty(_colorTablePath); - _maskingGroup.addProperty(_maskingQuantity); - _maskingMinMax.setViewOption(properties::Property::ViewOptions::MinMaxRange); - _maskingGroup.addProperty(_maskingMinMax); - // Add option for each extra quantity. Assumes there are just as many names to - // extra quantities as there are extra quantities. Also assume that all states in - // the given sequence have the same extra quantities - const size_t nExtraQuantities = _states[0].nExtraQuantities(); - const std::vector& extraNamesVec = _states[0].extraQuantityNames(); - for (int i = 0; i < static_cast(nExtraQuantities); i++) { - _colorQuantity.addOption(i, extraNamesVec[i]); - _maskingQuantity.addOption(i, extraNamesVec[i]); - } - // Each quantity should have its own color table and color table range - // no more, no less - _colorTablePaths.resize(nExtraQuantities, _colorTablePaths.back()); - _colorTablePath = _colorTablePaths[0].string(); - _colorTableRanges.resize(nExtraQuantities, _colorTableRanges.back()); - _maskingRanges.resize(nExtraQuantities, _maskingRanges.back()); - } + _maskingGroup.addProperty(_maskingEnabled); + _maskingGroup.addProperty(_maskingQuantity); + _selectedMaskingRange.setViewOption(properties::Property::ViewOptions::MinMaxRange); + _maskingGroup.addProperty(_selectedMaskingRange); - definePropertyCallbackFunctions(); - - if (hasExtras) { - // Set defaults - _colorQuantity = _colorQuantityTemp; - _colorQuantityMinMax = _colorTableRanges[_colorQuantity]; - - _maskingQuantity = _maskingQuantityTemp; - _maskingMinMax = _maskingRanges[_colorQuantity]; - } -} - -void RenderableFieldlinesSequence::definePropertyCallbackFunctions() { - // Add Property Callback Functions - bool hasExtras = (_states[0].nExtraQuantities() > 0); - if (hasExtras) { - _colorQuantity.onChange([this]() { - _shouldUpdateColorBuffer = true; - _colorQuantityMinMax = _colorTableRanges[_colorQuantity]; - _colorTablePath = _colorTablePaths[_colorQuantity].string(); - }); - - _colorTablePath.onChange([this]() { - _transferFunction->setPath(_colorTablePath.value()); - }); - - _colorQuantityMinMax.onChange([this]() { - _colorTableRanges[_colorQuantity] = _colorQuantityMinMax; - }); - - _maskingQuantity.onChange([this]() { - _shouldUpdateMaskingBuffer = true; - _maskingMinMax = _maskingRanges[_maskingQuantity]; - }); - - _maskingMinMax.onChange([this]() { - _maskingRanges[_maskingQuantity] = _maskingMinMax; - }); - } - - _jumpToStartBtn.onChange([this]() { - global::timeManager->setTimeNextFrame(Time(_startTimes[0])); - }); -} - -// Calculate expected end time. -void RenderableFieldlinesSequence::computeSequenceEndTime() { - if (_nStates > 1) { - const double lastTriggerTime = _startTimes[_nStates - 1]; - const double sequenceDuration = lastTriggerTime - _startTimes[0]; - const double averageStateDuration = sequenceDuration / - (static_cast(_nStates) - 1.0); - _sequenceEndTime = lastTriggerTime + averageStateDuration; - } + addProperty(_saveDownloadsOnShutdown); } void RenderableFieldlinesSequence::setModelDependentConstants() { - const fls::Model simulationModel = _states[0].model(); float limit = 100.f; // Just used as a default value. - switch (simulationModel) { + switch (_model) { case fls::Model::Batsrus: _scalingFactor = fls::ReToMeter; limit = 300.f; // Should include a long magnetotail @@ -772,165 +830,6 @@ void RenderableFieldlinesSequence::setModelDependentConstants() { _domainR = glm::vec2(0.f, limit * 1.5f); } -// Extract J2000 time from file names -// Requires files to be named as such: 'YYYY-MM-DDTHH-MM-SS-XXX.osfls' -void RenderableFieldlinesSequence::extractTriggerTimesFromFileNames() { - // number of characters in filename (excluding '.osfls') - constexpr int FilenameSize = 23; - // size(".osfls") - constexpr int ExtSize = 6; - - for (const std::string& filePath : _sourceFiles) { - const size_t strLength = filePath.size(); - // Extract the filename from the path (without extension) - std::string timeString = filePath.substr( - strLength - FilenameSize - ExtSize, - FilenameSize - 1 - ); - // Ensure the separators are correct - timeString.replace(4, 1, "-"); - timeString.replace(7, 1, "-"); - timeString.replace(13, 1, ":"); - timeString.replace(16, 1, ":"); - timeString.replace(19, 1, "."); - const double triggerTime = Time::convertTime(timeString); - _startTimes.push_back(triggerTime); - } -} - -void RenderableFieldlinesSequence::addStateToSequence(FieldlinesState& state) { - _states.push_back(state); - _startTimes.push_back(state.triggerTime()); - ++_nStates; -} - -bool RenderableFieldlinesSequence::getStatesFromCdfFiles() { - std::vector extraMagVars = extractMagnitudeVarsFromStrings(_extraVars); - - std::unordered_map> seedsPerFiles = - extractSeedPointsFromFiles(_seedPointDirectory); - if (seedsPerFiles.empty()) { - LERROR("No seed files found"); - return false; - } - - for (const std::string& cdfPath : _sourceFiles) { - FieldlinesState newState; - bool isSuccessful = fls::convertCdfToFieldlinesState( - newState, - cdfPath, - seedsPerFiles, - _manualTimeOffset, - _tracingVariable, - _extraVars, - extraMagVars - ); - - if (isSuccessful) { - addStateToSequence(newState); - if (!_outputFolderPath.empty()) { - newState.saveStateToOsfls(_outputFolderPath); - } - } - } - return true; -} - -std::unordered_map> - extractSeedPointsFromFiles(std::filesystem::path filePath) -{ - std::unordered_map> outMap; - - if (!std::filesystem::is_directory(filePath)) { - LERROR(std::format( - "The specified seed point directory '{}' does not exist", filePath - )); - return outMap; - } - - namespace fs = std::filesystem; - for (const fs::directory_entry& spFile : fs::directory_iterator(filePath)) { - std::string seedFilePath = spFile.path().string(); - if (!spFile.is_regular_file() || - seedFilePath.substr(seedFilePath.find_last_of('.') + 1) != "txt") - { - continue; - } - - std::ifstream seedFile(seedFilePath); - if (!seedFile.good()) { - LERROR(std::format("Could not open seed points file '{}'", seedFilePath)); - outMap.clear(); - return {}; - } - - LDEBUG(std::format("Reading seed points from file '{}'", seedFilePath)); - std::string line; - std::vector outVec; - while (ghoul::getline(seedFile, line)) { - std::stringstream ss(line); - glm::vec3 point; - ss >> point.x; - ss >> point.y; - ss >> point.z; - outVec.push_back(std::move(point)); - } - - if (outVec.empty()) { - LERROR(std::format("Found no seed points in '{}'", seedFilePath)); - outMap.clear(); - return {}; - } - - size_t lastIndex = seedFilePath.find_last_of('.'); - std::string name = seedFilePath.substr(0, lastIndex); // remove file extention - size_t dateAndTimeSeperator = name.find_last_of('_'); - std::string time = name.substr(dateAndTimeSeperator + 1, name.length()); - std::string date = name.substr(dateAndTimeSeperator - 8, 8); // 8 for yyyymmdd - std::string dateAndTime = date + time; - - // add outVec as value and time stamp as int as key - outMap[dateAndTime] = outVec; - } - return outMap; -} - -std::vector - extractMagnitudeVarsFromStrings(std::vector extrVars) -{ - std::vector extraMagVars; - for (int i = 0; i < static_cast(extrVars.size()); i++) { - const std::string& str = extrVars[i]; - // Check if string is in the format specified for magnitude variables - if (str.substr(0, 2) == "|(" && str.substr(str.size() - 2, 2) == ")|") { - std::istringstream ss(str.substr(2, str.size() - 4)); - std::string magVar; - size_t counter = 0; - while (ghoul::getline(ss, magVar, ',')) { - magVar.erase( - std::remove_if( - magVar.begin(), - magVar.end(), - ::isspace - ), - magVar.end() - ); - extraMagVars.push_back(magVar); - counter++; - if (counter == 3) { - break; - } - } - if (counter != 3 && counter > 0) { - extraMagVars.erase(extraMagVars.end() - counter, extraMagVars.end()); - } - extrVars.erase(extrVars.begin() + i); - i--; - } - } - return extraMagVars; -} - void RenderableFieldlinesSequence::deinitializeGL() { glDeleteVertexArrays(1, &_vertexArrayObject); _vertexArrayObject = 0; @@ -949,14 +848,112 @@ void RenderableFieldlinesSequence::deinitializeGL() { _shaderProgram = nullptr; } - // Stall main thread until thread that's loading states is done - bool printedWarning = false; - while (_isLoadingStateFromDisk) { - if (!printedWarning) { - LWARNING("Trying to destroy class when an active thread is still using it"); - printedWarning = true; + _files.clear(); + + if (_loadingType == LoadingType::DynamicDownloading && _dynamicFileDownloader) { + _dynamicFileDownloader->deinitialize(_saveDownloadsOnShutdown); + } +} + +void RenderableFieldlinesSequence::computeSequenceEndTime() { + if (_files.empty()) { + _sequenceEndTime = 0.f; + } + else if (_files.size() == 1) { + _sequenceEndTime = _files[0].timestamp + 7200.f; + if (_loadingType == LoadingType::StaticLoading && !_renderForever) { + // TODO (2025-06-10, Elon) Alternativly check at construction and throw + // exeption. + LWARNING( + "Only one file in data set, but ShowAtAllTimes set to false. Using a 2h " + "window after the files time stamp to visualize the data" + ); } - std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + else if (_files.size() > 1) { + const double lastTriggerTime = _files.back().timestamp; + const double sequenceDuration = lastTriggerTime - _files[0].timestamp; + const double averageCadence = sequenceDuration / (_files.size() - 1); + // A multiplier of 3 to the average cadence is added at the end as a buffer + // 3 because if you start it just before new data came in, you might just be + // outside the sequence end time otherwise + _sequenceEndTime = lastTriggerTime + 3 * averageCadence; + } +} + +void RenderableFieldlinesSequence::loadFile(File& file) { + _isLoadingStateFromDisk = true; + try { + if (_inputFileType == SourceFileType::Osfls) { + file.state = FieldlinesState::createStateFromOsfls(file.path.string()); + } + else if (_inputFileType == SourceFileType::Json) { + file.state.loadStateFromJson( + file.path.string(), + fls::Model::Invalid, + _scalingFactor + ); + } + } + catch (const ghoul::RuntimeError& e) { + LERRORC(e.component, e.message); + } +} + +void RenderableFieldlinesSequence::trackOldest(File& file) { + if (file.status == File::FileStatus::Loaded) { + std::deque::iterator it = + std::find(_loadedFiles.begin(), _loadedFiles.end(), &file); + if (it == _loadedFiles.end()) { + _loadedFiles.push_back(&file); + } + // Repopulate the queue if new File makes the queue full + if (!_loadedFiles.empty() && + _loadingType == LoadingType::DynamicDownloading && + _loadedFiles.size() >= _maxLoadedFiles) + { + File* oldest = _loadedFiles.front(); + // The edge case of when queue just got full and user jumped back to where + // they started which would make the oldes file in queue to be the active + // file. In that case we need to make sure we do not unload it + if (oldest == &file) { + return; + } + oldest->status = File::FileStatus::Downloaded; + oldest->state.clear(); + _loadedFiles.pop_front(); + } + } +} + +int RenderableFieldlinesSequence::updateActiveIndex(double currentTime) { + if (_files.empty()) { + return -1; + } + // Sets index to 0 if time is at the first file time stamp and also, + // if size == 1 then we can expect to not have a sequence and wants to show + // the one file of fieldlines at all points in time + if (_files.begin()->timestamp == currentTime || _files.size() == 1) { + return 0; + } + + const std::deque::const_iterator iter = std::upper_bound( + _files.begin(), + _files.end(), + currentTime, + [](double timeRef, const File& fileRef) { + return timeRef < fileRef.timestamp; + } + ); + + if (iter == _files.begin()) { + return 0; + } + else if (iter != _files.end()) { + return static_cast(std::distance(_files.cbegin(), iter)); + } + else { + return static_cast(_files.size()) - 1; } } @@ -964,10 +961,169 @@ bool RenderableFieldlinesSequence::isReady() const { return _shaderProgram != nullptr; } -void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks&) { - if (_activeTriggerTimeIndex == -1) { +void RenderableFieldlinesSequence::updateDynamicDownloading(double currentTime, + double deltaTime) +{ + _dynamicFileDownloader->update(currentTime, deltaTime); + const std::vector& filesToRead = + _dynamicFileDownloader->downloadedFiles(); + for (const std::filesystem::path& filePath : filesToRead) { + File newFile = { + .status = File::FileStatus::Downloaded, + .path = filePath, + .timestamp = extractTriggerTimeFromFilename(filePath.filename()) + }; + const std::deque::const_iterator iter = std::upper_bound( + _files.begin(), + _files.end(), + newFile.timestamp, + [](double timeRef, const File& fileRef) { + return timeRef < fileRef.timestamp; + } + ); + std::deque::iterator it = _files.insert(iter, std::move(newFile)); + trackOldest(*it); + } + + // If all files are moved into _sourceFiles then we can + // empty the DynamicFileSequenceDownloader's downloaded files list + _dynamicFileDownloader->clearDownloaded(); +} + +void RenderableFieldlinesSequence::firstUpdate() { + std::deque::iterator file = std::find_if( + _files.begin(), + _files.end(), + [](File& f) { return f.status == File::FileStatus::Loaded; } + ); + if (file == _files.end()) { return; } + + const std::vector>& quantities = file->state.extraQuantities(); + const std::vector& extraNamesVec = + file->state.extraQuantityNames(); + + for (int i = 0; i < quantities.size(); ++i) { + _colorQuantity.addOption(i, extraNamesVec[i]); + _maskingQuantity.addOption(i, extraNamesVec[i]); + } + _colorQuantity = _colorQuantityTemp; + _maskingQuantity = _maskingQuantityTemp; + + if (_colorTablePaths.size() > _colorQuantity) { + _colorTablePath = _colorTablePaths[_colorQuantity].string(); + } + else { + _colorTablePath = _colorTablePaths[0].string(); + } + + if (std::filesystem::exists(_colorTablePath.value())) { + _transferFunction = std::make_unique(_colorTablePath.value()); + } + else { + LWARNING("Invalid path to transfer function, please enter new path"); + _colorTablePath = FieldlinesSequenceModule::DefaultTransferFunctionFile.string(); + _transferFunction = + std::make_unique(_colorTablePath.stringValue()); + } + + _shouldUpdateColorBuffer = true; + _shouldUpdateMaskingBuffer = true; + + _isFirstLoad = false; +} + +void RenderableFieldlinesSequence::update(const UpdateData& data) { + if (_shaderProgram->isDirty()) { + _shaderProgram->rebuildFromFile(); + } + const double currentTime = data.time.j2000Seconds(); + const double deltaTime = global::timeManager->deltaTime(); + + if (_loadingType == LoadingType::DynamicDownloading) { + if (!_dynamicFileDownloader) { + const std::string& identifier = parent()->identifier(); + _dynamicFileDownloader = std::make_unique( + _dataID, + identifier, + _infoURL, + _dataURL, + _nFilesToQueue + ); + } + updateDynamicDownloading(currentTime, deltaTime); + computeSequenceEndTime(); + } + // At least one file in data set needs to be loaded to read extra variables + if (_isFirstLoad && _atLeastOneFileLoaded) { + firstUpdate(); + } + + _inInterval = !_files.empty() && + currentTime >= _files[0].timestamp && + currentTime < _sequenceEndTime; + + // For the sake of this if statment, it is easiest to think of activeIndex as the + // previous index and nextIndex as the current + const int nextIndex = _activeIndex + 1; + // if _activeIndex is -1 but we are in interval, it means we were before the start + // of the sequence in the previous frame + if (_activeIndex == -1 || + // if currentTime < active timestamp, it means that we stepped back to a + // time represented by another state + // _activeIndex has already been checked if it is <0 in the line above + currentTime < _files[_activeIndex].timestamp || + // if currentTime >= next timestamp, it means that we stepped forward to a + // time represented by another state + (nextIndex < _files.size() && currentTime >= _files[nextIndex].timestamp) || + // The case when we jumped passed last file. where nextIndex is not < file.size() + currentTime >= _files[_activeIndex].timestamp) + { + int previousIndex = _activeIndex; + _activeIndex = updateActiveIndex(currentTime); + // check index again after updating + if (_activeIndex == -1) { + return; + } + File& file = _files[_activeIndex]; + if (file.status == File::FileStatus::Downloaded) { + // if LoadingType is StaticLoading all files will be Loaded + // would be optimal if loading of next file would happen in the background + loadFile(file); + _isLoadingStateFromDisk = false; + file.status = File::FileStatus::Loaded; + file.timestamp = extractTriggerTimeFromFilename(file.path); + _atLeastOneFileLoaded = true; + computeSequenceEndTime(); + trackOldest(file); + } + // If we have a new index, buffers needs to update + if (previousIndex != _activeIndex) { + _shouldUpdateColorBuffer = true; + _shouldUpdateMaskingBuffer = true; + } + + updateVertexPositionBuffer(); + } + + if (_shouldUpdateColorBuffer) { + updateVertexColorBuffer(); + } + + if (_shouldUpdateMaskingBuffer) { + updateVertexMaskingBuffer(); + } +} + +void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks&) { + if (_files.empty() || _isFirstLoad) { + return; + } + if (!_inInterval && !_renderForever) { + return; + } + _shaderProgram->activate(); // Calculate Model View MatrixProjection @@ -978,8 +1134,10 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& glm::dmat4(glm::scale(glm::dmat4(1), glm::dvec3(data.modelTransform.scale))); const glm::dmat4 modelViewMat = data.camera.combinedViewMatrix() * modelMat; - _shaderProgram->setUniform("modelViewProjection", - data.camera.sgctInternal.projectionMatrix() * glm::mat4(modelViewMat)); + _shaderProgram->setUniform( + "modelViewProjection", + data.camera.sgctInternal.projectionMatrix() * glm::mat4(modelViewMat) + ); _shaderProgram->setUniform("colorMethod", _colorMethod); _shaderProgram->setUniform("lineColor", _colorUniform); @@ -989,13 +1147,13 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& if (_colorMethod == static_cast(ColorMethod::ByQuantity)) { ghoul::opengl::TextureUnit textureUnit; textureUnit.activate(); - _transferFunction->bind(); // Calls update internally - _shaderProgram->setUniform("colorTable", textureUnit); - _shaderProgram->setUniform("colorTableRange", _colorTableRanges[_colorQuantity]); + _transferFunction->bind(); + _shaderProgram->setUniform("transferFunction", textureUnit); + _shaderProgram->setUniform("selectedColorRange", _selectedColorRange); } if (_maskingEnabled) { - _shaderProgram->setUniform("maskingRange", _maskingRanges[_maskingQuantity]); + _shaderProgram->setUniform("maskingRange", _selectedMaskingRange); } _shaderProgram->setUniform("domainLimR", _domainR.value() * _scalingFactor); @@ -1003,7 +1161,7 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& _shaderProgram->setUniform("domainLimY", _domainY.value() * _scalingFactor); _shaderProgram->setUniform("domainLimZ", _domainZ.value() * _scalingFactor); - // Flow/Particles + // Flow / Particles _shaderProgram->setUniform("flowColor", _flowColor); _shaderProgram->setUniform("usingParticles", _flowEnabled); _shaderProgram->setUniform("particleSize", _flowParticleSize); @@ -1030,11 +1188,24 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& glLineWidth(1.f); #endif + int loadedIndex = _activeIndex; + if (loadedIndex == -1) { + return; + } + while (_files[loadedIndex].status != File::FileStatus::Loaded) { + --loadedIndex; + if (loadedIndex < 0) { + LWARNING("No file at or before current time is loaded"); + return; + } + } + + const FieldlinesState& state = _files[loadedIndex].state; glMultiDrawArrays( GL_LINE_STRIP, - _states[_activeStateIndex].lineStart().data(), - _states[_activeStateIndex].lineCount().data(), - static_cast(_states[_activeStateIndex].lineStart().size()) + state.lineStart().data(), + state.lineCount().data(), + static_cast(state.lineStart().size()) ); glBindVertexArray(0); @@ -1047,136 +1218,6 @@ void RenderableFieldlinesSequence::render(const RenderData& data, RendererTasks& } } -void RenderableFieldlinesSequence::update(const UpdateData& data) { - if (_shaderProgram->isDirty()) { - _shaderProgram->rebuildFromFile(); - } - // True if new 'runtime-state' must be loaded from disk. - // False => the previous frame's state should still be shown - bool mustLoadNewStateFromDisk = false; - // True if new 'in-RAM-state' must be loaded. - // False => the previous frame's state should still be shown - bool needUpdate = false; - const double currentTime = data.time.j2000Seconds(); - const bool isInInterval = (currentTime >= _startTimes[0]) && - (currentTime < _sequenceEndTime); - - // Check if current time in OpenSpace is within sequence interval - if (isInInterval) { - const size_t nextIdx = _activeTriggerTimeIndex + 1; - if ( - // true => Previous frame was not within the sequence interval - _activeTriggerTimeIndex < 0 || - // true => We stepped back to a time represented by another state - currentTime < _startTimes[_activeTriggerTimeIndex] || - // true => We stepped forward to a time represented by another state - (nextIdx < _nStates && currentTime >= _startTimes[nextIdx])) - { - updateActiveTriggerTimeIndex(currentTime); - - if (_loadingStatesDynamically) { - mustLoadNewStateFromDisk = true; - } - else { - needUpdate = true; - _activeStateIndex = _activeTriggerTimeIndex; - } - } // else {we're still in same state as previous frame (no changes needed)} - } - // if only one state - else if (_nStates == 1) { - _activeTriggerTimeIndex = 0; - _activeStateIndex = 0; - if (!_hasBeenUpdated) { - updateVertexPositionBuffer(); - } - - if (_states[_activeStateIndex].nExtraQuantities() > 0) { - _shouldUpdateColorBuffer = true; - _shouldUpdateMaskingBuffer = true; - } - - _hasBeenUpdated = true; - } - else { - // Not in interval => set everything to false - _activeTriggerTimeIndex = -1; - mustLoadNewStateFromDisk = false; - needUpdate = false; - } - - if (mustLoadNewStateFromDisk) { - if (!_isLoadingStateFromDisk && !_newStateIsReady) { - _isLoadingStateFromDisk = true; - mustLoadNewStateFromDisk = false; - std::string filePath = _sourceFiles[_activeTriggerTimeIndex]; - std::thread readBinaryThread([this, f = std::move(filePath)]() { - readNewState(f); - }); - readBinaryThread.detach(); - } - } - - if (needUpdate || _newStateIsReady) { - if (_loadingStatesDynamically) { - _states[0] = std::move(*_newState); - } - - updateVertexPositionBuffer(); - - if (_states[_activeStateIndex].nExtraQuantities() > 0) { - _shouldUpdateColorBuffer = true; - _shouldUpdateMaskingBuffer = true; - } - - // Everything is set and ready for rendering - needUpdate = false; - _newStateIsReady = false; - } - - if (_colorMethod == 1) { //By quantity - if (_shouldUpdateColorBuffer) { - updateVertexColorBuffer(); - _shouldUpdateColorBuffer = false; - } - - if (_shouldUpdateMaskingBuffer) { - updateVertexMaskingBuffer(); - _shouldUpdateMaskingBuffer = false; - } - } -} - -// Assumes we already know that currentTime is within the sequence interval -void RenderableFieldlinesSequence::updateActiveTriggerTimeIndex(double currentTime) { - auto iter = std::upper_bound(_startTimes.begin(), _startTimes.end(), currentTime); - if (iter != _startTimes.end()) { - if (iter != _startTimes.begin()) { - _activeTriggerTimeIndex = static_cast( - std::distance(_startTimes.begin(), iter) - ) - 1; - } - else { - _activeTriggerTimeIndex = 0; - } - } - else { - _activeTriggerTimeIndex = static_cast(_nStates) - 1; - } - if (_nStates == 1) { - _activeTriggerTimeIndex = 0; - } -} - -// Reading state from disk. Must be thread safe -void RenderableFieldlinesSequence::readNewState(const std::string& filePath) { - _newState = std::make_unique(); - if (_newState->loadStateFromOsfls(filePath)) { - _newStateIsReady = true; - } - _isLoadingStateFromDisk = false; -} - // Unbind buffers and arrays void unbindGL() { glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -1184,11 +1225,11 @@ void unbindGL() { } void RenderableFieldlinesSequence::updateVertexPositionBuffer() { - if (_activeStateIndex == -1) { return; } glBindVertexArray(_vertexArrayObject); glBindBuffer(GL_ARRAY_BUFFER, _vertexPositionBuffer); - const std::vector& vertPos = _states[_activeStateIndex].vertexPositions(); + const FieldlinesState& state = _files[_activeIndex].state; + const std::vector& vertPos = state.vertexPositions(); glBufferData( GL_ARRAY_BUFFER, @@ -1204,17 +1245,14 @@ void RenderableFieldlinesSequence::updateVertexPositionBuffer() { } void RenderableFieldlinesSequence::updateVertexColorBuffer() { - if (_activeStateIndex == -1) { return; } glBindVertexArray(_vertexArrayObject); glBindBuffer(GL_ARRAY_BUFFER, _vertexColorBuffer); - bool isSuccessful; - const std::vector& quantities = _states[_activeStateIndex].extraQuantity( - _colorQuantity, - isSuccessful - ); + const FieldlinesState& state = _files[_activeIndex].state; + bool success = false; + const std::vector& quantities = state.extraQuantity(_colorQuantity, success); - if (isSuccessful) { + if (success) { glBufferData( GL_ARRAY_BUFFER, quantities.size() * sizeof(float), @@ -1225,26 +1263,24 @@ void RenderableFieldlinesSequence::updateVertexColorBuffer() { glEnableVertexAttribArray(1); glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, nullptr); - unbindGL(); + _shouldUpdateColorBuffer = false; } + unbindGL(); } void RenderableFieldlinesSequence::updateVertexMaskingBuffer() { - if (_activeStateIndex == -1) { return; } glBindVertexArray(_vertexArrayObject); glBindBuffer(GL_ARRAY_BUFFER, _vertexMaskingBuffer); - bool isSuccessful; - const std::vector& maskings = _states[_activeStateIndex].extraQuantity( - _maskingQuantity, - isSuccessful - ); + const FieldlinesState& state = _files[_activeIndex].state; + bool success = false; + const std::vector& quantities = state.extraQuantity(_maskingQuantity, success); - if (isSuccessful) { + if (success) { glBufferData( GL_ARRAY_BUFFER, - maskings.size() * sizeof(float), - maskings.data(), + quantities.size() * sizeof(float), + quantities.data(), GL_STATIC_DRAW ); @@ -1252,6 +1288,7 @@ void RenderableFieldlinesSequence::updateVertexMaskingBuffer() { glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 0, nullptr); unbindGL(); + _shouldUpdateMaskingBuffer = false; } } diff --git a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h index f5efbb4a53..5f69f45e83 100644 --- a/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h +++ b/modules/fieldlinessequence/rendering/renderablefieldlinessequence.h @@ -35,12 +35,30 @@ #include #include #include -#include +#include +#include namespace openspace { class RenderableFieldlinesSequence : public Renderable { public: + enum class LoadingType { + StaticLoading, + DynamicDownloading + }; + + enum class SourceFileType { + Cdf, + Json, + Osfls + }; + + // Used to determine if lines should be colored uniformly or by some data variable + enum class ColorMethod { + Uniform, + ByQuantity + }; + explicit RenderableFieldlinesSequence(const ghoul::Dictionary& dictionary); void initialize() override; void initializeGL() override; @@ -50,84 +68,93 @@ public: void render(const RenderData& data, RendererTasks& rendererTask) override; void update(const UpdateData& data) override; + void updateDynamicDownloading(double currentTime, double deltaTime); + void firstUpdate(); + void computeSequenceEndTime(); static documentation::Documentation Documentation(); -private: - void addStateToSequence(FieldlinesState& STATE); - void computeSequenceEndTime(); - void definePropertyCallbackFunctions(); - void extractTriggerTimesFromFileNames(); - bool loadJsonStatesIntoRAM(); - void loadOsflsStatesIntoRAM(); - bool getStatesFromCdfFiles(); - void setModelDependentConstants(); - void setupProperties(); - bool prepareForOsflsStreaming(); + struct File { + enum class FileStatus { + Downloaded, + Loaded + }; + FileStatus status; + std::filesystem::path path; + // Assume timestamp is -1 until FileStatus is = Loaded + double timestamp = -1.0; + FieldlinesState state; - void readNewState(const std::string& filePath); - void updateActiveTriggerTimeIndex(double currentTime); + bool operator<(const File& other) const noexcept { + return timestamp < other.timestamp; + } + }; + +private: + void setupProperties(); + void setModelDependentConstants(); + + int updateActiveIndex(double currentTime); void updateVertexPositionBuffer(); void updateVertexColorBuffer(); void updateVertexMaskingBuffer(); - // Used to determine if lines should be colored UNIFORMLY or by an extraQuantity - enum class ColorMethod { - Uniform = 0, - ByQuantity = 1 - }; - enum class SourceFileType { - Cdf = 0, - Json = 1, - Osfls = 2 - }; + void staticallyLoadFiles(const std::optional& seed, + const std::optional& traceVariable); - // cdf, osfls or json - SourceFileType _inputFileType; - // Output folder path in case of file conversion - std::string _outputFolderPath; - // which tracing vaiable to trace. 'b' for fieldline is default - std::string _tracingVariable; + std::deque _files; + // The function loads the file in the sense that it creates the FieldlineState object + // in the File object. The function also deletes the oldest file if the loadedFiles + // queue is full. + void loadFile(File& file); + void trackOldest(File& file); + + // Not optional, but initialized with osfls because that is what we expect to be used + SourceFileType _inputFileType = SourceFileType::Osfls; + // Static Loading on default if not specified + LoadingType _loadingType = LoadingType::StaticLoading; // path to directory with seed point files std::filesystem::path _seedPointDirectory; - // optional except when using json input - std::string _modelStr; + // Which tracing variable to trace. Often 'b' is for magnetic field + std::string _tracingVariable; + // Extra variables such as rho, p or t for density, pressure or temperature + std::vector _extraVars; + float _manualTimeOffset = 0.0; + // Estimated / calculated end of sequence + double _sequenceEndTime = 0.0; + // If there's just one state it should never disappear + bool _renderForever = false; + bool _inInterval = false; - // Used for 'runtime-states'. True when loading a new state from disk on another - // thread. - std::atomic_bool _isLoadingStateFromDisk = false; - // False => states are stored in RAM (using 'in-RAM-states'), True => states are - // loaded from disk during runtime (using 'runtime-states') - bool _loadingStatesDynamically = false; - // Used for 'runtime-states'. True when finished loading a new state from disk on - // another thread. - std::atomic_bool _newStateIsReady = false; - // True when new state is loaded or user change which quantity to color the lines by - bool _shouldUpdateColorBuffer = false; - // True when new state is loaded or user change which quantity used for masking out - // line segments - bool _shouldUpdateMaskingBuffer = false; - // note Elon: rework the case of only one state - // hasBeenUpdated only gets sets once, first iteration of update function, to - // guarantee the vertext position buffer to be initialized. - bool _hasBeenUpdated = false; + // Data ID that corresponds to what dataset to use if using DynamicDownloading + int _dataID; + // Number of files to queue up at a time + size_t _nFilesToQueue = 10; + // To keep track of oldest file + std::deque _loadedFiles; + // The max number of files loaded at once + size_t _maxLoadedFiles = 100; + std::string _infoURL; + std::string _dataURL; + // DynamicFileSequenceDownloader downloads and updates renderable field lines with + // field lines downloaded from the web. + std::unique_ptr _dynamicFileDownloader; - // Active index of _states. If(==-1)=>no state available for current time. Always the - // same as _activeTriggerTimeIndex if(_loadingStatesDynamically==true), else - // always = 0 - int _activeStateIndex = -1; - // Active index of _startTimes - int _activeTriggerTimeIndex = -1; - // Manual time offset - double _manualTimeOffset = 0.0; - // Number of states in the sequence - size_t _nStates = 0; // In setup it is used to scale JSON coordinates. During runtime it is used to scale // domain limits. float _scalingFactor = 1.f; - // Estimated end of sequence. - // If there's just one state it should never disappear - double _sequenceEndTime = std::numeric_limits::max(); + fls::Model _model = fls::Model::Invalid; + bool _shouldUpdateMaskingBuffer = false; + bool _shouldUpdateColorBuffer = false; + int _activeIndex = -1; + bool _atLeastOneFileLoaded = false; + + bool _isLoadingStateFromDisk = false; + + std::unique_ptr _shaderProgram; + // Transfer function used to color lines when _pColorMethod is set to BY_QUANTITY + std::unique_ptr _transferFunction; + // OpenGL Vertex Array Object GLuint _vertexArrayObject = 0; // OpenGL Vertex Buffer Object containing the extraQuantity values used for coloring @@ -139,39 +166,20 @@ private: // OpenGL Vertex Buffer Object containing the vertex positions GLuint _vertexPositionBuffer = 0; - // The Lua-Modfile-Dictionary used during initialization - // Used for 'runtime-states' when switching out current state to a new state - std::unique_ptr _newState; - std::unique_ptr _shaderProgram; - // Transfer function used to color lines when _pColorMethod is set to BY_QUANTITY - std::unique_ptr _transferFunction; - - // Paths to color tables. One for each 'extraQuantity' - std::vector _colorTablePaths; - // Values represents min & max values represented in the color table - std::vector _colorTableRanges; - // Values represents min & max limits for valid masking range - std::vector _maskingRanges; - // Stores the provided source file paths if using 'runtime-states', else emptied after - // initialization - std::vector _sourceFiles; - // Extra variables such as rho, p or t - std::vector _extraVars; - // Contains the _triggerTimes for all FieldlineStates in the sequence - std::vector _startTimes; - // Stores the FieldlineStates - std::vector _states; - // Group to hold the color properties properties::PropertyOwner _colorGroup; // Uniform/transfer function/topology? properties::OptionProperty _colorMethod; // Index of the extra quantity to color lines by properties::OptionProperty _colorQuantity; - // Used to save property for later initialization - int _colorQuantityTemp = 0; - // Color table/transfer function min and max range - properties::Vec2Property _colorQuantityMinMax; + // Used to save property for later initialization, because firstUpdate needs to run + // first, to populate _colorQuantity with options + int _colorQuantityTemp; + std::vector _colorTableRanges; + // Color table/transfer function selected min and max range + properties::Vec2Property _selectedColorRange; + // Paths to color tables. One for each 'extraQuantity' + std::vector _colorTablePaths; // Color table/transfer function for "By Quantity" coloring properties::StringProperty _colorTablePath; // Uniform Field Line Color @@ -179,25 +187,21 @@ private: // Whether or not to use additive blending properties::BoolProperty _colorABlendEnabled; - // Whether or not to use Domain + // Whether or not to use Domain limits properties::BoolProperty _domainEnabled; // Group to hold the Domain properties properties::PropertyOwner _domainGroup; - // Domain Limits along x-axis properties::Vec2Property _domainX; - // Domain Limits along y-axis properties::Vec2Property _domainY; - // Domain Limits along z-axis properties::Vec2Property _domainZ; - // Domain Limits radially properties::Vec2Property _domainR; - // Simulated particles' color - properties::Vec4Property _flowColor; // Toggle flow [ON/OFF] properties::BoolProperty _flowEnabled; // Group to hold the flow/particle properties properties::PropertyOwner _flowGroup; + // Simulated particles' color + properties::Vec4Property _flowColor; // Size of simulated flow particles properties::IntProperty _flowParticleSize; // Size of simulated flow particles @@ -211,8 +215,9 @@ private: properties::BoolProperty _maskingEnabled; // Group to hold the masking properties properties::PropertyOwner _maskingGroup; - // Lower and upper range limit for allowed values - properties::Vec2Property _maskingMinMax; + std::vector _maskingRanges; + // Selected lower and upper range limits for masking + properties::Vec2Property _selectedMaskingRange; // Index of the extra quantity to use for masking properties::OptionProperty _maskingQuantity; // used to save property for later initialization @@ -221,7 +226,10 @@ private: // Line width for the line rendering part properties::FloatProperty _lineWidth; // Button which executes a time jump to start of sequence - properties::TriggerProperty _jumpToStartBtn; + properties::TriggerProperty _jumpToStart; + properties::BoolProperty _saveDownloadsOnShutdown; + + bool _isFirstLoad = true; }; } // namespace openspace diff --git a/modules/fieldlinessequence/shaders/fieldlinessequence_vs.glsl b/modules/fieldlinessequence/shaders/fieldlinessequence_vs.glsl index 6114bebe73..2fa560e4f8 100644 --- a/modules/fieldlinessequence/shaders/fieldlinessequence_vs.glsl +++ b/modules/fieldlinessequence/shaders/fieldlinessequence_vs.glsl @@ -39,8 +39,8 @@ uniform mat4 modelViewProjection; // Uniforms needed to color by quantity uniform int colorMethod; -uniform sampler1D colorTable; -uniform vec2 colorTableRange; +uniform sampler1D transferFunction; +uniform vec2 selectedColorRange; // Uniforms needed for Particle Flow uniform vec4 flowColor; @@ -69,8 +69,8 @@ const int colorByQuantity = 1; vec4 getTransferFunctionColor() { // Remap the color scalar to a [0,1] range float lookUpVal = - (in_color_scalar - colorTableRange.x) / (colorTableRange.y - colorTableRange.x); - return texture(colorTable, lookUpVal); + (in_color_scalar - selectedColorRange.x) / (selectedColorRange.y - selectedColorRange.x); + return texture(transferFunction, lookUpVal); } bool isPartOfParticle(double time, int vertexId, int particleSize, int particleSpeed, @@ -92,7 +92,7 @@ void main() { if (usingDomain && hasColor) { float radius = length(in_position); - + // If position is outside of domain if (in_position.x < domainLimX.x || in_position.x > domainLimX.y || in_position.y < domainLimY.x || in_position.y > domainLimY.y || in_position.z < domainLimZ.x || in_position.z > domainLimZ.y || diff --git a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp new file mode 100644 index 0000000000..85434b1d7d --- /dev/null +++ b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.cpp @@ -0,0 +1,204 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + constexpr std::string_view _loggerCat = "KameleonVolumeToFieldlinesTask"; + + // This task class traces field lines from volume data. It takes a task file which + // specifies a folder with .cdf files, as well as a file that lists seed points from + // which the tracing starts. For the outputs, specify an `outputFolder` for where + // the field lines data will be saved and the `OutputType` parameter to be either + // `Osfls` which is an OpenSpace specific binary format for field lines, or `Json` for + // a readable version of the same data. Some knowledge of the data might be needed, + // especially if coloring the field lines according to some data parameter like + // temperature or density. These parameters needs to be specified in the `ScalarVars` + // and match the name in the input data. For the magnitude of a vector parameter, such + // as magnetic stength or velocity, there are specified in `MagntitudeVars`. + struct [[codegen::Dictionary(KameleonVolumeToFieldlinesTask)]] Parameters { + // The folder to the cdf files to extract data from. + std::filesystem::path input [[codegen::directory()]]; + + // Choose to decrease cadence and only use every nth time step / input file. + std::optional nthTimeStep; + + // A path to folder with text files with seedpoints. + // The format of points: x1 y1 z1 x2 y2 z2 ... + // Seedpoints are expressed in the native coordinate system of the model. + // Filename must match date and time for CDF file. + std::filesystem::path seedpoints [[codegen::directory()]]; + + // Choose to only include every nth seedpoint from each file. + std::optional nthSeedpoint; + + // If data sets parameter start_time differ from start of run, + // elapsed_time_in_seconds might be in relation to start of run. + // ManualTimeOffset will be added to trigger time. + std::optional manualTimeOffset; + + // The name of the kameleon variable to use for tracing, like b, or u. + std::string tracingVar; + + // The folder to write the files to. + std::filesystem::path outputFolder [[codegen::directory()]]; + + enum class [[codegen::map(openspace::KameleonVolumeToFieldlinesTask::OutputType)]] + OutputType { + Json, + Osfls + }; + // Output type + OutputType outputType; + + // A list of scalar variables to extract along the fieldlines + // like temperature or density. + std::optional> scalarVars; + + // A list of vector field variables. Must be in groups of 3, + // for example \"bx, by, bz\", \"ux, uy, uz\". + std::optional> magnitudeVars; + }; +#include "kameleonvolumetofieldlinestask_codegen.cpp" +} // namespace + +namespace openspace { + +documentation::Documentation KameleonVolumeToFieldlinesTask::Documentation() { + return codegen::doc( + "fieldlinesequence_kameleon_volume_to_fieldlines_task" + ); +} + +KameleonVolumeToFieldlinesTask::KameleonVolumeToFieldlinesTask( + const ghoul::Dictionary& dictionary) +{ + const Parameters p = codegen::bake(dictionary); + + _inputPath = p.input; + _nthTimeStep = p.nthTimeStep.value_or(_nthTimeStep); + _seedpointsPath = p.seedpoints; + _nthSeedPoint = p.nthSeedpoint.value_or(_nthSeedPoint); + _manualTimeOffset = p.manualTimeOffset.value_or(_manualTimeOffset); + _outputFolder = p.outputFolder; + if (_outputFolder.string().back() != '/') { + _outputFolder += '/'; + } + _outputType = codegen::map(p.outputType); + _tracingVar = p.tracingVar; + + _scalarVars = p.scalarVars.value_or(std::vector()); + if (_scalarVars.empty()) { + LINFO("No scalar variable was specified to be saved"); + } + + _magnitudeVars = p.magnitudeVars.value_or(std::vector()); + if (_magnitudeVars.empty()) { + LINFO("No vector field variable was specified to be saved"); + } + + namespace fs = std::filesystem; + for (const fs::directory_entry& e : fs::directory_iterator(_inputPath)) { + if (e.is_regular_file()) { + std::string eStr = e.path().string(); + _sourceFiles.push_back(eStr); + } + } +} + +std::string KameleonVolumeToFieldlinesTask::description() { + return std::format( + "Extract fieldline data from cdf file {} and seedpoint file {}. " + "Write osfls file into the folder {}.", + _inputPath, _seedpointsPath, _outputFolder + ); +} + +void KameleonVolumeToFieldlinesTask::perform( + const Task::ProgressCallback& progressCallback) +{ + std::vector extraMagVars = + fls::extractMagnitudeVarsFromStrings(_magnitudeVars); + + std::unordered_map> seedPoints = + fls::extractSeedPointsFromFiles(_seedpointsPath, _nthSeedPoint); + if (seedPoints.empty()) { + throw ghoul::RuntimeError("Falied to read seedpoints"); + } + + size_t fileNumber = 0; + for (const std::string& cdfPath : _sourceFiles) { + if (fileNumber % _nthTimeStep != 0) { + continue; + } + + FieldlinesState newState; + bool isSuccessful = fls::convertCdfToFieldlinesState( + newState, + cdfPath, + seedPoints, + _manualTimeOffset, + _tracingVar, + _scalarVars, + extraMagVars + ); + if (isSuccessful) { + switch (_outputType) { + case OutputType::Osfls: + newState.saveStateToOsfls(_outputFolder.string()); + break; + case OutputType::Json: + { + std::string timeStr = + std::string(Time(newState.triggerTime()).ISO8601()); + timeStr.replace(13, 1, "-"); + timeStr.replace(16, 1, "-"); + timeStr.replace(19, 1, "-"); + std::string fileName = timeStr; + newState.saveStateToJson(_outputFolder.string() + fileName); + break; + } + default : + throw ghoul::MissingCaseException(); + } + } + ++fileNumber; + } + + // Ideally, we would want to signal about progress earlier as well, but + // convertCdfToFieldlinesState does all the work encapsulated in one function call. + progressCallback(1.f); +} + +} // namespace openspace diff --git a/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h new file mode 100644 index 0000000000..f0dbd70a8c --- /dev/null +++ b/modules/fieldlinessequence/tasks/kameleonvolumetofieldlinestask.h @@ -0,0 +1,64 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_MODULE_FIELDLINESSEQUENCE___KAMELEONVOLUMETOFIELDLINESTASK___H__ +#define __OPENSPACE_MODULE_FIELDLINESSEQUENCE___KAMELEONVOLUMETOFIELDLINESTASK___H__ + +#include + +#include + +namespace openspace { + +class KameleonVolumeToFieldlinesTask : public Task { +public: + enum class OutputType { + Json, + Osfls + }; + + explicit KameleonVolumeToFieldlinesTask(const ghoul::Dictionary& dictionary); + + std::string description() override; + void perform(const Task::ProgressCallback& progressCallback) override; + static documentation::Documentation Documentation(); + +private: + std::string _tracingVar; + std::vector _scalarVars; + std::vector _magnitudeVars; + std::filesystem::path _inputPath; + size_t _nthTimeStep = 1; + std::vector _sourceFiles; + std::filesystem::path _seedpointsPath; + size_t _nthSeedPoint = 1; + OutputType _outputType; + std::filesystem::path _outputFolder; + // Manual time offset + float _manualTimeOffset = 0.f; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_FIELDLINESSEQUENCE___KAMELEONVOLUMETOFIELDLINESTASK___H__ diff --git a/modules/fieldlinessequence/util/fieldlinesstate.cpp b/modules/fieldlinessequence/util/fieldlinesstate.cpp index ad83414e3c..b3a4870e33 100644 --- a/modules/fieldlinessequence/util/fieldlinesstate.cpp +++ b/modules/fieldlinessequence/util/fieldlinesstate.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -61,10 +62,25 @@ void FieldlinesState::scalePositions(float scale) { } } +FieldlinesState FieldlinesState::createStateFromOsfls(const std::string& path) { + FieldlinesState s; + const bool success = s.loadStateFromOsfls(path); + if (!success) { + throw ghoul::RuntimeError(std::format( + "Failed to load state from osfls file {}", path + )); + } + return s; +} + bool FieldlinesState::loadStateFromOsfls(const std::string& pathToOsflsFile) { - std::ifstream ifs(pathToOsflsFile, std::ifstream::binary); + std::ifstream ifs = std::ifstream(pathToOsflsFile, std::ifstream::binary); + if (!ifs.is_open()) { - LERROR("Couldn't open file: " + pathToOsflsFile); + LERROR(std::format( + "Could not open file: {}. Error code: {}", + pathToOsflsFile, std::strerror(errno) + )); return false; } @@ -89,7 +105,7 @@ bool FieldlinesState::loadStateFromOsfls(const std::string& pathToOsflsFile) { // Read single value variables ifs.read(reinterpret_cast(&_triggerTime), sizeof(double)); ifs.read(reinterpret_cast(&_model), sizeof(int32_t)); - ifs.read(reinterpret_cast(&_isMorphable), sizeof(bool)); + ifs.read(reinterpret_cast(&_isMorphable), sizeof(uint8_t)); ifs.read(reinterpret_cast(&nLines), sizeof(uint64_t)); ifs.read(reinterpret_cast(&nPoints), sizeof(uint64_t)); ifs.read(reinterpret_cast(&nExtras), sizeof(uint64_t)); @@ -226,7 +242,8 @@ bool FieldlinesState::loadStateFromJson(const std::string& pathToJsonFile, * CurrentVersion) * 1. double - _triggerTime * 2. int - _model - * 3. bool - _isMorphable + * 3. uint8_t works like bool- _isMorphable + * 0 for false, 1 for true * 4. size_t - Number of lines in the state == _lineStart.size() * == _lineCount.size() * 5. size_t - Total number of vertex points == _vertexPositions.size() @@ -277,7 +294,7 @@ void FieldlinesState::saveStateToOsfls(const std::string& absPath) { //-------------------- WRITE META DATA FOR STATE -------------------------------- ofs.write(reinterpret_cast(&_triggerTime), sizeof(_triggerTime)); ofs.write(reinterpret_cast(&_model), sizeof(int32_t)); - ofs.write(reinterpret_cast(&_isMorphable), sizeof(bool)); + ofs.write(reinterpret_cast(&_isMorphable), sizeof(uint8_t)); ofs.write(reinterpret_cast(&nLines), sizeof(uint64_t)); ofs.write(reinterpret_cast(&nPoints), sizeof(uint64_t)); @@ -296,6 +313,8 @@ void FieldlinesState::saveStateToOsfls(const std::string& absPath) { ofs.write(reinterpret_cast(vec.data()), sizeof(float) * nPoints); } ofs.write(allExtraQuantityNamesInOne.c_str(), nStringBytes); + + LINFO(std::format("Saving fieldline state to: {}", absPath)); } // TODO: This should probably be rewritten, but this is the way the files were structured @@ -375,6 +394,18 @@ void FieldlinesState::saveStateToJson(const std::string& absPath) { LINFO(std::format("Saved fieldline state to: {}{}", absPath, ext)); } +void FieldlinesState::clear() { + _isMorphable = 0; + _triggerTime = -1.0; + _model = fls::Model::Invalid; + + _extraQuantities.clear(); + _extraQuantityNames.clear(); + _lineCount.clear(); + _lineStart.clear(); + _vertexPositions.clear(); +} + void FieldlinesState::setModel(fls::Model m) { _model = m; } @@ -387,6 +418,10 @@ void FieldlinesState::setTriggerTime(double t) { // If index is out of scope an empty vector is returned and the referenced bool is false. std::vector FieldlinesState::extraQuantity(size_t index, bool& isSuccessful) const { + if (index == -1) { + isSuccessful = false; + return std::vector(); + } if (index < _extraQuantities.size()) { isSuccessful = true; return _extraQuantities[index]; @@ -394,13 +429,12 @@ std::vector FieldlinesState::extraQuantity(size_t index, bool& isSuccessf else { isSuccessful = false; LERROR("Provided Index was out of scope"); - return {}; + return std::vector(); } } // Moves the points in @param line over to _vertexPositions and updates // _lineStart & _lineCount accordingly. - void FieldlinesState::addLine(std::vector& line) { const size_t nNewPoints = line.size(); const size_t nOldPoints = _vertexPositions.size(); diff --git a/modules/fieldlinessequence/util/fieldlinesstate.h b/modules/fieldlinessequence/util/fieldlinesstate.h index 062cb68e8c..3b852bf44e 100644 --- a/modules/fieldlinessequence/util/fieldlinesstate.h +++ b/modules/fieldlinessequence/util/fieldlinesstate.h @@ -35,6 +35,10 @@ namespace openspace { class FieldlinesState { public: + static FieldlinesState createStateFromOsfls(const std::string& pathToSoflsFile); + + FieldlinesState() = default; + void convertLatLonToCartesian(float scale = 1.f); void scalePositions(float scale); @@ -45,6 +49,8 @@ public: float coordToMeters); void saveStateToJson(const std::string& pathToJsonFile); + void clear(); + const std::vector>& extraQuantities() const; const std::vector& extraQuantityNames() const; const std::vector& lineCount() const; @@ -66,9 +72,9 @@ public: void appendToExtra(size_t idx, float val); private: - bool _isMorphable = false; + uint8_t _isMorphable = 0; double _triggerTime = -1.0; - fls::Model _model; + fls::Model _model = fls::Model::Invalid; std::vector> _extraQuantities; std::vector _extraQuantityNames; diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp index c15eafbd86..92ff3c22c0 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.cpp @@ -29,7 +29,9 @@ #include #include #include +#include #include +#include #ifdef OPENSPACE_MODULE_KAMELEON_ENABLED @@ -126,6 +128,101 @@ bool convertCdfToFieldlinesState(FieldlinesState& state, const std::string& cdfP #endif // OPENSPACE_MODULE_KAMELEON_ENABLED } +std::unordered_map> +extractSeedPointsFromFiles(std::filesystem::path path, size_t nth) +{ + std::unordered_map> outMap; + + if (!std::filesystem::is_directory(path)) { + throw ghoul::RuntimeError(std::format( + "The specified seed point directory: '{}' does not exist", path + )); + return outMap; + } + + namespace fs = std::filesystem; + for (const fs::directory_entry& spFile : fs::directory_iterator(path)) { + fs::path seedFilePath = spFile.path(); + if (!spFile.is_regular_file() || seedFilePath.extension() != "txt") { + continue; + } + + std::ifstream seedFile = std::ifstream(seedFilePath); + if (!seedFile.good()) { + LERROR(std::format("Could not open seed points file '{}'", seedFilePath)); + outMap.clear(); + return {}; + } + + LDEBUG(std::format("Reading seed points from file '{}'", seedFilePath)); + std::string line; + std::vector outVec; + int linenumber = 0; + while (ghoul::getline(seedFile, line)) { + if (linenumber % nth == 0) { + if (!line.empty() && line[0] == '#') { + // Ignore line, assume it's a comment + continue; + } + std::stringstream ss(line); + glm::vec3 point; + if (!(ss >> point.x) || !(ss >> point.y) || !(ss >> point.z)) { + LERROR(std::format( + "Could not read line '{}' in file '{}'. Line is not formatted " + "with 3 values representing a point", + linenumber, seedFilePath + )); + } + else { + outVec.push_back(std::move(point)); + } + } + ++linenumber; + } + + if (outVec.empty()) { + LERROR(std::format("Found no seed points in: {}", seedFilePath)); + return {}; + } + + std::string name = seedFilePath.stem().string(); // remove file extention + size_t dateAndTimeSeperator = name.find_last_of('_'); + std::string time = name.substr(dateAndTimeSeperator + 1, name.length()); + std::string date = name.substr(dateAndTimeSeperator - 8, 8); // 8 for yyyymmdd + std::string dateAndTime = date + time; + + // Add outVec as value, with time stamp as key + outMap[dateAndTime] = outVec; + } + return outMap; +} +std::vector +extractMagnitudeVarsFromStrings(std::vector vars) +{ + std::vector extraMagVars; + for (size_t i = 0; i < vars.size(); i++) { + const std::string& str = vars[i]; + + std::istringstream ss(str); + std::string magVar; + size_t counter = 0; + while (ghoul::getline(ss, magVar, ',')) { + std::erase_if(magVar, ::isspace); + extraMagVars.push_back(magVar); + counter++; + if (counter == 3) { + break; + } + } + if (counter != 3 && counter > 0) { + extraMagVars.erase(extraMagVars.end() - counter, extraMagVars.end()); + } + vars.erase(vars.begin() + i); + i--; + } + return extraMagVars; +} + #ifdef OPENSPACE_MODULE_KAMELEON_ENABLED /** * Traces and adds line vertices to state. @@ -140,10 +237,10 @@ bool addLinesToState(ccmc::Kameleon* kameleon, const std::vector& see switch (state.model()) { case fls::Model::Batsrus: - innerBoundaryLimit = 2.5f; // TODO specify in Lua? + innerBoundaryLimit = 0.f; // TODO (2025-06-10 Elon) specify in Lua? break; case fls::Model::Enlil: - innerBoundaryLimit = 0.11f; // TODO specify in Lua? + innerBoundaryLimit = 0.11f; break; default: LERROR( @@ -169,7 +266,7 @@ bool addLinesToState(ccmc::Kameleon* kameleon, const std::vector& see //--------------------------------------------------------------------------// auto interpolator = std::make_unique(kameleon->model); ccmc::Tracer tracer(kameleon, interpolator.get()); - tracer.setInnerBoundary(innerBoundaryLimit); // TODO specify in Lua? + tracer.setInnerBoundary(innerBoundaryLimit); ccmc::Fieldline ccmcFieldline = tracer.bidirectionalTrace( tracingVar, seed.x, @@ -178,15 +275,21 @@ bool addLinesToState(ccmc::Kameleon* kameleon, const std::vector& see ); const std::vector& positions = ccmcFieldline.getPositions(); - const size_t nLinePoints = positions.size(); + const ccmc::Point3f& firstPos = positions[0]; + const ccmc::Point3f& lastPos = positions[positions.size() - 1]; + if ((firstPos.component3 < 0.5f && firstPos.component3 > -0.5f) && + (lastPos.component3 < 0.5f && lastPos.component3 > -0.5f)) + { + const size_t nLinePoints = positions.size(); - std::vector vertices; - vertices.reserve(nLinePoints); - for (const ccmc::Point3f& p : positions) { - vertices.emplace_back(p.component1, p.component2, p.component3); + std::vector vertices; + vertices.reserve(nLinePoints); + for (const ccmc::Point3f& p : positions) { + vertices.emplace_back(p.component1, p.component2, p.component3); + } + state.addLine(vertices); + success |= (nLinePoints > 0); } - state.addLine(vertices); - success |= (nLinePoints > 0); } return success; @@ -214,6 +317,18 @@ void addExtraQuantities(ccmc::Kameleon* kameleon, std::vector& extraMagVars, FieldlinesState& state) { + int nVariableAttributes = kameleon->getNumberOfVariableAttributes(); + std::vector variablesAttributeNames; + for (int i = 0; i < nVariableAttributes; ++i) { + std::string varname = kameleon->getVariableAttributeName(i); + std::string varunit = kameleon->getNativeUnit(varname); + std::string varVisualizationUnit = kameleon->getVisUnit(varname); + LINFO(std::format( + "Variable '{}' is : '{}'. Variable Unit: '{}'. Visualization unit: '{}'.", + i, varname, varunit, varVisualizationUnit + )); + variablesAttributeNames.push_back(varname); + } prepareStateAndKameleonForExtras(kameleon, extraScalarVars, extraMagVars, state); diff --git a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h index 2839060a98..330786c79c 100644 --- a/modules/fieldlinessequence/util/kameleonfieldlinehelper.h +++ b/modules/fieldlinessequence/util/kameleonfieldlinehelper.h @@ -35,7 +35,20 @@ namespace openspace { class FieldlinesState; namespace fls { +std::vector + extractMagnitudeVarsFromStrings(std::vector extrVars); +/** + * Extract seedpoints from a text file. This function is used both in + * RenderableFieldlinesSequence and the .cdf to .osfls converter task. + * + * \param path The path to a directory with files containing list of seedpoints + * \param nth Is 1 on default to incluse every seedpoint. nth can be used to reduce the + amount of data produced be only including every nth seed point + * \return A list of seedpoints, mapped by their corresponding time step + */ +std::unordered_map> extractSeedPointsFromFiles( + std::filesystem::path path, size_t nth = 1); /** * Traces field lines from the provided cdf file using kameleon and stores the data in the * provided FieldlinesState. Returns `false` if it fails to create a valid state. Requires diff --git a/modules/fitsfilereader/CMakeLists.txt b/modules/fitsfilereader/CMakeLists.txt index b13c2b83d3..f1d0ffdc5e 100644 --- a/modules/fitsfilereader/CMakeLists.txt +++ b/modules/fitsfilereader/CMakeLists.txt @@ -27,12 +27,16 @@ include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES fitsfilereadermodule.h include/fitsfilereader.h + include/renderabletimevaryingfitssphere.h + include/wsafitshelper.h ) source_group("Header Files" FILES ${HEADER_FILES}) set(SOURCE_FILES fitsfilereadermodule.cpp src/fitsfilereader.cpp + src/renderabletimevaryingfitssphere.cpp + src/wsafitshelper.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/fitsfilereader/fitsfilereadermodule.cpp b/modules/fitsfilereader/fitsfilereadermodule.cpp index c17f247e36..78436d37c6 100644 --- a/modules/fitsfilereader/fitsfilereadermodule.cpp +++ b/modules/fitsfilereader/fitsfilereadermodule.cpp @@ -24,8 +24,29 @@ #include +#include +#include +#include +#include + namespace openspace { FitsFileReaderModule::FitsFileReaderModule() : OpenSpaceModule(Name) {} +void FitsFileReaderModule::internalInitialize(const ghoul::Dictionary&) { + ghoul::TemplateFactory* fRenderable = + FactoryManager::ref().factory(); + ghoul_assert(fRenderable, "No renderable factory existed"); + fRenderable->registerClass( + "RenderableTimeVaryingFitsSphere" + ); +} + +std::vector FitsFileReaderModule::documentations() const { + return { + FitsFileReaderModule::Documentation(), + RenderableTimeVaryingFitsSphere::Documentation() + }; +} + } // namespace openspace diff --git a/modules/fitsfilereader/fitsfilereadermodule.h b/modules/fitsfilereader/fitsfilereadermodule.h index 1fdd480f7d..cd5e921dd0 100644 --- a/modules/fitsfilereader/fitsfilereadermodule.h +++ b/modules/fitsfilereader/fitsfilereadermodule.h @@ -34,6 +34,11 @@ public: constexpr static const char* Name = "FitsFileReader"; FitsFileReaderModule(); + + std::vector documentations() const override; + +private: + void internalInitialize(const ghoul::Dictionary&) override; }; } // namespace openspace diff --git a/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h new file mode 100644 index 0000000000..6912882005 --- /dev/null +++ b/modules/fitsfilereader/include/renderabletimevaryingfitssphere.h @@ -0,0 +1,127 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_MODULE_FITSFILEREADER___RENDERABLETIMEVARYINGFITSSPHERE___H__ +#define __OPENSPACE_MODULE_FITSFILEREADER___RENDERABLETIMEVARYINGFITSSPHERE___H__ + +#include + +#include +#include + +namespace openspace { + +struct RenderData; +struct UpdateData; +namespace documentation { struct Documentation; } + +class RenderableTimeVaryingFitsSphere : public RenderableSphere { +public: + enum class LoadingType { + StaticLoading, + DynamicDownloading + }; + + explicit RenderableTimeVaryingFitsSphere(const ghoul::Dictionary& dictionary); + + void deinitializeGL() override; + + void update(const UpdateData& data) override; + void render(const RenderData& data, RendererTasks& rendererTask) override; + + static documentation::Documentation Documentation(); + +protected: + void bindTexture() override; + +private: + struct File { + enum class FileStatus { + Downloaded, + Loaded + }; + FileStatus status = FileStatus::Downloaded; + std::filesystem::path path; + double time = 0.0; + std::unique_ptr texture; + glm::vec2 dataMinMax = { 0.f, 1.f }; + bool operator<(const File& other) const noexcept { + return time < other.time; + } + }; + void loadTexture(); + void trackOldest(File& file); + void showCorrectFileName(); + void extractMandatoryInfoFromSourceFolder(); + void readFileFromFits(std::filesystem::path path); + glm::vec2 minMaxTextureDataValues(std::unique_ptr& t); + void updateActiveTriggerTimeIndex(double currenttime); + void computeSequenceEndTime(); + void updateDynamicDownloading(double currentTime, double deltaTime); + + properties::OptionProperty _fitsLayerName; + // An option to keep or delete the downloads from dynamic downloader on shutdown + // Deletes on default + properties::BoolProperty _saveDownloadsOnShutdown; + properties::OptionProperty _textureFilterProperty; + properties::StringProperty _textureSource; + + // If there's just one state it should never disappear! + double _sequenceEndTime = std::numeric_limits::max(); + // Static Loading on default / if not specified + LoadingType _loadingType = LoadingType::StaticLoading; + // A data ID that corresponds to what dataset to use if using DynamicDownloading + int _dataID = -1; + // Number of files to queue up at a time + int _nFilesToQueue = 10; + // To keep track of oldest file + std::deque _loadedFiles; + // Max number of files loaded at once + size_t _maxLoadedFiles = 100; + std::string _infoUrl; + std::string _dataUrl; + std::map _layerNames; + std::map> _layerMinMaxCaps; + + int _fitsLayerTemp = -1; + // If there's just one state it should never disappear + bool _renderForever = false; + bool _inInterval = false; + + bool _isLoadingStateFromDisk = false; + // DynamicFileSequenceDownloader downloads and updates the renderable with + // data downloaded from the web + std::unique_ptr _dynamicFileDownloader; + std::deque _files; + int _activeTriggerTimeIndex = 0; + + bool _firstUpdate = true; + bool _layerOptionsAdded = false; + ghoul::opengl::Texture* _texture = nullptr; + bool _textureIsDirty = true; +}; + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_FITSFILEREADER___RENDERABLETIMEVARYINGFITSSPHERE___H__ diff --git a/modules/fitsfilereader/include/wsafitshelper.h b/modules/fitsfilereader/include/wsafitshelper.h new file mode 100644 index 0000000000..6b49cbf379 --- /dev/null +++ b/modules/fitsfilereader/include/wsafitshelper.h @@ -0,0 +1,75 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#ifndef __OPENSPACE_MODULE_FITSFILEREADER___WSAFITSHELPER___H__ +#define __OPENSPACE_MODULE_FITSFILEREADER___WSAFITSHELPER___H__ + +#include +#include +#include + +namespace CCfits { + class FITS; + class PHDU; + class ExtHDU; +} // namespace CCfits + +namespace openspace { + +template +struct ImageData { + std::valarray contents; + int width; + int height; +}; + +/** + * Load image from a FITS file into a texture. + * + * \param path The path to the FITS file + * \param layerIndex The index of the layer to load from the FITS file + * \param minMax The minimum and maximum value range in which to cap the data between + Values outside of range will be overexposed + \return The texture created from the layer in the file with the set min-max range + */ +std::unique_ptr loadTextureFromFits( + const std::filesystem::path& path, size_t layerIndex, + const std::pair& minMax); + +void readFitsHeader(const std::filesystem::path& path); + +/** + * Get the number of data layers in a FITS file. + * + * \param path The path to the FITS file + * \return The number of layers in the FITS file + */ +int nLayers(const std::filesystem::path& path); + +template +std::shared_ptr> readImageInternal(U& image); + +} // namespace openspace + +#endif // __OPENSPACE_MODULE_FITSFILEREADER___WSAFITSHELPER___H__ diff --git a/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp b/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp new file mode 100644 index 0000000000..77c20ad77d --- /dev/null +++ b/modules/fitsfilereader/src/renderabletimevaryingfitssphere.cpp @@ -0,0 +1,678 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + constexpr std::string_view _loggerCat = "RenderableTimeVaryingFitsSphere"; + + // Extract J2000 time from file names + // Requires file to be named as example : 'wsa_202209291400R011_agong.fits' + // Looks for timestamp after first '_' + double extractTriggerTimeFromFitsFileName(const std::filesystem::path& filePath) { + // Extract the filename from the path (without extension) + std::string fileName = filePath.stem().string(); + + std::string digits; + bool foundDigits = false; + + // Iterate over the characters in the file name + for (char c : fileName) { + if (std::isdigit(c)) { + // If current character is a digit, append it to digits string + digits += c; + foundDigits = true; + } + else { + // If current character is not a digit, reset digits string + digits.clear(); + foundDigits = false; + } + + // If we have found at least 12 consecutive digits, break the loop + if (digits.size() >= 12) { + break; + } + } + // If no digits found, return an empty string + if (!foundDigits || digits.size() < 12) { + return -1; + } + + // Extract digits from the substring and construct ISO 8601 formatted string + std::ostringstream oss; + oss << digits.substr(0, 4) << "-" // Year + << digits.substr(4, 2) << "-" // Month + << digits.substr(6, 2) << "T" // Day + << digits.substr(8, 2) << ":" // Hour + << digits.substr(10, 2) << ":" // Minute + << "00" + << digits.substr(12, 2) << "." // Second + << "000"; + + return openspace::Time::convertTime(oss.str()); + } + + constexpr openspace::properties::Property::PropertyInfo TextureSourceInfo = { + "TextureSource", + "Texture Source", + "A directory on disk from which to load the texture files for the sphere.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo FitsLayerInfo = { + "FitsLayer", + "Texture Layer", + "The index of the layer in the FITS file to use as texture.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo FitsLayerNameInfo = { + "LayerNames", + "Texture Layer Options", + "This value specifies which name of the fits layer to use as texture.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo TextureFilterInfo = { + "TextureFilter", + "Texture Filter", + "Option to choose nearest neighbor or linear filtering for the texture.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + constexpr openspace::properties::Property::PropertyInfo SaveDownloadsOnShutdown = { + "SaveDownloadsOnShutdown", + "Save Downloads On Shutdown", + "This is an option for if dynamically downloaded files should be saved for the" + "next run or not.", + openspace::properties::Property::Visibility::AdvancedUser + }; + + struct [[codegen::Dictionary(RenderableTimeVaryingFitsSphere)]] Parameters { + // [[codegen::verbatim(TextureSourceInfo.description)]] + std::optional textureSource; + + enum class [[codegen::map( + openspace::RenderableTimeVaryingFitsSphere::LoadingType)]] LoadingType + { + StaticLoading, + DynamicDownloading + }; + + // Choose type of loading: + // StaticLoading: Download and load files on startup. + // DynamicDownloading: Download and load files during run time. + std::optional loadingType; + + // A data ID that corresponds to what dataset to use if using dynamicWebContent. + std::optional dataID; + + // This is a max value of the amount of files to queue up + // so that not to big of a data set is downloaded. + std::optional numberOfFilesToQueue; + + // A URL that returns a JSON formated page with metadata needed for the dataURL. + std::optional infoURL; + + // A URL that returns a JSON formated page with a list of each available file. + std::optional dataURL; + + // [[codegen::verbatim(FitsLayerInfo.description)]] + std::optional fitsLayer; + + // [[codegen::verbatim(FitsLayerNameInfo.description)]] + std::optional layerNames; + + // A range per layer to be used to cap where the color range will lie. + // Values outside of range will be overexposed, i.e. data values below the min + // or above the max, will all be set to the min and max color value in range. + std::optional layerMinMaxCapValues; + + // This is set to false by default and will delete all the downloaded content when + // OpenSpace is shut down. Set to true to save all the downloaded files. + std::optional cacheData; + + // Set if first/last file should render outside of the sequence interval. + std::optional showPastFirstAndLastFile; + }; +#include "renderabletimevaryingfitssphere_codegen.cpp" +} // namespace + +namespace openspace { + +documentation::Documentation RenderableTimeVaryingFitsSphere::Documentation() { + return codegen::doc( + "fitsfilereader_renderable_time_varying_fits_sphere", + RenderableSphere::Documentation() + ); +} + +RenderableTimeVaryingFitsSphere::RenderableTimeVaryingFitsSphere( + const ghoul::Dictionary& dictionary) + : RenderableSphere(dictionary) + , _fitsLayerName(FitsLayerNameInfo) + , _saveDownloadsOnShutdown(SaveDownloadsOnShutdown, false) + , _textureFilterProperty(TextureFilterInfo) + , _textureSource(TextureSourceInfo) +{ + const Parameters p = codegen::bake(dictionary); + + if (p.textureSource.has_value()) { + _textureSource = p.textureSource->string(); + } + + _textureSource.setReadOnly(true); + addProperty(_textureSource); // Added only to show in GUI which file is active + + if (p.loadingType.has_value()) { + _loadingType = codegen::map(*p.loadingType); + } + else { + _loadingType = LoadingType::StaticLoading; + } + + if (p.fitsLayer.has_value()) { + _fitsLayerTemp = *p.fitsLayer; + } + + _textureFilterProperty.addOptions({ + { static_cast(ghoul::opengl::Texture::FilterMode::Nearest), "No Filter" }, + { + static_cast(ghoul::opengl::Texture::FilterMode::Linear), + "Linear smoothing" + } + }); + _textureFilterProperty = static_cast( + ghoul::opengl::Texture::FilterMode::Nearest + ); + + _renderForever = p.showPastFirstAndLastFile.value_or(_renderForever); + + _textureFilterProperty.onChange([this]() { + switch (_textureFilterProperty) { + case static_cast(ghoul::opengl::Texture::FilterMode::Nearest): + for (File& file : _files) { + if (file.texture) { + file.texture->setFilter( + ghoul::opengl::Texture::FilterMode::Nearest + ); + } + } + break; + case static_cast(ghoul::opengl::Texture::FilterMode::Linear): + for (File& file : _files) { + if (file.texture) { + file.texture->setFilter( + ghoul::opengl::Texture::FilterMode::Linear + ); + } + } + break; + } + }); + addProperty(_textureFilterProperty); + + _fitsLayerName.onChange([this]() { + if (_loadingType == LoadingType::StaticLoading) { + extractMandatoryInfoFromSourceFolder(); + } + else { + for (File& file : _files) { + // This if-statement might seem redundant since we're loading a texture + // here, but the files without texture should not be loaded to save memory + if (file.status == File::FileStatus::Loaded) { + std::pair minMax = _layerMinMaxCaps.at(_fitsLayerName); + file.texture = loadTextureFromFits(file.path, _fitsLayerName, minMax); + file.texture->uploadTexture(); + using FM = ghoul::opengl::Texture::FilterMode; + if (_textureFilterProperty == static_cast(FM::Nearest)) { + file.texture->setFilter(FM::Nearest); + } + else if (_textureFilterProperty == static_cast(FM::Linear)) { + file.texture->setFilter(FM::Linear); + } + } + } + loadTexture(); + } + }); + addProperty(_fitsLayerName); + + if (_loadingType == LoadingType::StaticLoading) { + extractMandatoryInfoFromSourceFolder(); + computeSequenceEndTime(); + loadTexture(); + } + + if (_loadingType == LoadingType::DynamicDownloading) { + if (!p.dataID.has_value()) { + throw ghoul::RuntimeError( + "If running with dynamic downloading, dataID needs to be specified" + ); + } + _dataID = *p.dataID; + + _nFilesToQueue = p.numberOfFilesToQueue.value_or(_nFilesToQueue); + + if (!p.infoURL.has_value()) { + throw ghoul::RuntimeError( + "If running with dynamic downloading, infoURL needs to be specified" + ); + } + _infoUrl = *p.infoURL; + + if (!p.dataURL.has_value()) { + throw ghoul::RuntimeError( + "If running with dynamic downloading, dataURL needs to be specified" + ); + } + _dataUrl = *p.dataURL; + + if (p.layerMinMaxCapValues.has_value()) { + const ghoul::Dictionary d = *p.layerMinMaxCapValues; + for (std::string_view intKey : d.keys()) { + const ghoul::Dictionary& pair = d.value(intKey); + if (pair.hasValue("1") && pair.hasValue("2")) { + std::pair minMax = std::pair( + static_cast(pair.value("1")), + static_cast(pair.value("2")) + ); + std::pair> mapPair = std::pair( + std::stoi(std::string(intKey)), + minMax + ); + _layerMinMaxCaps.emplace(mapPair); + } + else { + throw ghoul::RuntimeError(std::format( + "The two values at {} needs to be of type double, a number with " + "at least one decimal", + intKey + )); + } + } + } + + if (!p.layerNames.has_value()) { + throw ghoul::RuntimeError("At least one name for one layer is required"); + } + const ghoul::Dictionary names = *p.layerNames; + for (std::string_view key : names.keys()) { + const int k = std::stoi(std::string(key)); + std::string v = names.value(key); + _layerNames.emplace(k, std::move(v)); + } + if (!p.fitsLayer.has_value()) { + LWARNING(std::format( + "Specify 'FitsLayer' for scene graph node with DataID: {}. ", + "Assuming first layer", + _dataID + )); + _fitsLayerTemp = 0; + } + } + _saveDownloadsOnShutdown = p.cacheData.value_or(_saveDownloadsOnShutdown); + addProperty(_saveDownloadsOnShutdown); +} + +void RenderableTimeVaryingFitsSphere::deinitializeGL() { + if (_loadingType == LoadingType::DynamicDownloading && _dynamicFileDownloader) { + _dynamicFileDownloader->deinitialize(_saveDownloadsOnShutdown); + } + _texture = nullptr; + _files.clear(); + RenderableSphere::deinitializeGL(); +} + +void RenderableTimeVaryingFitsSphere::readFileFromFits(std::filesystem::path path) { + if (!_layerOptionsAdded) { + for (const std::pair& name : _layerNames) { + _fitsLayerName.addOption(name.first, name.second); + } + _fitsLayerName = _fitsLayerTemp; + _layerOptionsAdded = true; + } + + std::pair minMax = _layerMinMaxCaps.at(_fitsLayerName); + std::unique_ptr t = + loadTextureFromFits(path, _fitsLayerName, minMax); + + if (!t) { + return; + } + + using FilterMode = ghoul::opengl::Texture::FilterMode; + if (_textureFilterProperty == static_cast(FilterMode::Nearest)) { + t->setFilter(FilterMode::Nearest); + } + else if (_textureFilterProperty == static_cast(FilterMode::Linear)) { + t->setFilter(FilterMode::Linear); + } + + glm::vec2 minMaxDataValues = minMaxTextureDataValues(t); + + File newFile = { + .status = File::FileStatus::Loaded, + .path = path, + .time = extractTriggerTimeFromFitsFileName(path), + .texture = std::move(t), + .dataMinMax = minMaxDataValues + }; + + const std::deque::const_iterator iter = std::upper_bound( + _files.begin(), + _files.end(), + newFile.time, + [](double timeRef, const File& fileRef) { + return timeRef < fileRef.time; + } + ); + std::deque::iterator it = _files.insert(iter, std::move(newFile)); + trackOldest(*it); +} + +glm::vec2 RenderableTimeVaryingFitsSphere::minMaxTextureDataValues( + std::unique_ptr& t) +{ + const glm::ivec3 dims = glm::ivec3(t->dimensions()); + const int width = dims.x; + const int height = dims.y; + + std::vector pixelValues; + pixelValues.reserve(width * height * 4); + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + glm::vec4 texel = t->texelAsFloat(x, y); + pixelValues.push_back(texel.r); + pixelValues.push_back(texel.g); + pixelValues.push_back(texel.b); + pixelValues.push_back(texel.a); + } + } + if (!pixelValues.empty()) { + float min = *std::min_element(pixelValues.begin(), pixelValues.end()); + float max = *std::max_element(pixelValues.begin(), pixelValues.end()); + return glm::vec2(min, max); + } + else { + return glm::vec2(0.f, 1.f); + } +} + +void RenderableTimeVaryingFitsSphere::extractMandatoryInfoFromSourceFolder() { + // Ensure that the source folder exists and then extract + // the files with the same extension as + namespace fs = std::filesystem; + const fs::path sourceFolder = _textureSource.stringValue(); + if (!std::filesystem::is_directory(sourceFolder)) { + throw ghoul::RuntimeError(std::format( + "Source folder '{}' for RenderableTimeVaryingFitsSphere is not a valid " + "directory", + sourceFolder + )); + } + // Extract all file paths from the provided folder + _files.clear(); + namespace fs = std::filesystem; + for (const fs::directory_entry& e : fs::directory_iterator(sourceFolder)) { + if (!e.is_regular_file()) { + continue; + } + if (e.path().extension() != ".fits") { + throw ghoul::RuntimeError(std::format( + "File extension for '{}' required to be .fits", e.path()) + ); + } + + readFileFromFits(e.path()); + } + // Ensure that there are available and valid source files left + if (_files.empty()) { + throw ghoul::RuntimeError( + "Source folder for RenderableTimeVaryingFitsSphere contains no files" + ); + } + + computeSequenceEndTime(); +} + +void RenderableTimeVaryingFitsSphere::update(const UpdateData& data) { + RenderableSphere::update(data); + + const double currentTime = data.time.j2000Seconds(); + const double deltaTime = global::timeManager->deltaTime(); + + if (!_dynamicFileDownloader && _loadingType == LoadingType::DynamicDownloading) { + const std::string& identifier = parent()->identifier(); + _dynamicFileDownloader = std::make_unique( + _dataID, + identifier, + _infoUrl, + _dataUrl, + _nFilesToQueue + ); + } + + if (_loadingType == LoadingType::DynamicDownloading) { + updateDynamicDownloading(currentTime, deltaTime); + } + + _inInterval = !_files.empty() && + currentTime >= _files[0].time && + currentTime < _sequenceEndTime; + + if (_inInterval) { + const size_t nextIdx = _activeTriggerTimeIndex + 1; + if ( + // true => We stepped back to a time represented by another state + currentTime < _files[_activeTriggerTimeIndex].time || + // true => We stepped forward to a time represented by another state + (nextIdx < _files.size() && currentTime >= _files[nextIdx].time)) + { + updateActiveTriggerTimeIndex(currentTime); + File& file = _files[_activeTriggerTimeIndex]; + if (file.status == File::FileStatus::Downloaded) { + std::pair minMax = _layerMinMaxCaps.at(_fitsLayerName); + file.texture = + loadTextureFromFits(file.path, _fitsLayerName, minMax); + using FilterMode = ghoul::opengl::Texture::FilterMode; + if (_textureFilterProperty == static_cast(FilterMode::Nearest)) { + file.texture->setFilter(FilterMode::Nearest); + } + else if (_textureFilterProperty == static_cast(FilterMode::Linear)) { + file.texture->setFilter(FilterMode::Linear); + } + file.status = File::FileStatus::Loaded; + trackOldest(file); + loadTexture(); + } + } + // The case when we jumped passed last file where nextIdx is not < file.size() + else if (currentTime >= _files[_activeTriggerTimeIndex].time && !_texture) { + loadTexture(); + } + } + + if (!_firstUpdate && _useColorMap && !_files.empty()) { + _dataMinMaxValues = _files[_activeTriggerTimeIndex].dataMinMax; + } + + if (_textureIsDirty) [[unlikely]] { + loadTexture(); + _textureIsDirty = false; + } +} + +void RenderableTimeVaryingFitsSphere::render(const RenderData& data, RendererTasks& task) +{ + if (_files.empty() || (!_inInterval && !_renderForever)) { + return; + } + RenderableSphere::render(data, task); +} + +void RenderableTimeVaryingFitsSphere::bindTexture() { + if (_texture) { + _texture->bind(); + } +} + +void RenderableTimeVaryingFitsSphere::updateActiveTriggerTimeIndex(double currentTime) { + auto iter = std::upper_bound( + _files.cbegin(), + _files.cend(), + currentTime, + [](double value, const File& f) { return value < f.time; } + ); + if (iter != _files.cend()) { + if (iter != _files.cbegin()) { + const ptrdiff_t idx = std::distance(_files.cbegin(), iter); + _activeTriggerTimeIndex = static_cast(idx - 1); + } + else { + _activeTriggerTimeIndex = 0; + } + } + else { + _activeTriggerTimeIndex = static_cast(_files.size()) - 1; + } +} + +void RenderableTimeVaryingFitsSphere::updateDynamicDownloading(double currentTime, + double deltaTime) +{ + _dynamicFileDownloader->update(currentTime, deltaTime); + const std::vector& filesToRead = + _dynamicFileDownloader->downloadedFiles(); + for (const std::filesystem::path& filePath : filesToRead) { + if (filePath.extension() == ".fits") { + readFileFromFits(filePath); + } + } + if (!filesToRead.empty()) { + computeSequenceEndTime(); + updateActiveTriggerTimeIndex(currentTime); + } + if (_firstUpdate) { + const bool isInInterval = !_files.empty() && + currentTime >= _files[0].time && + currentTime < _sequenceEndTime; + + if (isInInterval && + _activeTriggerTimeIndex != -1 && + _activeTriggerTimeIndex < _files.size()) + { + _firstUpdate = false; + loadTexture(); + } + } + // If all files are moved into _sourceFiles then we can + // empty the DynamicFileSequenceDownloader's downloaded files list + _dynamicFileDownloader->clearDownloaded(); +} + +void RenderableTimeVaryingFitsSphere::computeSequenceEndTime() { + if (_files.empty()) { + _sequenceEndTime = 0.f; + } + else if (_files.size() == 1) { + _sequenceEndTime = _files[0].time + 7200.f; + if (_loadingType == LoadingType::StaticLoading && !_renderForever) { + // TODO (2025-06-10, Elon) Alternativly check at construction and throw + // exeption. + LWARNING( + "Only one file in data set, but ShowAtAllTimes set to false. " + "Using arbitrary 2 hours to visualize data file instead" + ); + } + } + else if (_files.size() > 1) { + const double lastTriggerTime = _files[_files.size() - 1].time; + const double sequenceDuration = lastTriggerTime - _files[0].time; + const double averageCadence = + sequenceDuration / (static_cast(_files.size()) - 1.0); + // A multiplier of 3 to the average cadence is added at the end as a buffer + // 3 because if you start it just before new data came in, you might just be + // outside the sequence end time otherwise + _sequenceEndTime = lastTriggerTime + 3 * averageCadence; + } +} + +void RenderableTimeVaryingFitsSphere::loadTexture() { + if (_activeTriggerTimeIndex != -1 && + static_cast(_activeTriggerTimeIndex) < _files.size()) + { + _texture = _files[_activeTriggerTimeIndex].texture.get(); + showCorrectFileName(); + } +} + +void RenderableTimeVaryingFitsSphere::trackOldest(File& file) { + if (file.status == File::FileStatus::Loaded) { + std::deque::iterator it = + std::find(_loadedFiles.begin(), _loadedFiles.end(), &file); + if (it == _loadedFiles.end()) { + _loadedFiles.push_back(&file); + } + // Repopulate the queue if new File makes the queue full + if (!_loadedFiles.empty() && + _loadingType == LoadingType::DynamicDownloading && + _loadedFiles.size() >= _maxLoadedFiles) + { + File* oldest = _loadedFiles.front(); + // The edge case of when queue just got full and user jumped back to where + // they started which would make the oldes file in queue to be the active + // file. In that case we need to make sure we do not unload it + if (oldest == &file) { + return; + } + oldest->status = File::FileStatus::Downloaded; + oldest->texture = nullptr; + _loadedFiles.pop_front(); + } + } +} + +void RenderableTimeVaryingFitsSphere::showCorrectFileName() { + _textureSource = _files[_activeTriggerTimeIndex].path.filename().string(); +} + +} // namespace openspace diff --git a/modules/fitsfilereader/src/wsafitshelper.cpp b/modules/fitsfilereader/src/wsafitshelper.cpp new file mode 100644 index 0000000000..c7f334cd67 --- /dev/null +++ b/modules/fitsfilereader/src/wsafitshelper.cpp @@ -0,0 +1,156 @@ +/***************************************************************************************** + * * + * OpenSpace * + * * + * Copyright (c) 2014-2025 * + * * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this * + * software and associated documentation files (the "Software"), to deal in the Software * + * without restriction, including without limitation the rights to use, copy, modify, * + * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to the following * + * conditions: * + * * + * The above copyright notice and this permission notice shall be included in all copies * + * or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************************/ + +#include +#include +#include +#include + +constexpr std::string_view _loggerCat = "RenderableTimeVaryingSphere"; + +using namespace CCfits; + +namespace openspace { + +std::unique_ptr loadTextureFromFits( + const std::filesystem::path& path, + size_t layerIndex, + const std::pair& minMax) +{ + try { + readFitsHeader(path); + std::unique_ptr file = std::make_unique(path.string(), Read, true); + if (!file.get()) { + LERROR(std::format( + "Failed to open, therefor removing file {}", path.string() + )); + std::filesystem::remove(path); + return nullptr; + } + // Convert fits path with fits-file-reader functions + const std::shared_ptr> fitsValues = + readImageInternal(file->pHDU()); + int layerSize = fitsValues->width * fitsValues->height; + + int nLayers = static_cast(fitsValues->contents.size()) / layerSize; + if (layerIndex > nLayers -1) { + LERROR( + "Chosen layer in fits file is not supported. Index too high. " + "First layer chosen instead" + ); + layerIndex = 0; + } + + std::valarray layerValues = + fitsValues->contents[std::slice(layerIndex*layerSize, layerSize, 1)]; + + float* imageData = new float[layerValues.size()]; + std::vector rgbLayers; + for (size_t i = 0; i < layerValues.size(); i++) { + // Normalization + float normalizedValue = + (layerValues[i] - minMax.first) / (minMax.second - minMax.first); + // Clamping causes overexposure above and below max and min values + // intentionally as desired by Nick Arge from WSA + normalizedValue = std::clamp(normalizedValue, 0.f, 1.f); + + imageData[i] = normalizedValue; + } + + // Create texture from imagedata + auto texture = std::make_unique( + imageData, + glm::size3_t(fitsValues->width, fitsValues->height, 1), + GL_TEXTURE_2D, + ghoul::opengl::Texture::Format::Red, + GL_RED, + GL_FLOAT + ); + // Tell it to use the single color channel as grayscale + convertTextureFormat(*texture, ghoul::opengl::Texture::Format::RGB); + texture->uploadTexture(); + return texture; + } + catch (const CCfits::FitsException& e) { + LERROR(std::format( + "Failed to open fits file '{}'. '{}'", path.string(), e.message() + )); + std::filesystem::remove(path); + return nullptr; + } +} + +void readFitsHeader(const std::filesystem::path& path) { + std::unique_ptr file = + std::make_unique(path.string(), CCfits::Read, true); + CCfits::PHDU& pHDU = file->pHDU(); + pHDU.readAllKeys(); + std::string val; + pHDU.readKey("CARRLONG", val); +} + +int nLayers(const std::filesystem::path& path) { + try { + std::unique_ptr file = std::make_unique(path.string(), Read, true); + if (!file.get()) { + LERROR(std::format("Failed to open fits file '{}'", path)); + return -1; + } + // Convert fits path with fits-file-reader functions + const std::shared_ptr> fitsValues = + readImageInternal(file->pHDU()); + int layerSize = fitsValues->width * fitsValues->height; + + return static_cast(fitsValues->contents.size() / layerSize); + } + catch (const CCfits::FitsException& e) { + LERROR(std::format( + "Failed to open fits file '{}'. '{}'", path, e.message() + )); + return 0; + } +} + +template +std::shared_ptr> readImageInternal(U& image) { + try { + std::valarray contents; + image.read(contents); + ImageData im = { + .contents = std::move(contents), + .width = static_cast(image.axis(0)), + .height = static_cast(image.axis(1)) + }; + return std::make_shared>(im); + } + catch (const CCfits::FitsException& e) { + LERROR(std::format( + "Could not read FITS layer. Error: {}", + e.message() + )); + } + return nullptr; +} + +} // namespace openspace diff --git a/modules/gaia/rendering/octreemanager.h b/modules/gaia/rendering/octreemanager.h index 2b9f9f8b4a..bca9d93561 100644 --- a/modules/gaia/rendering/octreemanager.h +++ b/modules/gaia/rendering/octreemanager.h @@ -260,7 +260,7 @@ private: * long as \p recursive is not set to false. * * \param node the node that should be removed - * \param deltaStars keeps track of how many stars that were removed. + * \param deltaStars keeps track of how many stars that were removed * \param recursive defines if decentents should be removed as well */ std::map> removeNodeFromCache(OctreeNode& node, @@ -294,7 +294,7 @@ private: * * \param node the node that should be inserted * \param mode the render mode that should be used - * \param deltaStars keeps track of how many stars that were added. + * \param deltaStars keeps track of how many stars that were added * \return the data to be inserted */ std::vector constructInsertData(const OctreeNode& node, diff --git a/modules/imgui/imguimodule.cpp b/modules/imgui/imguimodule.cpp index 06c0e3d36e..95fc40fede 100644 --- a/modules/imgui/imguimodule.cpp +++ b/modules/imgui/imguimodule.cpp @@ -130,7 +130,7 @@ ImGUIModule::ImGUIModule() global::callback::draw2D->emplace_back([this]() { ZoneScopedN("ImGUI"); - if (!_isEnabled) { + if (!_isEnabled || !_hasContext) { return; } @@ -160,7 +160,7 @@ ImGUIModule::ImGUIModule() { ZoneScopedN("ImGUI"); - if (!isGuiWindow || !_isEnabled) { + if (!isGuiWindow || !_isEnabled || !_hasContext) { return false; } return keyCallback(key, mod, action); @@ -173,7 +173,7 @@ ImGUIModule::ImGUIModule() { ZoneScopedN("ImGUI"); - if (!isGuiWindow || !_isEnabled) { + if (!isGuiWindow || !_isEnabled || !_hasContext) { return false; } return charCallback(codepoint, modifier); @@ -182,7 +182,7 @@ ImGUIModule::ImGUIModule() global::callback::mousePosition->emplace_back( [this](double x, double y, IsGuiWindow isGuiWindow) { - if (!isGuiWindow) { + if (!isGuiWindow || !_isEnabled || !_hasContext) { return; // do nothing } _mousePosition = glm::vec2(static_cast(x), static_cast(y)); @@ -195,7 +195,7 @@ ImGUIModule::ImGUIModule() { ZoneScopedN("ImGUI"); - if (!isGuiWindow) { + if (!isGuiWindow || !_isEnabled || !_hasContext) { return false; } @@ -214,7 +214,7 @@ ImGUIModule::ImGUIModule() [this](double, double posY, IsGuiWindow isGuiWindow) -> bool { ZoneScopedN("ImGUI"); - if (!isGuiWindow || !_isEnabled) { + if (!isGuiWindow || !_isEnabled || !_hasContext) { return false; } return mouseWheelCallback(posY); @@ -223,18 +223,27 @@ ImGUIModule::ImGUIModule() global::callback::touchDetected->emplace_back( [this](TouchInput input) -> bool { + if (!_isEnabled || !_hasContext) { + return false; + } return touchDetectedCallback(input); } ); global::callback::touchUpdated->emplace_back( [this](TouchInput input) -> bool { + if (!_isEnabled || !_hasContext) { + return false; + } return touchUpdatedCallback(input); } ); global::callback::touchExit->emplace_back( [this](TouchInput input) { + if (!_isEnabled || !_hasContext) { + return; + } touchExitCallback(input); } ); @@ -275,6 +284,8 @@ void ImGUIModule::internalDeinitialize() { for (gui::GuiComponent* comp : _components) { comp->deinitialize(); } + + _hasContext = false; } void ImGUIModule::internalInitializeGL() { @@ -378,6 +389,8 @@ void ImGUIModule::internalInitializeGL() { style.Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); } + _hasContext = true; + for (gui::GuiComponent* comp : _components) { comp->initialize(); } diff --git a/modules/imgui/imguimodule.h b/modules/imgui/imguimodule.h index f844c76f19..338201994f 100644 --- a/modules/imgui/imguimodule.h +++ b/modules/imgui/imguimodule.h @@ -120,6 +120,7 @@ private: GLuint vao = 0; GLuint vbo = 0; GLuint vboElements = 0; + bool _hasContext = false; std::unique_ptr _program; UniformCache(tex, ortho) _uniformCache; std::unique_ptr _fontTexture; diff --git a/modules/iswa/CMakeLists.txt b/modules/iswa/CMakeLists.txt index f7acf6d9a3..56d3a5bfc5 100644 --- a/modules/iswa/CMakeLists.txt +++ b/modules/iswa/CMakeLists.txt @@ -25,17 +25,17 @@ include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) set(HEADER_FILES - rendering/datacygnet.h - rendering/dataplane.h - rendering/datasphere.h - rendering/kameleonplane.h rendering/iswabasegroup.h - rendering/iswacygnet.h rendering/iswadatagroup.h rendering/iswakameleongroup.h + rendering/renderabledatacygnet.h + rendering/renderabledataplane.h + rendering/renderabledatasphere.h + rendering/renderableiswacygnet.h + rendering/renderablekameleonplane.h + rendering/renderabletexturecygnet.h + rendering/renderabletextureplane.h rendering/screenspacecygnet.h - rendering/texturecygnet.h - rendering/textureplane.h util/dataprocessor.h util/dataprocessorjson.h util/dataprocessorkameleon.h @@ -51,17 +51,17 @@ set(SOURCE_FILES util/dataprocessorkameleon.cpp util/dataprocessortext.cpp util/iswamanager.cpp - rendering/datacygnet.cpp - rendering/dataplane.cpp - rendering/datasphere.cpp rendering/iswabasegroup.cpp - rendering/iswacygnet.cpp rendering/iswadatagroup.cpp rendering/iswakameleongroup.cpp - rendering/kameleonplane.cpp + rendering/renderabledatacygnet.cpp + rendering/renderabledataplane.cpp + rendering/renderabledatasphere.cpp + rendering/renderablekameleonplane.cpp + rendering/renderableiswacygnet.cpp + rendering/renderabletexturecygnet.cpp + rendering/renderabletextureplane.cpp rendering/screenspacecygnet.cpp - rendering/texturecygnet.cpp - rendering/textureplane.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/iswa/iswamodule.cpp b/modules/iswa/iswamodule.cpp index 3cc01bab45..7c62ab78ff 100644 --- a/modules/iswa/iswamodule.cpp +++ b/modules/iswa/iswamodule.cpp @@ -24,12 +24,13 @@ #include -#include -#include -#include #include -#include +#include +#include +#include +#include #include +#include #include #include #include @@ -54,10 +55,10 @@ void IswaModule::internalInitialize(const ghoul::Dictionary&) { FactoryManager::ref().factory(); ghoul_assert(fRenderable, "No renderable factory existed"); - fRenderable->registerClass("TexturePlane"); - fRenderable->registerClass("DataPlane"); - fRenderable->registerClass("KameleonPlane"); - fRenderable->registerClass("DataSphere"); + fRenderable->registerClass("RenderableTexturePlane"); + fRenderable->registerClass("RenderableDataPlane"); + fRenderable->registerClass("RenderableKameleonPlane"); + fRenderable->registerClass("RenderableDataSphere"); ghoul::TemplateFactory* fScreenSpaceRenderable = FactoryManager::ref().factory(); @@ -66,6 +67,15 @@ void IswaModule::internalInitialize(const ghoul::Dictionary&) { fScreenSpaceRenderable->registerClass("ScreenSpaceCygnet"); } +std::vector IswaModule::documentations() const { + return { + RenderableTexturePlane::Documentation(), + RenderableDataPlane::Documentation(), + RenderableKameleonPlane::Documentation(), + ScreenSpaceCygnet::Documentation() + }; +} + scripting::LuaLibrary IswaModule::luaLibrary() const { return IswaManager::luaLibrary(); } diff --git a/modules/iswa/iswamodule.h b/modules/iswa/iswamodule.h index 35da497e44..b99e35fef4 100644 --- a/modules/iswa/iswamodule.h +++ b/modules/iswa/iswamodule.h @@ -35,6 +35,7 @@ public: IswaModule(); + std::vector documentations() const override; scripting::LuaLibrary luaLibrary() const override; protected: diff --git a/modules/iswa/rendering/iswadatagroup.cpp b/modules/iswa/rendering/iswadatagroup.cpp index 08f3609acb..02ad147cf2 100644 --- a/modules/iswa/rendering/iswadatagroup.cpp +++ b/modules/iswa/rendering/iswadatagroup.cpp @@ -24,9 +24,9 @@ #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -193,13 +193,13 @@ void IswaDataGroup::registerOptions(const std::vector& options) { } void IswaDataGroup::createDataProcessor() { - if (_type == typeid(DataPlane).name()) { + if (_type == typeid(RenderableDataPlane).name()) { _dataProcessor = std::make_shared(); } - else if (_type == typeid(DataSphere).name()) { + else if (_type == typeid(RenderableDataSphere).name()) { _dataProcessor = std::make_shared(); } - else if (_type == typeid(KameleonPlane).name()) { + else if (_type == typeid(RenderableKameleonPlane).name()) { _dataProcessor = std::make_shared(); } } diff --git a/modules/iswa/rendering/iswakameleongroup.cpp b/modules/iswa/rendering/iswakameleongroup.cpp index 6eccc022de..b7376e6566 100644 --- a/modules/iswa/rendering/iswakameleongroup.cpp +++ b/modules/iswa/rendering/iswakameleongroup.cpp @@ -51,7 +51,8 @@ namespace { }; } // namespace -namespace openspace{ +namespace openspace { + IswaKameleonGroup::IswaKameleonGroup(std::string name, std::string type) : IswaDataGroup(name, type) , _resolution(ResolutionInfo, 100.f, 10.f, 200.f) diff --git a/modules/iswa/rendering/datacygnet.cpp b/modules/iswa/rendering/renderabledatacygnet.cpp similarity index 93% rename from modules/iswa/rendering/datacygnet.cpp rename to modules/iswa/rendering/renderabledatacygnet.cpp index 928463691f..d8feb39043 100644 --- a/modules/iswa/rendering/datacygnet.cpp +++ b/modules/iswa/rendering/renderabledatacygnet.cpp @@ -22,11 +22,12 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include #include #include +#include #include #include #include @@ -92,8 +93,15 @@ namespace { namespace openspace { -DataCygnet::DataCygnet(const ghoul::Dictionary& dictionary) - : IswaCygnet(dictionary) +documentation::Documentation RenderableDataCygnet::Documentation() { + documentation::Documentation doc = RenderableIswaCygnet::Documentation(); + doc.name = "RenderableDataCygnet"; + doc.id = "iswa_renderable_datacygnet"; + return doc; +} + +RenderableDataCygnet::RenderableDataCygnet(const ghoul::Dictionary& dictionary) + : RenderableIswaCygnet(dictionary) , _dataOptions(DataOptionsInfo) , _transferFunctionsFile(TransferFunctionsFile, "${SCENE}/iswa/tfs/default.tf") , _backgroundValues(BackgroundInfo, glm::vec2(0.f), glm::vec2(0.f), glm::vec2(1.f)) @@ -112,9 +120,9 @@ DataCygnet::DataCygnet(const ghoul::Dictionary& dictionary) registerProperties(); } -DataCygnet::~DataCygnet() {} +RenderableDataCygnet::~RenderableDataCygnet() {} -bool DataCygnet::updateTexture() { +bool RenderableDataCygnet::updateTexture() { const std::vector& data = textureData(); if (data.empty()) { @@ -163,7 +171,7 @@ bool DataCygnet::updateTexture() { return texturesReady; } -bool DataCygnet::downloadTextureResource(double timestamp) { +bool RenderableDataCygnet::downloadTextureResource(double timestamp) { if (_futureObject.valid()) { return false; } @@ -181,7 +189,7 @@ bool DataCygnet::downloadTextureResource(double timestamp) { return false; } -bool DataCygnet::updateTextureResource() { +bool RenderableDataCygnet::updateTextureResource() { DownloadManager::MemoryFile dataFile = _futureObject.get(); if (dataFile.corrupted) { @@ -194,7 +202,7 @@ bool DataCygnet::updateTextureResource() { return true; } -bool DataCygnet::readyToRender() const { +bool RenderableDataCygnet::readyToRender() const { return (!_textures.empty() && !_transferFunctions.empty()); } @@ -203,7 +211,7 @@ bool DataCygnet::readyToRender() const { * bind to the right texture units. If separate in to two functions a list of * ghoul::TextureUnit needs to be passed as an argument to both. */ -void DataCygnet::setTextureUniforms() { +void RenderableDataCygnet::setTextureUniforms() { const std::set& selectedOptions = _dataOptions; const std::vector& options = _dataOptions.options(); std::vector selectedOptionsIndices; @@ -273,7 +281,7 @@ void DataCygnet::setTextureUniforms() { _shader->setUniform("numTextures", activeTextures); } -void DataCygnet::readTransferFunctions(std::string tfPath) { +void RenderableDataCygnet::readTransferFunctions(std::string tfPath) { std::ifstream tfFile(absPath(std::move(tfPath))); std::vector tfs; @@ -292,7 +300,7 @@ void DataCygnet::readTransferFunctions(std::string tfPath) { } } -void DataCygnet::fillOptions(const std::string& source) { +void RenderableDataCygnet::fillOptions(const std::string& source) { std::vector options = _dataProcessor->readMetadata( source, _textureDimensions @@ -314,7 +322,7 @@ void DataCygnet::fillOptions(const std::string& source) { } } -void DataCygnet::setPropertyCallbacks() { +void RenderableDataCygnet::setPropertyCallbacks() { _normValues.onChange([this]() { _dataProcessor->normValues(_normValues); updateTexture(); @@ -345,7 +353,7 @@ void DataCygnet::setPropertyCallbacks() { }); } -void DataCygnet::subscribeToGroup() { +void RenderableDataCygnet::subscribeToGroup() { ghoul::Event& groupEvent = _group->groupEvent(); groupEvent.subscribe( diff --git a/modules/iswa/rendering/datacygnet.h b/modules/iswa/rendering/renderabledatacygnet.h similarity index 89% rename from modules/iswa/rendering/datacygnet.h rename to modules/iswa/rendering/renderabledatacygnet.h index b0de1d2858..1214625676 100644 --- a/modules/iswa/rendering/datacygnet.h +++ b/modules/iswa/rendering/renderabledatacygnet.h @@ -22,10 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___DATACYGNET___H__ -#define __OPENSPACE_MODULE_ISWA___DATACYGNET___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLEDATACYGNET___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLEDATACYGNET___H__ -#include +#include #include #include @@ -35,16 +35,19 @@ namespace openspace { class DataProcessor; +namespace documentation { struct Documentation; } /** * This class abstracts away the the loading of data and creation of textures for all data * cygnets. It specifies the interface that needs to be implemented for all concrete * subclasses. */ -class DataCygnet : public IswaCygnet { +class RenderableDataCygnet : public RenderableIswaCygnet { public: - explicit DataCygnet(const ghoul::Dictionary& dictionary); - ~DataCygnet(); + explicit RenderableDataCygnet(const ghoul::Dictionary& dictionary); + ~RenderableDataCygnet(); + + static documentation::Documentation Documentation(); protected: bool updateTexture() override; @@ -100,4 +103,4 @@ private: } //namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___DATACYGNET___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLEDATACYGNET___H__ diff --git a/modules/iswa/rendering/dataplane.cpp b/modules/iswa/rendering/renderabledataplane.cpp similarity index 87% rename from modules/iswa/rendering/dataplane.cpp rename to modules/iswa/rendering/renderabledataplane.cpp index fbd34396b5..bb9b20b430 100644 --- a/modules/iswa/rendering/dataplane.cpp +++ b/modules/iswa/rendering/renderabledataplane.cpp @@ -22,10 +22,11 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include #include +#include #include #include #include @@ -33,10 +34,19 @@ namespace openspace { -DataPlane::DataPlane(const ghoul::Dictionary& dictionary) : DataCygnet(dictionary) {} +documentation::Documentation RenderableDataPlane::Documentation() { + documentation::Documentation doc = RenderableDataCygnet::Documentation(); + doc.name = "RenderableDataPlane"; + doc.id = "iswa_renderable_dataplane"; + return doc; +} -void DataPlane::initializeGL() { - IswaCygnet::initialize(); +RenderableDataPlane::RenderableDataPlane(const ghoul::Dictionary& dictionary) + : RenderableDataCygnet(dictionary) +{} + +void RenderableDataPlane::initializeGL() { + RenderableDataCygnet::initializeGL(); if (!_shader) { _shader = global::renderEngine->buildRenderProgram( @@ -73,7 +83,12 @@ void DataPlane::initializeGL() { _autoFilter = true; } -bool DataPlane::createGeometry() { +void RenderableDataPlane::deinitializeGL() { + _shader = nullptr; + RenderableDataCygnet::deinitializeGL(); +} + +bool RenderableDataPlane::createGeometry() { glGenVertexArrays(1, &_quad); // generate array glGenBuffers(1, &_vertexPositionBuffer); // generate buffer @@ -122,7 +137,7 @@ bool DataPlane::createGeometry() { return true; } -bool DataPlane::destroyGeometry() { +bool RenderableDataPlane::destroyGeometry() { glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -132,19 +147,19 @@ bool DataPlane::destroyGeometry() { return true; } -void DataPlane::renderGeometry() const { +void RenderableDataPlane::renderGeometry() const { glBindVertexArray(_quad); glDrawArrays(GL_TRIANGLES, 0, 6); } -void DataPlane::setUniforms() { +void RenderableDataPlane::setUniforms() { // set both data texture and transfer function texture setTextureUniforms(); _shader->setUniform("backgroundValues", _backgroundValues); _shader->setUniform("transparency", _alpha); } -std::vector DataPlane::textureData() { +std::vector RenderableDataPlane::textureData() { // if the buffer in the datafile is empty, do not proceed if (_dataBuffer.empty()) { return std::vector(); diff --git a/modules/iswa/rendering/dataplane.h b/modules/iswa/rendering/renderabledataplane.h similarity index 83% rename from modules/iswa/rendering/dataplane.h rename to modules/iswa/rendering/renderabledataplane.h index e9634878ab..5bb94df7a8 100644 --- a/modules/iswa/rendering/dataplane.h +++ b/modules/iswa/rendering/renderabledataplane.h @@ -22,27 +22,32 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___DATAPLANE___H__ -#define __OPENSPACE_MODULE_ISWA___DATAPLANE___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLEDATAPLANE___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLEDATAPLANE___H__ -#include +#include #include namespace openspace { +namespace documentation { struct Documentation; } + /** * DataPlane is a concrete IswaCygnet with data files as its input source. The class * handles creation, destruction and rendering of a plane geometry. It also specifies what * uniforms to use and what GUI properties it needs. */ -class DataPlane : public DataCygnet { +class RenderableDataPlane : public RenderableDataCygnet { friend class IswaBaseGroup; public: - explicit DataPlane(const ghoul::Dictionary& dictionary); - ~DataPlane() = default; + explicit RenderableDataPlane(const ghoul::Dictionary& dictionary); + ~RenderableDataPlane() = default; void initializeGL() override; + void deinitializeGL() override; + + static documentation::Documentation Documentation(); private: /** @@ -60,4 +65,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___DATAPLANE___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLEDATAPLANE___H__ diff --git a/modules/iswa/rendering/datasphere.cpp b/modules/iswa/rendering/renderabledatasphere.cpp similarity index 81% rename from modules/iswa/rendering/datasphere.cpp rename to modules/iswa/rendering/renderabledatasphere.cpp index dadf8276f2..615ff5aa8c 100644 --- a/modules/iswa/rendering/datasphere.cpp +++ b/modules/iswa/rendering/renderabledatasphere.cpp @@ -22,29 +22,45 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include +#include +#include +#include #include #include #include -#include -#include #include #include #include +namespace { + struct [[codegen::Dictionary(RenderableDataSphere)]] Parameters { + float radius; + }; +#include "renderabledatasphere_codegen.cpp" +} // namespace + namespace openspace { -DataSphere::DataSphere(const ghoul::Dictionary& dictionary) - : DataCygnet(dictionary) -{ - _radius = static_cast(dictionary.value("Radius")); +documentation::Documentation RenderableDataSphere::Documentation() { + return codegen::doc( + "iswa_renderable_datasphere", + RenderableDataCygnet::Documentation() + ); } -DataSphere::~DataSphere() {} +RenderableDataSphere::RenderableDataSphere(const ghoul::Dictionary& dictionary) + : RenderableDataCygnet(dictionary) +{ + const Parameters p = codegen::bake(dictionary); + _radius = p.radius; +} -void DataSphere::initializeGL() { - IswaCygnet::initializeGL(); +RenderableDataSphere::~RenderableDataSphere() {} + +void RenderableDataSphere::initializeGL() { + RenderableDataCygnet::initializeGL(); if (!_shader) { _shader = global::renderEngine->buildRenderProgram( @@ -87,7 +103,13 @@ void DataSphere::initializeGL() { _autoFilter = true; } -bool DataSphere::createGeometry() { +void RenderableDataSphere::deinitializeGL() { + _shader = nullptr; + + RenderableDataCygnet::deinitializeGL(); +} + +bool RenderableDataSphere::createGeometry() { const float radius = 6.371f * _radius * glm::pow(10.f, 6.f); int segments = 100; _sphere = std::make_unique(radius, segments); @@ -95,18 +117,18 @@ bool DataSphere::createGeometry() { return true; } -bool DataSphere::destroyGeometry() { +bool RenderableDataSphere::destroyGeometry() { _sphere = nullptr; return true; } -void DataSphere::renderGeometry() const { +void RenderableDataSphere::renderGeometry() const { glEnable(GL_CULL_FACE); glCullFace(GL_BACK); _sphere->render(); } -std::vector DataSphere::textureData() { +std::vector RenderableDataSphere::textureData() { // if the buffer in the datafile is empty, do not proceed if (_dataBuffer.empty()) { return std::vector(); @@ -127,7 +149,7 @@ std::vector DataSphere::textureData() { return _dataProcessor->processData(_dataBuffer, _dataOptions, _textureDimensions); } -void DataSphere::setUniforms() { +void RenderableDataSphere::setUniforms() { // set both data texture and transfer function texture setTextureUniforms(); _shader->setUniform("backgroundValues", _backgroundValues); diff --git a/modules/iswa/rendering/datasphere.h b/modules/iswa/rendering/renderabledatasphere.h similarity index 82% rename from modules/iswa/rendering/datasphere.h rename to modules/iswa/rendering/renderabledatasphere.h index 711c191504..d4b7f2fcdb 100644 --- a/modules/iswa/rendering/datasphere.h +++ b/modules/iswa/rendering/renderabledatasphere.h @@ -22,26 +22,30 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___DATASPHERE___H__ -#define __OPENSPACE_MODULE_ISWA___DATASPHERE___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLEDATASPHERE___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLEDATASPHERE___H__ -#include +#include namespace openspace { class Sphere; +namespace documentation { struct Documentation; } /** * DataSphere is a concrete IswaCygnet with data files as its input source. The class * handles creation, destruction and rendering of a sphere geometry. It also specifies * what uniforms to use and what GUI properties it needs. */ -class DataSphere : public DataCygnet { +class RenderableDataSphere : public RenderableDataCygnet { public: - explicit DataSphere(const ghoul::Dictionary& dictionary); - ~DataSphere(); + explicit RenderableDataSphere(const ghoul::Dictionary& dictionary); + ~RenderableDataSphere(); - void initializeGL() override; + void initializeGL() override; + void deinitializeGL() override; + + static documentation::Documentation Documentation(); protected: /** @@ -59,4 +63,4 @@ protected: } // namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___DATASPHERE___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLEDATASPHERE___H__ diff --git a/modules/iswa/rendering/iswacygnet.cpp b/modules/iswa/rendering/renderableiswacygnet.cpp similarity index 82% rename from modules/iswa/rendering/iswacygnet.cpp rename to modules/iswa/rendering/renderableiswacygnet.cpp index 2fb57f22b3..d71eac0b57 100644 --- a/modules/iswa/rendering/iswacygnet.cpp +++ b/modules/iswa/rendering/renderableiswacygnet.cpp @@ -22,10 +22,11 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include #include +#include #include #include #include @@ -54,56 +55,51 @@ namespace { "", // @TODO Missing documentation openspace::properties::Property::Visibility::User }; + + struct [[codegen::Dictionary(RenderableIswaCygnet)]] Parameters { + int id; + int updateTime; + std::optional spatialScale; + std::optional gridMin; + std::optional gridMax; + std::optional frame; + std::optional coordinateType; + std::optional group; + + std::optional xOffset; + }; +#include "renderableiswacygnet_codegen.cpp" } // namespace namespace openspace { -IswaCygnet::IswaCygnet(const ghoul::Dictionary& dictionary) +documentation::Documentation RenderableIswaCygnet::Documentation() { + return codegen::doc("iswa_renderable_iswacygnet"); +} + +RenderableIswaCygnet::RenderableIswaCygnet(const ghoul::Dictionary& dictionary) : Renderable(dictionary) , _alpha(AlphaInfo, 0.9f, 0.f, 1.f) , _delete(DeleteInfo) { - // This changed from setIdentifier to setGuiName, 2018-03-14 ---abock + const Parameters p = codegen::bake(dictionary); + std::string name; if (dictionary.hasValue("Name")) { name = dictionary.value("Name"); } setGuiName(name); - _data.id = static_cast(dictionary.value("Id")); - _data.updateTime = static_cast(dictionary.value("UpdateTime")); - - _data.spatialScale = glm::dvec4(0.0); - if (dictionary.hasValue("SpatialScale")) { - _data.spatialScale = dictionary.value("SpatialScale"); - } - - _data.gridMin = glm::dvec3(0.0); - if (dictionary.hasValue("GridMin")) { - _data.gridMin = dictionary.value("GridMin"); - } - - _data.gridMax = glm::dvec3(0.0); - if (dictionary.hasValue("GridMax")) { - _data.gridMax = dictionary.value("GridMax"); - } - - if (dictionary.hasKey("Frame") && dictionary.hasValue("Frame")) { - _data.frame = dictionary.value("Frame"); - } - if (dictionary.hasValue("CoordinateType")) { - _data.coordinateType = dictionary.value("CoordinateType"); - } - - - double xOffset = 0.0; - if (dictionary.hasValue("XOffset")) { - xOffset = dictionary.value("XOffset"); - } - if (dictionary.hasValue("Group")) { - _data.groupName = dictionary.value("Group"); - } + _data.id = p.id; + _data.updateTime = p.updateTime; + _data.spatialScale = p.spatialScale.value_or(_data.spatialScale); + _data.gridMin = p.gridMin.value_or(_data.gridMin); + _data.gridMax = p.gridMax.value_or(_data.gridMax); + _data.frame = p.frame.value_or(_data.frame); + _data.coordinateType = p.frame.value_or(_data.coordinateType); + _data.groupName = p.group.value_or(_data.groupName); + double xOffset = p.xOffset.value_or(0.0); glm::vec3 scale = glm::vec3( _data.gridMax.x - _data.gridMin.x, @@ -126,9 +122,9 @@ IswaCygnet::IswaCygnet(const ghoul::Dictionary& dictionary) addProperty(_delete); } -IswaCygnet::~IswaCygnet() {} +RenderableIswaCygnet::~RenderableIswaCygnet() {} -void IswaCygnet::initializeGL() { +void RenderableIswaCygnet::initializeGL() { _textures.push_back(nullptr); if (!_data.groupName.empty()) { @@ -148,7 +144,7 @@ void IswaCygnet::initializeGL() { downloadTextureResource(global::timeManager->time().j2000Seconds()); } -void IswaCygnet::deinitializeGL() { +void RenderableIswaCygnet::deinitializeGL() { if (!_data.groupName.empty()) { _group->groupEvent().unsubscribe(identifier()); } @@ -162,11 +158,11 @@ void IswaCygnet::deinitializeGL() { } } -bool IswaCygnet::isReady() const { +bool RenderableIswaCygnet::isReady() const { return !_shader; } -void IswaCygnet::render(const RenderData& data, RendererTasks&) { +void RenderableIswaCygnet::render(const RenderData& data, RendererTasks&) { if (!readyToRender()) { return; } @@ -209,7 +205,7 @@ void IswaCygnet::render(const RenderData& data, RendererTasks&) { _shader->deactivate(); } -void IswaCygnet::update(const UpdateData&) { +void RenderableIswaCygnet::update(const UpdateData&) { if (!_enabled) { return; } @@ -254,15 +250,15 @@ void IswaCygnet::update(const UpdateData&) { } } -void IswaCygnet::enabled(bool enabled) { +void RenderableIswaCygnet::enabled(bool enabled) { _enabled = enabled; } -void IswaCygnet::registerProperties() {} +void RenderableIswaCygnet::registerProperties() {} -void IswaCygnet::unregisterProperties() {} +void RenderableIswaCygnet::unregisterProperties() {} -void IswaCygnet::initializeTime() { +void RenderableIswaCygnet::initializeTime() { _openSpaceTime = global::timeManager->time().j2000Seconds(); _lastUpdateOpenSpaceTime = 0.0; @@ -274,7 +270,7 @@ void IswaCygnet::initializeTime() { _minRealTimeUpdateInterval = 100; } -void IswaCygnet::initializeGroup() { +void RenderableIswaCygnet::initializeGroup() { _group = IswaManager::ref().iswaGroup(_data.groupName); //Subscribe to enable and delete property diff --git a/modules/iswa/rendering/iswacygnet.h b/modules/iswa/rendering/renderableiswacygnet.h similarity index 92% rename from modules/iswa/rendering/iswacygnet.h rename to modules/iswa/rendering/renderableiswacygnet.h index b0bcc77126..86a006ce00 100644 --- a/modules/iswa/rendering/iswacygnet.h +++ b/modules/iswa/rendering/renderableiswacygnet.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___ISWACYGNET___H__ -#define __OPENSPACE_MODULE_ISWA___ISWACYGNET___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLEISWACYGNET___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLEISWACYGNET___H__ #include @@ -40,11 +40,12 @@ namespace openspace { class IswaBaseGroup; class TransferFunction; -class IswaCygnet : public Renderable { +namespace documentation { struct Documentation; } +class RenderableIswaCygnet : public Renderable { public: - explicit IswaCygnet(const ghoul::Dictionary& dictionary); - virtual ~IswaCygnet(); + explicit RenderableIswaCygnet(const ghoul::Dictionary& dictionary); + virtual ~RenderableIswaCygnet(); void initializeGL() override; void deinitializeGL() override; @@ -53,6 +54,8 @@ public: void render(const RenderData& data, RendererTasks& rendererTask) override; void update(const UpdateData& data) override; + static documentation::Documentation Documentation(); + protected: struct Metadata { int id = -1; @@ -148,4 +151,4 @@ private: } //namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___ISWACYGNET___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLEISWACYGNET___H__ diff --git a/modules/iswa/rendering/kameleonplane.cpp b/modules/iswa/rendering/renderablekameleonplane.cpp similarity index 84% rename from modules/iswa/rendering/kameleonplane.cpp rename to modules/iswa/rendering/renderablekameleonplane.cpp index 16f301d79a..e2f0416b50 100644 --- a/modules/iswa/rendering/kameleonplane.cpp +++ b/modules/iswa/rendering/renderablekameleonplane.cpp @@ -22,13 +22,14 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include #include #include #include #include +#include #include #include #include @@ -63,38 +64,58 @@ namespace { "", // @TODO Missing documentation openspace::properties::Property::Visibility::User }; + + struct [[codegen::Dictionary(RenderableKameleonPlane)]] Parameters { + std::optional kwPath; + std::optional + fieldlineSeedsIndexFile [[codegen::key("fieldlineSeedsIndexFile")]]; + + enum class AxisCut { + X, + Y, + Z + }; + std::optional axisCut [[codegen::key("axisCut")]]; + }; +#include "renderablekameleonplane_codegen.cpp" } // namespace namespace openspace { -KameleonPlane::KameleonPlane(const ghoul::Dictionary& dictionary) - : DataCygnet(dictionary) +documentation::Documentation RenderableKameleonPlane::Documentation() { + return codegen::doc( + "iswa_renderable_kameleonplane", + RenderableDataCygnet::Documentation() + ); +} + +RenderableKameleonPlane::RenderableKameleonPlane(const ghoul::Dictionary& dictionary) + : RenderableDataCygnet(dictionary) , _fieldlines(FieldLineSeedsInfo) , _resolution(ResolutionInfo, 100.f, 10.f, 200.f) , _slice(SliceInfo, 0.f, 0.f, 1.f) { + const Parameters p = codegen::bake(dictionary); + + _kwPath = p.kwPath.value_or(_kwPath); + _fieldlineIndexFile = p.fieldlineSeedsIndexFile.value_or(_fieldlineIndexFile); + addProperty(_resolution); addProperty(_slice); addProperty(_fieldlines); - if (dictionary.hasValue("kwPath")) { - _kwPath = dictionary.value("kwPath"); - } - - if (dictionary.hasValue("fieldlineSeedsIndexFile")) { - _fieldlineIndexFile = dictionary.value("fieldlineSeedsIndexFile"); - } - - std::string axis; - if (dictionary.hasValue("axisCut")) { - axis = dictionary.value("axisCut"); - } - - if (axis == "x") { - _cut = Cut::X; - } - else if (axis == "y") { - _cut = Cut::Y; + if (p.axisCut.has_value()) { + switch (*p.axisCut) { + case Parameters::AxisCut::X: + _cut = Cut::X; + break; + case Parameters::AxisCut::Y: + _cut = Cut::Y; + break; + case Parameters::AxisCut::Z: + _cut = Cut::Z; + break; + } } else { _cut = Cut::Z; @@ -111,14 +132,16 @@ KameleonPlane::KameleonPlane(const ghoul::Dictionary& dictionary) setDimensions(); } -KameleonPlane::~KameleonPlane() {} +RenderableKameleonPlane::~RenderableKameleonPlane() {} -void KameleonPlane::deinitializeGL() { - IswaCygnet::deinitialize(); +void RenderableKameleonPlane::deinitializeGL() { _fieldlines = std::set(); + RenderableDataCygnet::deinitializeGL(); } -void KameleonPlane::initializeGL() { +void RenderableKameleonPlane::initializeGL() { + RenderableDataCygnet::initializeGL(); + if (!_shader) { _shader = global::renderEngine->buildRenderProgram( "DataPlaneProgram", @@ -194,7 +217,7 @@ void KameleonPlane::initializeGL() { updateTextureResource(); } -bool KameleonPlane::createGeometry() { +bool RenderableKameleonPlane::createGeometry() { glGenVertexArrays(1, &_quad); // generate array glGenBuffers(1, &_vertexPositionBuffer); // generate buffer @@ -236,7 +259,7 @@ bool KameleonPlane::createGeometry() { return true; } -bool KameleonPlane::destroyGeometry() { +bool RenderableKameleonPlane::destroyGeometry() { glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -246,31 +269,31 @@ bool KameleonPlane::destroyGeometry() { return true; } -void KameleonPlane::renderGeometry() const { +void RenderableKameleonPlane::renderGeometry() const { glBindVertexArray(_quad); glDrawArrays(GL_TRIANGLES, 0, 6); } -std::vector KameleonPlane::textureData() { +std::vector RenderableKameleonPlane::textureData() { DataProcessorKameleon* p = dynamic_cast(_dataProcessor.get()); p->setSlice(_slice); return p->processData(_kwPath, _dataOptions, _dimensions); } -bool KameleonPlane::updateTextureResource() { +bool RenderableKameleonPlane::updateTextureResource() { _data.offset[_cut] = _slice * _scale + _data.gridMin[_cut]; // _textureDirty = true; updateTexture(); return true; } -void KameleonPlane::setUniforms() { +void RenderableKameleonPlane::setUniforms() { setTextureUniforms(); _shader->setUniform("backgroundValues", _backgroundValues.value()); _shader->setUniform("transparency", _alpha.value()); } -void KameleonPlane::updateFieldlineSeeds() { +void RenderableKameleonPlane::updateFieldlineSeeds() { std::set selectedOptions = _fieldlines; std::vector opts = _fieldlines.options(); @@ -316,7 +339,7 @@ void KameleonPlane::updateFieldlineSeeds() { } } -void KameleonPlane::readFieldlinePaths(const std::filesystem::path& indexFile) { +void RenderableKameleonPlane::readFieldlinePaths(const std::filesystem::path& indexFile) { LINFO(std::format("Reading seed points paths from file '{}'", indexFile)); if (_group) { dynamic_cast(_group)->setFieldlineInfo( @@ -356,9 +379,9 @@ void KameleonPlane::readFieldlinePaths(const std::filesystem::path& indexFile) { } } -void KameleonPlane::subscribeToGroup() { +void RenderableKameleonPlane::subscribeToGroup() { // Subscribe to DataCygnet events - DataCygnet::subscribeToGroup(); + RenderableDataCygnet::subscribeToGroup(); //Add additional Events specific to KameleonPlane ghoul::Event& groupEvent = _group->groupEvent(); @@ -387,7 +410,7 @@ void KameleonPlane::subscribeToGroup() { ); } -void KameleonPlane::setDimensions() { +void RenderableKameleonPlane::setDimensions() { // the cdf files has an offset of 0.5 in normali resolution. // with lower resolution the offset increases. _data.offset = _origOffset - 0.5f * (100.f / _resolution); @@ -405,7 +428,7 @@ void KameleonPlane::setDimensions() { } } -void KameleonPlane::changeKwPath(std::string kwPath) { +void RenderableKameleonPlane::changeKwPath(std::string kwPath) { _kwPath = std::move(kwPath); } diff --git a/modules/iswa/rendering/kameleonplane.h b/modules/iswa/rendering/renderablekameleonplane.h similarity index 89% rename from modules/iswa/rendering/kameleonplane.h rename to modules/iswa/rendering/renderablekameleonplane.h index eb14616a99..6b51f7c8f8 100644 --- a/modules/iswa/rendering/kameleonplane.h +++ b/modules/iswa/rendering/renderablekameleonplane.h @@ -22,10 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___KAMELEONPLANE___H__ -#define __OPENSPACE_MODULE_ISWA___KAMELEONPLANE___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLEKAMELEONPLANE___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLEKAMELEONPLANE___H__ -#include +#include #include #include @@ -39,13 +39,15 @@ namespace openspace { * the planes. Interaction with the planes is possible through sliders that will move the * planes through the data volume. */ -class KameleonPlane : public DataCygnet { +class RenderableKameleonPlane : public RenderableDataCygnet { public: - explicit KameleonPlane(const ghoul::Dictionary& dictionary); - ~KameleonPlane(); + explicit RenderableKameleonPlane(const ghoul::Dictionary& dictionary); + ~RenderableKameleonPlane(); - void initializeGL() override; - void deinitializeGL() override; + void initializeGL() override; + void deinitializeGL() override; + + static documentation::Documentation Documentation(); private: /** @@ -113,4 +115,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___KAMELEONPLANE___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLEKAMELEONPLANE___H__ diff --git a/modules/iswa/rendering/texturecygnet.cpp b/modules/iswa/rendering/renderabletexturecygnet.cpp similarity index 84% rename from modules/iswa/rendering/texturecygnet.cpp rename to modules/iswa/rendering/renderabletexturecygnet.cpp index 248523b719..818f23727f 100644 --- a/modules/iswa/rendering/texturecygnet.cpp +++ b/modules/iswa/rendering/renderabletexturecygnet.cpp @@ -22,9 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include #include +#include #include #include #include @@ -35,13 +36,20 @@ namespace { namespace openspace { -TextureCygnet::TextureCygnet(const ghoul::Dictionary& dictionary) - : IswaCygnet(dictionary) +documentation::Documentation RenderableTextureCygnet::Documentation() { + documentation::Documentation doc = RenderableIswaCygnet::Documentation(); + doc.name = "RenderableTextureCygnet"; + doc.id = "iswa_renderable_texturecygnet"; + return doc; +} + +RenderableTextureCygnet::RenderableTextureCygnet(const ghoul::Dictionary& dictionary) + : RenderableIswaCygnet(dictionary) { registerProperties(); } -bool TextureCygnet::updateTexture() { +bool RenderableTextureCygnet::updateTexture() { using namespace ghoul; std::unique_ptr texture = io::TextureReader::ref().loadTexture( @@ -64,7 +72,7 @@ bool TextureCygnet::updateTexture() { return false; } -bool TextureCygnet::downloadTextureResource(double timestamp) { +bool RenderableTextureCygnet::downloadTextureResource(double timestamp) { if (_futureObject.valid()) { return false; } @@ -86,7 +94,7 @@ bool TextureCygnet::downloadTextureResource(double timestamp) { return false; } -bool TextureCygnet::updateTextureResource() { +bool RenderableTextureCygnet::updateTextureResource() { // if The future is done then get the new imageFile DownloadManager::MemoryFile imageFile; if (_futureObject.valid() && DownloadManager::futureReady(_futureObject)) { @@ -107,7 +115,7 @@ bool TextureCygnet::updateTextureResource() { return true; } -bool TextureCygnet::readyToRender() const { +bool RenderableTextureCygnet::readyToRender() const { return isReady() && ((!_textures.empty()) && _textures[0]); } diff --git a/modules/iswa/rendering/texturecygnet.h b/modules/iswa/rendering/renderabletexturecygnet.h similarity index 82% rename from modules/iswa/rendering/texturecygnet.h rename to modules/iswa/rendering/renderabletexturecygnet.h index 6d80465b7d..ba53897829 100644 --- a/modules/iswa/rendering/texturecygnet.h +++ b/modules/iswa/rendering/renderabletexturecygnet.h @@ -22,22 +22,26 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___TEXTURECYGNET___H__ -#define __OPENSPACE_MODULE_ISWA___TEXTURECYGNET___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLETEXTURECYGNET___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLETEXTURECYGNET___H__ -#include +#include namespace openspace { +namespace documentation { struct Documentation; } + /** * This class exist to abstract away the loading of images from iSWA and updating of the * textures for child geometries. The class specifies the minimum interface that child * classes needs to implement. */ -class TextureCygnet : public IswaCygnet { +class RenderableTextureCygnet : public RenderableIswaCygnet { public: - explicit TextureCygnet(const ghoul::Dictionary& dictionary); - ~TextureCygnet() = default; + explicit RenderableTextureCygnet(const ghoul::Dictionary& dictionary); + ~RenderableTextureCygnet() = default; + + static documentation::Documentation Documentation(); protected: bool updateTexture() override; @@ -50,4 +54,4 @@ private: }; } //namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___TEXTURECYGNET___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLETEXTURECYGNET___H__ diff --git a/modules/iswa/rendering/textureplane.cpp b/modules/iswa/rendering/renderabletextureplane.cpp similarity index 83% rename from modules/iswa/rendering/textureplane.cpp rename to modules/iswa/rendering/renderabletextureplane.cpp index 5e9d9cc484..bb110acccc 100644 --- a/modules/iswa/rendering/textureplane.cpp +++ b/modules/iswa/rendering/renderabletextureplane.cpp @@ -22,8 +22,9 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include +#include +#include #include #include #include @@ -33,11 +34,20 @@ namespace openspace { -TexturePlane::TexturePlane(const ghoul::Dictionary& dictionary) - : TextureCygnet(dictionary) +documentation::Documentation RenderableTexturePlane::Documentation() { + documentation::Documentation doc = RenderableTextureCygnet::Documentation(); + doc.name = "RenderableTexturePlane"; + doc.id = "iswa_renderable_textureplane"; + return doc; +} + +RenderableTexturePlane::RenderableTexturePlane(const ghoul::Dictionary& dictionary) + : RenderableTextureCygnet(dictionary) {} -void TexturePlane::initializeGL() { +void RenderableTexturePlane::initializeGL() { + RenderableTextureCygnet::initializeGL(); + if (!_shader) { _shader = global::renderEngine->buildRenderProgram( "PlaneProgram", @@ -47,7 +57,12 @@ void TexturePlane::initializeGL() { } } -void TexturePlane::setUniforms() { +void RenderableTexturePlane::deinitializeGL() { + _shader = nullptr; + RenderableTextureCygnet::deinitializeGL(); +} + +void RenderableTexturePlane::setUniforms() { ghoul::opengl::TextureUnit unit; unit.activate(); @@ -56,7 +71,7 @@ void TexturePlane::setUniforms() { _shader->setUniform("transparency", _alpha.value()); } -bool TexturePlane::createGeometry() { +bool RenderableTexturePlane::createGeometry() { glGenVertexArrays(1, &_quad); // generate array glGenBuffers(1, &_vertexPositionBuffer); // generate buffer @@ -98,7 +113,7 @@ bool TexturePlane::createGeometry() { return true; } -bool TexturePlane::destroyGeometry() { +bool RenderableTexturePlane::destroyGeometry() { glDeleteVertexArrays(1, &_quad); _quad = 0; @@ -108,7 +123,7 @@ bool TexturePlane::destroyGeometry() { return true; } -void TexturePlane::renderGeometry() const { +void RenderableTexturePlane::renderGeometry() const { glBindVertexArray(_quad); glDrawArrays(GL_TRIANGLES, 0, 6); } diff --git a/modules/iswa/rendering/textureplane.h b/modules/iswa/rendering/renderabletextureplane.h similarity index 82% rename from modules/iswa/rendering/textureplane.h rename to modules/iswa/rendering/renderabletextureplane.h index 177906aa35..c56f061137 100644 --- a/modules/iswa/rendering/textureplane.h +++ b/modules/iswa/rendering/renderabletextureplane.h @@ -22,26 +22,31 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_ISWA___TEXTUREPLANE___H__ -#define __OPENSPACE_MODULE_ISWA___TEXTUREPLANE___H__ +#ifndef __OPENSPACE_MODULE_ISWA___RENDERABLETEXTUREPLANE___H__ +#define __OPENSPACE_MODULE_ISWA___RENDERABLETEXTUREPLANE___H__ -#include +#include #include namespace openspace { +namespace documentation { struct Documentation; } + /** * TexturePlane is a "concrete" IswaCygnet with texture as its input source. It handles * the creation, destruction and rendering of a plane geometry. It also specifies which * shaders to use and the uniforms that it needs. */ -class TexturePlane : public TextureCygnet { +class RenderableTexturePlane : public RenderableTextureCygnet { public: - explicit TexturePlane(const ghoul::Dictionary& dictionary); - virtual ~TexturePlane() = default; + explicit RenderableTexturePlane(const ghoul::Dictionary& dictionary); + virtual ~RenderableTexturePlane() = default; void initializeGL() override; + void deinitializeGL() override; + + static documentation::Documentation Documentation(); private: bool createGeometry() override; @@ -55,4 +60,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_ISWA___TEXTUREPLANE___H__ +#endif // __OPENSPACE_MODULE_ISWA___RENDERABLETEXTUREPLANE___H__ diff --git a/modules/iswa/rendering/screenspacecygnet.cpp b/modules/iswa/rendering/screenspacecygnet.cpp index a195cb6cd9..2a12dfca1b 100644 --- a/modules/iswa/rendering/screenspacecygnet.cpp +++ b/modules/iswa/rendering/screenspacecygnet.cpp @@ -29,13 +29,27 @@ #include #include +namespace { + struct [[codegen::Dictionary(ScreenSpaceCygnet)]] Parameters { + int cygnetId; + int updateInterval; + }; +#include "screenspacecygnet_codegen.cpp" +} // namespace + namespace openspace { +documentation::Documentation ScreenSpaceCygnet::Documentation() { + return codegen::doc("iswa_screenspace_cygnet"); +} + ScreenSpaceCygnet::ScreenSpaceCygnet(const ghoul::Dictionary& dictionary) : ScreenSpaceImageOnline(dictionary) { - _cygnetId = static_cast(dictionary.value("CygnetId")); - _updateTime = static_cast(dictionary.value("UpdateInterval")); + const Parameters p = codegen::bake(dictionary); + + _cygnetId = p.cygnetId; + _updateTime = p.updateInterval; _downloadImage = true; _texturePath = IswaManager::ref().iswaUrl( diff --git a/modules/iswa/rendering/screenspacecygnet.h b/modules/iswa/rendering/screenspacecygnet.h index ded2be9132..72b7bc0e14 100644 --- a/modules/iswa/rendering/screenspacecygnet.h +++ b/modules/iswa/rendering/screenspacecygnet.h @@ -27,10 +27,13 @@ #include +#include #include namespace openspace { +namespace documentation { struct Documentation; } + class ScreenSpaceCygnet : public ScreenSpaceImageOnline { public: explicit ScreenSpaceCygnet(const ghoul::Dictionary& dictionary); @@ -38,6 +41,8 @@ public: virtual void update() override; + static documentation::Documentation Documentation(); + private: int _cygnetId; diff --git a/modules/iswa/util/iswamanager.cpp b/modules/iswa/util/iswamanager.cpp index 40db4b2ede..67e1c37dd4 100644 --- a/modules/iswa/util/iswamanager.cpp +++ b/modules/iswa/util/iswamanager.cpp @@ -24,14 +24,14 @@ #include -#include -#include -#include #include -#include #include #include -#include +#include +#include +#include +#include +#include #include #include #include @@ -286,10 +286,10 @@ std::string IswaManager::iswaUrl(int id, double timestamp, const std::string& ty void IswaManager::registerGroup(std::string groupName, std::string type) { if (_groups.find(groupName) == _groups.end()) { - const bool dataGroup = (type == typeid(DataPlane).name()) || - (type == typeid(DataSphere).name()); + const bool dataGroup = (type == typeid(RenderableDataPlane).name()) || + (type == typeid(RenderableDataSphere).name()); - const bool kameleonGroup = (type == typeid(KameleonPlane).name()); + const bool kameleonGroup = (type == typeid(RenderableKameleonPlane).name()); if (dataGroup) { _groups[groupName] = std::make_shared( @@ -527,10 +527,10 @@ void IswaManager::createPlane(MetadataFuture& data) { if (!data.group.empty()) { std::string type; if (data.type == CygnetType::Data) { - type = typeid(DataPlane).name(); + type = typeid(RenderableDataPlane).name(); } else { - type = typeid(TexturePlane).name(); + type = typeid(RenderableTexturePlane).name(); } registerGroup(data.group, type); @@ -565,7 +565,7 @@ void IswaManager::createSphere(MetadataFuture& data) { ); if (!data.group.empty()) { - std::string type = typeid(DataSphere).name(); + std::string type = typeid(RenderableDataSphere).name(); registerGroup(data.group, type); auto it = _groups.find(data.group); @@ -594,7 +594,7 @@ void IswaManager::createKameleonPlane(CdfInfo info, std::string cut) { std::filesystem::path ext = std::filesystem::path(absPath(info.path)).extension(); if (std::filesystem::is_regular_file(absPath(info.path)) && ext == ".cdf") { if (!info.group.empty()) { - std::string type = typeid(KameleonPlane).name(); + std::string type = typeid(RenderableKameleonPlane).name(); registerGroup(info.group, type); auto it = _groups.find(info.group); diff --git a/modules/opensoundcontrol/include/opensoundcontrolconnection.h b/modules/opensoundcontrol/include/opensoundcontrolconnection.h index 666a5feb1c..c2a76ae6fa 100644 --- a/modules/opensoundcontrol/include/opensoundcontrolconnection.h +++ b/modules/opensoundcontrol/include/opensoundcontrolconnection.h @@ -50,4 +50,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLCONNECTION___H__ +#endif // __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLCONNECTION___H__ diff --git a/modules/opensoundcontrol/opensoundcontrolmodule.h b/modules/opensoundcontrol/opensoundcontrolmodule.h index 4164c2a3c3..f420dad013 100644 --- a/modules/opensoundcontrol/opensoundcontrolmodule.h +++ b/modules/opensoundcontrol/opensoundcontrolmodule.h @@ -39,4 +39,4 @@ public: } // namespace openspace -#endif __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLMODULE___H__ +#endif // __OPENSPACE_MODULE_OPENSOUNDCONTROL___OPENSOUNDCONTROLMODULE___H__ diff --git a/modules/server/include/logging/notificationlog.h b/modules/server/include/logging/notificationlog.h index 5d4e187313..09a369fe47 100644 --- a/modules/server/include/logging/notificationlog.h +++ b/modules/server/include/logging/notificationlog.h @@ -60,7 +60,7 @@ public: * Method that logs a message with a given level and category to the console. * * \param level The log level with which the message shall be logged - * \param category The category of this message. + * \param category The category of this message * \param message The message body of the log message */ void log(ghoul::logging::LogLevel level, std::string_view category, diff --git a/modules/server/include/topics/errorlogtopic.h b/modules/server/include/topics/errorlogtopic.h index 606d421687..163df34f2e 100644 --- a/modules/server/include/topics/errorlogtopic.h +++ b/modules/server/include/topics/errorlogtopic.h @@ -52,4 +52,4 @@ private: } // namespace openspace -#endif // !__OPENSPACE_MODULE_SERVER___ERRORLOGTOPIC____H__ +#endif // __OPENSPACE_MODULE_SERVER___ERRORLOGTOPIC____H__ diff --git a/modules/server/src/topics/flightcontrollertopic.cpp b/modules/server/src/topics/flightcontrollertopic.cpp index 5088478107..1c2c364e6c 100644 --- a/modules/server/src/topics/flightcontrollertopic.cpp +++ b/modules/server/src/topics/flightcontrollertopic.cpp @@ -338,7 +338,8 @@ void FlightControllerTopic::setRenderableEnabled(const nlohmann::json& json) con const SceneGraphNode* node = global::renderEngine->scene()->sceneGraphNode(name); if (node && node->renderable() != nullptr) { properties::Property* prop = node->renderable()->property(RenderableEnabled); - properties::BoolProperty* boolProp = dynamic_cast(prop); + properties::BoolProperty* boolProp = + dynamic_cast(prop); ghoul_assert(boolProp, "Enabled is not a boolean property"); *boolProp = enabled; } @@ -367,17 +368,20 @@ void FlightControllerTopic::setFriction(bool roll, bool rotation, bool zoom) con global::navigationHandler->orbitalNavigator(); properties::Property* rollProp = navigator.property(RollFriction); - properties::BoolProperty* rollBoolProp = dynamic_cast(rollProp); + properties::BoolProperty* rollBoolProp = + dynamic_cast(rollProp); ghoul_assert(rollBoolProp, "RollFriction is not a boolean property"); *rollBoolProp = roll; properties::Property* rotProp = navigator.property(RotationalFriction); - properties::BoolProperty* rotBoolProp = dynamic_cast(rotProp); + properties::BoolProperty* rotBoolProp = + dynamic_cast(rotProp); ghoul_assert(rotBoolProp, "RotationFriction is not a boolean property"); *rotBoolProp = rotation; properties::Property* zoomProp = navigator.property(ZoomFriction); - properties::BoolProperty* zoomBoolProp = dynamic_cast(zoomProp); + properties::BoolProperty* zoomBoolProp = + dynamic_cast(zoomProp); ghoul_assert(zoomBoolProp, "ZoomFriction is not a boolean property"); *zoomBoolProp = zoom; diff --git a/modules/server/src/topics/profiletopic.cpp b/modules/server/src/topics/profiletopic.cpp index 37cbe50cbc..3cf8b9d370 100644 --- a/modules/server/src/topics/profiletopic.cpp +++ b/modules/server/src/topics/profiletopic.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace openspace { @@ -43,9 +44,14 @@ void ProfileTopic::handleJson(const nlohmann::json&) { nlohmann::json data = { { "uiPanelVisibility", global::profile->uiPanelVisibility }, { "markNodes", global::profile->markNodes }, - { "filePath", global::configuration->profile } + { "filePath", global::configuration->profile }, }; + Settings settings = loadSettings(); + if (settings.hasStartedBefore.has_value()) { + data["hasStartedBefore"] = settings.hasStartedBefore.value(); + } + if (global::profile->meta.has_value()) { data["name"] = global::profile->meta->name.value_or(""); diff --git a/modules/server/src/topics/subscriptiontopic.cpp b/modules/server/src/topics/subscriptiontopic.cpp index 00f1d433ca..d6e011bbda 100644 --- a/modules/server/src/topics/subscriptiontopic.cpp +++ b/modules/server/src/topics/subscriptiontopic.cpp @@ -105,7 +105,7 @@ void SubscriptionTopic::handleJson(const nlohmann::json& json) { // Immediately send the value and meta data onChange(); - onMetaDataChange(); + onMetaDataChange(); } else { LWARNING(std::format("Could not subscribe. Property '{}' not found", uri)); diff --git a/modules/skybrowser/CMakeLists.txt b/modules/skybrowser/CMakeLists.txt index a7ad98298b..a634cf77e5 100644 --- a/modules/skybrowser/CMakeLists.txt +++ b/modules/skybrowser/CMakeLists.txt @@ -31,7 +31,6 @@ set(HEADER_FILES include/utility.h include/targetbrowserpair.h include/wwtcommunicator.h - include/browser.h include/screenspaceskybrowser.h ) source_group("Header Files" FILES ${HEADER_FILES}) @@ -44,7 +43,6 @@ set(SOURCE_FILES src/utility.cpp src/targetbrowserpair.cpp src/wwtcommunicator.cpp - src/browser.cpp src/screenspaceskybrowser.cpp ) source_group("Source Files" FILES ${SOURCE_FILES}) diff --git a/modules/skybrowser/include/browser.h b/modules/skybrowser/include/browser.h deleted file mode 100644 index b669f8d75b..0000000000 --- a/modules/skybrowser/include/browser.h +++ /dev/null @@ -1,113 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2025 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#ifndef __OPENSPACE_MODULE_SKYBROWSER___BROWSER___H__ -#define __OPENSPACE_MODULE_SKYBROWSER___BROWSER___H__ - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable : 4100) -#endif // _MSC_VER - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunused-parameter" -#endif // __clang__ - -#include - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif // __clang__ - -#ifdef _MSC_VER -#pragma warning (pop) -#endif // _MSC_VER - -namespace ghoul::opengl { class Texture; } - -namespace openspace { - -class BrowserInstance; -class RenderHandler; -class WebKeyboardHandler; - -class Browser { -public: - explicit Browser(const ghoul::Dictionary& dictionary); - virtual ~Browser(); - - void initializeGL(); - void deinitializeGL(); - bool isReady() const; - - void render(); - void update(); - - void updateBrowserSize(); - void reload(); - - void setRatio(float ratio); - float browserRatio() const; - -protected: - properties::IVec2Property _browserDimensions; - properties::StringProperty _url; - properties::TriggerProperty _reload; - - std::unique_ptr _texture; - - void updateBrowserDimensions(); - void executeJavascript(const std::string& script) const; - - bool _isUrlDirty = false; - bool _isDimensionsDirty = false; - bool _shouldReload = false; - -private: - class RenderHandler : public WebRenderHandler { - public: - RenderHandler() - : WebRenderHandler(false) - {} - void draw() override; - void render() override; - - void setTexture(GLuint t); - }; - - CefRefPtr _renderHandler; - CefRefPtr _keyboardHandler; - std::unique_ptr _browserInstance; -}; - -} // namespace openspace - -#endif // __OPENSPACE_MODULE_SKYBROWSER___BROWSER___H__ diff --git a/modules/skybrowser/include/screenspaceskybrowser.h b/modules/skybrowser/include/screenspaceskybrowser.h index 2264427062..e5be43252d 100644 --- a/modules/skybrowser/include/screenspaceskybrowser.h +++ b/modules/skybrowser/include/screenspaceskybrowser.h @@ -25,7 +25,7 @@ #ifndef __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYBROWSER___H__ #define __OPENSPACE_MODULE_SKYBROWSER___SCREENSPACESKYBROWSER___H__ -#include +#include #include #include @@ -35,56 +35,84 @@ namespace openspace { -class ScreenSpaceSkyBrowser : public ScreenSpaceRenderable, public WwtCommunicator { +class ScreenSpaceSkyBrowser : public ScreenSpaceBrowser { public: explicit ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary); ~ScreenSpaceSkyBrowser() override; - void initializeGL() override; - void deinitializeGL() override; - - glm::mat4 scaleMatrix() override; void render(const RenderData& renderData) override; void update() override; - float opacity() const noexcept override; - glm::dvec2 fineTuneVector(const glm::dvec2& drag); + // Getters bool isInitialized() const; bool isPointingSpacecraft() const; bool shouldUpdateWhileTargetAnimates() const; + double verticalFov() const; + glm::ivec3 borderColor() const; + double borderRadius() const; + void setTargetRoll(double roll); + glm::dvec2 fieldsOfView() const; + glm::dvec2 equatorialAim() const; + double browserRatio() const; - double setVerticalFovWithScroll(float scroll); - void setIdInBrowser() const; + // Setters void setIsInitialized(bool isInitialized); void setPointSpaceCraft(bool shouldPoint); + void setVerticalFov(double vfov); + void setEquatorialAim(glm::dvec2 equatorial); + void setBorderColor(glm::ivec3 color); + double setVerticalFovWithScroll(float scroll); + void setBorderRadius(double radius); + void setRatio(double ratio); + void setIdInBrowser() const; + glm::dvec2 fineTuneVector(const glm::dvec2& drag); + void updateBorderColor(); void updateTextureResolution(); + void reload(); - // Copies rendered + // Display copies rendered void addDisplayCopy(const glm::vec3& raePosition, int nCopies); void removeDisplayCopy(); std::vector> displayCopies() const; std::vector> showDisplayCopies() const; + ghoul::Dictionary data() const; + + WwtCommunicator* worldWideTelescope(); + static documentation::Documentation Documentation(); private: static constexpr int RadiusTimeOut = 25; - properties::FloatProperty _textureQuality; properties::BoolProperty _isHidden; properties::BoolProperty _isPointingSpacecraft; properties::BoolProperty _updateDuringTargetAnimation; std::vector> _displayCopies; std::vector> _showDisplayCopies; - void bindTexture() override; + properties::DoubleProperty _verticalFov; + + double _borderRadius = 0.0; + glm::ivec3 _wwtBorderColor = glm::ivec3(70); + glm::dvec2 _equatorialAim = glm::dvec2(0.0); + double _targetRoll = 0.0; + + WwtCommunicator _wwtCommunicator; + // Time variables + // For capping the message passing to WWT + static constexpr std::chrono::milliseconds TimeUpdateInterval = + std::chrono::milliseconds(10); + std::chrono::system_clock::time_point _lastUpdateTime; + + bool _borderColorIsDirty = false; + bool _equatorialAimIsDirty = false; + bool _isDimensionsDirty = false; // Flags bool _isInitialized = false; bool _radiusIsDirty = false; int _borderRadiusTimer = -1; - - float _lastTextureQuality = 1.f; }; } // namespace openspace diff --git a/modules/skybrowser/include/targetbrowserpair.h b/modules/skybrowser/include/targetbrowserpair.h index 7c017bff77..b5956d07de 100644 --- a/modules/skybrowser/include/targetbrowserpair.h +++ b/modules/skybrowser/include/targetbrowserpair.h @@ -58,26 +58,21 @@ public: // Browser void sendIdToBrowser() const; std::vector> displayCopies() const; + void addDisplayCopy(glm::vec3 position, int nCopies); + void removeDisplayCopy(); // Target void centerTargetOnScreen(); double targetRoll() const; + bool pointSpaceCraft() const; + void applyRoll(); + void reloadBrowser(); + // Getters bool isFacingCamera() const; + bool isInitialized() const; bool isUsingRadiusAzimuthElevation() const; bool isEnabled() const; - - void setEnabled(bool enable); - void setVerticalFov(double vfov); - void setEquatorialAim(const glm::dvec2& aim); - void setBorderColor(const glm::ivec3& color); - void setBorderRadius(double radius); - void setBrowserRatio(float ratio); - void setVerticalFovWithScroll(float scroll); - void setImageCollectionIsLoaded(bool isLoaded); - void setPointSpaceCraft(bool shouldPoint); - void applyRoll(); - double verticalFov() const; glm::ivec3 borderColor() const; glm::dvec2 targetDirectionEquatorial() const; @@ -86,11 +81,20 @@ public: std::string browserId() const; std::string targetRenderableId() const; std::string targetNodeId() const; - bool pointSpaceCraft() const; - - ScreenSpaceSkyBrowser* browser() const; std::vector selectedImages() const; + // Setters + void setEnabled(bool enable); + void setVerticalFov(double vfov); + void setEquatorialAim(const glm::dvec2& aim); + void setBorderColor(const glm::ivec3& color); + void setBorderRadius(double radius); + void setBrowserRatio(float ratio); + void setBrowserIsInitialized(bool initialized); + void setVerticalFovWithScroll(float scroll); + void setImageCollectionIsLoaded(bool isLoaded); + void setPointSpaceCraft(bool shouldPoint); + ghoul::Dictionary dataAsDictionary() const; // WorldWide Telescope image handling @@ -101,7 +105,6 @@ public: void loadImageCollection(const std::string& collection); void setImageOpacity(const std::string& imageUrl, float opacity); void hideChromeInterface(); - private: // Target and browser RenderableSkyTarget* _targetRenderable = nullptr; diff --git a/modules/skybrowser/include/wwtcommunicator.h b/modules/skybrowser/include/wwtcommunicator.h index 6953e7e49e..2495ea56bc 100644 --- a/modules/skybrowser/include/wwtcommunicator.h +++ b/modules/skybrowser/include/wwtcommunicator.h @@ -25,7 +25,7 @@ #ifndef __OPENSPACE_MODULE_SKYBROWSER___WWTCOMMUNICATOR___H__ #define __OPENSPACE_MODULE_SKYBROWSER___WWTCOMMUNICATOR___H__ -#include +#include #include #include @@ -33,12 +33,10 @@ namespace openspace { using SelectedImageDeque = std::deque>; -class WwtCommunicator : public Browser { +class WwtCommunicator { public: - explicit WwtCommunicator(const ghoul::Dictionary& dictionary); - ~WwtCommunicator() override = default; - - void update(); + explicit WwtCommunicator(BrowserInstance* browserInstance); + ~WwtCommunicator() = default; // WorldWide Telescope communication void selectImage(const std::string& imageUrl); @@ -51,48 +49,26 @@ public: bool isImageCollectionLoaded() const; - double verticalFov() const; - glm::ivec3 borderColor() const; - glm::dvec2 equatorialAim() const; - glm::dvec2 fieldsOfView() const; std::vector selectedImages() const; std::vector opacities() const; - double borderRadius() const; void setImageCollectionIsLoaded(bool isLoaded); - void setVerticalFov(double vfov); - void setEquatorialAim(glm::dvec2 equatorial); + void setAim(glm::dvec2 equatorialAim, double vFov, double roll); void setBorderColor(glm::ivec3 color); void setBorderRadius(double radius); - void setTargetRoll(double roll); - void updateBorderColor() const; - void updateAim() const; - -protected: void setIdInBrowser(const std::string& id) const; SelectedImageDeque::iterator findSelectedImage(const std::string& imageUrl); - properties::DoubleProperty _verticalFov; +private: + void executeJavascript(const std::string& script) const; + void sendMessageToWwt(const ghoul::Dictionary& msg) const; - double _borderRadius = 0.0; - glm::ivec3 _wwtBorderColor = glm::ivec3(70); - glm::dvec2 _equatorialAim = glm::dvec2(0.0); - double _targetRoll = 0.0; bool _isImageCollectionLoaded = false; SelectedImageDeque _selectedImages; -private: - void sendMessageToWwt(const ghoul::Dictionary& msg) const; - bool _borderColorIsDirty = false; - bool _equatorialAimIsDirty = false; - - // Time variables - // For capping the message passing to WWT - static constexpr std::chrono::milliseconds TimeUpdateInterval = - std::chrono::milliseconds(10); - std::chrono::system_clock::time_point _lastUpdateTime; + BrowserInstance* _browserInstance = nullptr; }; } // namespace openspace diff --git a/modules/skybrowser/skybrowsermodule.cpp b/modules/skybrowser/skybrowsermodule.cpp index 5a532a3ba9..fe50ba3371 100644 --- a/modules/skybrowser/skybrowsermodule.cpp +++ b/modules/skybrowser/skybrowsermodule.cpp @@ -363,7 +363,8 @@ void SkyBrowserModule::disableHoverCircle(bool useScript) { } else { properties::Property* prop = _hoverCircle->renderable()->property("Fade"); - properties::FloatProperty* floatProp = dynamic_cast(prop); + properties::FloatProperty* floatProp = + dynamic_cast(prop); ghoul_assert(floatProp, "Fade property is not a float property"); *floatProp = 0.f; } diff --git a/modules/skybrowser/skybrowsermodule_lua.inl b/modules/skybrowser/skybrowsermodule_lua.inl index 64665110c3..0c2e31df03 100644 --- a/modules/skybrowser/skybrowsermodule_lua.inl +++ b/modules/skybrowser/skybrowsermodule_lua.inl @@ -79,17 +79,17 @@ std::string prunedIdentifier(std::string identifier) { if (id != "all") { TargetBrowserPair* pair = module->pair(id); if (pair) { - pair->browser()->setIsInitialized(false); - pair->browser()->setImageCollectionIsLoaded(false); - pair->browser()->reload(); + pair->setBrowserIsInitialized(false); + pair->setImageCollectionIsLoaded(false); + pair->reloadBrowser(); } } else { const std::vector>& pairs = module->pairs(); for (const std::unique_ptr& pair : pairs) { - pair->browser()->setIsInitialized(false); - pair->browser()->setImageCollectionIsLoaded(false); - pair->browser()->reload(); + pair->setBrowserIsInitialized(false); + pair->setImageCollectionIsLoaded(false); + pair->reloadBrowser(); } } } @@ -224,7 +224,7 @@ std::string prunedIdentifier(std::string identifier) { TargetBrowserPair* pair = module->pair(prunedId); if (pair) { pair->hideChromeInterface(); - pair->browser()->loadImageCollection(module->wwtImageCollectionUrl()); + pair->loadImageCollection(module->wwtImageCollectionUrl()); } } @@ -649,7 +649,7 @@ std::string prunedIdentifier(std::string identifier) { SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->browser()->removeSelectedImage(imageUrl); + pair->removeSelectedImage(imageUrl); } } @@ -726,7 +726,7 @@ std::string prunedIdentifier(std::string identifier) { SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); // Make sure the webpage has loaded properly before executing javascript on it - if (pair && pair->browser()->isInitialized()) { + if (pair && pair->isInitialized()) { pair->setBorderRadius(std::clamp(radius, 0.0, 1.0)); } } @@ -760,7 +760,7 @@ std::string prunedIdentifier(std::string identifier) { SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->browser()->addDisplayCopy(position, numberOfCopies); + pair->addDisplayCopy(position, numberOfCopies); } } @@ -773,7 +773,7 @@ std::string prunedIdentifier(std::string identifier) { SkyBrowserModule* module = global::moduleEngine->module(); TargetBrowserPair* pair = module->pair(identifier); if (pair) { - pair->browser()->removeDisplayCopy(); + pair->removeDisplayCopy(); } } @@ -832,7 +832,7 @@ std::string prunedIdentifier(std::string identifier) { std::optional img = module->wwtDataHandler().image(imageUrl); ghoul_assert(img.has_value(), "No image found"); // Index of image is used as layer ID as it's unique in the image data set - pair->browser()->addImageLayerToWwt(img->imageUrl); + pair->addImageLayerToWwt(img->imageUrl); } ); } diff --git a/modules/skybrowser/src/browser.cpp b/modules/skybrowser/src/browser.cpp deleted file mode 100644 index 076260785a..0000000000 --- a/modules/skybrowser/src/browser.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/***************************************************************************************** - * * - * OpenSpace * - * * - * Copyright (c) 2014-2025 * - * * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this * - * software and associated documentation files (the "Software"), to deal in the Software * - * without restriction, including without limitation the rights to use, copy, modify, * - * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * - * permit persons to whom the Software is furnished to do so, subject to the following * - * conditions: * - * * - * The above copyright notice and this permission notice shall be included in all copies * - * or substantial portions of the Software. * - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * - * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * - * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * - * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - ****************************************************************************************/ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { - constexpr std::string_view _loggerCat = "Browser"; - - constexpr openspace::properties::Property::PropertyInfo DimensionsInfo = { - "Dimensions", - "Browser Dimensions", - "Set the dimensions of the web browser window.", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo UrlInfo = { - "Url", - "URL", - "The URL to load.", - openspace::properties::Property::Visibility::AdvancedUser - }; - - constexpr openspace::properties::Property::PropertyInfo ReloadInfo = { - "Reload", - "Reload", - "Reload the web browser.", - openspace::properties::Property::Visibility::User - }; - - struct [[codegen::Dictionary(Browser)]] Parameters { - // [[codegen::verbatim(DimensionsInfo.description)]] - std::optional dimensions; - - // [[codegen::verbatim(UrlInfo.description)]] - std::optional url; - - // [[codegen::verbatim(ReloadInfo.description)]] - std::optional reload; - }; - -#include "browser_codegen.cpp" -} // namespace - -namespace openspace { - -void Browser::RenderHandler::draw() {} - -void Browser::RenderHandler::render() {} - -void Browser::RenderHandler::setTexture(GLuint t) { - _texture = t; -} - -Browser::Browser(const ghoul::Dictionary& dictionary) - : _browserDimensions( - DimensionsInfo, - glm::vec2(1000.f), - glm::vec2(10.f), - glm::vec2(3000.f) - ) - , _url(UrlInfo) - , _reload(ReloadInfo) - , _renderHandler(new RenderHandler) - , _keyboardHandler(new WebKeyboardHandler) - , _browserInstance( - std::make_unique(_renderHandler.get(), _keyboardHandler.get()) - ) -{ - const Parameters p = codegen::bake(dictionary); - - _url = p.url.value_or(_url); - _url.onChange([this]() { _isUrlDirty = true; }); - - _browserDimensions = p.dimensions.value_or(_browserDimensions); - _browserDimensions.onChange([this]() { _isDimensionsDirty = true; }); - - _reload.onChange([this]() { _shouldReload = true; }); - - // Create browser and render handler - _browserInstance = std::make_unique( - _renderHandler.get(), - _keyboardHandler.get(), - false - ); - - WebBrowserModule* webBrowser = global::moduleEngine->module(); - if (webBrowser) { - webBrowser->addBrowser(_browserInstance.get()); - } -} - -Browser::~Browser() {} - -void Browser::initializeGL() { - _texture = std::make_unique( - glm::uvec3(glm::ivec2(_browserDimensions.value()), 1), - GL_TEXTURE_2D - ); - - _renderHandler->setTexture(*_texture); - - _browserInstance->initialize(); - _browserInstance->loadUrl(_url); - // Update the dimensions upon initialization. Do this with flag as it affects - // derived classes as well - _isDimensionsDirty = true; -} - -void Browser::deinitializeGL() { - _renderHandler->setTexture(0); - - _texture = nullptr; - - LDEBUG(std::format("Deinitializing browser '{}'", _url.value())); - - _browserInstance->close(true); - - WebBrowserModule* webBrowser = global::moduleEngine->module(); - if (webBrowser) { - webBrowser->removeBrowser(_browserInstance.get()); - _browserInstance.reset(); - } - else { - LWARNING("Could not find WebBrowserModule"); - } -} - -void Browser::render() { - if (_renderHandler->isTextureReady()) { - _renderHandler->updateTexture(); - } -} - -void Browser::update() { - if (_isUrlDirty) { - _browserInstance->loadUrl(_url); - _isUrlDirty = false; - } - - if (_isDimensionsDirty) { - updateBrowserDimensions(); - } - - if (_shouldReload) { - _browserInstance->reloadBrowser(); - _shouldReload = false; - } -} - -bool Browser::isReady() const { - return _texture != nullptr; -} - -// Updates the browser size to match the size of the texture -void Browser::updateBrowserSize() { - _browserDimensions = _texture->dimensions(); -} - -void Browser::reload() { - _reload.trigger(); -} - -void Browser::setRatio(float ratio) { - const float relativeRatio = ratio / browserRatio(); - const float newX = static_cast(_browserDimensions.value().x) * relativeRatio; - _browserDimensions = { - static_cast(std::floor(newX)), - _browserDimensions.value().y - }; - _isDimensionsDirty = true; -} - -float Browser::browserRatio() const { - return static_cast(_texture->dimensions().x) / - static_cast(_texture->dimensions().y); -} - -void Browser::updateBrowserDimensions() { - const glm::ivec2 dim = _browserDimensions; - if (dim.x > 0 && dim.y > 0) { - _texture->setDimensions(glm::uvec3(_browserDimensions.value(), 1)); - _browserInstance->reshape(dim); - _isDimensionsDirty = false; - } -} - -void Browser::executeJavascript(const std::string& script) const { - // Make sure that the browser has a main frame - const bool browserExists = _browserInstance && _browserInstance->getBrowser(); - const bool frameIsLoaded = - browserExists && _browserInstance->getBrowser()->GetMainFrame(); - - if (frameIsLoaded) { - const CefRefPtr frame = _browserInstance->getBrowser()->GetMainFrame(); - frame->ExecuteJavaScript(script, frame->GetURL(), 0); - } -} - -} // namespace openspace diff --git a/modules/skybrowser/src/screenspaceskybrowser.cpp b/modules/skybrowser/src/screenspaceskybrowser.cpp index e6a30111bd..2f7a66a185 100644 --- a/modules/skybrowser/src/screenspaceskybrowser.cpp +++ b/modules/skybrowser/src/screenspaceskybrowser.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -88,6 +89,13 @@ namespace { openspace::properties::Property::Visibility::User }; + constexpr openspace::properties::Property::PropertyInfo VerticalFovInfo = { + "VerticalFov", + "Vertical Field Of View", + "The vertical field of view of the target.", + openspace::properties::Property::Visibility::AdvancedUser + }; + // This `ScreenSpaceRenderable` is used to display a screen space window showing the // integrated World Wide Telescope view. The view will be dynamically updated when // interacting with the view or with images in the SkyBrowser panel. @@ -107,6 +115,9 @@ namespace { // [[codegen::verbatim(UpdateDuringAnimationInfo.description)]] std::optional updateDuringTargetAnimation; + + // [[codegen::verbatim(VerticalFovInfo.description)]] + std::optional verticalFov; }; #include "screenspaceskybrowser_codegen.cpp" @@ -133,35 +144,37 @@ documentation::Documentation ScreenSpaceSkyBrowser::Documentation() { } ScreenSpaceSkyBrowser::ScreenSpaceSkyBrowser(const ghoul::Dictionary& dictionary) - : ScreenSpaceRenderable(dictionary) - , WwtCommunicator(dictionary) - , _textureQuality(TextureQualityInfo, 1.f, 0.25f, 1.f) + : ScreenSpaceBrowser(dictionary) , _isHidden(IsHiddenInfo, true) , _isPointingSpacecraft(PointSpacecraftInfo, false) - , _updateDuringTargetAnimation(UpdateDuringAnimationInfo, false) + , _updateDuringTargetAnimation(UpdateDuringAnimationInfo, true) + , _verticalFov(VerticalFovInfo, 10.0, 0.00000000001, 70.0) + , _wwtCommunicator(_browserInstance.get()) + { _identifier = makeUniqueIdentifier(_identifier); // Handle target dimension property const Parameters p = codegen::bake(dictionary); - _textureQuality = p.textureQuality.value_or(_textureQuality); _isHidden = p.isHidden.value_or(_isHidden); _isPointingSpacecraft = p.pointSpacecraft.value_or(_isPointingSpacecraft); _updateDuringTargetAnimation = p.updateDuringTargetAnimation.value_or( _updateDuringTargetAnimation ); + _verticalFov = p.verticalFov.value_or(_verticalFov); + _verticalFov.setReadOnly(true); + addProperty(_isHidden); - addProperty(_url); - addProperty(_browserDimensions); - addProperty(_reload); - addProperty(_textureQuality); addProperty(_verticalFov); addProperty(_isPointingSpacecraft); addProperty(_updateDuringTargetAnimation); - _textureQuality.onChange([this]() { _isDimensionsDirty = true; }); + _reload.onChange([this]() { + _wwtCommunicator.setImageCollectionIsLoaded(false); + _isInitialized = false; + }); if (global::windowDelegate->isMaster()) { _wwtBorderColor = randomBorderColor(); @@ -191,12 +204,8 @@ ScreenSpaceSkyBrowser::~ScreenSpaceSkyBrowser() { } } -void ScreenSpaceSkyBrowser::initializeGL() { - WwtCommunicator::initializeGL(); - // @TODO (ylvse, 2024-08-23) Remove this once the skybrowser has been rewritten - ghoul::Dictionary dict; - dict.setValue("useAcceleratedRendering", false); - createShaders(dict); +void ScreenSpaceSkyBrowser::updateBorderColor() { + _borderColorIsDirty = true; } glm::dvec2 ScreenSpaceSkyBrowser::fineTuneVector(const glm::dvec2& drag) { @@ -228,7 +237,11 @@ bool ScreenSpaceSkyBrowser::shouldUpdateWhileTargetAnimates() const { void ScreenSpaceSkyBrowser::setIdInBrowser() const { int currentNode = global::windowDelegate->currentNode(); - WwtCommunicator::setIdInBrowser(std::format("{}_{}", identifier(), currentNode)); + _wwtCommunicator.setIdInBrowser(std::format("{}_{}", identifier(), currentNode)); +} + +double ScreenSpaceSkyBrowser::verticalFov() const { + return _verticalFov; } void ScreenSpaceSkyBrowser::setIsInitialized(bool isInitialized) { @@ -240,17 +253,11 @@ void ScreenSpaceSkyBrowser::setPointSpaceCraft(bool shouldPoint) { } void ScreenSpaceSkyBrowser::updateTextureResolution() { - // Check if texture quality has changed. If it has, adjust accordingly - if (std::abs(_textureQuality.value() - _lastTextureQuality) > glm::epsilon()) { - const float diffTextureQuality = _textureQuality / _lastTextureQuality; - const glm::vec2 res = glm::vec2(_browserDimensions.value()) * diffTextureQuality; - _browserDimensions = glm::ivec2(res); - _lastTextureQuality = _textureQuality.value(); - } - _objectSize = glm::ivec3(_browserDimensions.value(), 1); + _objectSize = glm::ivec3(_dimensions.value(), 1); // The radius has to be updated when the texture resolution has changed _radiusIsDirty = true; + _isDimensionsDirty = false; _borderRadiusTimer = 0; } @@ -316,21 +323,42 @@ ScreenSpaceSkyBrowser::showDisplayCopies() const return vec; } -void ScreenSpaceSkyBrowser::deinitializeGL() { - ScreenSpaceRenderable::deinitializeGL(); - WwtCommunicator::deinitializeGL(); +ghoul::Dictionary ScreenSpaceSkyBrowser::data() const { + ghoul::Dictionary res; + std::vector color = { _wwtBorderColor.r, _wwtBorderColor.g, _wwtBorderColor.b }; + + res.setValue("fov", verticalFov()); + res.setValue("roll", _targetRoll); + res.setValue("isFacingCamera", isFacingCamera()); + res.setValue("isUsingRae", isUsingRaeCoords()); + res.setValue("scale", static_cast(scale())); + res.setValue("ratio", browserRatio()); + res.setValue("borderRadius", borderRadius()); + res.setValue("opacities", _wwtCommunicator.opacities()); + res.setValue("color", color); + + std::vector> copies = displayCopies(); + std::vector> showCopies = showDisplayCopies(); + ghoul::Dictionary copiesData; + for (size_t i = 0; i < copies.size(); i++) { + ghoul::Dictionary copy; + copy.setValue("position", copies[i].second); + copy.setValue("show", showCopies[i].second); + copy.setValue("idShowProperty", showCopies[i].first); + copiesData.setValue(copies[i].first, copy); + } + // Set table for the current target + res.setValue("displayCopies", copiesData); + return res; +} + +WwtCommunicator* ScreenSpaceSkyBrowser::worldWideTelescope() { + return &_wwtCommunicator; } void ScreenSpaceSkyBrowser::render(const RenderData& renderData) { - WwtCommunicator::render(); - if (!_isHidden) { - const glm::mat4 mat = - globalRotationMatrix() * - translationMatrix() * - localRotationMatrix() * - scaleMatrix(); - draw(mat, renderData); + ScreenSpaceBrowser::render(renderData); } // Render the display copies @@ -354,30 +382,94 @@ void ScreenSpaceSkyBrowser::render(const RenderData& renderData) { glm::translate(glm::mat4(1.f), coordinates) * localRotation * scaleMatrix(); - draw(mat, renderData); + draw(mat, renderData, true); } } } +glm::ivec3 ScreenSpaceSkyBrowser::borderColor() const { + return _wwtBorderColor; +} + +double ScreenSpaceSkyBrowser::borderRadius() const { + return _borderRadius; +} + +void ScreenSpaceSkyBrowser::setTargetRoll(double roll) { + _equatorialAimIsDirty = true; + _targetRoll = roll; +} + +glm::dvec2 ScreenSpaceSkyBrowser::fieldsOfView() const { + const double vFov = verticalFov(); + const double hFov = vFov * browserRatio(); + return glm::dvec2(hFov, vFov); +} + +glm::dvec2 ScreenSpaceSkyBrowser::equatorialAim() const { + return _equatorialAim; +} + +void ScreenSpaceSkyBrowser::setVerticalFov(double vfov) { + _equatorialAimIsDirty = true; + _verticalFov = vfov; +} + +void ScreenSpaceSkyBrowser::setEquatorialAim(glm::dvec2 equatorial) { + _equatorialAim = std::move(equatorial); + _equatorialAimIsDirty = true; +} + +void ScreenSpaceSkyBrowser::setBorderColor(glm::ivec3 color) { + _wwtBorderColor = std::move(color); + _borderColorIsDirty = true; +} + +double ScreenSpaceSkyBrowser::browserRatio() const { + if (_dimensions.value().y > 0) { + return static_cast(_dimensions.value().x) / + static_cast(_dimensions.value().y); + } + else { + return std::numeric_limits::max(); + } +} + +void ScreenSpaceSkyBrowser::reload() { + _browserInstance->reloadBrowser(); +} + void ScreenSpaceSkyBrowser::update() { + // Cap how messages are passed + const std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + const std::chrono::system_clock::duration timeSinceLastUpdate = now - _lastUpdateTime; + + if (timeSinceLastUpdate > TimeUpdateInterval) { + if (_equatorialAimIsDirty) { + _wwtCommunicator.setAim(_equatorialAim, _verticalFov, _targetRoll); + _equatorialAimIsDirty = false; + } + if (_borderColorIsDirty) { + _wwtCommunicator.setBorderColor(_wwtBorderColor); + _borderColorIsDirty = false; + } + _lastUpdateTime = std::chrono::system_clock::now(); + } + // Check for dirty flags if (_isDimensionsDirty) { updateTextureResolution(); } - if (_shouldReload) { - _isInitialized = false; - } // After the texture has been updated, wait a little bit before updating the border // radius so the browser has time to update its size - if (_radiusIsDirty && _isInitialized && _borderRadiusTimer == RadiusTimeOut) { - setBorderRadius(_borderRadius); + if (_radiusIsDirty && _isInitialized && _borderRadiusTimer > RadiusTimeOut) { + _wwtCommunicator.setBorderRadius(_borderRadius); _radiusIsDirty = false; _borderRadiusTimer = -1; } _borderRadiusTimer++; - ScreenSpaceRenderable::update(); - WwtCommunicator::update(); + ScreenSpaceBrowser::update(); } double ScreenSpaceSkyBrowser::setVerticalFovWithScroll(float scroll) { @@ -391,24 +483,18 @@ double ScreenSpaceSkyBrowser::setVerticalFovWithScroll(float scroll) { return _verticalFov; } -void ScreenSpaceSkyBrowser::bindTexture() { - _texture->bind(); +void ScreenSpaceSkyBrowser::setBorderRadius(double radius) { + _borderRadius = radius; + _radiusIsDirty = true; } -glm::mat4 ScreenSpaceSkyBrowser::scaleMatrix() { - // To ensure the plane has the right ratio - // The _scale tells us how much of the windows height the browser covers: e.g. a - // browser that covers 0.25 of the height of the window will have scale = 0.25 - - glm::mat4 scale = glm::scale( - glm::mat4(1.f), - glm::vec3(browserRatio() * _scale, _scale, 1.f) +void ScreenSpaceSkyBrowser::setRatio(double ratio) { + _radiusIsDirty = true; + _isDimensionsDirty = true; + _dimensions = glm::uvec2( + static_cast(_dimensions.value().y * ratio), + _dimensions.value().y ); - return scale; -} - -float ScreenSpaceSkyBrowser::opacity() const noexcept { - return _opacity; } } // namespace openspace diff --git a/modules/skybrowser/src/targetbrowserpair.cpp b/modules/skybrowser/src/targetbrowserpair.cpp index 3df56efb83..d6b2e1e390 100644 --- a/modules/skybrowser/src/targetbrowserpair.cpp +++ b/modules/skybrowser/src/targetbrowserpair.cpp @@ -67,7 +67,7 @@ TargetBrowserPair::TargetBrowserPair(SceneGraphNode* targetNode, } void TargetBrowserPair::setImageOrder(const std::string& imageUrl, int order) { - _browser->setImageOrder(imageUrl, order); + _browser->worldWideTelescope()->setImageOrder(imageUrl, order); } void TargetBrowserPair::startFinetuningTarget() { @@ -115,7 +115,7 @@ void TargetBrowserPair::initialize() { const glm::vec2 dim = _browser->screenSpaceDimensions(); _targetRenderable->setRatio(dim.x / dim.y); _browser->updateBorderColor(); - _browser->hideChromeInterface(); + _browser->worldWideTelescope()->hideChromeInterface(); _browser->setIsInitialized(true); } @@ -159,7 +159,7 @@ double TargetBrowserPair::verticalFov() const { } std::vector TargetBrowserPair::selectedImages() const { - return _browser->selectedImages(); + return _browser->worldWideTelescope()->selectedImages(); } ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { @@ -176,43 +176,21 @@ ghoul::Dictionary TargetBrowserPair::dataAsDictionary() const { ); } - ghoul::Dictionary res; + ghoul::Dictionary res = _browser->data(); res.setValue("id", browserId()); res.setValue("targetId", targetNodeId()); res.setValue("name", browserGuiName()); - res.setValue("fov", static_cast(verticalFov())); res.setValue("ra", spherical.x); res.setValue("dec", spherical.y); - res.setValue("roll", targetRoll()); - res.setValue("color", borderColor()); res.setValue("cartesianDirection", cartesian); - res.setValue("ratio", static_cast(_browser->browserRatio())); - res.setValue("isFacingCamera", isFacingCamera()); - res.setValue("isUsingRae", isUsingRadiusAzimuthElevation()); res.setValue("selectedImages", selectedImagesIndices); - res.setValue("scale", static_cast(_browser->scale())); - res.setValue("opacities", _browser->opacities()); - res.setValue("borderRadius", _browser->borderRadius()); - - std::vector> copies = displayCopies(); - std::vector> showCopies = _browser->showDisplayCopies(); - ghoul::Dictionary copiesData; - for (size_t i = 0; i < copies.size(); i++) { - ghoul::Dictionary copy; - copy.setValue("position", copies[i].second); - copy.setValue("show", showCopies[i].second); - copy.setValue("idShowProperty", showCopies[i].first); - copiesData.setValue(copies[i].first, copy); - } - // Set table for the current target - res.setValue("displayCopies", copiesData); return res; } void TargetBrowserPair::selectImage(const ImageData& image) { // Load image into browser - _browser->selectImage(image.imageUrl); + _browser->worldWideTelescope()->selectImage(image.imageUrl); // If the image has coordinates, move the target if (image.hasCelestialCoords) { @@ -225,23 +203,23 @@ void TargetBrowserPair::selectImage(const ImageData& image) { } void TargetBrowserPair::addImageLayerToWwt(const std::string& imageUrl) { - _browser->addImageLayerToWwt(imageUrl); + _browser->worldWideTelescope()->addImageLayerToWwt(imageUrl); } void TargetBrowserPair::removeSelectedImage(const std::string& imageUrl) { - _browser->removeSelectedImage(imageUrl); + _browser->worldWideTelescope()->removeSelectedImage(imageUrl); } void TargetBrowserPair::loadImageCollection(const std::string& collection) { - _browser->loadImageCollection(collection); + _browser->worldWideTelescope()->loadImageCollection(collection); } void TargetBrowserPair::setImageOpacity(const std::string& imageUrl, float opacity) { - _browser->setImageOpacity(imageUrl, opacity); + _browser->worldWideTelescope()->setImageOpacity(imageUrl, opacity); } void TargetBrowserPair::hideChromeInterface() { - _browser->hideChromeInterface(); + _browser->worldWideTelescope()->hideChromeInterface(); } void TargetBrowserPair::sendIdToBrowser() const { @@ -251,6 +229,14 @@ std::vector> TargetBrowserPair::displayCopies return _browser->displayCopies(); } +void TargetBrowserPair::addDisplayCopy(glm::vec3 position, int nCopies) { + _browser->addDisplayCopy(position, nCopies); +} + +void TargetBrowserPair::removeDisplayCopy() { + _browser->removeDisplayCopy(); +} + void TargetBrowserPair::setVerticalFov(double vfov) { _browser->setVerticalFov(vfov); _targetRenderable->setVerticalFov(vfov); @@ -279,19 +265,27 @@ void TargetBrowserPair::setBrowserRatio(float ratio) { _targetRenderable->setRatio(ratio); } +void TargetBrowserPair::setBrowserIsInitialized(bool initialized) { + _browser->setIsInitialized(initialized); +} + void TargetBrowserPair::setVerticalFovWithScroll(float scroll) { const double fov = _browser->setVerticalFovWithScroll(scroll); _targetRenderable->setVerticalFov(fov); } void TargetBrowserPair::setImageCollectionIsLoaded(bool isLoaded) { - _browser->setImageCollectionIsLoaded(isLoaded); + _browser->worldWideTelescope()->setImageCollectionIsLoaded(isLoaded); } void TargetBrowserPair::applyRoll() { _targetRenderable->applyRoll(); } +void TargetBrowserPair::reloadBrowser() { + _browser->reload(); +} + void TargetBrowserPair::setPointSpaceCraft(bool shouldPoint) { _browser->setPointSpaceCraft(shouldPoint); } @@ -379,12 +373,12 @@ bool TargetBrowserPair::isFacingCamera() const { return _browser->isFacingCamera(); } +bool TargetBrowserPair::isInitialized() const { + return _browser->isInitialized(); +} + bool TargetBrowserPair::isUsingRadiusAzimuthElevation() const { return _browser->isUsingRaeCoords(); } -ScreenSpaceSkyBrowser* TargetBrowserPair::browser() const { - return _browser; -} - } // namespace openspace diff --git a/modules/skybrowser/src/wwtcommunicator.cpp b/modules/skybrowser/src/wwtcommunicator.cpp index d04cf24769..8cdb886433 100644 --- a/modules/skybrowser/src/wwtcommunicator.cpp +++ b/modules/skybrowser/src/wwtcommunicator.cpp @@ -24,7 +24,8 @@ #include -#include +#include +#include #include #include #include @@ -106,53 +107,12 @@ namespace { MessageCounter++; return msg; } - - constexpr openspace::properties::Property::PropertyInfo VerticalFovInfo = { - "VerticalFov", - "Vertical Field Of View", - "The vertical field of view of the target.", - openspace::properties::Property::Visibility::AdvancedUser - }; - - struct [[codegen::Dictionary(WwtCommunicator)]] Parameters { - // [[codegen::verbatim(VerticalFovInfo.description)]] - std::optional verticalFov; - }; - #include "wwtcommunicator_codegen.cpp" } // namespace namespace openspace { -WwtCommunicator::WwtCommunicator(const ghoul::Dictionary& dictionary) - : Browser(dictionary) - , _verticalFov(VerticalFovInfo, 10.0, 0.00000000001, 70.0) -{ - // Handle target dimension property - const Parameters p = codegen::bake(dictionary); - _verticalFov = p.verticalFov.value_or(_verticalFov); - _verticalFov.setReadOnly(true); -} - -void WwtCommunicator::update() { - // Cap how messages are passed - const std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - const std::chrono::system_clock::duration timeSinceLastUpdate = now - _lastUpdateTime; - - if (timeSinceLastUpdate > TimeUpdateInterval) { - if (_equatorialAimIsDirty) { - updateAim(); - _equatorialAimIsDirty = false; - } - if (_borderColorIsDirty) { - updateBorderColor(); - _borderColorIsDirty = false; - } - _lastUpdateTime = std::chrono::system_clock::now(); - } - if (_shouldReload) { - _isImageCollectionLoaded = false; - } - Browser::update(); +WwtCommunicator::WwtCommunicator(BrowserInstance* browserInstance) { + _browserInstance = browserInstance; } void WwtCommunicator::selectImage(const std::string& url) { @@ -214,59 +174,25 @@ std::vector WwtCommunicator::opacities() const { return opacities; } -double WwtCommunicator::borderRadius() const { - return _borderRadius; -} - -void WwtCommunicator::setTargetRoll(double roll) { - _targetRoll = roll; -} - -void WwtCommunicator::setVerticalFov(double vfov) { - _verticalFov = vfov; - _equatorialAimIsDirty = true; -} - -void WwtCommunicator::setEquatorialAim(glm::dvec2 equatorial) { - _equatorialAim = std::move(equatorial); - _equatorialAimIsDirty = true; -} - -void WwtCommunicator::setBorderColor(glm::ivec3 color) { - _wwtBorderColor = std::move(color); - _borderColorIsDirty = true; -} - void WwtCommunicator::setBorderRadius(double radius) { - _borderRadius = radius; const std::string scr = std::format("setBorderRadius({});", radius); executeJavascript(scr); } -void WwtCommunicator::updateBorderColor() const { +void WwtCommunicator::setBorderColor(glm::ivec3 color) { const std::string script = std::format( "setBackgroundColor('rgb({},{},{})');", - _wwtBorderColor.x, _wwtBorderColor.y, _wwtBorderColor.z + color.x, color.y, color.z ); executeJavascript(script); } -void WwtCommunicator::updateAim() const { +void WwtCommunicator::setAim(glm::dvec2 equatorialAim, double vFov, double roll) { // Message WorldWide Telescope current view - const ghoul::Dictionary msg = moveCameraMessage( - _equatorialAim, - _verticalFov, - _targetRoll - ); + const ghoul::Dictionary msg = moveCameraMessage(equatorialAim, vFov, roll); sendMessageToWwt(msg); } -glm::dvec2 WwtCommunicator::fieldsOfView() const { - const double vFov = verticalFov(); - const double hFov = vFov * browserRatio(); - return glm::dvec2(hFov, vFov); -} - bool WwtCommunicator::isImageCollectionLoaded() const { return _isImageCollectionLoaded; } @@ -284,10 +210,6 @@ SelectedImageDeque::iterator WwtCommunicator::findSelectedImage( return it; } -glm::dvec2 WwtCommunicator::equatorialAim() const { - return _equatorialAim; -} - void WwtCommunicator::setImageOrder(const std::string& imageUrl, int order) { // Find in selected images list auto current = findSelectedImage(imageUrl); @@ -351,12 +273,17 @@ void WwtCommunicator::setIdInBrowser(const std::string& id) const { executeJavascript(std::format("setId('{}')", id)); } -glm::ivec3 WwtCommunicator::borderColor() const { - return _wwtBorderColor; +void WwtCommunicator::executeJavascript(const std::string& script) const { + // Make sure that the browser has a main frame + const bool browserExists = _browserInstance && _browserInstance->getBrowser(); + const bool frameIsLoaded = + browserExists && _browserInstance->getBrowser()->GetMainFrame(); + + if (frameIsLoaded) { + const CefRefPtr frame = _browserInstance->getBrowser()->GetMainFrame(); + frame->ExecuteJavaScript(script, frame->GetURL(), 0); + } } -double WwtCommunicator::verticalFov() const { - return _verticalFov; -} } // namespace openspace diff --git a/modules/space/kepler.cpp b/modules/space/kepler.cpp index 10469799d7..0d8c821d97 100644 --- a/modules/space/kepler.cpp +++ b/modules/space/kepler.cpp @@ -425,7 +425,7 @@ namespace { throw ghoul::RuntimeError(std::format( "Illformed packed date. Illegal year marker. {}", packedDate )); - }; + }; }(packedDate[0]); auto yearRes = scn::scan(packedDate.substr(1, 2), "{}"); diff --git a/modules/space/kepler.h b/modules/space/kepler.h index 4e145d70fc..0970937d0a 100644 --- a/modules/space/kepler.h +++ b/modules/space/kepler.h @@ -104,7 +104,7 @@ enum class Format { TLE, //< Two-line elements OMM, //< Orbit Mean-Elements Message SBDB, //< Small-Body Database - MPC //< Minor Planet Center + MPC //< Minor Planet Center }; /** * Reads the object information from the provided file. diff --git a/modules/space/rendering/renderableconstellationbounds.cpp b/modules/space/rendering/renderableconstellationbounds.cpp index 60f4937b8b..7aa36841d3 100644 --- a/modules/space/rendering/renderableconstellationbounds.cpp +++ b/modules/space/rendering/renderableconstellationbounds.cpp @@ -212,14 +212,26 @@ bool RenderableConstellationBounds::isReady() const { void RenderableConstellationBounds::render(const RenderData& data, RendererTasks& tasks) { _program->activate(); - _program->setUniform(_uniformCache.campos, glm::vec4(data.camera.positionVec3(), 1.f)); - _program->setUniform(_uniformCache.objpos, glm::vec4(data.modelTransform.translation, 0.f)); - _program->setUniform(_uniformCache.camrot, glm::mat4(data.camera.viewRotationMatrix())); + _program->setUniform( + _uniformCache.campos, + glm::vec4(data.camera.positionVec3(), 1.f) + ); + _program->setUniform( + _uniformCache.objpos, + glm::vec4(data.modelTransform.translation, 0.f) + ); + _program->setUniform( + _uniformCache.camrot, + glm::mat4(data.camera.viewRotationMatrix()) + ); _program->setUniform(_uniformCache.scaling, glm::vec2(1.f, 0.f)); const glm::dmat4 modelTransform = calcModelTransform(data); - _program->setUniform(_uniformCache.ViewProjection, data.camera.viewProjectionMatrix()); + _program->setUniform( + _uniformCache.ViewProjection, + data.camera.viewProjectionMatrix() + ); _program->setUniform(_uniformCache.ModelTransform, glm::mat4(modelTransform)); _program->setUniform(_uniformCache.color, _color); _program->setUniform(_uniformCache.opacity, opacity()); diff --git a/modules/space/rendering/renderablefluxnodes.cpp b/modules/space/rendering/renderablefluxnodes.cpp index ac697cab3f..02b7452b56 100644 --- a/modules/space/rendering/renderablefluxnodes.cpp +++ b/modules/space/rendering/renderablefluxnodes.cpp @@ -391,6 +391,7 @@ RenderableFluxNodes::RenderableFluxNodes(const ghoul::Dictionary& dictionary) LINFO("Assuming default value 1, meaning Emin03"); _goesEnergyBins.setValue(1); } + setupProperties(); } void RenderableFluxNodes::initialize() { @@ -420,7 +421,6 @@ void RenderableFluxNodes::initializeGL() { // Needed for alpha transparency setRenderBin(Renderable::RenderBin::PreDeferredTransparent); - setupProperties(); } void RenderableFluxNodes::definePropertyCallbackFunctions() { diff --git a/modules/space/timeframe/timeframekernel.cpp b/modules/space/timeframe/timeframekernel.cpp index cf12dc09cf..0413964ecf 100644 --- a/modules/space/timeframe/timeframekernel.cpp +++ b/modules/space/timeframe/timeframekernel.cpp @@ -63,7 +63,7 @@ namespace { ghoul_assert(std::holds_alternative(object), "Additional variant type"); id = std::get(object); } - + // Set up variables constexpr unsigned int MaxObj = 1024; @@ -351,7 +351,7 @@ namespace { // kernel must be provided as the latter is required to be able to interpret the time // codes of the former. For this reason it is not possible to provide only a single // kernel to the CK struct in this class. - // + // // The resulting validity of the time frame is based on the following conditions: // // 1. If either SPK or CK (but not both) are specified, the time frame depends on diff --git a/modules/space/timeframe/timeframekernel.h b/modules/space/timeframe/timeframekernel.h index 568325f338..0bbc04c9ed 100644 --- a/modules/space/timeframe/timeframekernel.h +++ b/modules/space/timeframe/timeframekernel.h @@ -22,8 +22,8 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#ifndef __OPENSPACE_MODULE_BASE___TIMEFRAMEKERNEL___H__ -#define __OPENSPACE_MODULE_BASE___TIMEFRAMEKERNEL___H__ +#ifndef __OPENSPACE_MODULE_SPACE___TIMEFRAMEKERNEL___H__ +#define __OPENSPACE_MODULE_SPACE___TIMEFRAMEKERNEL___H__ #include @@ -49,4 +49,4 @@ private: } // namespace openspace -#endif // __OPENSPACE_MODULE_BASE___TIMEFRAMEKERNEL___H__ +#endif // __OPENSPACE_MODULE_SPACE___TIMEFRAMEKERNEL___H__ diff --git a/modules/space/translation/gptranslation.cpp b/modules/space/translation/gptranslation.cpp index f39cace673..a03b0dac0b 100644 --- a/modules/space/translation/gptranslation.cpp +++ b/modules/space/translation/gptranslation.cpp @@ -68,7 +68,8 @@ namespace { if (element > static_cast(parameters.size())) { throw ghoul::RuntimeError(std::format( - "Requested element {} but only {} are available", element, parameters.size() + "Requested element {} but only {} are available", + element, parameters.size() )); } diff --git a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp index 775916887e..172c239eca 100644 --- a/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp +++ b/modules/spacecraftinstruments/rendering/renderableplaneprojection.cpp @@ -46,10 +46,11 @@ namespace { // This specialized Renderable type is used as a target for projections from a // spacecraft instrument. Similarly to the - // [RenderablePlanetProject](spacecraftinstruments_renderableplanetprojection) it uses the spacecraft's - // position and orientation and information about an instruments field-of-view and - // set of images to project a captured image. In the case of this renderable the - // target geometry is a two-dimensional plane that the image is projected on. + // [RenderablePlanetProject](spacecraftinstruments_renderableplanetprojection) it + // uses the spacecraft's position and orientation and information about an instruments + // field-of-view and set of images to project a captured image. In the case of this + // renderable the target geometry is a two-dimensional plane that the image is + // projected on. struct [[codegen::Dictionary(RenderablePlaneProjection)]] Parameters { // The SPICE name of the spacecraft from which the projection is performed. std::string spacecraft; diff --git a/modules/telemetry/include/general/anglemodetelemetry.h b/modules/telemetry/include/general/anglemodetelemetry.h index 1c44df47d4..566fa5c485 100644 --- a/modules/telemetry/include/general/anglemodetelemetry.h +++ b/modules/telemetry/include/general/anglemodetelemetry.h @@ -61,4 +61,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___ANGLEMODETELEMETRY___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___ANGLEMODETELEMETRY___H__ diff --git a/modules/telemetry/include/general/cameratelemetry.h b/modules/telemetry/include/general/cameratelemetry.h index b394e30d12..ad38f30d15 100644 --- a/modules/telemetry/include/general/cameratelemetry.h +++ b/modules/telemetry/include/general/cameratelemetry.h @@ -71,4 +71,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___CAMERATELEMETRY___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___CAMERATELEMETRY___H__ diff --git a/modules/telemetry/include/general/focustelemetry.h b/modules/telemetry/include/general/focustelemetry.h index d68607c02f..4b2f235b45 100644 --- a/modules/telemetry/include/general/focustelemetry.h +++ b/modules/telemetry/include/general/focustelemetry.h @@ -56,4 +56,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___FOCUSTELEMETRY___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___FOCUSTELEMETRY___H__ diff --git a/modules/telemetry/include/general/nodestelemetry.h b/modules/telemetry/include/general/nodestelemetry.h index 7eebc150e6..2989541254 100644 --- a/modules/telemetry/include/general/nodestelemetry.h +++ b/modules/telemetry/include/general/nodestelemetry.h @@ -144,4 +144,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___NODESTELEMETRY___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___NODESTELEMETRY___H__ diff --git a/modules/telemetry/include/general/timetelemetry.h b/modules/telemetry/include/general/timetelemetry.h index 207485a990..af549e92e0 100644 --- a/modules/telemetry/include/general/timetelemetry.h +++ b/modules/telemetry/include/general/timetelemetry.h @@ -68,4 +68,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___TIMETELEMETRY___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___TIMETELEMETRY___H__ diff --git a/modules/telemetry/include/specific/planetscomparesonification.h b/modules/telemetry/include/specific/planetscomparesonification.h index 25fed74315..ce28b28d77 100644 --- a/modules/telemetry/include/specific/planetscomparesonification.h +++ b/modules/telemetry/include/specific/planetscomparesonification.h @@ -115,4 +115,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_SONIFICATION___PLANETSCOMPARESONIFICATION___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___PLANETSCOMPARESONIFICATION___H__ diff --git a/modules/telemetry/include/specific/planetsoverviewsonification.h b/modules/telemetry/include/specific/planetsoverviewsonification.h index faec9127e8..a43f11bc32 100644 --- a/modules/telemetry/include/specific/planetsoverviewsonification.h +++ b/modules/telemetry/include/specific/planetsoverviewsonification.h @@ -78,4 +78,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___PLANETSOVERVIEWSONIFICATION___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___PLANETSOVERVIEWSONIFICATION___H__ diff --git a/modules/telemetry/include/specific/planetssonification.h b/modules/telemetry/include/specific/planetssonification.h index 1824f94c50..a861d1de40 100644 --- a/modules/telemetry/include/specific/planetssonification.h +++ b/modules/telemetry/include/specific/planetssonification.h @@ -90,8 +90,8 @@ private: /** * Create an osc::Blob object with the current sonification settings for the indicated * planet. - * Order of settings: Size/day, gravity, temperature, and optionally atmosphere, moons, - * and rings. + * Order of settings: Size/day, gravity, temperature, and optionally atmosphere, + * moons, and rings. * * \param planetIndex The index of the planet to create the settings blob for * \return An osc::Blob object with current sonification settings for the indicated @@ -208,4 +208,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___PLANETSSONIFICATION___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___PLANETSSONIFICATION___H__ diff --git a/modules/telemetry/include/telemetrybase.h b/modules/telemetry/include/telemetrybase.h index e20fc8e861..999c2b5d14 100644 --- a/modules/telemetry/include/telemetrybase.h +++ b/modules/telemetry/include/telemetrybase.h @@ -84,4 +84,4 @@ protected: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___TELEMETRYBASE___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___TELEMETRYBASE___H__ diff --git a/modules/telemetry/include/util.h b/modules/telemetry/include/util.h index 0c7eac2d34..92f7ee9b3a 100644 --- a/modules/telemetry/include/util.h +++ b/modules/telemetry/include/util.h @@ -203,4 +203,4 @@ double calculateElevationAngleFromAToB(const Camera* camera, } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___UTIL___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___UTIL___H__ diff --git a/modules/telemetry/src/general/anglemodetelemetry.cpp b/modules/telemetry/src/general/anglemodetelemetry.cpp index 6bcb1dd4c3..1959d4172e 100644 --- a/modules/telemetry/src/general/anglemodetelemetry.cpp +++ b/modules/telemetry/src/general/anglemodetelemetry.cpp @@ -41,8 +41,8 @@ namespace { { "AngleModeTelemetry", "Angle Mode Telemetry", - "Telemetry that gathers data of what angle calculation mode is currently used for " - "all telemetries in the telemetry module" + "Telemetry that gathers data of what angle calculation mode is currently used " + "for all telemetries in the telemetry module" }; } // namespace diff --git a/modules/telemetry/telemetrymodule.cpp b/modules/telemetry/telemetrymodule.cpp index a1fccb700f..9e29a990cc 100644 --- a/modules/telemetry/telemetrymodule.cpp +++ b/modules/telemetry/telemetrymodule.cpp @@ -211,7 +211,8 @@ void TelemetryModule::internalInitialize(const ghoul::Dictionary& dictionary) { }); // When the program shuts down, make sure this module turns itself off. - // If the module is turned on while the scene is being destroyed, then it will crash. + // If the module is turned on while the scene is being destroyed, then it will + // crash global::callback::deinitialize->emplace_back([this]() { _enabled = false; }); diff --git a/modules/telemetry/telemetrymodule.h b/modules/telemetry/telemetrymodule.h index 331c718b0c..f96b6cc4ec 100644 --- a/modules/telemetry/telemetrymodule.h +++ b/modules/telemetry/telemetrymodule.h @@ -167,4 +167,4 @@ private: } // namespace openspace -#endif __OPENSPACE_MODULE_TELEMETRY___TELEMETRYMODULE___H__ +#endif // __OPENSPACE_MODULE_TELEMETRY___TELEMETRYMODULE___H__ diff --git a/modules/webbrowser/CMakeLists.txt b/modules/webbrowser/CMakeLists.txt index 52501ce7ef..d2b813f27d 100644 --- a/modules/webbrowser/CMakeLists.txt +++ b/modules/webbrowser/CMakeLists.txt @@ -31,6 +31,9 @@ set(WEBBROWSER_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "WEBBROWSE # wanted by CEF if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") set(PROJECT_ARCH "arm64") # For macOS on ARM64 + set(CMAKE_OSX_DEPLOYMENT_TARGET "13.3" CACHE STRING "Minimum OS X deployment version" FORCE) # check if this solves no type named 'in_place_t' + set(CMAKE_CXX_STANDARD 20) + set(CMAKE_CXX_STANDARD_REQUIRED ON) elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") set(PROJECT_ARCH "armv8-a") # For Ubuntu/Linux on ARM64 - or should it be aarch64? Builds OK on Ubuntu with armv8-a else () diff --git a/modules/webbrowser/cmake/cef_support.cmake b/modules/webbrowser/cmake/cef_support.cmake index bbcc948780..45312e8465 100644 --- a/modules/webbrowser/cmake/cef_support.cmake +++ b/modules/webbrowser/cmake/cef_support.cmake @@ -33,7 +33,14 @@ function(set_current_cef_build_platform) if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") - if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "arm64") + # Use CMAKE_OSX_ARCHITECTURES if set, otherwise fallback to CMAKE_SYSTEM_PROCESSOR + if (DEFINED CMAKE_OSX_ARCHITECTURES AND NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "") + # CMAKE_OSX_ARCHITECTURES can be a list; just use the first architecture + list(GET CMAKE_OSX_ARCHITECTURES 0 CEF_ARCH) + else() + set(CEF_ARCH "${CMAKE_SYSTEM_PROCESSOR}") + endif() + if ("${CEF_ARCH}" STREQUAL "arm64") set(CEF_PLATFORM "macosarm64" PARENT_SCOPE) else() set(CEF_PLATFORM "macosx64" PARENT_SCOPE) diff --git a/modules/webbrowser/cmake/patch/cmake/cef_variables.cmake b/modules/webbrowser/cmake/patch/cmake/cef_variables.cmake index 85c0e67dc1..84b2ca9355 100644 --- a/modules/webbrowser/cmake/patch/cmake/cef_variables.cmake +++ b/modules/webbrowser/cmake/patch/cmake/cef_variables.cmake @@ -24,7 +24,9 @@ endif() # Determine the project architecture. if(NOT DEFINED PROJECT_ARCH) - if(CMAKE_SIZEOF_VOID_P MATCHES 8) + if(OS_MACOSX AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(PROJECT_ARCH "arm64") + elseif(CMAKE_SIZEOF_VOID_P MATCHES 8) set(PROJECT_ARCH "x86_64") else() set(PROJECT_ARCH "x86") @@ -183,6 +185,14 @@ if(OS_LINUX) list(APPEND CEF_LINKER_FLAGS -m32 ) + elseif(PROJECT_ARCH STREQUAL "arm64") + # Apple Silicon (ARM64) architecture. + list(APPEND CEF_COMPILER_FLAGS + -arch arm64 + ) + list(APPEND CEF_LINKER_FLAGS + -arch arm64 + ) endif() # Standard libraries. @@ -253,7 +263,7 @@ if(OS_MACOSX) -Wno-unused-parameter # Don't warn about unused parameters ) list(APPEND CEF_C_COMPILER_FLAGS - -std=c99 # Use the C99 language standard + -std=c17 # Use the C99 language standard ) list(APPEND CEF_CXX_COMPILER_FLAGS #-fno-exceptions # Disable exceptions @@ -261,7 +271,7 @@ if(OS_MACOSX) -fno-threadsafe-statics # Don't generate thread-safe statics -fobjc-call-cxx-cdtors # Call the constructor/destructor of C++ instance variables in ObjC objects -fvisibility-inlines-hidden # Give hidden visibility to inlined class member functions - -std=gnu++14 # Use the C++14 language standard including GNU extensions + -std=gnu++20 # Use the C++20 language standard including GNU extensions -Wno-narrowing # Don't warn about type narrowing -Wsign-compare # Warn about mixed signed/unsigned type comparisons ) @@ -299,7 +309,7 @@ if(OS_MACOSX) # Find the newest available base SDK. execute_process(COMMAND xcode-select --print-path OUTPUT_VARIABLE XCODE_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) - foreach(OS_VERSION 10.11 10.10 10.9) + foreach(OS_VERSION 13.3 14.7) set(SDK "${XCODE_PATH}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${OS_VERSION}.sdk") if(NOT "${CMAKE_OSX_SYSROOT}" AND EXISTS "${SDK}" AND IS_DIRECTORY "${SDK}") set(CMAKE_OSX_SYSROOT ${SDK}) @@ -307,7 +317,7 @@ if(OS_MACOSX) endforeach() # Target SDK. - set(CEF_TARGET_SDK "10.15") + set(CEF_TARGET_SDK "13.3") list(APPEND CEF_COMPILER_FLAGS -mmacosx-version-min=${CEF_TARGET_SDK} ) @@ -317,7 +327,7 @@ if(OS_MACOSX) if(PROJECT_ARCH STREQUAL "x86_64") set(CMAKE_OSX_ARCHITECTURES "x86_64") else() - set(CMAKE_OSX_ARCHITECTURES "i386") + set(CMAKE_OSX_ARCHITECTURES "arm64") endif() # CEF directory paths. @@ -329,6 +339,8 @@ if(OS_MACOSX) set(CEF_BINARY_DIR "${_CEF_ROOT}/$") endif() + message("CMAKE_OSX_DEPLOYMENT_TARGET is set to ${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(CEF_BINARY_DIR_DEBUG "${_CEF_ROOT}/Debug") set(CEF_BINARY_DIR_RELEASE "${_CEF_ROOT}/Release") diff --git a/modules/webbrowser/include/browserclient.h b/modules/webbrowser/include/browserclient.h index 8eb2e934be..eb256bc185 100644 --- a/modules/webbrowser/include/browserclient.h +++ b/modules/webbrowser/include/browserclient.h @@ -65,7 +65,7 @@ public: // TODO (ylvse 2025-02-18): Update CEF when they have fixed this issue // https://github.com/chromiumembedded/cef/issues/3870 class FocusHandler : public CefFocusHandler { - void OnTakeFocus(CefRefPtr, bool) override; + void OnTakeFocus(CefRefPtr, bool) override; bool OnSetFocus(CefRefPtr, FocusSource) override; IMPLEMENT_REFCOUNTING(FocusHandler); @@ -73,7 +73,7 @@ public: class LoadHandler : public CefLoadHandler { void OnLoadEnd(CefRefPtr browser, CefRefPtr, int) override; - + IMPLEMENT_REFCOUNTING(LoadHandler); }; diff --git a/modules/webbrowser/include/browserinstance.h b/modules/webbrowser/include/browserinstance.h index 8bb49ee9fa..c5a8ae5688 100644 --- a/modules/webbrowser/include/browserinstance.h +++ b/modules/webbrowser/include/browserinstance.h @@ -57,13 +57,8 @@ class WebKeyboardHandler; class BrowserInstance { public: static constexpr int SingleClick = 1; - // @TODO (ylvse 2024-08-20): remove third argument when the sky browser rewrite is - // done. - // The browser instance should always accelerate the rendering if possible but for - // now the skybrowser is not accelerated. Will be when the rewrite is done. BrowserInstance(WebRenderHandler* renderer, - WebKeyboardHandler* keyboardHandler, - bool accelerateRendering = true + WebKeyboardHandler* keyboardHandler ); ~BrowserInstance(); diff --git a/modules/webbrowser/include/cefhost.h b/modules/webbrowser/include/cefhost.h index 70f49a5a70..02560847bf 100644 --- a/modules/webbrowser/include/cefhost.h +++ b/modules/webbrowser/include/cefhost.h @@ -49,9 +49,6 @@ public: ~CefHost(); void doMessageLoopWork(); - -private: - void attachDebugSettings(CefSettings&); }; } // namespace openspace diff --git a/modules/webbrowser/include/screenspacebrowser.h b/modules/webbrowser/include/screenspacebrowser.h index 8ece2fc5e0..4bdd1c9b45 100644 --- a/modules/webbrowser/include/screenspacebrowser.h +++ b/modules/webbrowser/include/screenspacebrowser.h @@ -77,6 +77,8 @@ public: protected: properties::UVec2Property _dimensions; std::unique_ptr _browserInstance; + bool _isDimensionsDirty = false; + properties::TriggerProperty _reload; private: class ScreenSpaceRenderHandler : public WebRenderHandler { @@ -93,13 +95,11 @@ private: void bindTexture() override; properties::StringProperty _url; - properties::TriggerProperty _reload; CefRefPtr _keyboardHandler; bool _useAcceleratedRendering = false; bool _isUrlDirty = false; - bool _isDimensionsDirty = false; }; } // namespace openspace diff --git a/modules/webbrowser/include/webrenderhandler.h b/modules/webbrowser/include/webrenderhandler.h index 353b00b78c..df4805353d 100644 --- a/modules/webbrowser/include/webrenderhandler.h +++ b/modules/webbrowser/include/webrenderhandler.h @@ -51,11 +51,10 @@ namespace openspace { class WebRenderHandler : public CefRenderHandler { public: - // @TODO (ylvse 2024-08-20): Remove this argument when the skybrowser rewrite is done. - // It is necessary atm for making the skybrowser work. - explicit WebRenderHandler(bool accelerate = true); using Pixel = glm::tvec4; + WebRenderHandler(); + virtual void draw(void) = 0; virtual void render() = 0; diff --git a/modules/webbrowser/src/browserclient.cpp b/modules/webbrowser/src/browserclient.cpp index 1fa075b290..8a83925537 100644 --- a/modules/webbrowser/src/browserclient.cpp +++ b/modules/webbrowser/src/browserclient.cpp @@ -103,8 +103,9 @@ bool BrowserClient::FocusHandler::OnSetFocus(CefRefPtr, FocusSource) return false; } -void BrowserClient::LoadHandler::OnLoadEnd(CefRefPtr browser, CefRefPtr, - int) { +void BrowserClient::LoadHandler::OnLoadEnd(CefRefPtr browser, + CefRefPtr, int) +{ // Focus status can be lost. Try to restore it if (_hasFocus && browser && browser->GetHost()) { browser->GetHost()->SetFocus(true); diff --git a/modules/webbrowser/src/browserinstance.cpp b/modules/webbrowser/src/browserinstance.cpp index 1f65d83d75..56424c148e 100644 --- a/modules/webbrowser/src/browserinstance.cpp +++ b/modules/webbrowser/src/browserinstance.cpp @@ -45,8 +45,7 @@ namespace { namespace openspace { BrowserInstance::BrowserInstance(WebRenderHandler* renderer, - WebKeyboardHandler* keyboardHandler, - bool accelerateRendering) + WebKeyboardHandler* keyboardHandler) : _renderHandler(renderer) , _keyboardHandler(keyboardHandler) , _client(new BrowserClient(_renderHandler.get(), _keyboardHandler.get())) @@ -57,7 +56,7 @@ BrowserInstance::BrowserInstance(WebRenderHandler* renderer, windowInfo.SetAsWindowless(0); // Use accelerated rendering if possible - if (WebBrowserModule::canUseAcceleratedRendering() && accelerateRendering) { + if (WebBrowserModule::canUseAcceleratedRendering()) { windowInfo.shared_texture_enabled = true; LINFO("Enabling shared texture mode for CEF"); } diff --git a/modules/webbrowser/src/cefhost.cpp b/modules/webbrowser/src/cefhost.cpp index e62451e13f..46bd39bd2d 100644 --- a/modules/webbrowser/src/cefhost.cpp +++ b/modules/webbrowser/src/cefhost.cpp @@ -54,11 +54,16 @@ CefHost::CefHost([[maybe_unused]] const std::string& helperLocation) { CefString(&settings.browser_subprocess_path).FromString(helperLocation); #endif // __APPLE__ - settings.windowless_rendering_enabled = true; - attachDebugSettings(settings); + settings.windowless_rendering_enabled = 1; + + settings.remote_debugging_port = 8088; + LDEBUG(std::format( + "Remote WebBrowser debugging available on http://localhost:{}", + settings.remote_debugging_port + )); // cf. https://github.com/chromiumembedded/cef/issues/3685 - settings.chrome_runtime = true; + settings.chrome_runtime = 1; #ifdef __APPLE__ // Load the CEF framework library at runtime instead of linking directly as required @@ -72,7 +77,10 @@ CefHost::CefHost([[maybe_unused]] const std::string& helperLocation) { const CefRefPtr app = CefRefPtr(new WebBrowserApp); const CefMainArgs args; - CefInitialize(args, settings, app.get(), nullptr); + const bool success = CefInitialize(args, settings, app.get(), nullptr); + if (!success) { + throw ghoul::RuntimeError("Failed initializing CEF Browser"); + } LDEBUG("Initializing CEF... done"); } @@ -80,15 +88,6 @@ CefHost::~CefHost() { CefShutdown(); } -void CefHost::attachDebugSettings(CefSettings &settings) { - settings.remote_debugging_port = 8088; - - LDEBUG(std::format( - "Remote WebBrowser debugging available on http://localhost:{}", - settings.remote_debugging_port - )); -} - void CefHost::doMessageLoopWork() { ZoneScoped; diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index 344a6ecb9d..a09f6fcb16 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -457,7 +457,7 @@ bool EventHandler::keyboardCallback(Key key, KeyModifier modifier, KeyAction act return charCallback(static_cast(Key::Enter), modifier); } - return KeyEventFlag; + return KeyEventFlag; } bool EventHandler::specialKeyEvent(Key key, KeyModifier mod, KeyAction action) { diff --git a/modules/webbrowser/src/processhelperwindows.cpp b/modules/webbrowser/src/processhelperwindows.cpp index 4a34592318..cc6f9f54ac 100644 --- a/modules/webbrowser/src/processhelperwindows.cpp +++ b/modules/webbrowser/src/processhelperwindows.cpp @@ -28,14 +28,71 @@ #include "include/cef_app.h" #include "include/webbrowserapp.h" +#include -// Entry point function for sub-processes. +#ifdef WIN32 +#include +#endif // WIN32 + +// The solution for GetParentProcess and the thread comes from Mikael who posted it here: +// https://www.magpcss.org/ceforum/viewtopic.php?f=6&t=15817&start=10#p37813 + +#ifdef WIN32 +namespace { + // Get the HANDLE of the parent process that spawned this process + HANDLE GetParentProcess() { + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + + PROCESSENTRY32 processEntry = {}; + processEntry.dwSize = sizeof(PROCESSENTRY32); + + if (Process32First(snapshot, &processEntry)) { + DWORD currentProcessId = GetCurrentProcessId(); + + do { + if (processEntry.th32ProcessID == currentProcessId) { + break; + } + } while (Process32Next(snapshot, &processEntry)); + } + + CloseHandle(snapshot); + return OpenProcess(SYNCHRONIZE, FALSE, processEntry.th32ParentProcessID); + } +} // namespace +#endif // WIN32 + +// Entry point function for sub-processes int main(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { - // Provide CEF with command-line arguments. - CefMainArgs main_args(hInstance); + // Provide CEF with command-line arguments + CefMainArgs mainArgs = CefMainArgs(hInstance); - CefRefPtr app(new openspace::WebBrowserApp); + CefRefPtr app = new openspace::WebBrowserApp; - // Execute the sub-process. - return CefExecuteProcess(main_args, app.get(), NULL); +#ifdef WIN32 + // This following part is only necessary as we need to guard against OpenSpace getting + // force terminated. The most common way is by "Stop Debugging" in Visual Studio, but + // other reasons exist as well. + // If OpenSpace is terminated, none of its destructors will be executed, which means + // that `CefShutdown` will not be called which means that this process will never get + // to learn that OpenSpace is dead. + // To circumvent that we are: + // 1. Getting the HANDLE of the parent process (=OpenSpace) + // 2. Start a new thread that waits for the parent process to die + // 3. If the parent process die, we kill this process + // If OpenSpace closes gracefully, the `WaitForSingleObject` will never finish as the + // `CefShutdown` in OpenSpace will the `CefExecuteProcess` function to finish thus + // ending the scope and stopping the thread from existing + HANDLE parent = GetParentProcess(); + std::thread([parent]() { + // This wait will only continue once the parent process no longer exists + WaitForSingleObject(parent, INFINITE); + + // Once the parent process is dead, we will kill ourselves + ExitProcess(0); + }).detach(); +#endif // WIN32 + + // Execute the sub-process + return CefExecuteProcess(mainArgs, app.get(), nullptr); } diff --git a/modules/webbrowser/src/screenspacebrowser.cpp b/modules/webbrowser/src/screenspacebrowser.cpp index dc4d8e59cd..5c557837ec 100644 --- a/modules/webbrowser/src/screenspacebrowser.cpp +++ b/modules/webbrowser/src/screenspacebrowser.cpp @@ -96,9 +96,9 @@ documentation::Documentation ScreenSpaceBrowser::Documentation() { ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary& dictionary) : ScreenSpaceRenderable(dictionary) , _dimensions(DimensionsInfo, glm::uvec2(0), glm::uvec2(0), glm::uvec2(3000)) + , _reload(ReloadInfo) , _renderHandler(new ScreenSpaceRenderHandler) , _url(UrlInfo) - , _reload(ReloadInfo) , _keyboardHandler(new WebKeyboardHandler) { const Parameters p = codegen::bake(dictionary); @@ -109,7 +109,7 @@ ScreenSpaceBrowser::ScreenSpaceBrowser(const ghoul::Dictionary& dictionary) _url = p.url.value_or(_url); - _dimensions = p.dimensions.value_or(global::windowDelegate->currentSubwindowSize()); + _dimensions = p.dimensions.value_or(glm::vec2(1920, 1080)); _browserInstance = std::make_unique( _renderHandler.get(), diff --git a/modules/webbrowser/src/webrenderhandler.cpp b/modules/webbrowser/src/webrenderhandler.cpp index 42abec216f..acbfb06a20 100644 --- a/modules/webbrowser/src/webrenderhandler.cpp +++ b/modules/webbrowser/src/webrenderhandler.cpp @@ -29,8 +29,8 @@ namespace openspace { -WebRenderHandler::WebRenderHandler(bool accelerate) - : _acceleratedRendering(WebBrowserModule::canUseAcceleratedRendering() && accelerate) +WebRenderHandler::WebRenderHandler() + : _acceleratedRendering(WebBrowserModule::canUseAcceleratedRendering()) { if (_acceleratedRendering) { glCreateTextures(GL_TEXTURE_2D, 1, &_texture); diff --git a/modules/webbrowser/webbrowsermodule.cpp b/modules/webbrowser/webbrowsermodule.cpp index a5d8243143..1d49a1c222 100644 --- a/modules/webbrowser/webbrowsermodule.cpp +++ b/modules/webbrowser/webbrowsermodule.cpp @@ -44,15 +44,6 @@ namespace { constexpr std::string_view _loggerCat = "WebBrowser"; - #ifdef _MSC_VER - constexpr std::string_view SubprocessPath = "OpenSpace_Helper.exe"; - #elif defined(__APPLE__) - constexpr std::string_view SubprocessPath = - "../Frameworks/OpenSpace Helper.app/Contents/MacOS/OpenSpace Helper"; - #else - constexpr std::string_view SubprocessPath = "OpenSpace_Helper"; - #endif - constexpr openspace::properties::Property::PropertyInfo UpdateBrowserBetweenRenderablesInfo = { @@ -78,6 +69,15 @@ namespace { * \return the absolute path to the file */ std::filesystem::path findHelperExecutable() { +#ifdef WIN32 + constexpr std::string_view SubprocessPath = "OpenSpace_Helper.exe"; +#elif defined(__APPLE__) + constexpr std::string_view SubprocessPath = + "../Frameworks/OpenSpace Helper.app/Contents/MacOS/OpenSpace Helper"; +#else + constexpr std::string_view SubprocessPath = "OpenSpace_Helper"; +#endif + const std::filesystem::path execLocation = absPath(std::format( "${{BIN}}/{}", SubprocessPath )); @@ -109,7 +109,6 @@ namespace { std::optional disableAcceleratedRendering; }; #include "webbrowsermodule_codegen.cpp" - } // namespace namespace openspace { @@ -156,13 +155,14 @@ void WebBrowserModule::internalInitialize(const ghoul::Dictionary& dictionary) { const Parameters p = codegen::bake(dictionary); - _webHelperLocation = p.webHelperLocation.value_or(findHelperExecutable()); _enabled = p.enabled.value_or(_enabled); _disableAcceleratedRendering = p.disableAcceleratedRendering.value_or(_disableAcceleratedRendering); - LDEBUG(std::format("CEF using web helper executable: {}", _webHelperLocation)); - _cefHost = std::make_unique(_webHelperLocation.string()); + std::filesystem::path webHelperLocation = + p.webHelperLocation.value_or(findHelperExecutable()); + LDEBUG(std::format("CEF using web helper executable: {}", webHelperLocation)); + _cefHost = std::make_unique(webHelperLocation.string()); LDEBUG("Starting CEF... done"); _updateBrowserBetweenRenderables = @@ -181,6 +181,8 @@ void WebBrowserModule::internalInitialize(const ghoul::Dictionary& dictionary) { void WebBrowserModule::internalDeinitialize() { ZoneScoped; + _cefHost = nullptr; + if (!_enabled) { return; } diff --git a/modules/webbrowser/webbrowsermodule.h b/modules/webbrowser/webbrowsermodule.h index 6129c866b7..342a50fcfa 100644 --- a/modules/webbrowser/webbrowsermodule.h +++ b/modules/webbrowser/webbrowsermodule.h @@ -75,7 +75,6 @@ private: std::vector _browsers; std::unique_ptr _eventHandler; std::unique_ptr _cefHost; - std::filesystem::path _webHelperLocation; bool _enabled = true; static inline bool _disableAcceleratedRendering = false; }; diff --git a/modules/webgui/CMakeLists.txt b/modules/webgui/CMakeLists.txt index 8959182f20..343be25cc9 100644 --- a/modules/webgui/CMakeLists.txt +++ b/modules/webgui/CMakeLists.txt @@ -25,6 +25,9 @@ include(${PROJECT_SOURCE_DIR}/support/cmake/module_definition.cmake) include(../webbrowser/cmake/webbrowser_helpers.cmake) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(nodejs_support) + set(WEBGUI_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "WEBGUI_MODULE_PATH") set(OPENSPACE_HEADER_FILES @@ -37,13 +40,7 @@ set(OPENSPACE_SOURCE_FILES ) source_group("Source Files" FILES ${OPENSPACE_SOURCE_FILES}) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -# Specify the NodeJs distribution version. -set(NODEJS_VERSION "8.11.4") - -include(nodejs_support) -DownloadNodeJs("${NODEJS_VERSION}" "${CMAKE_CURRENT_SOURCE_DIR}/ext/nodejs") +DownloadNodeJs("22.15.0" "${CMAKE_CURRENT_SOURCE_DIR}/ext/nodejs") create_new_module( WebGui diff --git a/modules/webgui/cmake/nodejs_support.cmake b/modules/webgui/cmake/nodejs_support.cmake index 8d73435eb2..f5386d3984 100644 --- a/modules/webgui/cmake/nodejs_support.cmake +++ b/modules/webgui/cmake/nodejs_support.cmake @@ -31,60 +31,60 @@ function(DownloadNodeJs version download_dir) set(basename "node") set(filename "${basename}.exe") set(path "v${version}/win-x64/${filename}") - endif () - if (APPLE) + elseif (APPLE) set(basename "node-v${version}-darwin-x64") set(filename "${basename}.tar.gz") set(path "v${version}/${filename}") - endif () - if (UNIX AND NOT APPLE) + elseif (UNIX) set(basename "node-v${version}-linux-x64") set(filename "${basename}.tar.xz") set(path "v${version}/${filename}") endif () - # Specify the binary distribution type and download directory. - set(NODEJS_DOWNLOAD_DIR "${download_dir}") + # Create the file if it doesn't exist + file(MAKE_DIRECTORY "${download_dir}") + file(TOUCH "${download_dir}/version.txt") - # The location where we expect the extracted binary distribution. - set(NODEJS_ROOT "${NODEJS_DOWNLOAD_DIR}" CACHE INTERNAL "NODEJS_ROOT") + # Read the file + file(STRINGS "${download_dir}/version.txt" existing_version) - # Download and/or extract the binary distribution if necessary. - if (NOT IS_DIRECTORY "${NODEJS_ROOT}") - set(NODEJS_DOWNLOAD_SOURCE "v${version}/node-v${version}-${suffix}") - set(NODEJS_DOWNLOAD_PATH "${NODEJS_DOWNLOAD_DIR}/${filename}") - if (NOT EXISTS "${NODEJS_DOWNLOAD_PATH}") - set(NODEJS_DOWNLOAD_URL "https://nodejs.org/dist/${path}") - - # Download the binary distribution. - message(STATUS "Downloading NodeJs: ${NODEJS_DOWNLOAD_PATH}...") - file(DOWNLOAD "${NODEJS_DOWNLOAD_URL}" "${NODEJS_DOWNLOAD_PATH}" SHOW_PROGRESS) - endif () - - message(STATUS "URL: ${NODEJS_DOWNLOAD_URL}") - - # Extract the binary distribution for unix - if (APPLE) - # Apple uses tar.gz - message(STATUS "Extracting NodeJs: ${NODEJS_DOWNLOAD_PATH} in ${NODEJS_DOWNLOAD_DIR}") - execute_process( - COMMAND tar xzf ${NODEJS_DOWNLOAD_PATH} - WORKING_DIRECTORY ${NODEJS_DOWNLOAD_DIR} - ) - endif () - if (UNIX AND NOT APPLE) - # Linux uses tar.xz - message(STATUS "Extracting NodeJs: ${NODEJS_DOWNLOAD_PATH} in ${NODEJS_DOWNLOAD_DIR}") - execute_process( - COMMAND tar xf ${NODEJS_DOWNLOAD_PATH} - WORKING_DIRECTORY ${NODEJS_DOWNLOAD_DIR} - ) - endif () - - if (UNIX) - FILE(COPY ${NODEJS_DOWNLOAD_DIR}/${basename}/bin/node DESTINATION ${NODEJS_DOWNLOAD_DIR}) - FILE(REMOVE_RECURSE ${NODEJS_DOWNLOAD_DIR}/${basename}) - FILE(REMOVE ${NODEJS_DOWNLOAD_PATH}) - endif () + # Download and/or extract the binary distribution if necessary + if ("${existing_version}" STREQUAL "${version}") + return() endif () + + set(NODEJS_DOWNLOAD_PATH "${download_dir}/${filename}") + set(NODEJS_DOWNLOAD_URL "https://nodejs.org/dist/${path}") + + # Download the binary distribution + message(STATUS "Downloading Node.js: ${NODEJS_DOWNLOAD_PATH}") + file(DOWNLOAD "${NODEJS_DOWNLOAD_URL}" "${NODEJS_DOWNLOAD_PATH}" SHOW_PROGRESS) + + message(STATUS "URL: ${NODEJS_DOWNLOAD_URL}") + + # Extract the binary distribution for unix + if (APPLE) + # Apple uses tar.gz + message(STATUS "Extracting Node.js: ${NODEJS_DOWNLOAD_PATH} in ${download_dir}") + execute_process( + COMMAND tar xzf ${NODEJS_DOWNLOAD_PATH} + WORKING_DIRECTORY ${download_dir} + ) + endif () + if (UNIX AND NOT APPLE) + # Linux uses tar.xz + message(STATUS "Extracting Node.js: ${NODEJS_DOWNLOAD_PATH} in ${download_dir}") + execute_process( + COMMAND tar xf ${NODEJS_DOWNLOAD_PATH} + WORKING_DIRECTORY ${download_dir} + ) + endif () + + if (UNIX) + file(COPY ${download_dir}/${basename}/bin/node DESTINATION ${download_dir}) + file(REMOVE_RECURSE ${download_dir}/${basename}) + file(REMOVE ${NODEJS_DOWNLOAD_PATH}) + endif () + + file(WRITE "${download_dir}/version.txt" "${version}") endfunction () diff --git a/openspace.cfg b/openspace.cfg index 6c2713523e..17c6d82814 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -86,6 +86,9 @@ Paths = { USER_PROFILES = "${USER}/data/profiles", USER_CONFIG = "${USER}/config", USER_WEBPANELS = "${USER}/webpanels", + USER_SHOWCOMPOSER = "${USER}/showcomposer", + USER_SHOWCOMPOSER_UPLOADS = "${USER}/showcomposer/uploads", + USER_SHOWCOMPOSER_PROJECTS = "${USER}/showcomposer/projects", FONTS = "${DATA}/fonts", TASKS = "${DATA}/tasks", -- If the the 'OPENSPACE_SYNC' environment variable is defined on the system, use that diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ddc9b49769..10fc821867 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -172,6 +172,7 @@ set(OPENSPACE_SOURCE util/collisionhelper.cpp util/coordinateconversion.cpp util/distanceconversion.cpp + util/dynamicfilesequencedownloader.cpp util/ellipsoid.cpp util/factorymanager.cpp util/geodetic.cpp @@ -367,6 +368,7 @@ set(OPENSPACE_HEADER ${PROJECT_SOURCE_DIR}/include/openspace/util/coordinateconversion.h ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconstants.h ${PROJECT_SOURCE_DIR}/include/openspace/util/distanceconversion.h + ${PROJECT_SOURCE_DIR}/include/openspace/util/dynamicfilesequencedownloader.h ${PROJECT_SOURCE_DIR}/include/openspace/util/ellipsoid.h ${PROJECT_SOURCE_DIR}/include/openspace/util/factorymanager.h ${PROJECT_SOURCE_DIR}/include/openspace/util/factorymanager.inl diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 13b1a5e117..d34acdf6ad 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -84,6 +85,7 @@ #include #include #include +#include #include #include #include @@ -865,6 +867,27 @@ void OpenSpaceEngine::deinitialize() { LTRACE("OpenSpaceEngine::deinitialize(begin)"); + { + // We are storing the `hasStartedBefore` setting here instead of in the + // intialization phase as otherwise we'd always think that OpenSpace had been + // started before + openspace::Settings settings = loadSettings(); + + settings.hasStartedBefore = true; + const date::year_month_day now = date::year_month_day( + floor(std::chrono::system_clock::now()) + ); + settings.lastStartedDate = std::format( + "{}-{:0>2}-{:0>2}", + static_cast(now.year()), + static_cast(now.month()), + static_cast(now.day()) + ); + + saveSettings(settings, findSettings()); + } + + for (const std::function& func : *global::callback::deinitialize) { func(); } @@ -1704,6 +1727,7 @@ scripting::LuaLibrary OpenSpaceEngine::luaLibrary() { codegen::lua::RemoveTag, codegen::lua::DownloadFile, codegen::lua::CreateSingleColorImage, + codegen::lua::SaveBase64File, codegen::lua::IsMaster, codegen::lua::Version, codegen::lua::ReadCSVFile, diff --git a/src/engine/openspaceengine_lua.inl b/src/engine/openspaceengine_lua.inl index c5eec2024e..6f54f91d33 100644 --- a/src/engine/openspaceengine_lua.inl +++ b/src/engine/openspaceengine_lua.inl @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -198,6 +199,23 @@ namespace { return fileName; } +/** + * This function takes a base64 encoded data string, decodes it and saves the resulting + * data to the provided filepath. + * + * \param filePath The location where the data will be saved. Any file that already exists + * in that location will be overwritten + * \param base64Data The base64 encoded data that should be saved to the provided file + */ +[[codegen::luawrap]] void saveBase64File(std::filesystem::path filepath, + std::string base64Data) +{ + std::vector data = ghoul::decodeBase64(base64Data); + + std::ofstream file = std::ofstream(filepath, std::ofstream::binary); + file.write(reinterpret_cast(data.data()), data.size()); +} + /** * Returns whether the current OpenSpace instance is the master node of a cluster * configuration. If this instance is not part of a cluster, this function also returns diff --git a/src/interaction/keybindingmanager.cpp b/src/interaction/keybindingmanager.cpp index 96f1422b6a..881095118e 100644 --- a/src/interaction/keybindingmanager.cpp +++ b/src/interaction/keybindingmanager.cpp @@ -119,6 +119,7 @@ scripting::LuaLibrary KeybindingManager::luaLibrary() { { codegen::lua::BindKey, codegen::lua::KeyBindings, + codegen::lua::KeyBindingsForAction, codegen::lua::ClearKey, codegen::lua::ClearKeys } diff --git a/src/interaction/keybindingmanager_lua.inl b/src/interaction/keybindingmanager_lua.inl index 2bdca50b66..77deee3321 100644 --- a/src/interaction/keybindingmanager_lua.inl +++ b/src/interaction/keybindingmanager_lua.inl @@ -49,22 +49,60 @@ namespace { } /** - * Returns the strings of the script that are bound to the passed key and whether they - * were local or remote key binds. + * Returns the identifiers of the action that are bound to the passed key and whether they + * were local or remote key binds. If no key is provided, all bound keybindings are + * returned instead. + * + * \param key The key for which to return the keybindings. If no key is provided, all + * keybindings are returned */ -[[codegen::luawrap]] std::vector keyBindings(std::string key) { +[[codegen::luawrap]] std::vector keyBindings(std::optional key) +{ using namespace openspace; - using K = KeyWithModifier; - using V = std::string; - const std::vector>& info = global::keybindingManager->keyBinding( - stringToKey(key) - ); + std::vector res; + if (key.has_value()) { + using K = KeyWithModifier; + using V = std::string; + const std::vector>& info = global::keybindingManager->keyBinding( + stringToKey(*key) + ); + + res.reserve(info.size()); + for (const std::pair& it : info) { + res.push_back(it.second); + } + } + else { + const std::multimap& keybinds = + global::keybindingManager->keyBindings(); + + res.reserve(keybinds.size()); + for (const std::pair& it : keybinds) { + res.push_back(it.second); + } + + // Actions might be bound to different actions + res.erase(std::unique(res.begin(), res.end()), res.end()); + } + return res; +} + +/** + * Returns the keybinds to which the provided action is bound. As actions can be bound to + * multiple keys, this function returns a list of all keys + */ +[[codegen::luawrap]] std::vector keyBindingsForAction(std::string action) { + using namespace openspace; + + const std::multimap& keybinds = + global::keybindingManager->keyBindings(); std::vector res; - res.reserve(info.size()); - for (const std::pair& it : info) { - res.push_back(it.second); + for (const std::pair& it : keybinds) { + if (it.second == action) { + res.push_back(keyToString(it.first)); + } } return res; } diff --git a/src/interaction/sessionrecordinghandler_lua.inl b/src/interaction/sessionrecordinghandler_lua.inl index 04314ed18b..8bb83297a5 100644 --- a/src/interaction/sessionrecordinghandler_lua.inl +++ b/src/interaction/sessionrecordinghandler_lua.inl @@ -39,7 +39,8 @@ namespace { * true, any existing session recording file will be overwritten, false by default. */ [[codegen::luawrap]] void stopRecording(std::filesystem::path recordFilePath, - std::string dataMode, std::optional overwrite) + std::string dataMode, + std::optional overwrite) { if (recordFilePath.empty()) { throw ghoul::lua::LuaError("Filepath string is empty"); diff --git a/src/navigation/navigationhandler_lua.inl b/src/navigation/navigationhandler_lua.inl index aea138766a..93b49e7bc8 100644 --- a/src/navigation/navigationhandler_lua.inl +++ b/src/navigation/navigationhandler_lua.inl @@ -1083,8 +1083,8 @@ localPositionFromGeo(std::string nodeIdentifier, double latitude, double longitu /** * Fly linearly to a specific distance in relation to the focus node. * - * \param distance The distance to fly to, in meters above the bounding sphere. - * \param duration An optional duration for the motion to take, in seconds. + * \param distance The distance to fly to, in meters above the bounding sphere + * \param duration An optional duration for the motion to take, in seconds */ [[codegen::luawrap]] void zoomToDistance(double distance, std::optional duration) { @@ -1126,8 +1126,8 @@ localPositionFromGeo(std::string nodeIdentifier, double latitude, double longitu * \param distance The distance to fly to, given as a multiple of the bounding sphere of * the current focus node bounding sphere. A value of 1 will result in a * position at a distance of one times the size of the bounding - * sphere away from the object. - * \param duration An optional duration for the motion, in seconds. + * sphere away from the object + * \param duration An optional duration for the motion, in seconds */ [[codegen::luawrap]] void zoomToDistanceRelative(double distance, std::optional duration) @@ -1169,11 +1169,11 @@ localPositionFromGeo(std::string nodeIdentifier, double latitude, double longitu * Fade rendering to black, jump to the specified node, and then fade in. This is done by * triggering another script that handles the logic. * - * \param navigationState A [NavigationState](#core_navigation_state) to jump to. + * \param navigationState A [NavigationState](#core_navigation_state) to jump to * \param useTimeStamp if true, and the provided NavigationState includes a timestamp, - * the time will be set as well. + * the time will be set as well * \param fadeDuration An optional duration for the fading. If not included, the - * property in Navigation Handler will be used. + * property in Navigation Handler will be used */ [[codegen::luawrap]] void jumpToNavigationState(ghoul::Dictionary navigationState, std::optional useTimeStamp, diff --git a/src/navigation/path.cpp b/src/navigation/path.cpp index 40437f7f7c..8d4215c85e 100644 --- a/src/navigation/path.cpp +++ b/src/navigation/path.cpp @@ -514,7 +514,8 @@ double Path::speedAlongPath(double traveledDistance) const { void checkVisibilityAndShowMessage(const SceneGraphNode* node) { auto isEnabled = [](const Renderable* r) { properties::Property* prop = r->property("Enabled"); - properties::BoolProperty* boolProp = dynamic_cast(prop); + properties::BoolProperty* boolProp = + dynamic_cast(prop); ghoul_assert(boolProp, "Enabled is not a boolean property"); return boolProp; }; diff --git a/src/properties/misc/optionproperty.cpp b/src/properties/misc/optionproperty.cpp index f1260be3ce..f652a6646f 100644 --- a/src/properties/misc/optionproperty.cpp +++ b/src/properties/misc/optionproperty.cpp @@ -32,6 +32,8 @@ namespace { constexpr std::string_view _loggerCat = "OptionProperty"; + constexpr std::string_view OptionsKey = "options"; + using Option = openspace::properties::OptionProperty::Option; bool addOptionInternal(int value, std::string desc, std::vector